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 l’identifiant de la réponse et vous le renvoie (champ uuid en mode non stream, en-tête X-Moustache-Message-UUID en mode stream). Il sert à noter la réponse (section 3quater).
Fichiers joints
Les fichiers peuvent être envoyés :
- en JSON via
files(data:URL base64, ou URL publique HTTPS pour les images) ; - 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 : question sur un document PDF (multipart/form-data)
Exemple : envoi multipart/form-data
Exemple : plusieurs fichiers (multipart/form-data)
Exemple : réponse en flux (stream = true)
:EOS:. L’identifiant de la réponse est dans l’en-tête X-Moustache-Message-UUID (affichez-le avec curl -i).
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 :
uuid: identifiant du message (celui d’une réponse sert à la noter, section 3quater)message: texte de la question ou réponsebuttons: tableau d’options (si présent)message_type: “Question” ou “Answer”created_at: date ISOreview(réponses uniquement) :"up","down"ounull, que la note vienne de l’API ou du pouce du chatbotattachments(questions uniquement) : fichiers joints à la question, chacun{ "kind": "image" | "document", "name", "type", "size", "url" }.urlest un lien de téléchargement temporaire (valable 1 heure) ; il vautnullsi le fichier n’a pas pu être conservé. Rappelez l’historique pour obtenir des liens neufs.
Exemple de requête
3quater. Noter une réponse
PUT /api/v1/responses/{uuid}/review
Équivalent du pouce positif / négatif du chatbot. La note apparaît dans la console Moustache AI comme celles du chatbot, et dans le champ review de l’historique.
{uuid} est l’identifiant de la réponse : champ uuid de la réponse non stream, en-tête X-Moustache-Message-UUID en mode stream, ou champ uuid d’un message Answer de l’historique.
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.