Bot Talk API
De Bot Talk API is een REST-API waarmee je met één specifieke chatbot kunt communiceren vanuit je eigen applicatie - zoals maatwerk-apps, interne tools of zelfgebouwde automatiseringen. Je maakt een API-sleutel aan op het tabblad API van de bot en roept vervolgens het chat-endpoint aan met de sleutel als Bearer-token om de antwoorden van de bot te ontvangen, hetzij als één enkel antwoord, hetzij gestreamd via SSE.
Aan de slag
- Selecteer je chatbot en ga naar het tabblad API bovenaan de botpagina (Select Bot > API (Bot selecteren > API)).
- Klik op Create API Key (API-sleutel aanmaken).
De teller naast de knop toont hoeveel sleutels er actief zijn ("1 of 5 API keys active"). De link View API Documentation (API-documentatie bekijken) opent deze referentie, en het curl-fragment onder Quick Start (Snelle start) geeft je een direct bruikbaar voorbeeld.
- Geef de sleutel een naam in het dialoogvenster Create API Key, stel eventueel een IP-whitelist en een rate-limit in, kies welke rechten de sleutel krijgt en klik op Create (Aanmaken).
- Kopieer de volledige sleutel uit het bevestigingsvenster. De tekst zonder opmaak wordt slechts één keer getoond.
Een sleutel ziet eruit als ck_abcdefghijklmnopqrstuvwxyz012345. Elke sleutel hoort bij die ene specifieke bot. Elk verzoek dat met de sleutel wordt gedaan communiceert dan ook met die bot - de bot wordt geïdentificeerd aan de hand van de sleutel en verschijnt nooit in de URL.
Basis-URL
https://api.chatlab.com/aichat
Alle endpoints in dit artikel zijn relatief ten opzichte van deze basis-URL.
Sleutelrechten
Elke sleutel bevat een of beide van deze rechten, in te stellen met de schakelaars in het dialoogvenster Create API Key:
- Chat (send messages and receive responses) - geeft toegang tot de endpoints
/v1/chaten/v1/chat/stream. - Conversation history (list and read past conversations) - geeft toegang tot de
/v1/conversations-endpoints.
Het tabblad API toont de toegekende rechten van elke sleutel als badges met de tekst Chat en Conversations.
Authenticatie
Stuur de sleutel bij elk verzoek mee in de Authorization-header:
Authorization: Bearer ck_abcdefghijklmnopqrstuvwxyz012345
Verzoeken zonder een Authorization: Bearer ...-header retourneren 401 missing_api_key. Onbekende sleutels retourneren 401 invalid_api_key; ingetrokken sleutels retourneren 401 revoked_api_key. Vijf ongeldige pogingen binnen een minuut vanaf hetzelfde IP-adres leiden tot een blokkade van 60 minuten.
Limieten
- Maximaal 5 actieve Bot Talk-sleutels per bot
- Maximaal 60 verzoeken per minuut per sleutel (token bucket, capaciteit van 60, gelijkmatige aanvulling met 1 token per seconde). Naar beneden configureerbaar tijdens het aanmaken - stel een lagere
rateLimitPerMinutein en het maximum daalt, waarbij de aanvulsnelheid evenredig meeschaalt. - Maximale berichtlengte 4000 tekens
- Gelijktijdige SSE-streams per sleutel zijn afhankelijk van je accountlimieten
Endpoints
POST /v1/chat
Stuur een bericht naar de bot en ontvang het volledige antwoord in één JSON-respons.
Request body
{
"message": "Hi, can you help me track my order?",
"conversationId": "550e8400-e29b-41d4-a716-446655440000",
"metadata": {"userEmail": "alice@example.com"}
}
message- verplichte string, maximaal 4000 tekens.conversationId- optionele UUID. Laat leeg voor een nieuw gesprek; hergebruik de waarde die de server eerder retourneerde om aan een bestaand gesprek toe te voegen.metadata- optioneel object:{source, userName, userEmail, userPhone}.userEmailwordt ook gebruikt om de interne client-id af te leiden.
Response body (200)
{
"message": {"role": "assistant", "content": "Sure, what's your order number?"},
"conversationId": "550e8400-e29b-41d4-a716-446655440000",
"model": "gpt-4o-mini",
"usage": {"creditsUsed": 2},
"actions": []
}
message.roleis altijd"assistant";message.contentis het volledige antwoord.modelis de model-id waarop de bot voor deze aanroep draaide.usage.creditsUsedtelt het gebruikersbericht + botantwoord mee (doorgaans 2), plus één extra credit per uitgevoerde tool-aanroep.actionstoont de tool-uitvoeringen die tijdens deze beurt zijn uitgevoerd. Momenteel worden alleenfunction_call-items geretourneerd (mettype,name,status: "completed").
POST /v1/chat/stream
Streamingvariant van /v1/chat. Retourneert Content-Type: text/event-stream met Server-Sent Events.
Request body
Zelfde structuur als POST /v1/chat. De vlag stream in de body is niet verplicht - het gebruik van dit pad activeert automatisch SSE.
Response body (SSE-events)
message.delta- inhoudsfragment{ "content": "..." }. Meerdere hiervan worden gestreamd naarmate tokens binnenkomen.action- tool-uitvoering{ "type", "name", "status": "executing" }. Wordt verzonden wanneer de bot een functie-aanroep activeert.message.done- afrondend event metconversationId,model,usageen (indien van toepassing) de lijst met voltooideactions.error- verzonden als de generatie mislukt; daarna stopt de stream.
Keep-alive SSE-opmerkingen (:keepalive) worden elke 15 seconden verzonden tijdens lange generaties. Time-outs aan de serverzijde: 30 seconden voor het eerste token, 120 seconden in totaal per stream.
Curl-voorbeeld
curl -N -X POST https://api.chatlab.com/aichat/v1/chat/stream \
-H "Authorization: Bearer ck_..." \
-H "Content-Type: application/json" \
-d '{"message":"hello"}'
GET /v1/conversations
Overzicht van gesprekken voor de bot die aan je sleutel is gekoppeld, over alle bronnen heen (widget, WhatsApp, API, enz.).
Query parameters
limit- 1-100, standaard 20. Waarden buiten het bereik worden begrensd.cursor- ondoorzichtige waarde die op de vorige pagina werd geretourneerd innextCursor. Laat leeg voor de eerste pagina.
Response body (200)
{
"data": [
{
"conversationId": "550e8400-e29b-41d4-a716-446655440000",
"createdAt": "2026-05-10T14:11:02Z",
"lastMessageAt": "2026-05-10T14:12:34Z",
"messageCount": 6,
"lastMessagePreview": "Thanks for the help."
}
],
"hasMore": false,
"nextCursor": null
}
lastMessagePreviewwordt afgekapt tot 100 tekens met een...-achtervoegsel.nextCursorisnullop de laatste pagina; geef deze mee alscursorom de volgende op te halen.
GET /v1/conversations/{conversation_id}
Volledige gespreksgeschiedenis.
Response body (200)
{
"conversationId": "550e8400-e29b-41d4-a716-446655440000",
"createdAt": "2026-05-10T14:11:02Z",
"lastMessageAt": "2026-05-10T14:12:34Z",
"messageCount": 6,
"messages": [
{"role": "user", "content": "Hi", "createdAt": "2026-05-10T14:11:02Z"},
{"role": "assistant", "content": "Hello! How can I help?", "createdAt": "2026-05-10T14:11:03Z"}
]
}
Alleen de rollen user en assistant worden geretourneerd; interne system- en tool-berichten worden weggefilterd. Retourneert 404 not_found_error als het gesprek niet hoort bij de bot die aan je sleutel is gekoppeld.
Gebruik het Management API-endpoint GET /v1/management/bots/{bot_id} met een Management-sleutel om de botconfiguratie te inspecteren.
Rate-limit-headers
Antwoorden die de rate-limit-fase bereiken (d.w.z. geslaagd voor authenticatie en IP-whitelist) bevatten:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 57
X-RateLimit-Reset: 1715430000
X-RateLimit-Limit- het daadwerkelijk toegepaste maximum per sleutel voor deze aanroep (standaard 60, of je geconfigureerderateLimitPerMinuteindien lager).X-RateLimit-Remaining- resterende tokens in de bucket direct na deze aanroep.X-RateLimit-Reset- Unix epoch-seconden waarop het volgende token beschikbaar komt (geen volledige bucket-reset; de bucket wordt continu aangevuld). Wanneer de bucket vol is, is dit de huidige tijd.
Bij 429 rate_limit_exceeded-antwoorden wordt ook Retry-After meegestuurd, uitgedrukt in hele seconden totdat er ten minste één token vrijkomt.
Fouten vóór authenticatie (401 missing_api_key, 401 invalid_api_key, 403 ip_blocked) en 403 ip_not_whitelisted bevatten de X-RateLimit-*-headers niet - de limiter wordt pas geraadpleegd nadat de authenticatie en IP-controles zijn geslaagd.
Foutindeling
Alle fouten delen één vaste structuur:
{
"error": {
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded. Try again in 12 seconds.",
"param": null
}
}
Veelvoorkomende HTTP-codes:
400 invalid_request_error- onjuist geformatteerde invoer (codes:invalid_parameter,unsupported_media_type)401 authentication_error- ontbrekende sleutel (missing_api_key), onbekende sleutel (invalid_api_key) of ingetrokken sleutel (revoked_api_key)402 quota_exceeded_error- berichtcredits verbruikt403 permission_error- IP geblokkeerd (ip_blocked), IP niet aanwezig op de whitelist van de sleutel (ip_not_whitelisted) of sleuteltype staat dit endpoint niet toe (key_type_not_allowed,insufficient_permissions)404 not_found_error- gesprek hoort niet bij deze bot405 invalid_request_error(method_not_allowed) - verkeerd HTTP-werkwoord op de URL429 rate_limit_error- te veel verzoeken (rate_limit_exceeded) of te veel gelijktijdige streams (concurrent_streams_exceeded)500 api_error- interne fout
Gerelateerd
Zie de Management API voor bewerkingen op accountniveau (bots aanmaken, bots bijwerken, verbruik ophalen).