Bot Talk API
A Bot Talk API é uma API REST para comunicar com um chatbot específico a partir da sua própria aplicação - aplicações personalizadas, ferramentas internas ou automações que constrói autonomamente. Cria uma chave de API no separador API do bot e, em seguida, chama o endpoint de chat com a chave como token Bearer para obter as respostas do bot, quer como uma resposta única, quer em streaming através de SSE.
Introdução
- Selecione o seu chatbot e navegue até ao separador API na parte superior da página do bot (Select Bot > API [Selecionar bot > API]).
- Clique em Create API Key (Criar chave de API).
O contador junto ao botão mostra quantas chaves estão ativas ("1 de 5 chaves de API ativas"). A ligação View API Documentation (Ver documentação da API) abre esta referência e o fragmento de curl Quick Start (Início rápido) fornece-lhe um exemplo pronto a executar.
- Na caixa de diálogo Create API Key, atribua um nome à chave, defina opcionalmente uma lista de permissões de IP e um limite de pedidos (rate limit), escolha as permissões que terá e clique em Create (Criar).
- Copie a chave completa a partir da caixa de diálogo de sucesso. O texto simples é apresentado apenas uma vez.
Uma chave tem o formato ck_abcdefghijklmnopqrstuvwxyz012345. Cada chave pertence a esse bot específico, pelo que cada pedido efetuado com a chave comunica com esse bot - o bot é identificado pela chave e nunca aparece no URL.
- A partir do seu servidor, execute o exemplo de curl abaixo com a sua chave e uma mensagem de teste curta. Guarde o
conversationIddevolvido e reutilize-o para uma mensagem de seguimento. Confirme a resposta e a conversa no separador Chatlogs (Registos de chat) do bot.
Mantenha as chaves ck_ no seu servidor e não no JavaScript do site ou em pacotes de aplicações móveis. A permissão Conversations concede acesso às conversas guardadas deste bot entre diferentes visitantes, pelo que a sua aplicação tem de autorizar cada utilizador final antes de devolver esses dados. Utilize Revoke (Revogar) ou Delete (Eliminar) no separador API para desativar uma chave; nenhuma das ações volta a revelar o seu texto simples.
Antes de começar, crie e treine o seu chatbot e confirme se a sua conta inclui acesso à API e dispõe de créditos de mensagens.
Base URL
https://api.chatlab.com/aichat
Todos os endpoints neste artigo são relativos a este URL base.
Permissões da chave
Cada chave tem uma ou ambas as seguintes permissões, definidas através dos seletores na caixa de diálogo Create API Key:
- Chat (send messages and receive responses) - permite a utilização dos endpoints
/v1/chate/v1/chat/stream. - Conversation history (list and read past conversations) - permite a utilização dos endpoints
/v1/conversations.
O separador API mostra as permissões concedidas a cada chave sob a forma de emblemas Chat e Conversations.
Autenticação
Envie a chave no cabeçalho Authorization em cada pedido:
Authorization: Bearer ck_abcdefghijklmnopqrstuvwxyz012345
Pedidos sem o cabeçalho Authorization: Bearer ... devolvem 401 missing_api_key. Chaves desconhecidas devolvem 401 invalid_api_key; chaves revogadas devolvem 401 revoked_api_key. Cinco tentativas inválidas num minuto a partir do mesmo IP acionam um bloqueio de 60 minutos.
Limites
- Máximo de 5 chaves Bot Talk ativas por bot
- Máximo de 60 pedidos por minuto por chave (token bucket, capacidade de 60, reposição gradual a 1 token por segundo). Configurável para valores inferiores no momento da criação - defina um
rateLimitPerMinutemais baixo e o limite máximo diminui, ajustando a taxa de reposição proporcionalmente. - Tamanho máximo da mensagem de 4000 carateres
- Os fluxos SSE simultâneos por chave estão sujeitos aos limites da sua conta
Endpoints
POST /v1/chat
Envia uma mensagem para o bot e recebe a resposta completa numa única resposta JSON.
Corpo do pedido
{
"message": "Hi, can you help me track my order?",
"conversationId": "550e8400-e29b-41d4-a716-446655440000",
"metadata": {"userEmail": "alice@example.com"}
}
message- string obrigatória, máx. 4000 carateres.conversationId- UUID opcional. Omita para uma nova conversa; reutilize o valor que o servidor devolveu anteriormente para continuar uma conversa existente.metadata- objeto opcional que aceita{source, userName, userEmail, userPhone}. Atualmente, apenasuserEmailé utilizado aqui para derivar o identificador do cliente; o canal é registado como API. Não dependa dos outros campos de metadados para gravação num registo de lead.
Corpo da resposta (200)
{
"message": {"role": "assistant", "content": "Sure, what's your order number?"},
"conversationId": "550e8400-e29b-41d4-a716-446655440000",
"model": "5.6-LUNA",
"usage": {"creditsUsed": 2},
"actions": []
}
message.roleé sempre"assistant";message.contenté a resposta completa.modelé o id do modelo em que o bot foi executado para esta chamada.usage.creditsUsedreporta atualmente 2 mais um por cada chamada de ferramenta (tool call) reportada para um turno concluído. Este contador de resposta não inclui multiplicadores de crédito de modelo/contexto e não deve ser utilizado como o seu registo de faturação. Utilize a utilização da Management API para o consumo da conta e consulte os créditos de mensagens.actionslista as execuções de ferramentas que foram efetuadas durante este turno. Atualmente, apenas são emitidas entradasfunction_call(comtype,name,status: "completed").
POST /v1/chat/stream
Variante de streaming de /v1/chat. Devolve Content-Type: text/event-stream com Server-Sent Events.
Corpo do pedido
A mesma estrutura de POST /v1/chat. O parâmetro stream no corpo não é obrigatório - a utilização deste caminho é o que aciona o SSE.
Corpo da resposta (eventos SSE)
message.reset- descarta o texto acumulado para a resposta atual e recomeça a recolher deltas. Isto pode ocorrer quando a geração é reiniciada; acrescentar ambas as versões mostraria uma resposta duplicada ou substituída.message.delta- fragmento de conteúdo{ "content": "..." }. Vários destes eventos são transmitidos à medida que os tokens chegam.action- execução de ferramenta{ "type", "name", "status": "executing" }. Emitido quando o bot aciona uma chamada de função.message.done- evento final comconversationId,model,usagee (se existirem) a lista deactionsconcluídas.error- enviado se a geração falhar; o fluxo termina em seguida.
Comentários SSE de manutenção de ligação (:keepalive) são enviados a cada 15 segundos durante gerações longas. Tempos limite do lado do servidor: 30 segundos para o primeiro token, 120 segundos no total por fluxo.
Exemplo de curl
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
Lista as conversas do bot associado à sua chave, em todas as origens (widget, WhatsApp, API, etc.).
Parâmetros de consulta
limit- 1-100, padrão 20. Os valores fora do intervalo são ajustados aos limites.cursor- valor opaco devolvido emnextCursorna página anterior. Omita para a primeira página.
Corpo da resposta (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
}
lastMessagePreviewé truncado para 100 carateres com um sufixo....nextCursorénullna última página; envie-o comocursorpara obter a página seguinte.
GET /v1/conversations/{conversation_id}
Mensagens de conversas guardadas disponibilizadas por este endpoint.
Corpo da resposta (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"}
]
}
Apenas as funções user e assistant são devolvidas; as mensagens internas de system e de ferramentas são filtradas. Devolve 404 not_found_error se a conversa não pertencer ao bot associado à sua chave.
Para inspecionar a configuração do bot, utilize o endpoint da Management API GET /v1/management/bots/{bot_id} com uma chave Management.
Cabeçalhos de limite de pedidos
As respostas que atingem a fase de verificação de limites (ou seja, passaram a autenticação e a lista de permissões de IP) incluem:
X-RateLimit-Limit: 60
X-RateLimit-Remaining: 57
X-RateLimit-Reset: 1715430000
X-RateLimit-Limit- o limite por chave efetivamente aplicado a esta chamada (60 por padrão, ou o valor configurado emrateLimitPerMinutese for inferior).X-RateLimit-Remaining- tokens restantes no balde imediatamente após esta chamada.X-RateLimit-Reset- segundos da época Unix em que o próximo token fica disponível (não representa uma reposição completa do balde; o balde recarrega continuamente). Quando o balde está cheio, este valor corresponde à hora atual.
Em respostas 429 rate_limit_exceeded, o cabeçalho Retry-After também é incluído, expresso em segundos inteiros até que pelo menos um token fique disponível.
Erros prévios à autenticação (401 missing_api_key, 401 invalid_api_key, 403 ip_blocked) e 403 ip_not_whitelisted não incluem os cabeçalhos X-RateLimit-* - o limitador só é consultado após a conclusão com sucesso da autenticação e das verificações de IP.
Formato de erro
Todos os erros partilham um envelope único:
{
"error": {
"type": "rate_limit_error",
"code": "rate_limit_exceeded",
"message": "Rate limit exceeded. Try again in 12 seconds.",
"param": null
}
}
Códigos HTTP comuns:
400 invalid_request_error- entrada malformada (invalid_parameter)415 invalid_request_error- tipo de conteúdo não suportado (unsupported_media_type)401 authentication_error- chave em falta (missing_api_key), chave desconhecida (invalid_api_key) ou chave revogada (revoked_api_key)402 quota_exceeded_error- créditos de mensagens esgotados403 permission_error- IP bloqueado (ip_blocked), IP não constante da lista de permissões da chave (ip_not_whitelisted) ou o tipo de chave não permite este endpoint (key_type_not_allowed,insufficient_permissions)404 not_found_error- a conversa não pertence a este bot405 invalid_request_error(method_not_allowed) - método HTTP incorreto no URL429 rate_limit_error- pedidos em excesso (rate_limit_exceeded) ou demasiados fluxos simultâneos (concurrent_streams_exceeded)500 api_error- erro interno
Relacionado
Para operações ao nível da conta (criar bots, atualizar bots, consultar utilização), consulte a Management API.