API flw.chat — referência rápida
Gerado de https://flwchat.readme.io (109 endpoints, 3 serviços). Specs completos em openapi/.
⚠️ Base URL (erro nº 1)
https://api.wts.chat/{core|chat|crm}/{versão}/{recurso}
- O prefixo de serviço é obrigatório.
https://api.wts.chat/v1/channel → 400 badrequest.
O correto é https://api.wts.chat/chat/v1/channel.
api.flw.chat é alias válido do mesmo backend (também exige o prefixo), mas api.wts.chat é o host
canônico — é o que está nos specs. (Verificado por requisição real em 2026-09-15; o exemplo de
curl do guia "Criar token" mostra api.flw.chat/v1/channel, que está errado — não copie de lá.)
- Nunca invente
api.flw.chat/v1/... nem flwchat.readme.io como host de API.
| Serviço |
Base |
O que vive aqui |
core |
https://api.wts.chat/core |
contatos, etiquetas, campos personalizados, usuários, equipes, carteiras, arquivos, webhooks, horário de atendimento |
chat |
https://api.wts.chat/chat |
conversas, mensagens, envios, templates, chatbots, canais, sequências, mensagens agendadas |
crm |
https://api.wts.chat/crm |
painéis (funis), cards, anotações, motivos de perda |
Autenticação
Token permanente gerado em Ajustes > Integrações > Integração via API. Em toda requisição:
Authorization: Bearer pn_xxxxxxxxxxxxxxxxxxxxxx
Sem Bearer, ou com token inválido/revogado → 401 com key: ERROR_UNAUTHORIZED.
Paginação
Listagens usam pageNumber e pageSize (máx. 100) — query string nos GET, corpo nos POST /filter.
Mantenha pageSize constante ao iterar, senão pageNumber devolve resultados deslocados.
// resposta
{ "pageNumber": 1, "pageSize": 50, "totalPages": 5, "totalItems": 250,
"hasMorePages": true, "items": [ /* ... */ ] }
Itere enquanto hasMorePages === true.
Rate limiting — dois regimes distintos
| Escopo |
Limite |
| API em geral (por conta) |
1.000 req / 5 min + burst 200 req / 5 s |
Família POST/GET /chat/v1/send/* |
1.000 req / 2 min (limite próprio, independente) |
Excedeu → 429 Too Many Requests. Implemente backoff exponencial; não repita imediatamente.
Envelope de erro
Todos os erros (4xx e 5xx) voltam nesta forma — guarde id.shortValue para abrir suporte:
{ "id": { "value": "c44bf0cc-...", "shortValue": "c44bf0cc" },
"httpStatusCode": 401, "error": true, "date": "2026-09-15T19:41:56Z",
"key": "ERROR_UNAUTHORIZED", "text": "Acesso negado", "isUnsolvableError": false }
Nos specs aparece como InternalException; ProblemDetails (RFC 7807) é o formato de validação em alguns 400.
Atenção: rota inexistente sem token retorna 401, não 404 — a autenticação roda antes do roteamento.
Convenções
- Telefone:
+55|11999999999 (DDI, pipe, número sem máscara) — formato de phonenumber.
to = número de telefone ou @usuarioinstagram do destinatário. from = número/@usuario do
canal da conta que envia (liste em GET /chat/v1/channel); omitido, a plataforma resolve o canal.
- IDs: UUID v4. Datas: ISO-8601 UTC (
2026-09-15T19:41:56.925079Z).
senderId: seu ID próprio, opcional em qualquer envio — serve para rastrear a mensagem depois sem guardar o ID da plataforma.
sessionMetadata: chave-valor livre, acessível como variável no chatbot e devolvido nos webhooks.
Qual endpoint de envio usar
São três superfícies sobrepostas. Regra prática:
| Situação |
Use |
| Disparo novo (padrão, use este) |
POST /chat/v1/send/{text,image,audio,video,document,template,otp,typing} |
| Responder dentro de uma conversa que você já tem o ID |
POST /chat/v1/session/{id}/message |
| Envio genérico legado (payload polimórfico) |
POST /chat/v1/message/send |
| Lote (até 100 destinatários) |
POST /chat/v1/send/template/batch · POST /chat/v1/send/chatbot/batch |
| Precisa do status na mesma chamada |
variantes /sync (/chat/v1/message/send-sync, /chat/v1/session/{id}/message/sync) — teto de 25 s |
Regras que valem para todos os envios:
- No WhatsApp, conversa só pode ser iniciada com template (regra repetida em todos os endpoints de envio).
Sem conversa aberta,
POST /chat/v1/send/text é recusado — use POST /chat/v1/send/template com um
templateId de GET /chat/v1/template e parameters preenchido. Texto livre só depois que o contato
responde (janela de atendimento do WhatsApp, 24 h).
- Contato inexistente é criado automaticamente antes do envio. Não precisa criar antes.
- Envio é assíncrono por padrão: a resposta traz
id e status inicial, não a entrega.
Acompanhe por GET /chat/v1/send/message/{id} (ou GET /chat/v1/message/{id}/status), ou passe
callbackUrl no corpo e receba o webhook de entrega/falha.
status de mensagem ∈ PROCESSING | SAVED | QUEUED | SENT | DELIVERED | READ | FAILED | DELETED | WAIT_REPLY;
falha explica em failedReason. OTP usa outro enum: UNDEFINED | PENDING | SENT | RECEIVED | FAILED
(consulta em GET /chat/v1/send/otp/{id}, que aceita o ID da mensagem ou o seu senderId).
options controla o atendimento criado: enableBot, hiddenSession, forceStartSession, user, department.
delayTyping (≤ 25 s) simula "digitando" antes de entregar. Em canal CloudAPI oficial prefira
POST /chat/v1/send/typing.
refId responde a uma mensagem específica (reply).
Enviar arquivo — 3 passos
fileIdOrUrl aceita URL pública (caminho curto, nada a fazer) ou um FileId da plataforma.
Para o FileId, que é reutilizável indefinidamente:
# 1. pede a URL de upload (Type: UNDEFINED|PDF|EXCEL|WORD|IMAGE|AUDIO|VIDEO|DOCUMENT)
curl -H "Authorization: Bearer $TOKEN" \
"https://api.wts.chat/core/v2/file?Type=IMAGE&Name=foto.jpg&MimeType=image/jpeg"
# -> { "tempFileId": "...", "urlUpload": "https://..." }
# 2. sobe o conteúdo com PUT na urlUpload (sem header de Authorization)
curl -X PUT --upload-file foto.jpg "$URL_UPLOAD"
# 3. confirma e recebe o FileId definitivo
curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
-d '{"tempFileId":"..."}' https://api.wts.chat/core/v2/file
# -> { "id": "FILE_ID", "name": ..., "mimeType": ..., "size": ... }
IMAGE e VIDEO passam por transformação/compressão para compatibilidade entre canais; DOCUMENT não.
Webhooks
Assine por API (POST /core/v1/webhook/subscription) ou em Ajustes > Integrações > Webhooks.
A plataforma faz POST na sua URL pública com:
{ "eventType": "CONTACT_UPDATE", "date": "2026-09-15T16:42:35.4359934Z", "content": { } }
Eventos assináveis (enum fixo, de GET /core/v1/webhook/event):
SESSION_NEW SESSION_UPDATE SESSION_COMPLETE
MESSAGE_RECEIVED MESSAGE_UPDATED MESSAGE_SENT
CONTACT_NEW CONTACT_UPDATE CONTACT_TAG_UPDATE
PAYMENT_NEW PAYMENT_UPDATE
PANEL_CARD_NEW PANEL_CARD_UPDATE PANEL_CARD_STEP_CHANGE
PANEL_CARD_NOTE_NEW PANEL_CARD_NOTE_UPDATE
Assinatura pode ser desativada (pausa) sem ser removida. callbackUrl nos envios é um webhook
pontual por mensagem, independente das assinaturas.
Exemplo mínimo
# template (único jeito de iniciar conversa no WhatsApp)
curl -X POST https://api.wts.chat/chat/v1/send/template \
-H "Authorization: Bearer $FLW_TOKEN" -H "Content-Type: application/json" \
-d '{
"to": "+55|11999999999",
"templateId": "UUID_DO_TEMPLATE",
"parameters": { "1": "João", "2": "12345" },
"senderId": "pedido-9876",
"options": { "enableBot": true }
}'
Onde achar o resto
reference/*.md — 19 arquivos por domínio: todo campo de todo endpoint, com tipo, obrigatoriedade,
descrição e enums, mais os schemas usados. É onde olhar antes de montar um payload.
openapi/{core,chat,crm}.json — specs completos. Fonte de verdade para codegen/Postman.
llms-full.md — tudo acima num arquivo só, para colar em janela de contexto.
guides/ — páginas conceituais e tutoriais originais (auth, paginação, rate limit, webhooks, UTM, N8N, MAKE, firewall, login integrado).
index.json — as 109 operações em JSON (método, path, resumo, tag, página de origem).
python3 build.py regenera tudo da documentação publicada.
Índice de endpoints
Paths abaixo já incluem o prefixo de serviço — cole direto após https://api.wts.chat.
CORE — https://api.wts.chat/core
Arquivos
| Método |
Path |
O que faz |
Doc |
GET |
/core/v2/file |
Obter url para upload |
↗ |
POST |
/core/v2/file |
Salvar arquivo |
↗ |
Campos
| Método |
Path |
O que faz |
Doc |
GET |
/core/v1/custom-field |
Listar |
↗ |
Carteiras
| Método |
Path |
O que faz |
Doc |
GET |
/core/v1/portfolio |
Listar |
↗ |
DELETE |
/core/v1/portfolio/{id}/contact |
Remover contato |
↗ |
GET |
/core/v1/portfolio/{id}/contact |
Listar contatos |
↗ |
POST |
/core/v1/portfolio/{id}/contact |
Adicionar contato |
↗ |
DELETE |
/core/v1/portfolio/{id}/contact/batch |
Remover contatos |
↗ |
POST |
/core/v1/portfolio/{id}/contact/batch |
Adicionar contatos |
↗ |
Contatos
| Método |
Path |
O que faz |
Doc |
GET |
/core/v1/contact |
Listar |
↗ |
POST |
/core/v1/contact |
Criar |
↗ |
GET |
/core/v1/contact/custom-field |
Campos personalizados |
↗ |
POST |
/core/v1/contact/filter |
Filtrar |
↗ |
GET |
/core/v1/contact/phonenumber/{phone} |
Obter por Número de telefone |
↗ |
PUT |
/core/v1/contact/phonenumber/{phone} |
Atualizar por Número de telefone |
↗ |
POST |
/core/v1/contact/phonenumber/{phone}/tags |
Atualizar etiquetas por Número de telefone |
↗ |
GET |
/core/v1/contact/{id} |
Obter por ID |
↗ |
POST |
/core/v1/contact/{id}/tags |
Atualizar etiquetas |
↗ |
POST |
/core/v2/contact/batch |
Salvar em massa |
↗ |
PUT |
/core/v2/contact/{id} |
Atualizar |
↗ |
Equipes
| Método |
Path |
O que faz |
Doc |
POST |
/core/v1/department |
Criar |
↗ |
DELETE |
/core/v1/department/{id} |
Excluir |
↗ |
GET |
/core/v1/department/{id} |
Obter por ID |
↗ |
PUT |
/core/v1/department/{id} |
Atualizar |
↗ |
PUT |
/core/v1/department/{id}/agents |
Atualizar usuários |
↗ |
GET |
/core/v1/department/{id}/channel |
Listar canais |
↗ |
GET |
/core/v2/department |
Listar |
↗ |
Etiquetas
| Método |
Path |
O que faz |
Doc |
GET |
/core/v1/tag |
Listar |
↗ |
POST |
/core/v1/tag |
Criar |
↗ |
GET |
/core/v1/tag/color |
Listar cores |
↗ |
DELETE |
/core/v1/tag/{id} |
Excluir |
↗ |
PUT |
/core/v1/tag/{id} |
Atualizar |
↗ |
Horários de Atendimento
| Método |
Path |
O que faz |
Doc |
GET |
/core/v1/company/officehours |
Obter |
↗ |
Usuários
| Método |
Path |
O que faz |
Doc |
GET |
/core/v1/agent |
Listar |
↗ |
POST |
/core/v1/agent |
Criar |
↗ |
DELETE |
/core/v1/agent/{id} |
Excluir |
↗ |
GET |
/core/v1/agent/{id} |
Obter por ID |
↗ |
PUT |
/core/v1/agent/{id} |
Atualizar |
↗ |
POST |
/core/v1/agent/{id}/departments |
Atualizar equipes |
↗ |
POST |
/core/v1/agent/{id}/logout |
Fazer logout |
↗ |
POST |
/core/v1/agent/{id}/status |
Alterar status |
↗ |
Webhooks
| Método |
Path |
O que faz |
Doc |
GET |
/core/v1/webhook/event |
Listar eventos |
↗ |
GET |
/core/v1/webhook/subscription |
Listar assinaturas |
↗ |
POST |
/core/v1/webhook/subscription |
Cria assinatura |
↗ |
DELETE |
/core/v1/webhook/subscription/{subscriptionId} |
Remove assinatura |
↗ |
GET |
/core/v1/webhook/subscription/{subscriptionId} |
Busca assinatura por ID |
↗ |
PUT |
/core/v1/webhook/subscription/{subscriptionId} |
Atualiza assinatura |
↗ |
CHAT — https://api.wts.chat/chat
Canais de Atendimento
| Método |
Path |
O que faz |
Doc |
GET |
/chat/v1/channel |
Listar |
↗ |
Chatbots
| Método |
Path |
O que faz |
Doc |
GET |
/chat/v1/chatbot |
Listar |
↗ |
POST |
/chat/v1/chatbot/send |
Enviar chatbot |
↗ |
Conversas
| Método |
Path |
O que faz |
Doc |
DELETE |
/chat/v1/session/note/{id} |
Excluir uma nota interna |
↗ |
GET |
/chat/v1/session/note/{id} |
Obter uma nota interna |
↗ |
PUT |
/chat/v1/session/{id}/assignee |
Atribuir usuário |
↗ |
PUT |
/chat/v1/session/{id}/complete |
Concluir |
↗ |
GET |
/chat/v1/session/{id}/message |
Listar mensagens |
↗ |
POST |
/chat/v1/session/{id}/message |
Enviar mensagem |
↗ |
POST |
/chat/v1/session/{id}/message/sync |
Enviar mensagem síncrona |
↗ |
GET |
/chat/v1/session/{id}/note |
Listar notas internas |
↗ |
POST |
/chat/v1/session/{id}/note |
Salvar nota interna |
↗ |
PUT |
/chat/v1/session/{id}/status |
Alterar status |
↗ |
PUT |
/chat/v1/session/{id}/transfer |
Transferir |
↗ |
GET |
/chat/v2/session |
Listar |
↗ |
GET |
/chat/v2/session/{id} |
Obter por ID |
↗ |
PUT |
/chat/v2/session/{id}/partial |
Alterar |
↗ |
Envios (Msg/Otp/Bot)
| Método |
Path |
O que faz |
Doc |
POST |
/chat/v1/send/audio |
Áudio |
↗ |
POST |
/chat/v1/send/chatbot |
Chatbot |
↗ |
POST |
/chat/v1/send/chatbot/batch |
Chatbot (em lote) |
↗ |
GET |
/chat/v1/send/chatbot/{id} |
Chatbot status |
↗ |
POST |
/chat/v1/send/document |
Documento |
↗ |
POST |
/chat/v1/send/image |
Imagem |
↗ |
GET |
/chat/v1/send/message/{id} |
Mensagem status |
↗ |
POST |
/chat/v1/send/otp |
OTP |
↗ |
GET |
/chat/v1/send/otp/{id} |
OTP status |
↗ |
POST |
/chat/v1/send/template |
Modelo |
↗ |
POST |
/chat/v1/send/template/batch |
Modelo (em lote) |
↗ |
POST |
/chat/v1/send/text |
Texto |
↗ |
POST |
/chat/v1/send/typing |
Digitando |
↗ |
POST |
/chat/v1/send/video |
Vídeo |
↗ |
Mensagens
| Método |
Path |
O que faz |
Doc |
GET |
/chat/v1/message |
Listar |
↗ |
POST |
/chat/v1/message/send |
Enviar |
↗ |
POST |
/chat/v1/message/send-sync |
Enviar síncrono |
↗ |
DELETE |
/chat/v1/message/{id} |
Excluir mensagem |
↗ |
GET |
/chat/v1/message/{id} |
Obter por ID |
↗ |
GET |
/chat/v1/message/{id}/status |
Obter status por ID |
↗ |
Mensagens Agendadas
| Método |
Path |
O que faz |
Doc |
GET |
/chat/v1/scheduled-message |
Listar |
↗ |
POST |
/chat/v1/scheduled-message |
Criar |
↗ |
POST |
/chat/v1/scheduled-message/batch-cancel |
Cancelar em massa |
↗ |
GET |
/chat/v1/scheduled-message/{id} |
Obter por ID |
↗ |
PUT |
/chat/v1/scheduled-message/{id} |
Atualizar |
↗ |
POST |
/chat/v1/scheduled-message/{id}/cancel |
Cancelar |
↗ |
Modelos de Mensagem
| Método |
Path |
O que faz |
Doc |
GET |
/chat/v1/template |
Listar |
↗ |
Sequências
| Método |
Path |
O que faz |
Doc |
GET |
/chat/v1/sequence |
Listar |
↗ |
DELETE |
/chat/v1/sequence/{id}/contact |
Remover contato |
↗ |
POST |
/chat/v1/sequence/{id}/contact |
Adicionar contato |
↗ |
DELETE |
/chat/v1/sequence/{id}/contact/batch |
Remover contatos |
↗ |
POST |
/chat/v1/sequence/{id}/contact/batch |
Adicionar contatos |
↗ |
GET |
/chat/v2/sequence/{id}/contact |
Listar contatos |
↗ |
CRM — https://api.wts.chat/crm
Cards
| Método |
Path |
O que faz |
Doc |
GET |
/crm/v1/panel/card/{cardId}/note |
Listar anotações |
↗ |
POST |
/crm/v1/panel/card/{cardId}/note |
Adicionar anotação |
↗ |
DELETE |
/crm/v1/panel/card/{cardId}/note/{noteId} |
Remover anotação |
↗ |
GET |
/crm/v2/panel/card |
Listar |
↗ |
POST |
/crm/v2/panel/card |
Criar |
↗ |
GET |
/crm/v2/panel/card/{id} |
Obter por ID |
↗ |
POST |
/crm/v2/panel/card/{id}/duplicate |
Duplicar |
↗ |
PUT |
/crm/v3/panel/card/{id} |
Atualizar |
↗ |
Painéis
| Método |
Path |
O que faz |
Doc |
GET |
/crm/v1/panel/{id} |
Obter por ID |
↗ |
GET |
/crm/v1/panel/{id}/custom-fields |
Campos personalizados |
↗ |
GET |
/crm/v1/panel/{id}/lost-reason |
Listar motivos de perda |
↗ |
GET |
/crm/v2/panel |
Listar painéis |
↗ |
1---2name: flwchat-api3description: API flw.chat / wts.chat (atendimento WhatsApp, Instagram, Messenger) - autenticacao, rate limits, envio de mensagens e templates, contatos, conversas, chatbots, webhooks, CRM. Use ao integrar, depurar ou gerar codigo para qualquer endpoint api.wts.chat.4---56# API flw.chat — referência rápida78> Gerado de https://flwchat.readme.io (109 endpoints, 3 serviços). Specs completos em `openapi/`.910## ⚠️ Base URL (erro nº 1)1112```13https://api.wts.chat/{core|chat|crm}/{versão}/{recurso}14```1516- **O prefixo de serviço é obrigatório.** `https://api.wts.chat/v1/channel` → `400 badrequest`.17 O correto é `https://api.wts.chat/chat/v1/channel`.18- `api.flw.chat` é alias válido do mesmo backend (também exige o prefixo), mas **`api.wts.chat` é o host19 canônico** — é o que está nos specs. *(Verificado por requisição real em 2026-09-15; o exemplo de20 curl do guia "Criar token" mostra `api.flw.chat/v1/channel`, que está errado — não copie de lá.)*21- Nunca invente `api.flw.chat/v1/...` nem `flwchat.readme.io` como host de API.2223| Serviço | Base | O que vive aqui |24|---|---|---|25| `core` | `https://api.wts.chat/core` | contatos, etiquetas, campos personalizados, usuários, equipes, carteiras, arquivos, webhooks, horário de atendimento |26| `chat` | `https://api.wts.chat/chat` | conversas, mensagens, envios, templates, chatbots, canais, sequências, mensagens agendadas |27| `crm` | `https://api.wts.chat/crm` | painéis (funis), cards, anotações, motivos de perda |2829## Autenticação3031Token permanente gerado em `Ajustes > Integrações > Integração via API`. Em **toda** requisição:3233```34Authorization: Bearer pn_xxxxxxxxxxxxxxxxxxxxxx35```3637Sem `Bearer`, ou com token inválido/revogado → `401` com `key: ERROR_UNAUTHORIZED`.3839## Paginação4041Listagens usam `pageNumber` e `pageSize` (**máx. 100**) — query string nos `GET`, corpo nos `POST /filter`.42Mantenha `pageSize` constante ao iterar, senão `pageNumber` devolve resultados deslocados.4344```jsonc45// resposta46{ "pageNumber": 1, "pageSize": 50, "totalPages": 5, "totalItems": 250,47 "hasMorePages": true, "items": [ /* ... */ ] }48```4950Itere enquanto `hasMorePages === true`.5152## Rate limiting — dois regimes distintos5354| Escopo | Limite |55|---|---|56| API em geral (por conta) | **1.000 req / 5 min** + burst **200 req / 5 s** |57| Família `POST/GET /chat/v1/send/*` | **1.000 req / 2 min** (limite próprio, independente) |5859Excedeu → `429 Too Many Requests`. Implemente backoff exponencial; não repita imediatamente.6061## Envelope de erro6263Todos os erros (4xx e 5xx) voltam nesta forma — guarde `id.shortValue` para abrir suporte:6465```json66{ "id": { "value": "c44bf0cc-...", "shortValue": "c44bf0cc" },67 "httpStatusCode": 401, "error": true, "date": "2026-09-15T19:41:56Z",68 "key": "ERROR_UNAUTHORIZED", "text": "Acesso negado", "isUnsolvableError": false }69```7071Nos specs aparece como `InternalException`; `ProblemDetails` (RFC 7807) é o formato de validação em alguns 400.72**Atenção:** rota inexistente sem token retorna `401`, não `404` — a autenticação roda antes do roteamento.7374## Convenções7576- **Telefone**: `+55|11999999999` (DDI, pipe, número sem máscara) — formato de `phonenumber`.77- `to` = número de telefone **ou** `@usuarioinstagram` do destinatário. `from` = número/`@usuario` do78 **canal** da conta que envia (liste em `GET /chat/v1/channel`); omitido, a plataforma resolve o canal.79- **IDs**: UUID v4. **Datas**: ISO-8601 UTC (`2026-09-15T19:41:56.925079Z`).80- `senderId`: seu ID próprio, opcional em qualquer envio — serve para rastrear a mensagem depois sem guardar o ID da plataforma.81- `sessionMetadata`: chave-valor livre, acessível como variável no chatbot e devolvido nos webhooks.8283## Qual endpoint de envio usar8485São **três superfícies sobrepostas**. Regra prática:8687| Situação | Use |88|---|---|89| Disparo novo (padrão, use este) | `POST /chat/v1/send/{text,image,audio,video,document,template,otp,typing}` |90| Responder dentro de uma conversa que você já tem o ID | `POST /chat/v1/session/{id}/message` |91| Envio genérico legado (payload polimórfico) | `POST /chat/v1/message/send` |92| Lote (até 100 destinatários) | `POST /chat/v1/send/template/batch` · `POST /chat/v1/send/chatbot/batch` |93| Precisa do status **na mesma chamada** | variantes `/sync` (`/chat/v1/message/send-sync`, `/chat/v1/session/{id}/message/sync`) — teto de **25 s** |9495**Regras que valem para todos os envios:**96971. **No WhatsApp, conversa só pode ser *iniciada* com template** (regra repetida em todos os endpoints de envio).98 Sem conversa aberta, `POST /chat/v1/send/text` é recusado — use `POST /chat/v1/send/template` com um99 `templateId` de `GET /chat/v1/template` e `parameters` preenchido. Texto livre só depois que o contato100 responde (janela de atendimento do WhatsApp, 24 h).1012. **Contato inexistente é criado automaticamente** antes do envio. Não precisa criar antes.1023. Envio é **assíncrono** por padrão: a resposta traz `id` e `status` inicial, não a entrega.103 Acompanhe por `GET /chat/v1/send/message/{id}` (ou `GET /chat/v1/message/{id}/status`), ou passe104 `callbackUrl` no corpo e receba o webhook de entrega/falha.105 `status` de mensagem ∈ `PROCESSING | SAVED | QUEUED | SENT | DELIVERED | READ | FAILED | DELETED | WAIT_REPLY`;106 falha explica em `failedReason`. **OTP usa outro enum**: `UNDEFINED | PENDING | SENT | RECEIVED | FAILED`107 (consulta em `GET /chat/v1/send/otp/{id}`, que aceita o ID da mensagem **ou** o seu `senderId`).1084. `options` controla o atendimento criado: `enableBot`, `hiddenSession`, `forceStartSession`, `user`, `department`.1095. `delayTyping` (≤ 25 s) simula "digitando" antes de entregar. Em canal CloudAPI oficial prefira110 `POST /chat/v1/send/typing`.1116. `refId` responde a uma mensagem específica (reply).112113## Enviar arquivo — 3 passos114115`fileIdOrUrl` aceita **URL pública** (caminho curto, nada a fazer) ou um **FileId** da plataforma.116Para o FileId, que é reutilizável indefinidamente:117118```bash119# 1. pede a URL de upload (Type: UNDEFINED|PDF|EXCEL|WORD|IMAGE|AUDIO|VIDEO|DOCUMENT)120curl -H "Authorization: Bearer $TOKEN" \121 "https://api.wts.chat/core/v2/file?Type=IMAGE&Name=foto.jpg&MimeType=image/jpeg"122# -> { "tempFileId": "...", "urlUpload": "https://..." }123124# 2. sobe o conteúdo com PUT na urlUpload (sem header de Authorization)125curl -X PUT --upload-file foto.jpg "$URL_UPLOAD"126127# 3. confirma e recebe o FileId definitivo128curl -X POST -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \129 -d '{"tempFileId":"..."}' https://api.wts.chat/core/v2/file130# -> { "id": "FILE_ID", "name": ..., "mimeType": ..., "size": ... }131```132133`IMAGE` e `VIDEO` passam por transformação/compressão para compatibilidade entre canais; `DOCUMENT` não.134135## Webhooks136137Assine por API (`POST /core/v1/webhook/subscription`) ou em `Ajustes > Integrações > Webhooks`.138A plataforma faz `POST` na sua URL pública com:139140```json141{ "eventType": "CONTACT_UPDATE", "date": "2026-09-15T16:42:35.4359934Z", "content": { } }142```143144Eventos assináveis (enum fixo, de `GET /core/v1/webhook/event`):145146```147SESSION_NEW SESSION_UPDATE SESSION_COMPLETE148MESSAGE_RECEIVED MESSAGE_UPDATED MESSAGE_SENT149CONTACT_NEW CONTACT_UPDATE CONTACT_TAG_UPDATE150PAYMENT_NEW PAYMENT_UPDATE151PANEL_CARD_NEW PANEL_CARD_UPDATE PANEL_CARD_STEP_CHANGE152PANEL_CARD_NOTE_NEW PANEL_CARD_NOTE_UPDATE153```154155Assinatura pode ser desativada (pausa) sem ser removida. `callbackUrl` nos envios é um webhook156pontual por mensagem, independente das assinaturas.157158## Exemplo mínimo159160```bash161# template (único jeito de iniciar conversa no WhatsApp)162curl -X POST https://api.wts.chat/chat/v1/send/template \163 -H "Authorization: Bearer $FLW_TOKEN" -H "Content-Type: application/json" \164 -d '{165 "to": "+55|11999999999",166 "templateId": "UUID_DO_TEMPLATE",167 "parameters": { "1": "João", "2": "12345" },168 "senderId": "pedido-9876",169 "options": { "enableBot": true }170 }'171```172173## Onde achar o resto174175- `reference/*.md` — 19 arquivos por domínio: todo campo de todo endpoint, com tipo, obrigatoriedade,176 descrição e enums, mais os schemas usados. É onde olhar antes de montar um payload.177- `openapi/{core,chat,crm}.json` — specs completos. Fonte de verdade para codegen/Postman.178- `llms-full.md` — tudo acima num arquivo só, para colar em janela de contexto.179- `guides/` — páginas conceituais e tutoriais originais (auth, paginação, rate limit, webhooks, UTM, N8N, MAKE, firewall, login integrado).180- `index.json` — as 109 operações em JSON (método, path, resumo, tag, página de origem).181- `python3 build.py` regenera tudo da documentação publicada.182183## Índice de endpoints184185Paths abaixo já incluem o prefixo de serviço — cole direto após `https://api.wts.chat`.186187<!-- ENDPOINTS:START -->188189### CORE — `https://api.wts.chat/core`190191**Arquivos**192193| Método | Path | O que faz | Doc |194|---|---|---|---|195| `GET` | `/core/v2/file` | Obter url para upload | [↗](https://flwchat.readme.io/reference/get_v2-file) |196| `POST` | `/core/v2/file` | Salvar arquivo | [↗](https://flwchat.readme.io/reference/post_v2-file) |197198**Campos**199200| Método | Path | O que faz | Doc |201|---|---|---|---|202| `GET` | `/core/v1/custom-field` | Listar | [↗](https://flwchat.readme.io/reference/get_v1-custom-field) |203204**Carteiras**205206| Método | Path | O que faz | Doc |207|---|---|---|---|208| `GET` | `/core/v1/portfolio` | Listar | [↗](https://flwchat.readme.io/reference/get_v1-portfolio) |209| `DELETE` | `/core/v1/portfolio/{id}/contact` | Remover contato | [↗](https://flwchat.readme.io/reference/delete_v1-portfolio-id-contact) |210| `GET` | `/core/v1/portfolio/{id}/contact` | Listar contatos | [↗](https://flwchat.readme.io/reference/get_v1-portfolio-id-contact) |211| `POST` | `/core/v1/portfolio/{id}/contact` | Adicionar contato | [↗](https://flwchat.readme.io/reference/post_v1-portfolio-id-contact) |212| `DELETE` | `/core/v1/portfolio/{id}/contact/batch` | Remover contatos | [↗](https://flwchat.readme.io/reference/delete_v1-portfolio-id-contact-batch) |213| `POST` | `/core/v1/portfolio/{id}/contact/batch` | Adicionar contatos | [↗](https://flwchat.readme.io/reference/post_v1-portfolio-id-contact-batch) |214215**Contatos**216217| Método | Path | O que faz | Doc |218|---|---|---|---|219| `GET` | `/core/v1/contact` | Listar | [↗](https://flwchat.readme.io/reference/get_v1-contact) |220| `POST` | `/core/v1/contact` | Criar | [↗](https://flwchat.readme.io/reference/post_v1-contact) |221| `GET` | `/core/v1/contact/custom-field` | Campos personalizados | [↗](https://flwchat.readme.io/reference/get_v1-contact-custom-field) |222| `POST` | `/core/v1/contact/filter` | Filtrar | [↗](https://flwchat.readme.io/reference/post_v1-contact-filter) |223| `GET` | `/core/v1/contact/phonenumber/{phone}` | Obter por Número de telefone | [↗](https://flwchat.readme.io/reference/get_v1-contact-phonenumber-phone) |224| `PUT` | `/core/v1/contact/phonenumber/{phone}` | Atualizar por Número de telefone | [↗](https://flwchat.readme.io/reference/put_v1-contact-phonenumber-phone) |225| `POST` | `/core/v1/contact/phonenumber/{phone}/tags` | Atualizar etiquetas por Número de telefone | [↗](https://flwchat.readme.io/reference/post_v1-contact-phonenumber-phone-tags) |226| `GET` | `/core/v1/contact/{id}` | Obter por ID | [↗](https://flwchat.readme.io/reference/get_v1-contact-id) |227| `POST` | `/core/v1/contact/{id}/tags` | Atualizar etiquetas | [↗](https://flwchat.readme.io/reference/post_v1-contact-id-tags) |228| `POST` | `/core/v2/contact/batch` | Salvar em massa | [↗](https://flwchat.readme.io/reference/post_v2-contact-batch) |229| `PUT` | `/core/v2/contact/{id}` | Atualizar | [↗](https://flwchat.readme.io/reference/put_v2-contact-id) |230231**Equipes**232233| Método | Path | O que faz | Doc |234|---|---|---|---|235| `POST` | `/core/v1/department` | Criar | [↗](https://flwchat.readme.io/reference/post_v1-department) |236| `DELETE` | `/core/v1/department/{id}` | Excluir | [↗](https://flwchat.readme.io/reference/delete_v1-department-id) |237| `GET` | `/core/v1/department/{id}` | Obter por ID | [↗](https://flwchat.readme.io/reference/get_v1-department-id) |238| `PUT` | `/core/v1/department/{id}` | Atualizar | [↗](https://flwchat.readme.io/reference/put_v1-department-id) |239| `PUT` | `/core/v1/department/{id}/agents` | Atualizar usuários | [↗](https://flwchat.readme.io/reference/put_v1-department-id-agents) |240| `GET` | `/core/v1/department/{id}/channel` | Listar canais | [↗](https://flwchat.readme.io/reference/get_v1-department-id-channel) |241| `GET` | `/core/v2/department` | Listar | [↗](https://flwchat.readme.io/reference/get_v2-department) |242243**Etiquetas**244245| Método | Path | O que faz | Doc |246|---|---|---|---|247| `GET` | `/core/v1/tag` | Listar | [↗](https://flwchat.readme.io/reference/get_v1-tag) |248| `POST` | `/core/v1/tag` | Criar | [↗](https://flwchat.readme.io/reference/post_v1-tag) |249| `GET` | `/core/v1/tag/color` | Listar cores | [↗](https://flwchat.readme.io/reference/get_v1-tag-color) |250| `DELETE` | `/core/v1/tag/{id}` | Excluir | [↗](https://flwchat.readme.io/reference/delete_v1-tag-id) |251| `PUT` | `/core/v1/tag/{id}` | Atualizar | [↗](https://flwchat.readme.io/reference/put_v1-tag-id) |252253**Horários de Atendimento**254255| Método | Path | O que faz | Doc |256|---|---|---|---|257| `GET` | `/core/v1/company/officehours` | Obter | [↗](https://flwchat.readme.io/reference/get_v1-company-officehours) |258259**Usuários**260261| Método | Path | O que faz | Doc |262|---|---|---|---|263| `GET` | `/core/v1/agent` | Listar | [↗](https://flwchat.readme.io/reference/get_v1-agent) |264| `POST` | `/core/v1/agent` | Criar | [↗](https://flwchat.readme.io/reference/post_v1-agent) |265| `DELETE` | `/core/v1/agent/{id}` | Excluir | [↗](https://flwchat.readme.io/reference/delete_v1-agent-id) |266| `GET` | `/core/v1/agent/{id}` | Obter por ID | [↗](https://flwchat.readme.io/reference/get_v1-agent-id) |267| `PUT` | `/core/v1/agent/{id}` | Atualizar | [↗](https://flwchat.readme.io/reference/put_v1-agent-id) |268| `POST` | `/core/v1/agent/{id}/departments` | Atualizar equipes | [↗](https://flwchat.readme.io/reference/post_v1-agent-id-departments) |269| `POST` | `/core/v1/agent/{id}/logout` | Fazer logout | [↗](https://flwchat.readme.io/reference/post_v1-agent-id-logout) |270| `POST` | `/core/v1/agent/{id}/status` | Alterar status | [↗](https://flwchat.readme.io/reference/post_v1-agent-id-status) |271272**Webhooks**273274| Método | Path | O que faz | Doc |275|---|---|---|---|276| `GET` | `/core/v1/webhook/event` | Listar eventos | [↗](https://flwchat.readme.io/reference/get_v1-webhook-event) |277| `GET` | `/core/v1/webhook/subscription` | Listar assinaturas | [↗](https://flwchat.readme.io/reference/get_v1-webhook-subscription) |278| `POST` | `/core/v1/webhook/subscription` | Cria assinatura | [↗](https://flwchat.readme.io/reference/post_v1-webhook-subscription) |279| `DELETE` | `/core/v1/webhook/subscription/{subscriptionId}` | Remove assinatura | [↗](https://flwchat.readme.io/reference/delete_v1-webhook-subscription-subscriptionid) |280| `GET` | `/core/v1/webhook/subscription/{subscriptionId}` | Busca assinatura por ID | [↗](https://flwchat.readme.io/reference/get_v1-webhook-subscription-subscriptionid) |281| `PUT` | `/core/v1/webhook/subscription/{subscriptionId}` | Atualiza assinatura | [↗](https://flwchat.readme.io/reference/put_v1-webhook-subscription-subscriptionid) |282283284### CHAT — `https://api.wts.chat/chat`285286**Canais de Atendimento**287288| Método | Path | O que faz | Doc |289|---|---|---|---|290| `GET` | `/chat/v1/channel` | Listar | [↗](https://flwchat.readme.io/reference/get_v1-channel) |291292**Chatbots**293294| Método | Path | O que faz | Doc |295|---|---|---|---|296| `GET` | `/chat/v1/chatbot` | Listar | [↗](https://flwchat.readme.io/reference/get_v1-chatbot) |297| `POST` | `/chat/v1/chatbot/send` | Enviar chatbot | [↗](https://flwchat.readme.io/reference/post_v1-chatbot-send) |298299**Conversas**300301| Método | Path | O que faz | Doc |302|---|---|---|---|303| `DELETE` | `/chat/v1/session/note/{id}` | Excluir uma nota interna | [↗](https://flwchat.readme.io/reference/delete_v1-session-note-id) |304| `GET` | `/chat/v1/session/note/{id}` | Obter uma nota interna | [↗](https://flwchat.readme.io/reference/get_v1-session-note-id) |305| `PUT` | `/chat/v1/session/{id}/assignee` | Atribuir usuário | [↗](https://flwchat.readme.io/reference/put_v1-session-id-assignee) |306| `PUT` | `/chat/v1/session/{id}/complete` | Concluir | [↗](https://flwchat.readme.io/reference/put_v1-session-id-complete) |307| `GET` | `/chat/v1/session/{id}/message` | Listar mensagens | [↗](https://flwchat.readme.io/reference/get_v1-session-id-message) |308| `POST` | `/chat/v1/session/{id}/message` | Enviar mensagem | [↗](https://flwchat.readme.io/reference/post_v1-session-id-message) |309| `POST` | `/chat/v1/session/{id}/message/sync` | Enviar mensagem síncrona | [↗](https://flwchat.readme.io/reference/post_v1-session-id-message-sync) |310| `GET` | `/chat/v1/session/{id}/note` | Listar notas internas | [↗](https://flwchat.readme.io/reference/get_v1-session-id-note) |311| `POST` | `/chat/v1/session/{id}/note` | Salvar nota interna | [↗](https://flwchat.readme.io/reference/post_v1-session-id-note) |312| `PUT` | `/chat/v1/session/{id}/status` | Alterar status | [↗](https://flwchat.readme.io/reference/put_v1-session-id-status) |313| `PUT` | `/chat/v1/session/{id}/transfer` | Transferir | [↗](https://flwchat.readme.io/reference/put_v1-session-id-transfer) |314| `GET` | `/chat/v2/session` | Listar | [↗](https://flwchat.readme.io/reference/get_v2-session) |315| `GET` | `/chat/v2/session/{id}` | Obter por ID | [↗](https://flwchat.readme.io/reference/get_v2-session-id) |316| `PUT` | `/chat/v2/session/{id}/partial` | Alterar | [↗](https://flwchat.readme.io/reference/put_v2-session-id-partial) |317318**Envios (Msg/Otp/Bot)**319320| Método | Path | O que faz | Doc |321|---|---|---|---|322| `POST` | `/chat/v1/send/audio` | Áudio | [↗](https://flwchat.readme.io/reference/post_v1-send-audio) |323| `POST` | `/chat/v1/send/chatbot` | Chatbot | [↗](https://flwchat.readme.io/reference/post_v1-send-chatbot) |324| `POST` | `/chat/v1/send/chatbot/batch` | Chatbot (em lote) | [↗](https://flwchat.readme.io/reference/post_v1-send-chatbot-batch) |325| `GET` | `/chat/v1/send/chatbot/{id}` | Chatbot status | [↗](https://flwchat.readme.io/reference/get_v1-send-chatbot-id) |326| `POST` | `/chat/v1/send/document` | Documento | [↗](https://flwchat.readme.io/reference/post_v1-send-document) |327| `POST` | `/chat/v1/send/image` | Imagem | [↗](https://flwchat.readme.io/reference/post_v1-send-image) |328| `GET` | `/chat/v1/send/message/{id}` | Mensagem status | [↗](https://flwchat.readme.io/reference/get_v1-send-message-id) |329| `POST` | `/chat/v1/send/otp` | OTP | [↗](https://flwchat.readme.io/reference/post_v1-send-otp) |330| `GET` | `/chat/v1/send/otp/{id}` | OTP status | [↗](https://flwchat.readme.io/reference/get_v1-send-otp-id) |331| `POST` | `/chat/v1/send/template` | Modelo | [↗](https://flwchat.readme.io/reference/post_v1-send-template) |332| `POST` | `/chat/v1/send/template/batch` | Modelo (em lote) | [↗](https://flwchat.readme.io/reference/post_v1-send-template-batch) |333| `POST` | `/chat/v1/send/text` | Texto | [↗](https://flwchat.readme.io/reference/post_v1-send-text) |334| `POST` | `/chat/v1/send/typing` | Digitando | [↗](https://flwchat.readme.io/reference/post_v1-send-typing) |335| `POST` | `/chat/v1/send/video` | Vídeo | [↗](https://flwchat.readme.io/reference/post_v1-send-video) |336337**Mensagens**338339| Método | Path | O que faz | Doc |340|---|---|---|---|341| `GET` | `/chat/v1/message` | Listar | [↗](https://flwchat.readme.io/reference/get_v1-message) |342| `POST` | `/chat/v1/message/send` | Enviar | [↗](https://flwchat.readme.io/reference/post_v1-message-send) |343| `POST` | `/chat/v1/message/send-sync` | Enviar síncrono | [↗](https://flwchat.readme.io/reference/post_v1-message-send-sync) |344| `DELETE` | `/chat/v1/message/{id}` | Excluir mensagem | [↗](https://flwchat.readme.io/reference/delete_v1-message-id) |345| `GET` | `/chat/v1/message/{id}` | Obter por ID | [↗](https://flwchat.readme.io/reference/get_v1-message-id) |346| `GET` | `/chat/v1/message/{id}/status` | Obter status por ID | [↗](https://flwchat.readme.io/reference/get_v1-message-id-status) |347348**Mensagens Agendadas**349350| Método | Path | O que faz | Doc |351|---|---|---|---|352| `GET` | `/chat/v1/scheduled-message` | Listar | [↗](https://flwchat.readme.io/reference/get_v1-scheduled-message) |353| `POST` | `/chat/v1/scheduled-message` | Criar | [↗](https://flwchat.readme.io/reference/post_v1-scheduled-message) |354| `POST` | `/chat/v1/scheduled-message/batch-cancel` | Cancelar em massa | [↗](https://flwchat.readme.io/reference/post_v1-scheduled-message-batch-cancel) |355| `GET` | `/chat/v1/scheduled-message/{id}` | Obter por ID | [↗](https://flwchat.readme.io/reference/get_v1-scheduled-message-id) |356| `PUT` | `/chat/v1/scheduled-message/{id}` | Atualizar | [↗](https://flwchat.readme.io/reference/put_v1-scheduled-message-id) |357| `POST` | `/chat/v1/scheduled-message/{id}/cancel` | Cancelar | [↗](https://flwchat.readme.io/reference/post_v1-scheduled-message-id-cancel) |358359**Modelos de Mensagem**360361| Método | Path | O que faz | Doc |362|---|---|---|---|363| `GET` | `/chat/v1/template` | Listar | [↗](https://flwchat.readme.io/reference/get_v1-template) |364365**Sequências**366367| Método | Path | O que faz | Doc |368|---|---|---|---|369| `GET` | `/chat/v1/sequence` | Listar | [↗](https://flwchat.readme.io/reference/get_v1-sequence) |370| `DELETE` | `/chat/v1/sequence/{id}/contact` | Remover contato | [↗](https://flwchat.readme.io/reference/delete_v1-sequence-id-contact) |371| `POST` | `/chat/v1/sequence/{id}/contact` | Adicionar contato | [↗](https://flwchat.readme.io/reference/post_v1-sequence-id-contact) |372| `DELETE` | `/chat/v1/sequence/{id}/contact/batch` | Remover contatos | [↗](https://flwchat.readme.io/reference/delete_v1-sequence-id-contact-batch) |373| `POST` | `/chat/v1/sequence/{id}/contact/batch` | Adicionar contatos | [↗](https://flwchat.readme.io/reference/post_v1-sequence-id-contact-batch) |374| `GET` | `/chat/v2/sequence/{id}/contact` | Listar contatos | [↗](https://flwchat.readme.io/reference/get_v2-sequence-id-contact) |375376377### CRM — `https://api.wts.chat/crm`378379**Cards**380381| Método | Path | O que faz | Doc |382|---|---|---|---|383| `GET` | `/crm/v1/panel/card/{cardId}/note` | Listar anotações | [↗](https://flwchat.readme.io/reference/get_v1-panel-card-cardid-note) |384| `POST` | `/crm/v1/panel/card/{cardId}/note` | Adicionar anotação | [↗](https://flwchat.readme.io/reference/post_v1-panel-card-cardid-note) |385| `DELETE` | `/crm/v1/panel/card/{cardId}/note/{noteId}` | Remover anotação | [↗](https://flwchat.readme.io/reference/delete_v1-panel-card-cardid-note-noteid) |386| `GET` | `/crm/v2/panel/card` | Listar | [↗](https://flwchat.readme.io/reference/get_v2-panel-card) |387| `POST` | `/crm/v2/panel/card` | Criar | [↗](https://flwchat.readme.io/reference/post_v2-panel-card) |388| `GET` | `/crm/v2/panel/card/{id}` | Obter por ID | [↗](https://flwchat.readme.io/reference/get_v2-panel-card-id) |389| `POST` | `/crm/v2/panel/card/{id}/duplicate` | Duplicar | [↗](https://flwchat.readme.io/reference/post_v2-panel-card-id-duplicate) |390| `PUT` | `/crm/v3/panel/card/{id}` | Atualizar | [↗](https://flwchat.readme.io/reference/put_v3-panel-card-id) |391392**Painéis**393394| Método | Path | O que faz | Doc |395|---|---|---|---|396| `GET` | `/crm/v1/panel/{id}` | Obter por ID | [↗](https://flwchat.readme.io/reference/get_v1-panel-id) |397| `GET` | `/crm/v1/panel/{id}/custom-fields` | Campos personalizados | [↗](https://flwchat.readme.io/reference/get_v1-panel-id-custom-fields) |398| `GET` | `/crm/v1/panel/{id}/lost-reason` | Listar motivos de perda | [↗](https://flwchat.readme.io/reference/get_v1-panel-id-lost-reason) |399| `GET` | `/crm/v2/panel` | Listar painéis | [↗](https://flwchat.readme.io/reference/get_v2-panel) |400401<!-- ENDPOINTS:END -->