Retour au tableau de bord

Documentation

Apprenez à utiliser Asyntai

Référence API

Créez des intégrations personnalisées avec l'API REST Asyntai

Obtenir la clé API

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
Starter300 000
Standard1 500 000
Pro6 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].