DOCUMENTAÇÃO DA API

Referência da API FlowBridge

150 endpoints em 12 áreas, do envio de mensagens a grupos, canais, CRM e webhooks. Esta página segue a especificação OpenAPI 3.1 do projeto; uma verificação automática confere que toda rota do código está nela.

Pré-lançamento. O serviço ainda não está aberto ao público. O endereço https://api.flowbridge.com.br é provisório e pode mudar antes da abertura. 13 rotas respondem 501 porque o WhatsApp Web não oferece o recurso; elas estão marcadas abaixo.

Nas rotas de um número, {número} quer dizer /v1/workspaces/{workspaceId}/instances/{instanceId}.

Início rápido

  1. Tenha uma chave de API

    No console, em Integrações, o proprietário ou um administrador da organização cria a chave, que aparece uma única vez: guarde-a como segredo. Dê só os escopos necessários e, se quiser, prenda a chave a uma área de trabalho ou a um número.

    Os IDs da área de trabalho ($WORKSPACE) e do número ($NUMERO) ficam na mesma tela, com botão de copiar.

  2. Envie a primeira mensagem

    Idempotency-Key é obrigatória: se a rede cair e o seu sistema repetir o pedido com a mesma chave, a mensagem sai uma vez só. expires_at é o prazo para o envio acontecer (no máximo 7 dias à frente).

    Pedido
    curl -X POST https://api.flowbridge.com.br/v1/workspaces/$WORKSPACE/instances/$NUMERO/messages \
      -H "Authorization: Bearer $FLOWBRIDGE_KEY" \
      -H "Idempotency-Key: pedido-4821-confirmacao" \
      -H "Content-Type: application/json" \
      -d '{
        "to": { "kind": "phone", "value": "+5511912345678" },
        "type": "text",
        "text": { "body": "Seu pedido 4821 saiu para entrega." },
        "client_reference": "pedido-4821",
        "expires_at": "2026-10-01T18:00:00Z"
      }'
    Resposta202 Accepted
    {
      "data": {
        "id": "e7a1c3d9-0b4f-4e62-9a85-1d3c7b2f6e04",
        "state": "queued",
        "provider_message_id": "3EB0A1B2C3D4E5F6071829",
        "client_reference": "pedido-4821",
        "expires_at": "2026-10-01T18:00:00.000Z",
        "created_at": "2026-10-01T12:00:00.000Z"
      }
    }
  3. Acompanhe o resultado

    O 202 confirma que a mensagem entrou na fila. Para saber se saiu, foi entregue ou lida, consulte o envio ou cadastre um webhook: cada mudança chega como message.provider_accepted, message.delivered, message.read ou, se der errado, message.failed.

    Pedido
    # Consultar o envio (escopo messages:read)
    curl https://api.flowbridge.com.br/v1/messages/e7a1c3d9-0b4f-4e62-9a85-1d3c7b2f6e04 \
      -H "Authorization: Bearer $FLOWBRIDGE_KEY"
    
    # Ou receber avisos a cada mudança (webhooks:write, chave da área de trabalho)
    curl -X POST https://api.flowbridge.com.br/v1/webhook-endpoints \
      -H "Authorization: Bearer $FLOWBRIDGE_KEY" \
      -H "Content-Type: application/json" \
      -d '{ "workspace_id": "'$WORKSPACE'", "url": "https://seu-sistema.com.br/flowbridge" }'

Autenticação e escopos

Toda chamada leva a chave de API no cabeçalho Authorization. A chave pertence a uma organização e pode ficar presa a uma área de trabalho ou a um único número: fora desse alcance, a resposta é 404. Cada rota exige um escopo; sem ele, 403 scope_denied. A única exceção é o webhook chamado pelo Chatwoot, identificado por um token no endereço.

Cabeçalho
Authorization: Bearer fbk_XXXXXXXXXXXX_...
Escopos de uma chave
EscopoO que permite
workspaces:readLer as áreas de trabalho.
instances:writeCriar números e reservar a vaga para conectar.
instances:readAceito na chave; nenhuma rota pública usa ainda.
messages:sendEnviar mensagens e mídia, cancelar a fila e criar campanhas.
messages:readConsultar envios, baixar mídia, ler conversas, a fila e as campanhas.
engine:readLer dados do WhatsApp (grupos, contatos, perfil, canais), eventos, CRM, Chatwoot e operações.
engine:writeMudar algo no WhatsApp ou nos dados do número: grupos, perfil, conversas, CRM, Chatwoot.
webhooks:readListar webhooks e o histórico de entregas.
webhooks:writeCadastrar e remover webhooks.

Operações, erros e limites

Operações no WhatsApp

Rotas que precisam do WhatsApp (grupos, perfil, contatos, conversas, canais) são executadas pelo número conectado. A API espera até 15 segundos: responde 200 com o resultado em data ou 202 com o endereço da operação em Location. Consulte GET /v1/operations/{id} até terminar. 422 quer dizer que o WhatsApp recusou; 502, que o resultado é incerto (confira antes de repetir); 504, que a operação venceu sem ser executada.

Enviar mensagem é diferente: a resposta é sempre 202 com o envio na fila, e o resultado chega pelos eventos message.*.

Operação em andamento
HTTP/1.1 202 Accepted
Location: /v1/operations/0b8f4d2e-6c1a-4f37-9e50-a2d7c3b1e864

{
  "data": {
    "operation_id": "0b8f4d2e-6c1a-4f37-9e50-a2d7c3b1e864",
    "state": "running"
  }
}
Erro (sempre neste formato)
HTTP/1.1 403 Forbidden

{
  "error": {
    "code": "scope_denied",
    "message": "scope_denied",
    "request_id": "7f1e2d3c-4b5a-4968-8776-5a4b3c2d1e0f",
    "retryable": false
  }
}

Idempotência

Idempotency-Key é obrigatória para enviar mensagens, criar campanhas e criar números, e aceita nas operações. Repetir o pedido com a mesma chave devolve o mesmo resultado, com o cabeçalho Idempotent-Replay: true, sem fazer de novo. A mesma chave com outro conteúdo recebe 409 idempotency_conflict.

Limites

Envio: 60 mensagens por minuto, com rajada de 10, por chave e número (429 rate_limited com Retry-After). Com 1000 envios aguardando na fila do número, novos pedidos recebem 429 queue_full. Corpo JSON até 1 MB; mídia até 16 MiB, enviada como arquivo binário.

Códigos de resposta
CódigoSignificado
200Pronto; data traz o resultado.
201Criado.
202Aceito: mensagem na fila, ou operação ainda em andamento (cabeçalho Location).
204Feito, sem corpo.
400Pedido inválido (invalid_input e outros códigos).
401Chave ausente, inválida, revogada ou vencida.
403Falta o escopo na chave (scope_denied).
404Não existe, ou a chave não alcança esse recurso.
409Conflito, como a mesma Idempotency-Key com outro conteúdo.
422O WhatsApp ou uma regra do serviço recusou.
429Limite de envio (rate_limited) ou fila cheia (queue_full); espere o Retry-After.
501O WhatsApp Web não oferece o recurso (not_supported_by_engine). Não adianta repetir.
502Resultado incerto: confira o estado antes de repetir.
503Número desconectado ou serviço indisponível; tente mais tarde.
504A operação venceu sem ser executada; pode repetir.

Áreas de trabalho e operações

Uma organização tem áreas de trabalho, e cada área tem números. Rotas que dependem do WhatsApp podem responder 202; o resultado fica em /v1/operations/{id}.

  • GET
    /v1/workspaces

    Listar áreas de trabalho

    workspaces:readDisponível
  • GET
    /v1/workspaces/{workspaceId}

    Ler uma área de trabalho

    workspaces:readDisponível
  • GET
    /v1/operations/{id}

    Consultar uma operação

    engine:readDisponível

Exemplo: Listar áreas de trabalho

Pedido
curl https://api.flowbridge.com.br/v1/workspaces \
  -H "Authorization: Bearer $FLOWBRIDGE_KEY"
Resposta200 OK
{
  "data": [
    {
      "id": "8d3f2a61-4b7e-4c1a-9f0d-2e6b5c4a7d10",
      "organization_id": "5b0c9e7a-2f41-4d8b-a6c3-7e1f0d9b4a25",
      "name": "Atendimento"
    }
  ]
}

Números

Crie o número, reserve a vaga, leia o QR code e conecte pelo celular. Aqui também ficam a fila de envios, a pausa entre envios e o proxy próprio.

  • POST
    /v1/workspaces/{workspaceId}/instances

    Criar número

    instances:writeDisponível
  • POST
    {número}/reservations

    Reservar vaga para conectar

    instances:writeDisponível
  • GET
    {número}/status

    Situação do número

    engine:readDisponível
  • PATCH
    {número}

    Renomear número

    engine:writeDisponível
  • DELETE
    {número}

    Excluir número

    engine:writeDisponível
  • POST
    {número}/connect

    Iniciar conexão por QR code

    engine:writeDisponível
  • GET
    {número}/qr

    Ler o QR code de pareamento

    engine:readDisponível
  • POST
    {número}/disconnect

    Desconectar (sair do WhatsApp)

    engine:writeDisponível
  • POST
    {número}/restart

    Reconectar a sessão

    engine:writeDisponível
  • GET
    {número}/limits

    Limites de novas conversas

    engine:readNão suportado pelo WhatsApp Web
  • GET
    {número}/queue

    Ver a fila de envios

    messages:readDisponível
  • DELETE
    {número}/queue

    Cancelar envios na fila

    messages:sendDisponível
  • GET
    {número}/settings/delay

    Ler intervalo entre envios

    engine:readDisponível
  • PUT
    {número}/settings/delay

    Definir intervalo entre envios

    engine:writeDisponível
  • GET
    {número}/settings/signature

    Ler assinatura do atendente

    engine:readDisponível
  • PUT
    {número}/settings/signature

    Ligar ou desligar assinatura do atendente

    engine:writeDisponível
  • GET
    {número}/proxy/managed

    Proxy gerenciado

    engine:readNão suportado pelo WhatsApp Web
  • GET
    {número}/proxy

    Ler proxy do número

    engine:readDisponível
  • PUT
    {número}/proxy

    Definir proxy do número

    engine:writeDisponível
  • DELETE
    {número}/proxy

    Remover proxy

    engine:writeDisponível

Exemplo: Ver a situação do número

Pedido
curl https://api.flowbridge.com.br/v1/workspaces/$WORKSPACE/instances/$NUMERO/status \
  -H "Authorization: Bearer $FLOWBRIDGE_KEY"
Resposta200 OK
{
  "data": {
    "id": "c41e9b27-6a3d-4f58-b0e2-91d7f3a5c8e4",
    "name": "Vendas",
    "state": "active",
    "session_state": "connected",
    "connected": true,
    "phone_masked": "+55 11 9****-5678",
    "worker_alive": true,
    "lease_until": "2026-10-01T12:00:30.000Z",
    "reservation_state": "occupied",
    "reservation_expires_at": null,
    "created_at": "2026-09-28T14:03:11.000Z"
  }
}

Mensagens e mídia

Um único endpoint envia todos os tipos: texto, imagem, vídeo, áudio, documento, figurinha, localização, contato, reação, enquete, botões, lista, edição, apagar e status. Mídia pode ir por upload, base64 ou link https.

  • POST
    {número}/messages

    Enviar mensagem

    messages:sendDisponível
  • GET
    /v1/messages/{id}

    Consultar um envio

    messages:readDisponível
  • POST
    {número}/media

    Enviar arquivo de mídia (upload)

    messages:sendDisponível
  • GET
    {número}/media/{id}

    Ler dados de uma mídia

    messages:readDisponível
  • GET
    {número}/media/{id}/content

    Baixar uma mídia enviada

    messages:readDisponível
  • DELETE
    {número}/media/{id}

    Apagar uma mídia

    messages:sendDisponível
  • GET
    {número}/inbound/{inboxId}/media

    Baixar mídia recebida

    messages:readDisponível

Exemplo: Enviar uma imagem já carregada

Pedido
# 1. Envie o arquivo (corpo binário, até 16 MiB)
curl -X POST "https://api.flowbridge.com.br/v1/workspaces/$WORKSPACE/instances/$NUMERO/media?kind=image" \
  -H "Authorization: Bearer $FLOWBRIDGE_KEY" \
  -H "Content-Type: image/jpeg" \
  --data-binary @cardapio.jpg

# 2. Envie a mensagem com o id devolvido
curl -X POST https://api.flowbridge.com.br/v1/workspaces/$WORKSPACE/instances/$NUMERO/messages \
  -H "Authorization: Bearer $FLOWBRIDGE_KEY" \
  -H "Idempotency-Key: cardapio-cliente-4821" \
  -H "Content-Type: application/json" \
  -d '{
    "to": { "kind": "phone", "value": "+5511912345678" },
    "type": "image",
    "media": { "id": "3f9d0c52-8e1b-4a7f-b6d4-0c2e9a1f5b73" },
    "caption": "Cardápio de hoje",
    "expires_at": "2026-10-01T18:00:00Z"
  }'
Resposta202 Accepted
{
  "data": {
    "id": "e7a1c3d9-0b4f-4e62-9a85-1d3c7b2f6e04",
    "state": "queued",
    "provider_message_id": "3EB0A1B2C3D4E5F6071829",
    "client_reference": null,
    "expires_at": "2026-10-01T18:00:00.000Z",
    "created_at": "2026-10-01T12:00:00.000Z"
  }
}

Conversas e etiquetas

A leitura usa o histórico guardado pelo FlowBridge (as 2000 mensagens mais recentes de cada origem). As ações (arquivar, fixar, silenciar, etiquetar) são feitas no WhatsApp do número.

  • GET
    {número}/chats

    Listar conversas

    messages:readDisponível
  • GET
    {número}/chats/count

    Contar conversas

    messages:readDisponível
  • GET
    {número}/chats/{jid}/messages

    Mensagens de uma conversa

    messages:readDisponível
  • GET
    {número}/messages/search

    Buscar mensagens por texto

    messages:readDisponível
  • POST
    {número}/chats/{jid}/archive

    Arquivar ou desarquivar

    engine:writeDisponível
  • POST
    {número}/chats/{jid}/read

    Marcar conversa como lida ou não lida

    engine:writeDisponível
  • POST
    {número}/chats/{jid}/pin

    Fixar ou desafixar conversa

    engine:writeDisponível
  • POST
    {número}/chats/{jid}/mute

    Silenciar conversa

    engine:writeDisponível
  • DELETE
    {número}/chats/{jid}

    Apagar conversa no WhatsApp

    engine:writeDisponível
  • POST
    {número}/chats/{jid}/ephemeral

    Mensagens temporárias da conversa

    engine:writeDisponível
  • POST
    {número}/chats/{jid}/history-sync

    Pedir mensagens antigas ao celular

    engine:writeDisponível
  • POST
    {número}/messages/read

    Marcar mensagens como lidas

    engine:writeDisponível
  • POST
    {número}/messages/{messageId}/star

    Favoritar mensagem

    engine:writeDisponível
  • POST
    {número}/messages/{messageId}/pin

    Fixar mensagem na conversa

    engine:writeDisponível
  • GET
    {número}/labels

    Listar etiquetas do WhatsApp

    engine:readDisponível
  • POST
    {número}/labels

    Criar ou editar etiqueta

    engine:writeDisponível
  • DELETE
    {número}/labels/{labelId}

    Apagar etiqueta

    engine:writeDisponível
  • POST
    {número}/labels/refresh

    Sincronizar etiquetas com o celular

    engine:writeDisponível
  • GET
    {número}/chats/{jid}/labels

    Etiquetas de uma conversa

    engine:readDisponível
  • POST
    {número}/chats/{jid}/labels

    Aplicar ou tirar etiqueta da conversa

    engine:writeDisponível

Exemplo: Listar a conversa mais recente

Pedido
curl "https://api.flowbridge.com.br/v1/workspaces/$WORKSPACE/instances/$NUMERO/chats?limit=1" \
  -H "Authorization: Bearer $FLOWBRIDGE_KEY"
Resposta200 OK
{
  "data": [
    {
      "jid": "5511912345678@s.whatsapp.net",
      "alt_jid": null,
      "is_group": false,
      "name": "Mariana Souza",
      "last_message": {
        "id": "3A5F09C2B1E4D7A8C6F0",
        "direction": "in",
        "kind": "text",
        "text": "Vocês abrem no sábado?",
        "timestamp": "2026-10-01T11:58:02.000Z"
      },
      "inbound_count": 4,
      "outbound_count": 3,
      "unread_count": 1,
      "last_activity_at": "2026-10-01T11:58:02.000Z"
    }
  ],
  "next_cursor": "WyIyMDI2LTEwLTAxVDExOjU4OjAyLjAwMFoiLCI1NTExOTEyMzQ1Njc4QHMud2hhdHNhcHAubmV0Il0",
  "window": { "rows_per_source": 2000, "truncated": false, "skipped": 0 }
}

Grupos e comunidades

Criar e administrar grupos e comunidades. Cada rota é executada pelo número conectado e responde com o resultado do WhatsApp.

  • POST
    {número}/groups

    Criar grupo

    engine:writeDisponível
  • GET
    {número}/groups

    Listar grupos do número

    engine:readDisponível
  • POST
    {número}/groups/join

    Entrar em grupo por convite

    engine:writeDisponível
  • GET
    {número}/groups/invites/{code}

    Ver grupo pelo convite

    engine:readDisponível
  • GET
    {número}/groups/{jid}

    Dados do grupo e participantes

    engine:readDisponível
  • GET
    {número}/groups/{jid}/invite-link

    Link de convite

    engine:readDisponível
  • POST
    {número}/groups/{jid}/invite-link/reset

    Gerar novo link de convite

    engine:writeDisponível
  • POST
    {número}/groups/{jid}/leave

    Sair do grupo

    engine:writeDisponível
  • PUT
    {número}/groups/{jid}/name

    Renomear grupo

    engine:writeDisponível
  • PUT
    {número}/groups/{jid}/description

    Alterar descrição do grupo

    engine:writeDisponível
  • PUT
    {número}/groups/{jid}/announce

    Só administradores enviam

    engine:writeDisponível
  • PUT
    {número}/groups/{jid}/locked

    Só administradores editam o grupo

    engine:writeDisponível
  • PUT
    {número}/groups/{jid}/join-approval

    Aprovar entrada pelo link

    engine:writeDisponível
  • PUT
    {número}/groups/{jid}/member-add-mode

    Quem pode adicionar membros

    engine:writeDisponível
  • PUT
    {número}/groups/{jid}/ephemeral

    Mensagens temporárias do grupo

    engine:writeDisponível
  • PUT
    {número}/groups/{jid}/image

    Trocar foto do grupo

    engine:writeDisponível
  • POST
    {número}/groups/{jid}/participants

    Adicionar, remover, promover ou rebaixar

    engine:writeDisponível
  • GET
    {número}/groups/{jid}/requests

    Pedidos de entrada pendentes

    engine:readDisponível
  • POST
    {número}/groups/{jid}/requests

    Aprovar ou recusar pedidos de entrada

    engine:writeDisponível
  • POST
    {número}/communities

    Criar comunidade

    engine:writeDisponível
  • GET
    {número}/communities/{jid}/groups

    Grupos de uma comunidade

    engine:readDisponível
  • POST
    {número}/communities/{jid}/groups

    Vincular ou desvincular grupos

    engine:writeDisponível

Exemplo: Criar um grupo

Pedido
curl -X POST https://api.flowbridge.com.br/v1/workspaces/$WORKSPACE/instances/$NUMERO/groups \
  -H "Authorization: Bearer $FLOWBRIDGE_KEY" \
  -H "Idempotency-Key: grupo-clientes-vip" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Clientes VIP", "participants": ["+5511912345678"] }'
Resposta200 OK
{
  "data": {
    "jid": "120363025246125888@g.us",
    "name": "Clientes VIP",
    "topic": "",
    "owner": "5511955554444@s.whatsapp.net",
    "owner_phone": "+5511955554444",
    "created_at": "2026-10-01T12:00:00Z",
    "participant_count": 2,
    "announce": false,
    "locked": false,
    "join_approval": false,
    "member_add_mode": "admins",
    "ephemeral_seconds": 0,
    "is_community": false,
    "parent_jid": null,
    "is_default_subgroup": false,
    "suspended": false,
    "participants": [
      {
        "jid": "5511955554444@s.whatsapp.net",
        "phone": "+5511955554444",
        "is_admin": true,
        "is_super_admin": true
      },
      {
        "jid": "5511912345678@s.whatsapp.net",
        "phone": "+5511912345678",
        "is_admin": false,
        "is_super_admin": false
      }
    ]
  }
}

Contatos e perfil

Verifique quem tem WhatsApp, leia contatos e fotos, bloqueie, recuse chamadas e ajuste perfil, privacidade e presença do número.

  • GET
    {número}/contacts

    Listar contatos da agenda

    engine:readDisponível
  • POST
    {número}/contacts/check

    Verificar se telefones têm WhatsApp

    engine:readDisponível
  • POST
    {número}/contacts

    Adicionar contato à agenda

    engine:writeNão suportado pelo WhatsApp Web
  • DELETE
    {número}/contacts/{jid}

    Remover contato da agenda

    engine:writeNão suportado pelo WhatsApp Web
  • GET
    {número}/contacts/{jid}

    Dados de um contato

    engine:readDisponível
  • GET
    {número}/contacts/{jid}/avatar

    Foto de perfil de um contato

    engine:readDisponível
  • POST
    {número}/contacts/{jid}/block

    Bloquear ou desbloquear

    engine:writeDisponível
  • GET
    {número}/blocklist

    Lista de bloqueados

    engine:readDisponível
  • POST
    {número}/calls/{callId}/reject

    Recusar chamada recebida

    engine:writeDisponível
  • POST
    {número}/calls

    Fazer chamada

    engine:writeNão suportado pelo WhatsApp Web
  • GET
    {número}/profile

    Perfil do próprio número

    engine:readDisponível
  • PUT
    {número}/profile/name

    Alterar nome de exibição

    engine:writeDisponível
  • PUT
    {número}/profile/status

    Alterar recado (sobre)

    engine:writeDisponível
  • PUT
    {número}/profile/image

    Trocar foto de perfil

    engine:writeDisponível
  • GET
    {número}/privacy

    Ler configurações de privacidade

    engine:readDisponível
  • PUT
    {número}/privacy

    Alterar uma configuração de privacidade

    engine:writeDisponível
  • POST
    {número}/presence

    Ficar online ou offline

    engine:writeDisponível
  • POST
    {número}/presence/chat

    Mostrar digitando ou gravando

    engine:writeDisponível
  • POST
    {número}/presence/subscribe

    Acompanhar presença de um contato

    engine:writeDisponível

Exemplo: Verificar quem tem WhatsApp

Pedido
curl -X POST https://api.flowbridge.com.br/v1/workspaces/$WORKSPACE/instances/$NUMERO/contacts/check \
  -H "Authorization: Bearer $FLOWBRIDGE_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "phones": ["+5511912345678", "+5511900000000"] }'
Resposta200 OK
{
  "data": {
    "items": [
      {
        "phone": "+5511912345678",
        "exists": true,
        "jid": "5511912345678@s.whatsapp.net",
        "lid": null,
        "verified_name": null
      },
      {
        "phone": "+5511900000000",
        "exists": false,
        "jid": null,
        "lid": null,
        "verified_name": null
      }
    ]
  }
}

Canais

Canais (newsletters) do WhatsApp: seguir, ler, reagir, criar e publicar texto. Pesquisa pública e administração de canais não existem no WhatsApp Web.

  • GET
    {número}/newsletters/search

    Pesquisar canais públicos

    engine:readNão suportado pelo WhatsApp Web
  • POST
    {número}/newsletters/{jid}/admins

    Convidar administrador do canal

    engine:writeNão suportado pelo WhatsApp Web
  • POST
    {número}/newsletters

    Criar canal

    engine:writeDisponível
  • GET
    {número}/newsletters

    Canais que o número segue

    engine:readDisponível
  • GET
    {número}/newsletters/invites/{code}

    Ver canal pelo convite

    engine:readDisponível
  • GET
    {número}/newsletters/{jid}

    Dados do canal

    engine:readDisponível
  • GET
    {número}/newsletters/{jid}/messages

    Publicações do canal

    engine:readDisponível
  • GET
    {número}/newsletters/{jid}/updates

    Novidades (visualizações e reações)

    engine:readDisponível
  • POST
    {número}/newsletters/{jid}/follow

    Seguir ou deixar de seguir

    engine:writeDisponível
  • POST
    {número}/newsletters/{jid}/mute

    Silenciar canal

    engine:writeDisponível
  • POST
    {número}/newsletters/{jid}/viewed

    Marcar publicações como vistas

    engine:writeDisponível
  • POST
    {número}/newsletters/{jid}/reaction

    Reagir a uma publicação

    engine:writeDisponível
  • POST
    {número}/newsletters/{jid}/live

    Receber novidades ao vivo

    engine:writeDisponível
  • POST
    {número}/newsletters/{jid}/posts

    Publicar texto no canal

    engine:writeDisponível
  • PUT
    {número}/newsletters/{jid}/posts/{serverId}

    Editar publicação

    engine:writeDisponível
  • DELETE
    {número}/newsletters/{jid}/posts/{serverId}

    Apagar publicação

    engine:writeDisponível

Exemplo: Publicar texto num canal seu

Pedido
curl -X POST https://api.flowbridge.com.br/v1/workspaces/$WORKSPACE/instances/$NUMERO/newsletters/120363144038483540@newsletter/posts \
  -H "Authorization: Bearer $FLOWBRIDGE_KEY" \
  -H "Idempotency-Key: canal-promo-sexta" \
  -H "Content-Type: application/json" \
  -d '{ "text": "Sexta tem frete grátis para todo o Brasil." }'
Resposta200 OK
{
  "data": {
    "jid": "120363144038483540@newsletter",
    "id": "3EB0B7C2D9E4F1A6038571",
    "server_id": 128,
    "timestamp": "2026-10-01T12:00:01Z"
  }
}

Perfil comercial

Leitura do perfil comercial do número ou de um contato. Catálogo e edição do perfil não existem no WhatsApp Web: as rotas respondem 501.

  • PUT
    {número}/business/profile

    Editar perfil comercial

    engine:writeNão suportado pelo WhatsApp Web
  • GET
    {número}/business/catalog

    Listar catálogo

    engine:readNão suportado pelo WhatsApp Web
  • POST
    {número}/business/catalog

    Criar produto

    engine:writeNão suportado pelo WhatsApp Web
  • GET
    {número}/business/catalog/{productId}

    Ler produto

    engine:readNão suportado pelo WhatsApp Web
  • PUT
    {número}/business/catalog/{productId}

    Editar produto

    engine:writeNão suportado pelo WhatsApp Web
  • DELETE
    {número}/business/catalog/{productId}

    Apagar produto

    engine:writeNão suportado pelo WhatsApp Web
  • GET
    {número}/business/profile

    Perfil comercial do próprio número

    engine:readDisponível
  • GET
    {número}/business/profile/{jid}

    Perfil comercial de um contato

    engine:readDisponível

Exemplo: Ler o perfil comercial de um contato

Pedido
curl https://api.flowbridge.com.br/v1/workspaces/$WORKSPACE/instances/$NUMERO/business/profile/5511955554444@s.whatsapp.net \
  -H "Authorization: Bearer $FLOWBRIDGE_KEY"
Resposta200 OK
{
  "data": {
    "jid": "5511955554444@s.whatsapp.net",
    "address": "Rua das Flores, 100 — São Paulo",
    "email": "contato@loja.example",
    "categories": [{ "id": "1001", "name": "Loja de roupas" }],
    "profile_options": {},
    "business_hours": null
  }
}

Eventos, webhooks e SSE

Três formas de acompanhar o que acontece: webhook assinado, fluxo SSE ou leitura em ordem por número. Os avisos trazem só o tipo e os IDs; o conteúdo é lido pela API.

  • GET
    /v1/events/stream

    Receber eventos ao vivo (SSE)

    engine:readDisponível
  • GET
    /v1/events/{id}

    Ler um evento do motor

    engine:readDisponível
  • GET
    {número}/events

    Eventos de um número, em ordem

    engine:readDisponível
  • GET
    {número}/inbound

    Mensagens recebidas

    engine:readDisponível
  • GET
    {número}/inbound/{id}

    Ler uma mensagem recebida

    engine:readDisponível
  • POST
    /v1/webhook-endpoints

    Cadastrar endereço de webhook

    webhooks:writeDisponível
  • GET
    /v1/webhook-endpoints

    Listar endereços de webhook

    webhooks:readDisponível
  • DELETE
    /v1/webhook-endpoints/{id}

    Remover endereço de webhook

    webhooks:writeDisponível
  • GET
    /v1/webhook-deliveries

    Histórico de entregas de webhook

    webhooks:readDisponível

Exemplo: Conferir a assinatura de um webhook (Node.js)

Código de verificação
import { createHmac, timingSafeEqual } from "node:crypto";

// raw: corpo exato recebido (Buffer); secret: o "secret" do cadastro
export function assinaturaValida(headers, raw, secret) {
  const timestamp = headers["x-flow-timestamp"];
  const eventId = headers["x-flow-event-id"];
  const [versao, , hex] = String(headers["x-flow-signature"]).split(":");
  const idade = Math.abs(Date.now() / 1000 - Number(timestamp));
  if (versao !== "v1" || !(idade <= 300)) return false;
  const esperado = createHmac("sha256", Buffer.from(secret, "base64url"))
    .update(`${timestamp}.${eventId}.`)
    .update(raw)
    .digest();
  const recebido = Buffer.from(hex ?? "", "hex");
  return (
    recebido.length === esperado.length && timingSafeEqual(recebido, esperado)
  );
}
Aviso recebidoPOST no seu endereço
{
  "event_id": "4c2b8e1f-7a93-4d05-b6e8-2f1a0c9d3b57",
  "schema_version": "1.0",
  "type": "message.received",
  "occurred_at": "2026-10-01T12:00:00.000Z",
  "organization_id": "5b0c9e7a-2f41-4d8b-a6c3-7e1f0d9b4a25",
  "workspace_id": "8d3f2a61-4b7e-4c1a-9f0d-2e6b5c4a7d10",
  "instance_id": "c41e9b27-6a3d-4f58-b0e2-91d7f3a5c8e4",
  "sequence": 42,
  "data": { "resource_id": "9e3d7c1a-5b2f-4e80-a4c6-0d8b1f2e7a39" }
}

CRM e respostas rápidas

Leads por número, com consentimento registrado (data e origem), etiquetas de lead, anotações e respostas rápidas. São dados do FlowBridge, cifrados, e não mudam nada no WhatsApp.

  • GET
    {número}/crm/leads

    Listar leads

    engine:readDisponível
  • GET
    {número}/crm/leads/{contact}

    Ler um lead

    engine:readDisponível
  • PUT
    {número}/crm/leads/{contact}

    Criar ou atualizar lead

    engine:writeDisponível
  • DELETE
    {número}/crm/leads/{contact}

    Apagar lead

    engine:writeDisponível
  • POST
    {número}/crm/leads/{contact}/opt-out

    Registrar saída da lista (opt-out)

    engine:writeDisponível
  • GET
    {número}/crm/leads/{contact}/notes

    Anotações do lead

    engine:readDisponível
  • POST
    {número}/crm/leads/{contact}/notes

    Criar anotação

    engine:writeDisponível
  • DELETE
    {número}/crm/notes/{id}

    Apagar anotação

    engine:writeDisponível
  • GET
    {número}/crm/tags

    Listar etiquetas de lead

    engine:readDisponível
  • POST
    {número}/crm/tags

    Criar etiqueta de lead

    engine:writeDisponível
  • DELETE
    {número}/crm/tags/{id}

    Apagar etiqueta de lead

    engine:writeDisponível
  • GET
    {número}/quick-replies

    Listar respostas rápidas

    engine:readDisponível
  • POST
    {número}/quick-replies

    Criar resposta rápida

    engine:writeDisponível
  • PUT
    {número}/quick-replies/{id}

    Editar resposta rápida

    engine:writeDisponível
  • DELETE
    {número}/quick-replies/{id}

    Apagar resposta rápida

    engine:writeDisponível

Exemplo: Registrar um lead com consentimento

Pedido
curl -X PUT https://api.flowbridge.com.br/v1/workspaces/$WORKSPACE/instances/$NUMERO/crm/leads/%2B5511912345678 \
  -H "Authorization: Bearer $FLOWBRIDGE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Mariana Souza",
    "status": "cliente",
    "opted_in": { "at": "2026-09-30T15:20:00Z", "source": "formulário do site" }
  }'
Resposta201 Created
{
  "data": {
    "id": "a6f0d2c4-91b3-4e7a-8c15-3d9e2b7f0a61",
    "contact": "+5511912345678",
    "name": "Mariana Souza",
    "status": "cliente",
    "assigned_user_id": null,
    "tags": [],
    "fields": {},
    "opted_in": { "at": "2026-09-30T15:20:00.000Z", "source": "formulário do site" },
    "opted_out_at": null,
    "consented": true,
    "created_at": "2026-10-01T12:00:00.000Z",
    "updated_at": "2026-10-01T12:00:00.000Z"
  }
}

Campanhas

Envio em massa só para quem deu consentimento, com pausa aleatória entre envios, horário comercial opcional, pausar, retomar e cancelar.

  • POST
    {número}/campaigns

    Criar campanha

    messages:sendDisponível
  • GET
    {número}/campaigns

    Listar campanhas

    messages:readDisponível
  • GET
    {número}/campaigns/{id}

    Ler campanha e contagens

    messages:readDisponível
  • GET
    {número}/campaigns/{id}/recipients

    Destinatários e resultado

    messages:readDisponível
  • POST
    {número}/campaigns/{id}/pause

    Pausar campanha

    messages:sendDisponível
  • POST
    {número}/campaigns/{id}/resume

    Retomar campanha

    messages:sendDisponível
  • POST
    {número}/campaigns/{id}/cancel

    Cancelar campanha

    messages:sendDisponível

Exemplo: Agendar uma campanha para uma etiqueta de leads

Pedido
curl -X POST https://api.flowbridge.com.br/v1/workspaces/$WORKSPACE/instances/$NUMERO/campaigns \
  -H "Authorization: Bearer $FLOWBRIDGE_KEY" \
  -H "Idempotency-Key: campanha-reabertura-outubro" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Aviso de reabertura",
    "message": { "type": "text", "text": { "body": "Reabrimos no sábado, das 9h às 18h." } },
    "recipients": { "tag_id": "d1b7e4a2-6c30-4f9e-8a51-2e7c0b9d4f36" },
    "scheduled_at": "2026-10-02T12:00:00Z",
    "respect_business_hours": true
  }'
Resposta201 Created
{
  "data": {
    "id": "f2c8a0e6-3d71-4b95-9e24-7a1c5d0b8e43",
    "name": "Aviso de reabertura",
    "message_type": "text",
    "state": "scheduled",
    "pause_reason": null,
    "scheduled_at": "2026-10-02T12:00:00.000Z",
    "next_send_at": "2026-10-02T12:00:00.000Z",
    "delay_ms": { "min": 5000, "max": 15000 },
    "respect_business_hours": true,
    "total_recipients": 120,
    "skipped_unconsented": 0,
    "created_at": "2026-10-01T12:00:00.000Z",
    "started_at": null,
    "finished_at": null
  }
}

Chatwoot, n8n e Make

O Chatwoot se liga por número: as mensagens chegam na caixa de entrada e as respostas dos atendentes saem pelo WhatsApp. n8n e Make usam os webhooks e a API: recebem o aviso, conferem a assinatura, buscam a mensagem e respondem.

  • GET
    {número}/chatwoot

    Ler integração com o Chatwoot

    engine:readDisponível
  • PUT
    {número}/chatwoot

    Ligar ou alterar integração com o Chatwoot

    engine:writeDisponível
  • DELETE
    {número}/chatwoot

    Remover integração com o Chatwoot

    engine:writeDisponível
  • POST
    /v1/chatwoot/hooks/{token}

    Webhook chamado pelo Chatwoot

    sem chaveDisponível

Exemplo: Ligar o Chatwoot a um número

Pedido
curl -X PUT https://api.flowbridge.com.br/v1/workspaces/$WORKSPACE/instances/$NUMERO/chatwoot \
  -H "Authorization: Bearer $FLOWBRIDGE_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://chatwoot.suaempresa.com.br",
    "account_id": 1,
    "inbox_id": 7,
    "api_access_token": "<token de acesso do Chatwoot>",
    "enabled": true
  }'
Resposta200 OK
{
  "data": {
    "instance_id": "c41e9b27-6a3d-4f58-b0e2-91d7f3a5c8e4",
    "url": "https://chatwoot.suaempresa.com.br",
    "account_id": 1,
    "inbox_id": 7,
    "api_access_token": "****x9Qa",
    "enabled": true,
    "sign_messages": false,
    "reopen_conversation": true,
    "ignore_groups": true,
    "webhook_url": "https://api.flowbridge.com.br/v1/chatwoot/hooks/<token>",
    "last_error_code": null,
    "last_error_at": null,
    "created_at": "2026-10-01T12:00:00.000Z",
    "updated_at": "2026-10-01T12:00:00.000Z"
  }
}