Tous les exemples utilisent des requêtes HTTP classiques. Les en-têtes et corps sont encodés en JSON UTF-8.
1. Authentification
Chaque requête doit contenir l’en-tête :API_TOKEN_DE_LA_SOCIETE correspond au champ api_token de la table company.
Si l’en-tête est manquant ou invalide, le serveur renvoie 401 Unauthorized.
2. Créer / mettre à jour un client
POST /api/v1/customers
Réponses possibles
Exemple de requête
2bis. Récupérer un client
GET /api/v1/customers
Permet de récupérer les informations d’un client existant à partir de son identifiant.
Paramètres de requête (query string)
Réponses possibles
Exemple de requête
3. Envoyer une question à un agent
POST /api/v1/responses
Aucun
uuid n’est requis : le serveur génère un identifiant de message unique.
Si files est fourni, l’assistant doit utiliser un modèle vision (vision activée), sinon la requête échoue en 403.
Les fichiers peuvent être envoyés :
- en JSON via
files(URL publique oudata:URL base64) ; - en multipart/form-data via un champ
files(un ou plusieurs fichiers).
Réponses (mode stream)
- 200 OK : renvoie un flux texte
text/html; charset=utf-8dont chaque chunk est une partie de la réponse. Le flux se termine par le marqueur:EOS:. - Autres codes d’erreur : voir tableau ci-dessous.
Réponses (mode non stream)
Exemple : réponse complète (stream = false)
Exemple : question avec fichiers (stream = false)
Exemple : envoi multipart/form-data
Exemple : plusieurs fichiers (multipart/form-data)
Exemple : réponse en flux (stream = true)
:EOS:.
3bis. Récupérer l’historique d’une conversation
GET /api/v1/responses
Permet de récupérer l’historique complet (questions/réponses) d’une conversation entre un client et un agent, au format JSON.
Paramètres de requête (query string)
L’authentification se fait via le header :
Réponse
Chaque message du tableau contient :
message: texte de la question ou réponsebuttons: tableau d’options (si présent)message_type: “Question” ou “Answer”created_at: date ISO
Exemple de requête
3ter. Alimenter la base documentaire d’un agent
Ces points de terminaison permettent à une intégration externe (par exemple un workflow n8n) d’envoyer, lister et supprimer les documents d’un agent. L’API utilise automatiquement le RAG interne ou le Vector Store OpenAI/Azure configuré sur l’agent.
L’agent est désigné par son UUID dans l’URL. L’agentUUID doit appartenir à la société propriétaire du token.
POST — Ajouter (ou mettre à jour) un document
POST /api/v1/agents/{agentUUID}/rag-resources
Envoi en multipart/form-data.
ℹ️ Pour un agent OpenAI/Azure, le champ id retourné est l’identifiant du fichier du Vector Store. Il sert également à le supprimer avec la route DELETE.
Réponses possibles
Exemple
GET — Lister les documents et leur statut
GET /api/v1/agents/{agentUUID}/rag-resources
Renvoie le tableau des documents de l’agent, depuis son RAG interne ou son Vector Store, triés du plus récent au plus ancien (résultats paginés). À utiliser pour suivre l’ingestion (status passe de PENDING → PROCESSING → READY, ou FAILED).
Paramètres de requête (query string)
DELETE — Supprimer un document par clé externe
DELETE /api/v1/agents/{agentUUID}/rag-resources/{externalId}
Supprime le document (et ses vecteurs). Pour le RAG interne, utilisez son externalId. Pour un Vector Store, utilisez l’id de fichier retourné par POST ou GET.
4. Codes d’erreur communs
5. Bonnes pratiques
- Timeout côté client : pour le mode stream, coupez la connexion si aucun chunk n’est reçu depuis >20 s.
- Réessais : en cas de 500 réessayez avec back-off exponentiel.
- Sécurité : stockez l’
API_TOKENcôté serveur uniquement.
6. Détails techniques du mode stream
Le mode streaming (stream: true, valeur par défaut) utilise un ReadableStream HTTP côté serveur.
Format
- Content-Type :
text/html; charset=utf-8 - Chaque chunk contient un fragment de texte de la réponse de l’agent, encodé en UTF-8.
- Le flux se termine par le marqueur
:EOS:(End Of Stream). - Le timeout serveur est de 120 secondes (
maxDuration). Si l’agent met plus longtemps à répondre, la connexion sera coupée.
Backpressure
Le serveur utilise le mécanismepull() du ReadableStream : les chunks sont mis en file d’attente et envoyés dès que le client est prêt à les consommer. Si le client lit lentement, le serveur met les données en tampon.
Interruption
Si le client ferme la connexion (signalabort), le serveur interrompt la génération et pousse un message d’abandon dans le flux avant de le fermer.
Multipart/form-data
Le streaming fonctionne aussi avec un envoimultipart/form-data (pour joindre des fichiers). Les champs texte (companyIdentifier, agentUUID, question, stream) sont lus depuis le FormData, et les fichiers sont convertis en data: URL base64 avant d’être transmis à l’assistant.