API Pública do ChatForce 2.0
v1 · https://2.0.chatforce.com.br/api/v1 · JSON · Bearer + HMAC
Autenticação e assinatura
Cabeçalhos de toda requisição autenticada:
| Cabeçalho | Valor |
|---|---|
Authorization |
Bearer {token_id}.{secret} |
X-ChatForce-Timestamp |
Unix atual (janela de 5 min) |
X-ChatForce-Signature |
HMAC-SHA256(hex) de "{timestamp}.{corpo}" com o secret |
Em GET/HEAD o corpo é vazio: assine "{timestamp}.".
Falha de autenticação → 401 (token, timestamp ou assinatura inválidos).
Idempotência
Envie Idempotency-Key (ex.: UUID) nas escritas. Repetir a mesma chave com o mesmo corpo devolve a resposta original (Idempotency-Replayed: true); com corpo diferente devolve 409.
Escopo e limites
- Token de usuário: limitado às contas acessíveis. Token de agente (
cfa_): sem acesso a recursos de conta (403). 120requisições/min por ator;per_pagemáximo100.- Recurso fora do escopo →
404.
Erros
| HTTP | Motivo |
|---|---|
401 |
Token/timestamp/assinatura inválidos |
403 |
Token de agente em recurso de conta |
404 |
Recurso inexistente ou fora do escopo |
409 |
Conflito de idempotência |
422 |
Validação (errors por campo) |
429 |
Limite excedido |
Saúde
GET /health
Público. Retorna { "status": "ok", "checks": { "database": true, "cache": true } }.
Identidade
GET /me
Retorna o ator e o escopo de contas (account_scope; null = sem restrição).
Mensagens
POST /messages/{inbox_path}
Recebe mensagem de um sistema externo na Caixa de API. Requer Idempotency-Key.
| Campo | Tipo | |
|---|---|---|
event_id |
string | chave do evento |
contact.external_id |
string | id do contato na caixa |
contact.name |
string | |
contact.email / contact.phone |
string | opcionais |
conversation.external_id |
string | opcional |
message.external_id |
string | dedup do provider |
message.type |
text |
|
message.body |
string |
201 novo · 200 replay (replayed=true) · 409 event_id/conversa em conflito.
POST /webhooks/inbox/{token}
Recepção universal da Caixa de API para o gateway de WhatsApp (Evolution API). Diferente do endpoint acima, não usa Bearer/HMAC: a autenticação é o token da própria caixa na URL. Aceita o payload nativo da Evolution e monta contato, conversa e mensagem (texto e mídia).
| Campo | Tipo | |
|---|---|---|
event |
messages.upsert | messages.update |
tipo do evento |
instance |
string | nome da instância |
data.key |
object | remoteJid, fromMe, id |
data.message |
object | conteúdo (texto ou mídia) |
Como usar: na aba Canal da caixa de API, informe URL do servidor, Instância e API Key do Evolution e salve como Conectado — o ChatForce cadastra este webhook na instância automaticamente. 200 recebido (eventos irrelevantes são ignorados).
Contatos
GET /contacts
Filtros: search, email, phone, updated_since, page, per_page.
GET /contacts/{contact}
Detalhe do contato.
POST /contacts
Obrigatórios: name, phone. Opcionais: email, document, client_code, company, country, state, city, address, description, avatar_url.
PATCH /contacts/{contact}
Atualiza os mesmos campos + is_blocked.
Conversas
GET /conversations
Filtros: status, inbox_id, contact_id, team_id, assigned_user_id, updated_since, page, per_page.
GET /conversations/{conversation}
Detalhe da conversa.
GET /conversations/{conversation}/messages
Mensagens visíveis (ordem cronológica).
POST /conversations/{conversation}/messages
Envia mensagem. Corpo: body (obrigatório), destination (customer/team, padrão customer), reply_to_id.
PATCH /conversations/{conversation}
Atualiza assigned_user_id, team_id, status (in_progress/closed), resolution_reason_id (obrigatório ao fechar), resolution_notes.
Caixas
GET /inboxes
Filtros: channel, is_active.
GET /inboxes/{inbox}
Detalhe da caixa.
Tags
GET /tags
Filtro: search.
Pipelines
GET /pipelines
Filtro: is_active. Inclui etapas.
GET /pipelines/{pipeline}
Detalhe do funil.
Pedidos
GET /orders
Filtros: contact_id, external_number, status, approval_status, from, to.
GET /orders/{order}
Detalhe do pedido (com itens).
POST /orders
Obrigatórios: contact_id, number. Opcionais: conversation_id, opportunity_id, proposal_id, external_number, currency, status, notes e items[] (description, quantity, unit_price, discount). total e approval_status são calculados.
POST /orders/sync
Sincronização idempotente por external_number, indicada para ERPs e outros sistemas que mantêm o pedido do lado externo.
- Se não existir pedido com o
external_numberinformado (dentro do escopo do token), cria e retorna201. - Se existir, atualiza o pedido, substitui os itens e recalcula o total, retornando
200.
Obrigatórios: external_number, contact_id. Opcionais: number (se omitido na criação, é gerado), conversation_id, opportunity_id, proposal_id, currency, status, notes e items[]. Envie sempre o mesmo external_number do sistema de origem para evitar duplicidade.
PATCH /orders/{order}
Atualiza o pedido; se items for enviado, substitui os itens e recalcula o total.
Oportunidades
GET /opportunities
Filtros: status, contact_id, pipeline_id, external_id, updated_since.
GET /opportunities/{opportunity}
Detalhe da oportunidade.
POST /opportunities
Cria ou atualiza por external_id. Obrigatórios: title, pipeline_id, stage_id. Contato por contact_id ou contact_email/contact_phone. Opcionais: assigned_user_id, value, currency, expected_close_at, notes. status é derivado da etapa.
PATCH /opportunities/{opportunity}
Atualiza campos; ao mudar stage_id, status é recalculado.
Tickets
GET /tickets
Filtros: status, priority, contact_id, assigned_user_id, updated_since.
GET /tickets/{ticket}
Detalhe do ticket (com respostas).
POST /tickets
Obrigatórios: subject, priority. Opcionais: description, due_at, contact_id, conversation_id, order_id, team_id, assigned_user_id. protocol é gerado.
POST /tickets/{ticket}/replies
Responde o ticket. Corpo: body.
Campanhas
GET /campaigns
Filtros: status, type.
GET /campaigns/{campaign}
Detalhe da campanha com estatística.
POST /campaigns/{campaign}/events
Registra evento. Corpo: type (sent, delivered, read, replied, click, conversion, opt_out, error), campaign_recipient_id, contact_id, payload.
Webhooks
| Endpoint | Autenticação |
|---|---|
GET/POST /webhooks/meta |
verify token + X-Hub-Signature-256 |
GET/POST /webhooks/whatsapp/{token} |
token da caixa + assinatura |
POST /webhooks/inbox/{token} |
token da caixa (gateway Evolution) |
POST /webhooks/instagram · /webhooks/messenger |
payloads Meta |
POST /webhooks/telegram/{token} · /webhooks/email/{token} |
token da caixa |
POST /webhooks/stripe |
Stripe-Signature |
POST /webhooks/campaign-segments/{token} |
token do segmento |
POST /webhooks/campaigns/{token} |
token da campanha |
Links
GET /l/{code} — redireciona (302) e registra o clique com UTMs.