1. Vue d'ensemble
Deux modes d'intégration complémentaires :
| Usage | Méthode | Authentification |
|---|---|---|
| Afficher le chatbot sur votre site | Page de chat (iframe) ou widget JS, ou API de prédiction | Aucune (chatbot public) |
| Gérer les contenus, interroger en serveur-à-serveur, suivre l'usage | API client (clé d'assistant ou clé compte) | Clé API ak_… ou ak_account_… |
| Créer plusieurs chatbots (LMS, formations…) | API compte — POST /agents | Clé compte ak_account_… |
2. Authentification (API client)
Deux types de clés, fournies par ACHATBOT.EU :
| Type | Préfixe | Portée |
|---|---|---|
| Clé d'assistant (défaut) | ak_… | Un seul chatbot — sources, chat, usage |
| Clé compte | ak_account_… | Tous les assistants de votre organisation — création, config, sources par assistant |
Les clés peuvent être révoquées à tout moment depuis le tableau de bord.
Authorization: Bearer ak_xxxxxxxxxxxxxxxxxxxx
Base URL : https://www.achatbot.eu/console/api/client ·
Limite : 120 requêtes/minute par clé.
GET/me — identifier votre clé
Avec une clé d'assistant, obtenez le slug et les URLs publiques. Avec une clé compte, obtenez la liste de vos assistants.
curl -H "Authorization: Bearer $API_KEY" \
https://www.achatbot.eu/console/api/client/me
Réponse clé d'assistant :
{
"scope": "agent",
"agent": "votre-chatbot",
"title": "Mon assistant",
"public_config_url": "https://www.achatbot.eu/console/api/public/agents/votre-chatbot/config",
"public_predict_url": "https://www.achatbot.eu/console/api/public/agents/votre-chatbot/predict",
"chat_page_url": "https://www.achatbot.eu/console/chat.html?agent=votre-chatbot",
"widget_snippet": "AkiChat.init({ agent: \"votre-chatbot\" })"
}
Navigateur vs serveur : la clé sert aux appels serveur-à-serveur (chat backend, sources, usage).
Pour une page web, utilisez les URLs public_* ou l'iframe / widget (section 7).
2 bis. Multi-assistants (clé compte)
Pour créer un chatbot par formation, produit ou espace (isolation des corpus), demandez une
clé compte ak_account_… (tableau de bord → onglet assistant Clés API → section « Clé compte API (multi-assistants) »).
Les endpoints /chat et /sources sans préfixe /agents/:slug restent
réservés aux clés d'assistant ak_….
Tableau des endpoints (clé compte)
| Méthode | Endpoint | Rôle |
|---|---|---|
| GET | /me | Organisation + liste des assistants |
| GET | /agents | Lister les assistants (?externalId=, ?page=, ?limit=) |
| POST | /agents | Créer un assistant (+ PDF optionnels en multipart) |
| GET | /agents/:slug | Détail complet (config, sources, usage) |
| PATCH | /agents/:slug | Mettre à jour titre, langue, consigne, accueil… |
| POST | /agents/:slug/archive | Archiver sans supprimer le corpus ; libère l'instance active |
| POST | /agents/:slug/restore | Réactiver si le quota d'instances le permet |
| DELETE | /agents/:slug | Supprimer l'assistant et son corpus |
| GET | /agents/:slug/sources | Lister les sources |
| POST | /agents/:slug/sources | Uploader un PDF (multipart file) |
| POST | /agents/:slug/sources/text | Indexer un bloc texte |
| POST | /agents/:slug/sources/qa | Indexer une source Q&A (paires question/réponse) |
| POST | /agents/:slug/sources/web | Crawler un site web |
| POST | /agents/:slug/sources/youtube | Indexer une chaîne YouTube |
| POST | /agents/:slug/sources/wordpress | Indexer un site WordPress (API REST) |
| GET | /agents/:slug/sources/:id | Détail source (contenu texte intégral si applicable) |
| PATCH | /agents/:slug/sources/:id | modifier métadonnées (display_title, product_url, cta_label, cite_as_filename, usage_context, chunk_size, chunk_profile, single_chunk, extract_figures, figure_vision…), contenu texte ou notice livre (language_variants : titres/URL par langue) |
| DELETE | /agents/:slug/sources/:id | Supprimer une source |
| POST | /agents/:slug/sources/:id/reindex | Ré-indexer |
| POST | /agents/:slug/sources/:id/replace | Remplacer le PDF (même id — purge des segments + réindexation ; conserve métadonnées) |
| POST | /agents/:slug/sources/:id/refresh | Nouveautés web / YouTube / WordPress |
| POST | /agents/:slug/sources/:id/enrich-book | Créer / forcer la mise à jour meta Open Library (PDF ou fiche book, hors quota) — {hints:{title,…}} si le PDF n'est pas reconnu |
| POST | /agents/:slug/sources/enrich-books | Batch fiches livre pour les PDF de l'assistant |
| GET | /agents/:slug/usage | Usage mensuel + total + alerte quota |
| POST | /agents/:slug/chat | Chat serveur (clé compte) |
| POST | /agents/:slug/faithfulness-test | Test anti-hallucination |
| GET | /agents/:slug/messages/search | Recherche conversations (?q=) |
| GET | /agents/:slug/messages/export | Export JSON/CSV |
| GET | /agents/:slug/audit | Rapport audit assistant |
| GET | /agents/:slug/keys | Clés API d'assistant |
| POST | /agents/:slug/sources/bulk-reindex | Ré-indexer toutes les sources |
| GET | /agents/:slug/webhooks | Webhooks (Business+) |
| GET | /agents/:slug/messages | Historique conversations (?month=, ?sessionId=, ?limit=) |
| GET | /organization-settings | Paramètres par défaut du groupe |
| PATCH | /organization-settings | Mettre à jour accueil, disclaimer, prompt de base… |
GET/me — réponse clé compte
{
"scope": "account",
"group": "mon-organisation",
"group_name": "Mon organisation",
"agents_count": 2,
"agents": [
{
"agent": "assistant-formation-a",
"title": "Assistant — Formation A",
"archived": false,
"chat_page_url": "https://www.achatbot.eu/console/chat.html?agent=assistant-formation-a&lang=fr",
"public_config_url": "https://www.achatbot.eu/console/api/public/agents/assistant-formation-a/config",
"public_predict_url": "https://www.achatbot.eu/console/api/public/agents/assistant-formation-a/predict",
"widget_snippet": "AkiChat.init({ agent: \"assistant-formation-a\", lang: \"fr\" })"
}
]
}
GET/agents — lister
curl -H "Authorization: Bearer $ACCOUNT_KEY" \
"https://www.achatbot.eu/console/api/client/agents?externalId=recFormation123&page=1&limit=50"
{
"total": 1,
"page": 1,
"limit": 50,
"agents": [
{
"agent": "assistant-formation-a",
"title": "Assistant — Formation A",
"archived": false,
"externalId": "recFormation123",
"language": "fr",
"chat_page_url": "https://www.achatbot.eu/console/chat.html?agent=assistant-formation-a&lang=fr",
"public_config_url": "…",
"public_predict_url": "…",
"widget_snippet": "AkiChat.init({ agent: \"assistant-formation-a\", lang: \"fr\" })"
}
]
}
POST/agents — créer un chatbot
Corps multipart (PDF) ou JSON. Champs principaux :
| Champ | Type | Description |
|---|---|---|
title | string (128) | Nom affiché — requis |
slug | string | Identifiant URL — auto-généré depuis le titre si absent (suffixe -1 en cas de collision). Si fourni et déjà pris : 409 AGENT_SLUG_EXISTS |
language | fr | en | nl | de… | Langue par défaut de l'interface chat |
externalId | string (128) | Id externe (LMS, CRM…) — idempotent |
config | objet JSON | Paramètres initiaux (voir tableau ci-dessous) |
file / files[] | Documents à indexer immédiatement | |
textSources[] | JSON | Blocs texte documentaires {title, content} (pas de consignes prompt) |
curl -H "Authorization: Bearer $ACCOUNT_KEY" \
-F "title=Assistant — Ma formation" \
-F "language=fr" \
-F "externalId=recFormation123" \
-F 'config={"welcomeMessage":"Bonjour !","audience":"en_formation","instructions":"Réponds à partir des PDF fournis.","suggestions":["Question 1 ?","Question 2 ?"]}' \
-F "file=@support.pdf" \
https://www.achatbot.eu/console/api/client/agents
externalId : un second appel avec le même identifiant renvoie l'agent existant (200, champ idempotent: true) — pas de doublon. Recommandé pour toute intégration MCP ou script (retries sans créer mon-agent-1, mon-agent-2…).
Réponse 201 :
{
"agent": "assistant-ma-formation",
"title": "Assistant — Ma formation",
"archived": false,
"externalId": "recFormation123",
"language": "fr",
"chat_page_url": "https://www.achatbot.eu/console/chat.html?agent=assistant-ma-formation&lang=fr",
"public_config_url": "https://www.achatbot.eu/console/api/public/agents/assistant-ma-formation/config",
"public_predict_url": "https://www.achatbot.eu/console/api/public/agents/assistant-ma-formation/predict",
"widget_snippet": "AkiChat.init({ agent: \"assistant-ma-formation\", lang: \"fr\" })",
"api_key": "ak_…",
"config": {
"welcomeMessage": "Bonjour !",
"disclaimer": "",
"suggestions": ["Question 1 ?", "Question 2 ?"],
"audience": "en_formation",
"instructions": "Réponds à partir des PDF fournis.",
"colors": { "primary": "#1C2A6E" }
},
"sources": {
"total_chunks": 24,
"items": [
{
"id": 101,
"type": "pdf",
"filename": "support.pdf",
"display_title": "Support de cours",
"chunks": 24,
"status": "indexed",
"size_bytes": 1048576,
"created_at": "2026-06-18T10:00:00.000Z",
"updated_at": "2026-06-18T10:02:00.000Z",
"editable": false,
"external_source_id": null
}
]
},
"usage": { "month": "2026-06", "user_messages": 0, "sessions": null }
}
Champs config (création et PATCH)
Apparence et comportement de l'assistant — lisibles via GET /agents/:slug, modifiables via PATCH ou le MCP achatbot_agent_update. Le widget et l'iframe appliquent les mêmes réglages via la config publique (sans clé API).
| Champ | Rôle |
|---|---|
instructions | Consigne système / prompt pédagogique (effectif immédiatement, non indexée comme source du corpus) |
audience | en_formation | experts | debutants | grand_public |
welcomeMessage | Message d'accueil |
disclaimer | Mention légale / avertissement |
disclaimerPosition | top ou bottom |
suggestions | Questions suggérées (tableau de strings, max 8) |
widgetTeasers | Invitations widget au-dessus de la bulle (max 3) |
colors.primary | Couleur principale (hex) |
logoUrl | URL https du logo (chat et widget) |
placeholder | Texte du champ de saisie |
aiNotice | Bandeau mention IA (ouverture) |
aiFooterLabel | Label IA permanent en pied de chat |
privacyUrl | Lien politique de confidentialité |
brandSourceUrl | URL site pour import charte (référence) |
brandPalette | Palette hex (#RRGGBB, max 12) |
chatLayout | formal | friendly | balanced |
fullscreenEnabled | Bouton plein écran |
voice_mic_enabled | Dictée au micro (selon formule) |
voice_tts_enabled | Lecture vocale des réponses (selon formule) |
voice_enabled | Rétrocompat. — micro ou lecture activé |
sources_enabled | Afficher les sources en fin de réponse (folios / locators / figures si indexés en chunking v2) |
sources_label_mode | display (commercial) ou technical |
sources_show_date | Afficher la date des sources |
sources_link_web | Lier les sources web |
sources_only | Réponses limitées au corpus |
faithfulness_check | Vérification anti-hallucination post-RAG |
GET/agents/:slug — état complet
Structure identique à la réponse POST /agents (sans api_key).
Utile pour alimenter un panneau d'édition (LMS, back-office).
{
"agent": "assistant-ma-formation",
"title": "Assistant — Ma formation",
"externalId": "recFormation123",
"language": "fr",
"chat_page_url": "…",
"config": { "instructions": "…", "welcomeMessage": "…", "disclaimer": "…", "colors": { "primary": "#E85D04" }, "logoUrl": "https://…", "suggestions": [], "widgetTeasers": [] },
"sources": {
"total_chunks": 42,
"items": [
{
"id": 101,
"type": "pdf",
"filename": "support.pdf",
"display_title": "Support de cours",
"chunks": 24,
"status": "indexed",
"editable": false
},
{
"id": 103,
"type": "web",
"filename": "web:example.com",
"display_title": "example.com",
"chunks": 18,
"status": "indexed",
"editable": false
}
]
},
"usage": { "month": "2026-06", "user_messages": 12, "sessions": 8 }
}
Les consignes (config.instructions) alimentent le prompt de l'assistant, pas la liste des sources. N’envoyez pas de consignes via textSources.
Contenu texte intégral : GET /agents/:slug/sources/:id (champs title, content).
PATCH/agents/:slug — modifier sans recréer
curl -X PATCH -H "Authorization: Bearer $ACCOUNT_KEY" \
-H "Content-Type: application/json" \
-d '{"title":"Nouveau titre","language":"nl","config":{"instructions":"Nouvelle consigne…","welcomeMessage":"Welkom","colors":{"primary":"#E85D04"},"logoUrl":"https://example.com/logo.png","suggestions":["…","…"],"widgetTeasers":["Hulp nodig?"]}}' \
https://www.achatbot.eu/console/api/client/agents/mon-agent
Les changements de config.instructions sont effectifs immédiatement sur les réponses (sans réindexer les PDF).
Sources par assistant
Même sémantique que la section 4, préfixée par /agents/:slug.
Exemples :
# Lister
curl -H "Authorization: Bearer $ACCOUNT_KEY" \
https://www.achatbot.eu/console/api/client/agents/mon-agent/sources
# Ajouter un PDF (lien ressource LMS optionnel)
curl -H "Authorization: Bearer $ACCOUNT_KEY" \
-F "file=@nouveau-doc.pdf" \
-F "externalSourceId=recMateriel456" \
-F "display_title=Annexe cours" \
https://www.achatbot.eu/console/api/client/agents/mon-agent/sources
# Modifier une source texte / consigne
curl -X PATCH -H "Authorization: Bearer $ACCOUNT_KEY" \
-H "Content-Type: application/json" \
-d '{"content":"Nouvelle consigne pédagogique…"}' \
https://www.achatbot.eu/console/api/client/agents/mon-agent/sources/102
# Contexte d'usage (quand / comment utiliser la source)
curl -X PATCH -H "Authorization: Bearer $ACCOUNT_KEY" \
-H "Content-Type: application/json" \
-d '{"usage_context":"Catalogue éditeur — n'\''utiliser que si l'\''utilisateur demande d'\''autres ouvrages"}' \
https://www.achatbot.eu/console/api/client/agents/mon-agent/sources/102
# Découpage documentaire (1 segment forcé pour brève / article court)
curl -X PATCH -H "Authorization: Bearer $ACCOUNT_KEY" \
-H "Content-Type: application/json" \
-d '{"single_chunk":true}' \
https://www.achatbot.eu/console/api/client/agents/mon-agent/sources/102
# Supprimer
curl -X DELETE -H "Authorization: Bearer $ACCOUNT_KEY" \
https://www.achatbot.eu/console/api/client/agents/mon-agent/sources/101
GET/agents/:slug/usage
curl -H "Authorization: Bearer $ACCOUNT_KEY" \
"https://www.achatbot.eu/console/api/client/agents/mon-agent/usage?month=2026-06"
DELETE/agents/:slug
Supprime l'assistant, son contenu indexé, ses sources et ses clés. L'URL chat_page_url renvoie ensuite une erreur assistant inconnu.
Quotas
Chaque assistant créé consomme une instance de votre formule. Si le plafond est atteint :
403 avec {"code":"AGENT_QUOTA","quota":"instances",…}.
Les quotas sources, segments et messages s'appliquent par assistant comme pour la clé d'assistant.
3. Converser avec le chatbot
Clé d'assistant ak_… uniquement. Avec une clé compte, interrogez via l'URL publique
public_predict_url ou générez une clé d'assistant par assistant (api_key dans la réponse POST /agents).
POST/chat
curl https://www.achatbot.eu/console/api/client/chat \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{
"question": "Quels sont vos délais de livraison ?",
"sessionId": "utilisateur-123"
}'
Réponse :
{
"text": "Les délais de livraison sont de 3 à 5 jours ouvrables…",
"sourceDocuments": [
{
"pageContent": "…",
"metadata": {
"source_file": "faq.pdf",
"display_title": "FAQ livraison",
"product_url": "https://www.exemple.com/produit/guide",
"cta_label": "Acheter le guide"
}
}
]
}
sessionId (optionnel) maintient la mémoire de conversation côté
serveur : utilisez un identifiant stable par utilisateur ou par conversation.
history (recommandé pour les relances ; rôles
userMessage / apiMessage) ancre la recherche documentaire
sur le tour précédent (ex. « je peux avoir les réponses » après un quiz). Si
history est omis avec un sessionId déjà connu, la
console recharge les tours précédents de la session.
lang (optionnel, ex. "nl") fixe la langue de repli de la
réponse.
Cet endpoint applique le même traitement que la fenêtre de chat et l'espace de test de la console : à corpus et configuration identiques, vous obtenez la même réponse dans les deux canaux.
Les métadonnées commerciales product_url et cta_label
(définies via PATCH /sources/:id ou la console) sont renvoyées dans
sourceDocuments[].metadata lorsque la source citée en possède. Même
comportement sur POST /agents/:slug/chat, le predict public et le MCP
achatbot_agent_chat. Le catalogue public
(GET …/public/agents/:slug/config → source_catalog) les
expose aussi pour les intégrations iframe / widget.
Exemple Node.js
const resp = await fetch("https://www.achatbot.eu/console/api/client/chat", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.CHATBOT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({ question, sessionId: userId }),
});
const { text, sourceDocuments } = await resp.json();
4. Gérer vos sources de données
Clé d'assistant ak_… uniquement — ou préfixe /agents/:slug avec une clé compte (section 2 bis).
GET/sources — lister vos documents
curl -H "Authorization: Bearer $API_KEY" \
https://www.achatbot.eu/console/api/client/sources
{
"agent": "votre-chatbot",
"total_chunks": 42,
"sources": [
{ "id": 3, "filename": "faq.pdf", "chunks": 12, "status": "indexed",
"updated_at": "2026-06-12T08:00:00.000Z" }
]
}
POST/sources — uploader & indexer un PDF
Le document est découpé, vectorisé et immédiatement interrogeable. Ré-uploader un fichier du même nom remplace l'ancien contenu.
curl -H "Authorization: Bearer $API_KEY" \
-F "file=@catalogue-2026.pdf" \
https://www.achatbot.eu/console/api/client/sources
{ "id": 4, "filename": "catalogue-2026.pdf", "chunks": 18, "replaced": false }
POST/sources/text — indexer un bloc de texte
Pour les contenus sans fichier : FAQ, conditions, descriptions produits…
Renvoyer le même titre remplace le contenu précédent.
Pour des paires question/réponse, préférer /sources/qa (un contenu au format « Question : … / Réponse : … » envoyé ici est toutefois routé automatiquement en Q&A).
curl -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
-d '{
"title": "Conditions générales",
"content": "Article 1. Les présentes conditions…"
}' \
https://www.achatbot.eu/console/api/client/sources/text
POST/sources/qa — indexer une source Q&A
Crée une source de type Q&A (badge violet, paires dépliables). Accepte
entries[] structurées, ou un content au format
« Question : … / Réponse : … ».
curl -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
-d '{
"title": "autoevaluation-ch1",
"display_title": "Q&A — autoévaluation personnelle",
"entries": [
{ "question": "Pourquoi l'\''autoévaluation est-elle critique ?", "answer": "Parce que…" }
]
}' \
https://www.achatbot.eu/console/api/client/sources/qa
POST/sources/web — absorber un site web
Crawle un site ou indexe une liste d'URLs. Options :
| Champ | Défaut | Rôle |
|---|---|---|
url ou urls | — | Une URL, ou un tableau / texte multiligne (une URL par ligne) |
crawl_links | true | Suivre les liens (une seule URL uniquement ; sinon : page par page) |
same_domain | true | Rester dans le périmètre du domaine de départ (crawl) |
max_pages | 30 | Pages max en crawl, ou plafond pour une liste (max 500) |
languages | [] | Filtre optionnel de langues (fr, nl, en, es) — vide = toutes. Détecte /nl, /es, sous-domaines, etc. |
max_depth | 2 | Profondeur de crawl (plafond : 5) |
curl -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
-d '{
"urls": [
"https://www.exemple.be/page-1",
"https://www.exemple.be/page-2"
]
}' \
https://www.achatbot.eu/console/api/client/sources/web
{ "id": 5, "filename": "web:exemple.be", "type": "web", "pages": 23, "chunks": 117 }
AChatbotInEU/1.0. Le crawl ne peut pas
surcharger le site visité.POST/sources/youtube — indexer une chaîne YouTube
Indexe les transcripts des ~15 dernières vidéos de la chaîne. Accepte un
@handle, une URL de chaîne, un nom ou un ID UC….
curl -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
-d '{ "channel": "@MaChaine" }' \
https://www.achatbot.eu/console/api/client/sources/youtube
{ "id": 6, "filename": "youtube:Ma Chaîne", "type": "youtube",
"videos_indexed": 14, "videos_sans_transcript": 1, "chunks": 312 }
POST/sources/wordpress — indexer un site WordPress
Ingère tous les articles publiés via l'API REST WordPress
(wp-json/wp/v2/posts). Accepte l'URL du site (recommandé) ou l'endpoint REST
complet. Les gros sites partent en indexation asynchrone
(status: indexing). Nécessite la fonctionnalité crawl web de la formule.
Pour trouver la bonne URL : collez d'abord l'adresse d'accueil
(https://www.exemple.com). Pour vérifier l'API, ouvrez
https://www.exemple.com/wp-json/wp/v2/posts — du JSON doit s'afficher.
Sous-dossier : https://www.exemple.com/blog/…. Évitez les URLs d'article
isolé et /wp-admin.
curl -H "Authorization: Bearer $API_KEY" -H "Content-Type: application/json" \
-d '{ "url": "https://www.exemple.com", "display_title": "Mon blog", "auto_refresh": true }' \
https://www.achatbot.eu/console/api/client/sources/wordpress
{ "id": 7, "filename": "wordpress:exemple.com", "type": "wordpress",
"total_posts": 2438, "async": true, "status": "indexing" }
POST/sources/:id/refresh — récupérer les nouveautés
YouTube : indexe les nouvelles vidéos publiées depuis la dernière vérification (un contrôle automatique quotidien est aussi en place). WordPress : indexe les nouveaux articles depuis la dernière sync. Web : relance le crawl complet.
curl -X POST -H "Authorization: Bearer $API_KEY" \
https://www.achatbot.eu/console/api/client/sources/6/refresh
POST/sources/:id/reindex — réindexer
Purge les vecteurs de cette source et la ré-indexe depuis l'original (fichier stocké, re-crawl du site ou re-téléchargement des transcripts).
curl -X POST -H "Authorization: Bearer $API_KEY" \
https://www.achatbot.eu/console/api/client/sources/4/reindex
DELETE/sources/:id — supprimer
curl -X DELETE -H "Authorization: Bearer $API_KEY" \
https://www.achatbot.eu/console/api/client/sources/4
5. Suivre votre usage
GET/usage?month=2026-06
{
"agent": "votre-chatbot",
"month": "2026-06",
"usage": { "user_messages": 412, "bot_messages": 412, "sessions": 187 },
"total": { "user_messages": 1532, "sessions": 704 }
}
6. Codes d'erreur
| HTTP | Code JSON | Signification |
|---|---|---|
| 401 | — | Clé absente, invalide ou révoquée |
| 403 | AGENT_KEY_REQUIRED | Clé compte utilisée sur un endpoint réservé à la clé d'assistant (/chat, /sources sans slug) |
| 403 | AGENT_FORBIDDEN | Assistant hors de votre organisation (clé compte) |
| 403 | AGENT_QUOTA | Quota d'instances atteint (quota: "instances") — addon ou formule supérieure |
| 403 | PLAN_LIMIT | Fonctionnalité ou quota non inclus dans la formule (sources, messages, web, YouTube…) |
| 404 | AGENT_NOT_FOUND | Assistant inconnu |
| 404 | — | Source inconnue ou n'appartenant pas à l'assistant |
| 409 | — | Conflit (ex. titre texte déjà utilisé) |
| 415 | — | Format de fichier non supporté (upload : PDF uniquement) |
| 422 | — | Aucun contenu exploitable (site sans texte, chaîne sans vidéo…) |
| 429 | — | Limite de débit dépassée (120 req/min) — réessayez |
| 502 | — | Erreur temporaire du moteur — réessayez dans une minute ; contactez le support si persistant |
7. Afficher le chatbot sur votre site (sans clé)
Option A — iframe (page de chat complète)
<iframe
src="https://www.achatbot.eu/console/chat.html?agent=VOTRE-CHATBOT&lang=nl"
style="width:100%;height:640px;border:none;border-radius:12px"
></iframe>
La page reprend automatiquement votre configuration : titre, message d'accueil, couleurs, suggestions, disclaimer et mode vocal.
Langue (&lang=) : message d'accueil, disclaimer,
placeholder, suggestions et libellés CTA commerciaux des sources sont
traduits automatiquement dans la langue demandée (nl,
en, de, en-US…,
toute langue acceptée — première demande traduite à la volée puis mise en
cache). Pour les livres, si des éditions alternatives sont documentées
(titre + URL par langue), le titre et le lien commercial de citation suivent
aussi ?lang=. Sans paramètre, la langue du navigateur du visiteur est utilisée.
Le chatbot répond par ailleurs toujours dans la langue dans laquelle
l'utilisateur écrit (consigne plateforme prioritaire, même si le prompt métier
demande une autre langue), et le mode vocal (dictée + lecture) suit la langue active.
Le titre du chatbot (nom de marque) n'est jamais traduit.
Option B — widget bulle de chat (recommandé)
Bulle en bas à droite du site ; ouvre une modale avec la page de chat complète (titre, couleurs, suggestions, mode vocal). Aucune clé API dans le navigateur.
Formule Professionnel ou Entreprise : le widget charge automatiquement la bannière
de consentement cookies (RGPD) avant d'afficher le chat. Preuves enregistrées côté serveur
avec le scope agent:VOTRE-CHATBOT.
<script src="https://www.achatbot.eu/console/widget.js"></script>
<script>
AkiChat.init({ agent: "VOTRE-CHATBOT" });
</script>
Langue fixe pour accueil / disclaimer / suggestions :
AkiChat.init({ agent: "…", lang: "nl" });
Accueil personnalisé dans la modale (style « composer-first ») : passez le prénom du visiteur avec
visitorName — affiché comme « À vous la parole, … » avant la première question.
Les bulles d'accroche (widget_teasers) ouvrent le chat et envoient directement la question.
AkiChat.init({
agent: "VOTRE-CHATBOT",
lang: "fr",
visitorName: "Marie"
});
Sur desktop, la modale peut être agrandie en tirant le coin supérieur gauche
(largeur × hauteur). La taille choisie est mémorisée pour la session du navigateur
(sessionStorage, clé par agent) et réappliquée aux prochaines ouvertures.
Page standalone (lien direct, sans embed) :
https://www.achatbot.eu/console/chat.html?agent=VOTRE-CHATBOT
Option C — interface sur mesure (API publique)
Si vous ne voulez ni iframe ni bulle, construisez votre propre UI en deux appels publics (CORS ouvert, sans clé) :
GET …/api/public/agents/VOTRE-CHATBOT/config?lang=fr— titre, couleurs, accueil, disclaimer (disclaimer_position:topsous le titre,bottomsous la zone de saisie en petit texte),ai_notice(bandeau ouverture, non masquable),ai_footer_label(pied permanent),privacy_url,model_outside_eu+model_outside_eu_noticesi modèle hors UE, suggestions,prediction_urlPOST …/predictavec{ "question", "streaming": true, "chatId", "history", "deploymentUrl" }— réponse JSON ou flux SSE (event: token,sourceDocuments,replacesi anti-hallucination).deploymentUrlest optionnel et permet d'identifier un site qui appelle encore un agent archivé. Celui-ci répond503 AGENT_ARCHIVED. Une 2e prédiction pour le mêmechatIdpendant une génération en cours répond429 PREDICT_IN_FLIGHT. Danschat.html/ le widget, envoyer un message pendant le streaming arrête la génération puis envoie le nouveau texte. L'iframe, le widget et les aperçus console partagent le même indicateur de réflexion à trois points. Un tableau dans la réponse affiche un lien de téléchargement Excel (.xls).
Exemple minimal : voir site/public/home-chat.js sur www.achatbot.eu (chat démo above-the-fold).
Le champ chatId (UUID stable par visiteur) remplace sessionId de l'API client.
Look recommandé (best practice) — pour coller à la fenêtre de chat production (iframe / widget / aperçus console) :
- Appliquer
primaryColor(ouaccent) de la config comme couleur d’accent des bulles et du bouton d’envoi. - Bouton d’envoi : cercle plein (≈ 36×36 px), icône avion papier blanche (pas une flèche haut générique) :
<button type="submit" class="send-btn" aria-label="Envoyer"
style="width:36px;height:36px;border-radius:50%;border:none;background:VAR(--accent);color:#fff;display:grid;place-items:center">
<svg class="icon-send" viewBox="0 0 24 24" width="17" height="17" aria-hidden="true"
style="fill:currentColor">
<path d="M3.4 20.4 20.85 12 3.4 3.6l-.01 6.53L15 12 3.39 13.87z"/>
</svg>
</button>
Préférez l’iframe ou le widget si vous voulez cette UI sans la maintenir : ils chargent chat.html et restent alignés avec les mises à jour.
8. MCP — piloter depuis Cursor ou Claude Desktop
Le serveur MCP est distribué sur npm sous le nom
achatbot-mcp. Il expose des outils pour
gérer vos chatbots via l'API client : sources, paramètres organisation et assistant, déploiement
(iframe / widget) et historique de conversations. Aucun clone Git requis.
Prérequis
- Node.js 18+
- Formule Business+ (API activée — accès sécurisé derrière votre login)
- Clé compte
ak_account_…— tableau de bord → Clés API → Clé compte API (recommandé pour multi-assistants) - Ou clé d'assistant
ak_…+ slug pour un seul chatbot
Installation (npx)
npx -y achatbot-mcp
La première exécution télécharge le package depuis le registre npm public.
Configuration Cursor (~/.cursor/mcp.json)
{
"mcpServers": {
"achatbot": {
"command": "npx",
"args": ["-y", "achatbot-mcp"],
"env": {
"ACHATBOT_BASE_URL": "https://www.achatbot.eu",
"ACHATBOT_ACCOUNT_KEY": "ak_account_VOTRE_CLE"
}
}
}
}
Claude Desktop : même principe (command + args + variables d'environnement).
Sur macOS, si Cursor ou Claude Desktop ne trouve pas npx au démarrage du serveur MCP
(command not found), utilisez le chemin absolu renvoyé par which npx dans le terminal :
par ex. /opt/homebrew/bin/npx (Apple Silicon) ou /usr/local/bin/npx (Intel), à la place de
npx dans command.
Outils disponibles (extrait v3)
| Outil | Description |
|---|---|
achatbot_account_me | Compte, assistants, URLs publiques |
achatbot_agent_chat | Chat via clé compte |
achatbot_agent_archive | Archiver sans supprimer le corpus |
achatbot_agent_restore | Réactiver sous réserve du quota d'instances |
achatbot_agent_create_with_files | Créer assistant + PDFs locaux |
achatbot_agent_source_enrich_book | Fiche livre Open Library depuis un PDF |
achatbot_agent_source_replace_file | Remplacer le PDF d'une source (même id, hors quota) |
achatbot_agent_sources_add_qa | Indexer une source Q&A (paires question/réponse) |
achatbot_agent_sources_add_wordpress | Indexer un site WordPress (API REST) |
achatbot_agent_faithfulness_test | Test anti-hallucination |
achatbot_agent_conversations_search | Recherche dans l'historique |
achatbot_agent_audit | Audit sources, quotas, feedback |
achatbot_agent_webhooks_* | Webhooks (Business+) |
achatbot_agent_keys_* | Clés API d'assistant |
achatbot_agent_messages_export | Export conversations |
achatbot_doc_reference | Schéma config (doc locale) |
Package npm : achatbot-mcp ·
API sous-jacente : section 2 bis (clé compte) ci-dessus.
ACHATBOT.EU — www.achatbot.eu · Données hébergées en Union européenne · Support : formulaire de contact ·