Référence API
Créez des intégrations personnalisées avec l'API REST Asyntai
Plan payant requis : L'accès API est disponible sur les forfaits Starter, Standard et Pro. Voir les tarifs
Aperçu
The Asyntai API allows you to integrate AI-powered customer support into any application. Send messages and receive intelligent responses grounded in your website content and knowledge base.
Authentification
Toutes les requêtes API nécessitent une authentification à l'aide de votre clé API. Vous pouvez obtenir votre clé API depuis la page Paramètres API.
Incluez votre clé API dans les requêtes en utilisant l'une de ces méthodes :
- En-tête d'autorisation (recommandé) :
Authorization: Bearer YOUR_API_KEY - En-tête X-API-Key :
X-API-Key: YOUR_API_KEY
Gardez votre clé API secrète. Toute personne disposant de votre clé peut accéder à votre compte via l'API. Ne l'exposez jamais dans du code côté client.
URL de base
https://asyntai.com/api/v1/
Points de terminaison
POST /chat/
Envoyez un message et recevez une réponse générée par l'IA.
Corps de la requête
{
"message": "What are your business hours?",
"session_id": "user_123", // optional
"website_id": 1 // optional
}
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
message |
chaîne de caractères | Oui | Le message de l'utilisateur à envoyer à l'IA |
session_id |
chaîne de caractères | Non | Identifiant unique de la conversation. Utilisez le même session_id pour conserver l'historique de la conversation. |
website_id |
entier | Non | ID spécifique du site web. Si non fourni, utilise votre site web principal. |
Réponse
{
"success": true,
"response": "Our business hours are Monday-Friday, 9 AM to 5 PM EST.",
"session_id": "user_123"
}
Exemple (cURL)
curl -X POST https://asyntai.com/api/v1/chat/ \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"message": "What are your business hours?", "session_id": "user_123"}'
Exemple (Python)
import requests
response = requests.post(
"https://asyntai.com/api/v1/chat/",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
json={
"message": "What are your business hours?",
"session_id": "user_123"
}
)
data = response.json()
print(data["response"])
Exemple (JavaScript)
const response = await fetch("https://asyntai.com/api/v1/chat/", {
method: "POST",
headers: {
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json"
},
body: JSON.stringify({
message: "What are your business hours?",
session_id: "user_123"
})
});
const data = await response.json();
console.log(data.response);
GET /websites/
Listez tous les sites web associés à votre compte.
Réponse
{
"success": true,
"websites": [
{
"id": 1,
"name": "My Website",
"domain": "example.com",
"is_primary": true
}
]
}
Exemple (cURL)
curl https://asyntai.com/api/v1/websites/ \
-H "Authorization: Bearer YOUR_API_KEY"
POST /websites/
Create a new AI agent. This does the same thing as adding a website in your dashboard: it makes the agent, reads your site, and writes the first draft of the AI instructions.
Use this to set up customers from your own software. You get back the widget ID and the code to put on the website.
Corps de la requête
| Champ | Type | Description |
|---|---|---|
domain |
chaîne de caractères | Required. The website address, for example example.com |
name |
chaîne de caractères | Optional. A display name for the agent. Useful when one website has several agents. |
crawl |
boolean | Optional, true by default. Set it to false to create the agent without reading the website. Nothing is crawled and no instructions are written. |
force |
boolean | Optional, false by default. Set it to true to add a website you already have. The copy is stored with a number after it. |
Réponse
{
"success": true,
"website": {
"id": 42,
"domain": "example.com",
"name": "Support agent",
"widget_id": "asyntai_ab12cd34ef56",
"is_primary": true,
"crawl_started": true,
"instructions_status": "generating",
"job_id": "8f2c1e90-..."
},
"embed_code": "<script>...</script>"
}
Exemple (cURL)
curl -X POST https://asyntai.com/api/v1/websites/ \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"domain": "example.com", "name": "Support agent"}'
Reading a website takes a few minutes, so this call answers straight away. Check when the agent is ready with the next endpoint.
Errors
| Code | Meaning |
|---|---|
403 |
You have reached the number of websites your plan allows. The answer tells you the limit. |
409 |
Your account already has this website. Send force as true to add it again. |
GET /websites/{id}/
Get one website and see whether it is ready. Use this after you create an agent, to wait until the website has been read and the AI instructions are written.
Réponse
{
"success": true,
"website": {
"id": 42,
"domain": "example.com",
"name": "Support agent",
"widget_id": "asyntai_ab12cd34ef56",
"is_primary": true,
"created_at": "2026-08-11T09:12:00+00:00",
"ready": true,
"instructions": {
"status": "completed",
"has_instructions": true,
"characters": 3421
},
"crawl": {
"job_id": "8f2c1e90-...",
"status": "completed",
"pages_crawled": 47,
"pages_found": 50,
"max_pages": 50,
"completed_at": "2026-08-11T09:15:31+00:00",
"error": ""
},
"knowledge_items": 47
},
"embed_code": "<script>...</script>"
}
The ready field is true when nothing is still running. A crawl that failed also counts as ready, because it has finished. Look at the crawl status to see what happened.
Exemple (cURL)
curl https://asyntai.com/api/v1/websites/42/ \
-H "Authorization: Bearer YOUR_API_KEY"
GET PATCH /websites/{id}/settings/
Read or change the chat widget settings for one website. These are the same settings you see on the Customize page: colours, the name of the assistant, the first message, lead capture, and everything else.
Reading the settings
A GET request returns every setting with its current value, plus a locked list. Locked shows the settings your plan cannot change, and which plans they need.
{
"success": true,
"settings": {
"ai_support_name": "AI Assistant",
"widget_color": "#6366f1",
"initial_message": "Hi, how can I help you?",
"hide_branding": false,
"...": "..."
},
"locked": {
"hide_branding": ["pro", "enterprise"],
"widget_style": ["pro", "enterprise"]
}
}
Changing the settings
A PATCH request changes only the settings you send. Everything you leave out stays as it is.
curl -X PATCH https://asyntai.com/api/v1/websites/42/settings/ \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"ai_support_name": "Ava", "widget_color": "#0f172a", "use_emoji": true}'
{
"success": true,
"updated": ["ai_support_name", "use_emoji", "widget_color"],
"settings": { "...": "..." },
"locked": { "...": "..." }
}
Plans
Each setting needs its own plan, the same as in the dashboard. For example, hiding the Asyntai branding needs the Pro plan, and voice input needs Standard.
| Plan needed | Paramètres | Examples |
|---|---|---|
| Any paid plan | 25 | widget_color, ai_support_name, initial_message |
| À partir du forfait Starter | 22 | profile_picture, conversation_starters_enabled |
| À partir du forfait Standard | 25 | speech_to_text_enabled, image_vision_enabled, escalation_enabled |
| Pro | 6 | hide_branding, widget_style |
If you send a setting your plan does not allow, the whole request is refused with code 403 and nothing is saved. The same happens if any value is wrong, for example a colour that is not a hex code. Your settings never end up half changed.
GET PUT /websites/{id}/instructions/
Read or replace the AI instructions for one website. These are the rules that tell the assistant who it is, what it may say, and what it must not say. They are the same instructions you edit in the dashboard.
Reading
{
"success": true,
"instructions": "You are the support agent for Acme Tools...",
"characters": 1979,
"version": 7,
"mode": "instructions",
"ask_questions": true,
"generation_status": "completed",
"being_edited_by": null
}
Replacing
A PUT request replaces the whole text, the same as saving in the dashboard. There is no append mode. To add a paragraph, read the instructions, add your text, then write it back.
curl -X PUT https://asyntai.com/api/v1/websites/42/instructions/ \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"instructions": "You are the support agent for Acme Tools...", "version": 7}'
Corps de la requête
| Champ | Type | Description |
|---|---|---|
instructions |
chaîne de caractères | Required. The complete new text. It replaces everything that was there. |
version |
number | Optional but recommended. The version you read. If somebody changed the instructions since then, your write is refused instead of overwriting their work. |
mode |
chaîne de caractères | Optional. Either instructions or general. |
ask_questions |
boolean | Optional. Whether the assistant asks a follow-up question at the end of its answers. |
force |
boolean | Optional, false by default. Needed only when your new text is less than half the length of the current text. |
How your instructions are protected
Instructions can take hours to write, so a write can be refused to protect them:
| Code | Meaning |
|---|---|
400 |
Your new text is less than half the length of the current text. This catches a script that sends empty or cut-off text over instructions somebody spent hours on. Send force as true if you meant it. |
409 |
The instructions changed after you read them. Read them again, apply your change, then write. |
423 |
Somebody is editing the instructions in the dashboard right now. The answer tells you who. Try again in a couple of minutes. |
Every change also saves a copy of the previous text, so an earlier version can always be restored from the dashboard.
GET /conversations/
Récupérez l'historique des conversations pour une session spécifique.
Paramètres de requête
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
session_id |
chaîne de caractères | Oui | L'identifiant de session pour lequel récupérer l'historique |
limit |
entier | Non | Nombre maximum de messages à retourner (par défaut : 50, max : 100) |
Réponse
{
"success": true,
"session_id": "user_123",
"messages": [
{
"role": "user",
"content": "What are your business hours?",
"timestamp": "2024-01-15T10:30:00Z"
},
{
"role": "assistant",
"content": "Our business hours are Monday-Friday, 9 AM to 5 PM EST.",
"timestamp": "2024-01-15T10:30:01Z",
"sender_type": "ai",
"agent_name": null,
"response_time_ms": 1840.5
}
]
}
Une question et sa réponse sont enregistrées dans un même enregistrement, elles portent donc le même timestamp. Ne soustrayez pas l'un de l'autre pour mesurer la vitesse de réponse, car le résultat est toujours nul. Utilisez response_time_ms, qui correspond au temps réel de la réponse, en millisecondes.
sender_type vaut ai quand le chatbot a répondu, et human quand un de vos agents a repris la conversation. agent_name contient le nom affiché de cet agent.
Exemple (cURL)
curl "https://asyntai.com/api/v1/conversations/?session_id=user_123&limit=20" \
-H "Authorization: Bearer YOUR_API_KEY"
GET /sessions/
Listez vos sessions de chat récentes. Utilisez ceci pour découvrir les identifiants de session, que vous pouvez ensuite transmettre à /conversations/ pour récupérer l'historique complet des messages.
Paramètres de requête
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
limit |
entier | Non | Nombre de sessions récentes à retourner (par défaut : 20, max : 100) |
website_id |
chaîne de caractères | Non | Filtrer les sessions par identifiant de site web |
source |
chaîne de caractères | Non | Filtrer par source de session : widget, api, whatsapp, instagram, messenger, gorgias, freshchat, zapier |
Réponse
{
"success": true,
"sessions": [
{
"session_id": "session_abc123def",
"source": "widget",
"message_count": 5,
"first_message": "What are your business hours?",
"first_message_at": "2024-01-15T10:30:00Z",
"last_message_at": "2024-01-15T10:35:00Z",
"first_response_time_ms": 1840.5,
"first_human_response_at": null,
"started_at": "2024-01-15T10:29:58Z",
"ended_at": "2024-01-15T10:41:12Z",
"taken_over_at": null,
"website_domain": "example.com"
}
]
}
Champs d'horodatage pour le reporting
| Champ | Description |
|---|---|
started_at |
Quand le visiteur a ouvert la conversation. Disponible uniquement pour les sessions du widget, car les sessions créées via l'API n'ouvrent jamais de widget. |
first_message_at |
Quand le premier message de la conversation a été enregistré. |
first_response_time_ms |
Durée de la première réponse, en millisecondes. Utilisez ce champ pour le temps de première réponse. |
first_human_response_at |
Quand un de vos agents a envoyé la première réponse. La valeur est null quand le chatbot a géré toute la conversation. |
taken_over_at |
Quand un agent a repris la conversation du chatbot. |
last_message_at |
Quand le dernier message de la conversation a été enregistré. |
ended_at |
Quand le visiteur a quitté la conversation. Une conversation n'a pas d'état résolu ni fermé, car un visiteur peut toujours revenir et poser une autre question. |
Tous les horodatages sont en UTC et utilisent le format ISO 8601. Vous ne pouvez pas changer le fuseau horaire. Convertissez les valeurs dans votre propre outil de reporting.
Exemple (cURL)
curl "https://asyntai.com/api/v1/sessions/?limit=10" \
-H "Authorization: Bearer YOUR_API_KEY"
GET /leads/
Récupérer les prospects collectés — adresses e-mail et numéros de téléphone soumis par les visiteurs lors des conversations de chat.
Paramètres de requête
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
limit |
entier | Non | Nombre de prospects à renvoyer (par défaut : 50, max : 100) |
website_id |
chaîne de caractères | Non | Filtrer les prospects par un identifiant de site web spécifique |
Réponse
{
"success": true,
"leads": [
{
"session_id": "session_abc123def",
"email": "[email protected]",
"phone": "+1234567890",
"page_url": "https://example.com/pricing",
"started_at": "2024-01-15T10:30:00Z"
}
]
}
| Champ | Type | Description |
|---|---|---|
session_id |
chaîne de caractères | L'identifiant de la session de chat. Transmettez-le à /conversations/ pour voir l'historique complet du chat. |
email |
chaîne ou null | Adresse e-mail fournie par le visiteur, ou null si non collectée |
phone |
chaîne ou null | Numéro de téléphone fourni par le visiteur, ou null si non collecté |
page_url |
chaîne ou null | L'URL de la page où le visiteur discutait |
started_at |
chaîne de caractères | Horodatage ISO 8601 du début de la session de chat |
Exemple (cURL)
curl "https://asyntai.com/api/v1/leads/?limit=20" \
-H "Authorization: Bearer YOUR_API_KEY"
Exemple (Python)
import requests
response = requests.get(
"https://asyntai.com/api/v1/leads/",
headers={"Authorization": "Bearer YOUR_API_KEY"},
params={"limit": 20}
)
leads = response.json()["leads"]
for lead in leads:
print(f"{lead['email'] or ''} | {lead['phone'] or ''}")
GET /account/
Obtenez les informations de votre compte et vos statistiques d'utilisation.
Réponse
{
"success": true,
"account": {
"email": "[email protected]",
"plan": "starter",
"messages_used": 150,
"messages_limit": 2500
}
}
Exemple (cURL)
curl https://asyntai.com/api/v1/account/ \
-H "Authorization: Bearer YOUR_API_KEY"
Plusieurs sites web ? Les endpoints de la base de connaissances utilisent par défaut votre site web principal. Si vous avez plusieurs sites web, transmettez website_id pour cibler un site spécifique. Vous pouvez trouver les identifiants de vos sites web avec GET /websites/.
Limites de téléversement quotidiennes : Les téléversements vers la base de connaissances (texte, URL, tableur) sont soumis à une limite quotidienne de caractères selon votre plan. Cela s'applique au contenu total téléversé sur l'ensemble des points d'accès de la base de connaissances par jour.
| Forfait | Caractères/jour |
|---|---|
| Starter | 300 000 |
| Standard | 1 500 000 |
| Pro | 6 000 000 |
GET /knowledge/
Listez les entrées de votre base de connaissances. Ce sont les sources de contenu que votre chatbot IA utilise pour répondre aux questions.
Paramètres de requête
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
limit |
entier | Non | Nombre d'entrées à retourner (par défaut : 50, max : 100) |
website_id |
chaîne de caractères | Non | Filtrer par identifiant de site web (votre site web principal par défaut) |
Réponse
{
"success": true,
"entries": [
{
"id": "abc-123-def",
"type": "text",
"title": "Business Hours",
"description": "Manual text content (150 words)",
"created_at": "2024-01-15T10:30:00Z"
},
{
"id": "ghi-456-jkl",
"type": "url",
"title": "About Us - Example",
"description": "Content from https://example.com/about",
"created_at": "2024-01-14T09:00:00Z"
}
]
}
Exemple (cURL)
curl "https://asyntai.com/api/v1/knowledge/?limit=10" \
-H "Authorization: Bearer YOUR_API_KEY"
POST /knowledge/text/
Ajoutez du contenu textuel personnalisé à votre base de connaissances. L'IA l'utilisera pour répondre aux questions des visiteurs.
Corps de la requête
{
"title": "Return Policy",
"content": "We offer a 30-day return policy on all items. Items must be unused and in original packaging. Refunds are processed within 5-7 business days.",
"website_id": "123"
}
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
title |
chaîne de caractères | Oui | Un titre pour cette entrée de base de connaissances |
content |
chaîne de caractères | Oui | Le contenu textuel (minimum 10 caractères) |
website_id |
chaîne de caractères | Non | Site web cible (votre site web principal par défaut) |
Réponse
{
"success": true,
"id": "abc-123-def",
"title": "Return Policy",
"chunks_created": 1
}
Exemple (cURL)
curl -X POST "https://asyntai.com/api/v1/knowledge/text/" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"title": "Return Policy", "content": "We offer a 30-day return policy..."}'
POST /knowledge/url/
Ajoutez une page web à votre base de connaissances. Le contenu sera récupéré et extrait automatiquement.
Corps de la requête
{
"url": "https://example.com/faq",
"website_id": "123"
}
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
url |
chaîne de caractères | Oui | L'URL depuis laquelle récupérer le contenu |
website_id |
chaîne de caractères | Non | Site web cible (votre site web principal par défaut) |
Réponse
{
"success": true,
"id": "abc-123-def",
"title": "FAQ - Example",
"url": "https://example.com/faq",
"chunks_created": 5
}
Exemple (cURL)
curl -X POST "https://asyntai.com/api/v1/knowledge/url/" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/faq"}'
POST /knowledge/spreadsheet/
Téléversez un fichier CSV ou Excel (.xlsx) dans votre base de connaissances. Chaque ligne devient une entrée de connaissance distincte, idéal pour les catalogues de produits, les listes de FAQ, les grilles tarifaires et les répertoires.
Requête
Envoyez en multipart/form-data (téléversement de fichier), pas en JSON.
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
file |
fichier | Oui | Un fichier .csv ou .xlsx. La première ligne doit contenir les en-têtes de colonnes. Nombre maximal de lignes par téléversement : Starter 500, Standard 2 000, Pro 10 000. Les lignes excédentaires sont tronquées. |
website_id |
chaîne de caractères | Non | Site web cible (votre site web principal par défaut) |
Réponse
{
"success": true,
"id": "abc-123-def",
"title": "products.csv",
"rows_processed": 15,
"chunks_created": 15
}
Exemple (cURL)
curl -X POST "https://asyntai.com/api/v1/knowledge/spreadsheet/" \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "[email protected]"
GET /knowledge/{id}/
Lisez une entrée de la base de connaissances, y compris le texte qui y est enregistré. La valeur id provient de la réponse de GET /knowledge/.
Le contenu est renvoyé pour les entrées que vous avez ajoutées : texte, fichiers, feuilles de calcul, URL uniques et vidéos. Une exploration de site web apparaît dans la liste, mais ses pages ne sont pas renvoyées, car la source est votre propre site public. Dans ce cas, content vaut null et le champ reason en explique la raison.
Réponse
{
"success": true,
"id": "abc-123-def",
"type": "text",
"title": "Business Hours",
"description": "Manual text content (150 words)",
"created_at": "2024-01-15T10:30:00Z",
"chunks_count": 3,
"content": "We are open Monday to Friday, 9am to 5pm...",
"content_available": true,
"char_count": 43
}
Exemple (cURL)
curl "https://asyntai.com/api/v1/knowledge/abc-123-def/" \
-H "Authorization: Bearer YOUR_API_KEY"
DELETE /knowledge/{id}/
Supprimez une entrée de la base de connaissances. L'id se trouve dans la réponse de GET /knowledge/.
Réponse
{
"success": true,
"message": "Knowledge base entry deleted"
}
Exemple (cURL)
curl -X DELETE "https://asyntai.com/api/v1/knowledge/abc-123-def/" \
-H "Authorization: Bearer YOUR_API_KEY"
Astuce : Vous pouvez également gérer les webhooks depuis la Paramètres API page sans écrire la moindre ligne de code.
GET /webhooks/
Listez vos webhooks enregistrés.
Réponse
{
"success": true,
"webhooks": [
{
"id": "abc-123-def",
"url": "https://example.com/webhook",
"events": ["message.received", "escalation.requested"],
"is_active": true,
"created_at": "2024-01-15T10:30:00Z"
}
]
}
Exemple (cURL)
curl "https://asyntai.com/api/v1/webhooks/" \
-H "Authorization: Bearer YOUR_API_KEY"
POST /webhooks/
Enregistrez un nouveau webhook pour recevoir des notifications d'événements en temps réel.
Événements disponibles
| Événement | Description |
|---|---|
message.received |
Un visiteur a envoyé un message et a reçu une réponse |
conversation.started |
Une nouvelle session de chat a été démarrée |
escalation.requested |
L'IA a déclenché une escalade vers un agent humain |
takeover.started |
Un agent humain a pris en charge une session de chat |
Corps de la requête
{
"url": "https://example.com/webhook",
"events": ["message.received", "escalation.requested"],
"website_id": "123"
}
| Paramètre | Type | Obligatoire | Description |
|---|---|---|---|
url |
chaîne de caractères | Oui | L'URL HTTPS pour recevoir les requêtes POST du webhook |
events |
tableau | Oui | Liste des événements auxquels s'abonner (voir le tableau ci-dessus) |
website_id |
chaîne de caractères | Non | Site web cible (votre site web principal par défaut) |
Réponse
{
"success": true,
"webhook": {
"id": "abc-123-def",
"url": "https://example.com/webhook",
"events": ["message.received", "escalation.requested"],
"secret": "whsec_abc123...",
"created_at": "2024-01-15T10:30:00Z"
}
}
Vérification des webhooks : Chaque webhook inclut un secret (affiché uniquement à la création). Chaque POST vers votre URL inclut un X-Webhook-Signature en-tête — un HMAC-SHA256 du corps de la requête signé avec votre secret.
Exemple (cURL)
curl -X POST "https://asyntai.com/api/v1/webhooks/" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "https://example.com/webhook", "events": ["message.received"]}'
DELETE /webhooks/{id}/
Supprimez un webhook. L'id se trouve dans la réponse de GET /webhooks/.
Réponse
{
"success": true,
"message": "Webhook deleted"
}
Exemple (cURL)
curl -X DELETE "https://asyntai.com/api/v1/webhooks/abc-123-def/" \
-H "Authorization: Bearer YOUR_API_KEY"
Réponses d'erreur
Toutes les réponses d'erreur suivent ce format :
{
"success": false,
"error": "Error message describing what went wrong"
}
| Code de statut | Description |
|---|---|
400 |
Requête incorrecte - Paramètres invalides ou champs obligatoires manquants |
401 |
Non autorisé - Clé API invalide ou manquante |
429 |
Trop de requêtes - Limite de messages atteinte pour votre forfait |
503 |
Service indisponible — Le service IA est temporairement indisponible |
Limites de débit
L'utilisation de l'API est limitée par votre forfait d'abonnement :
- Free : 100 messages/mois
- Starter (39 $/mois) : 2 500 messages/mois
- Standard (139 $/mois) : 15 000 messages/mois
- Pro (449 $/mois) : 50 000 messages/mois
Besoin d'aide ?
Si vous avez des questions ou rencontrez des problèmes, contactez-nous à [email protected].