Visão geral
A API de handshake do FluidTalk permite que um bot externo controle um persona+engine em tempo real. Para cada mensagem recebida (ou evento) você faz uma pequena chamada HTTP; o FluidTalk retorna a próxima resposta, a foto a enviar e o estado da conversa. Você mantém sua própria lógica — quando abrir um chat, quando fazer o follow-up, onde entregar as mensagens — e o FluidTalk decide o que o persona diz em seguida.
Todos os endpoints ficam sob a URL base https://api-talk.fluidvip.com e usam multipart/form-data para que você possa enviar texto e uma imagem binária em uma única requisição. Se preferir não lidar manualmente com HTTP, auth e multipart, um SDK em TypeScript e um em Python encapsulam esses endpoints.
Autenticação
Autentique cada requisição com sua chave secreta no header X-API-Key . Uma chave é vinculada a um único persona e um único engine — esse par é o que diz ao FluidTalk qual personagem interpretar e qual lógica de conversa executar. Você cria e vincula chaves no dashboard (Wiring Lab); as chaves API concedem acesso apenas a conversas e não podem alterar sua estratégia, personas ou cobrança.
X-API-Key: ft_sk_live_YOUR_KEYUma chave deve ser vinculada a um persona
Se a chave não estiver vinculada a um persona, os endpoints de handshake retornam 400 ("Esta chave API não está vinculada a um persona específico"). Vincule a chave a um persona + engine no Wiring Lab antes de colocar em produção — veja Colocar em produção.
POST /api/v1/bot/chat
Use isso quando um lead envia a primeira mensagem (um DM recebido) ou para continuar uma conversa em andamento. O primeiro recebimento de um novo target abre na fase de início padrão do seu engine; reutilize o mesmo target para o mesmo lead e o engine mantém sua fase e estado entre os turnos.
Campos do formulário:
target(obrigatório) — o identificador do lead. Reutilize para continuar a mesma conversa.message(obrigatório) — o texto da mensagem do lead.own_username(opcional) — sua conta de envio, usada para rastreamento e filtragem de leads duplicados.image_url(opcional) — uma URL de imagem que o AI deve "ver" para contexto visual.file(opcional) — uma imagem binária, como alternativa aoimage_url.
A resposta inclui:
reply— o texto completo da resposta.replies[]— a resposta dividida em bolhas; envie cada uma como sua própria mensagem.should_send_photo/photo_url— quandoshould_send_photofor verdadeiro, busquephoto_urle envie como imagem.session_id— o identificador da conversa.ignored/ignore_reason— quandoignoredfor verdadeiro, não envie nada (veja Comportamentos abaixo).
curl -X POST https://api-talk.fluidvip.com/api/v1/bot/chat \
-H "X-API-Key: ft_sk_live_YOUR_KEY" \
-F "target=@john_doe" \
-F "own_username=@my_bot_account" \
-F "message=wow you look great today!" \
-F "file=@/path/to/screenshot.jpg"{
"reply": "Thank you so much! I was really feeling the outfit",
"replies": ["Thank you so much!", "I was really feeling the outfit"],
"should_send_photo": false,
"photo_url": null,
"session_id": "550e8400-e29b-41d4-a716-446655440000",
"ignored": false,
"ignore_reason": null
}Uma sessão concluída retorna 400 — pare de enviar
Quando uma conversa é finalizada (convertida ou com seu orçamento esgotado) a próxima chamada para aquele target retorna 400 "This session is DONE". Pare de enviar mensagens para esse lead em vez de tentar novamente.
POST /api/v1/bot/action
Use isso para acionar comportamentos orientados pelo engine em vez de retransmitir uma mensagem recebida. O campo action seleciona o comportamento:
OUTREACH— inicia uma conversa fria completamente nova (um opener do AI). Anexar uma captura de tela do perfil viafilepermite que o engine leia pistas visuais.FOLLOW_UP— envia um lembrete contextual quando um lead some. Requer uma conversa existente para aqueletarget(caso contrário,404).ENTRY_POINT— aciona uma entrada orientada por evento personalizado. Passeentry_type(deve existir na configuração do engine) e umentry_contextJSON opcional de contexto.
Campos do formulário:
target(obrigatório) — o identificador do lead.action(obrigatório) —OUTREACH | FOLLOW_UP | ENTRY_POINT.own_username(opcional) — sua conta de envio.image_url(opcional) — URL de imagem para contexto visual.entry_type(ENTRY_POINT) — o identificador de entrada configurado.entry_context(ENTRY_POINT, opcional) — uma string JSON de contexto para o evento.file(opcional) — uma imagem binária.
A resposta inclui:
session_id— o identificador da conversa.message— a mensagem a enviar (pode estar vazia quando uma conversa ativa foi continuada para um opener).ignored/ignore_reason— quando a ação foi descartada (veja Comportamentos abaixo).continued/continued_reason— quando uma conversa existente foi continuada em vez de uma nova ser aberta.
curl -X POST https://api-talk.fluidvip.com/api/v1/bot/action \
-H "X-API-Key: ft_sk_live_YOUR_KEY" \
-F "target=@random_lead_99" \
-F "action=ENTRY_POINT" \
-F "own_username=@my_bot_account" \
-F "entry_type=story_reaction" \
-F "entry_context={\"reaction\": \"fire\"}"{
"session_id": "550e8400-e29b-41d4-a716-446655440000",
"message": "Hey! I saw your profile, looks interesting!",
"ignored": false,
"ignore_reason": null,
"continued": false,
"continued_reason": null
}POST /api/v1/bot/upload
Faça upload de uma imagem e receba de volta uma URL hospedada que você pode reutilizar como image_url em chamadas chat ou action posteriores. Este endpoint está disponível apenas para autenticação por chave API (uma sessão do dashboard que tentar usá-lo recebe 403).
curl -X POST https://api-talk.fluidvip.com/api/v1/bot/upload \
-H "X-API-Key: ft_sk_live_YOUR_KEY" \
-F "file=@/path/to/screenshot.jpg"{
"url": "https://.../uploads/abc123.jpg",
"message": "Context media uploaded successfully."
}Comportamentos
ignored— a requisição foi deliberadamente ignorada. O motivo mais comum élead_claimed_by_other_account: o mesmo lead já está sendo atendido por outra conta de envio, então o FluidTalk descarta o duplicado. Quandoignoredfor verdadeiro, não envie nada ao lead.continued— em chamadasactionuma conversa existente foi continuada em vez de uma nova ser aberta (por exemplo,continued_reason: "conversation_already_active"). Para um opener, a mensagem pode estar vazia — mude para o endpointchatpara continuar a conversa.
Códigos de erro
- 400 — a chave não está vinculada a um persona, ou a sessão já está CONCLUÍDA.
- 401 — header
X-API-Key. - 402 — nenhum plano pago ativo, ou sem créditos para iniciar uma nova conversa.
- 403 —
uploadtentativa sem autenticação por chave API. - 404 — persona não encontrado, ou um follow-up sem conversa existente.
- 429 — limite de taxa excedido. Respeite o header
Retry-Aftere aguarde.
Limites de taxa
As rotas de handshake são limitadas por chave API e por IP em uma janela deslizante por minuto, para que um loop fora de controle ou uma chave vazada não gere gastos ilimitados. Exceder qualquer um dos limites retorna 429 com um header Retry-After (em segundos) — aguarde esse tempo antes de tentar novamente. Follow-ups também têm seu próprio cooldown/limite. Construa backoff na sua integração em vez de fazer loop contínuo em 429.
SDKs
Os clientes oficiais encapsulam os três endpoints, o header X-API-Key e uploads multipart, e expõem ignored / continued além de erros tipados:
- TypeScript —
npm install @fluidtalk/sdk - Python —
pip install fluidtalk
import { FluidTalk } from "@fluidtalk/sdk";
const ft = new FluidTalk({ apiKey: process.env.FT_API_KEY!, ownUsername: "@my_account" });
const res = await ft.inboundChat({ target: "@john", message: "hey, saw your post!" });
for (const bubble of res.replies) await myChat.send("@john", bubble);
if (res.shouldSendPhoto && res.photoUrl) await myChat.sendImage("@john", res.photoUrl);Colocar em produção exige um plano pago
O handshake atende tráfego real apenas em um plano pago. Sem um plano ativo (ou quando sem créditos) os endpoints retornam 402, então seu bot para de funcionar no momento em que o plano expira. Veja Cobrança para planos e créditos.
Próximos passos
Gere e vincule uma chave API, depois aponte seu bot para o handshake — veja Colocar em produção. Para entender como as conversas são medidas e o que um plano pago desbloqueia, veja Cobrança.