API de integração do Atendai

Envie mensagens de WhatsApp, registre notas e etiquetas e leia conversas do seu escritório a partir do seu sistema ou da sua IA.

A API é liberada por escritório. Para ativar, fale com o suporte.
Endereçohttps://app.atendai.pro/api/v1
FormatoJSON, UTF-8
Limite por chave60/min · 20.000/dia
Limite por escritório300/min

Chave e escopos

Toda chamada leva a chave no cabeçalho Authorization: Bearer. A chave é emitida pelo Dono do escritório, em Configurações, aba Chaves. Ela aparece uma única vez; guarde em lugar seguro.

Cada chave tem escopos, e pode ficar restrita a alguns números do escritório.

EscopoPermite
mensagem:enviarEnviar texto, template e imagem, e consultar envios
nota:criarCriar nota interna
etiqueta:aplicarAplicar etiquetas
contato:gravarExigido quando o corpo traz telefone_e164
conversa:lerLer uma conversa
mensagem:lerLer as mensagens de uma conversa, com o texto
O escritório precisa ter o módulo de integração ligado. Sem ele, toda chamada responde 401.
# <marca>_api_<8 letras ou números>_<43 caracteres>
Authorization: Bearer atendai_api_ab12cd34_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Regras comuns

Para quem enviar

Todo POST indica o alvo de um destes dois jeitos: conversa_id, ou canal_id junto com telefone_e164. O canal_id vem da rota Situação.

Idempotência

Todo POST exige uma chave de idempotência, no cabeçalho Idempotency-Key ou no campo chave_idempotencia, com 8 a 120 caracteres. Repetir a mesma chave com o mesmo corpo devolve o mesmo resultado e não envia duas vezes. A mesma chave com outro corpo dá 409.

Corpo

Até 64 KiB. Campo que a rota não conhece é recusado com 422.

Mensagens privadas e grupos

Conversas privadas e de grupo nunca são devolvidas pela leitura: respondem 404, como se não existissem.

Authorization: Bearer $CHAVE
Content-Type: application/json
Idempotency-Key: pedido-2026-10-12-0001

Situação

GET/api/v1/health

Confirma que a chave funciona e lista os números que ela alcança, com o estado de cada um.

Resposta

CampoDescrição
statusok ou degradado
canais[].idUse como canal_id nos envios
canais[].estadoconectado, em_revisao ou desconectado
curl -sS "https://app.atendai.pro/api/v1/health" \
  -H "Authorization: Bearer $CHAVE"
200
{
  "status": "ok",
  "versao": "1",
  "escritorio_id": "8f1c…",
  "canais": [
    { "id": "6e68…", "nome": "Comercial", "estado": "conectado" }
  ]
}

Enviar texto

POST/api/v1/whatsapp/textomensagem:enviar

Envia uma mensagem de texto. No WhatsApp oficial, só funciona com a janela de 24 horas aberta; fora dela, use um template.

Corpo

CampoTipoDescrição
conversa_iduuidOu canal_id + telefone_e164
texto obrigatóriostring1 a 4096 caracteres
notastringNota interna junto, até 4000 (exige nota:criar)
etiquetasstring[]1 a 10 nomes (exige etiqueta:aplicar)

Resposta

200 quando o WhatsApp confirma em até 6 segundos. 202 com estado: "pendente" quando ainda não confirmou: consulte depois pela chave de idempotência.

curl -sS -X POST "https://app.atendai.pro/api/v1/whatsapp/texto" \
  -H "Authorization: Bearer $CHAVE" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: texto-0001-2026-10-12" \
  -d '{
    "conversa_id": "0b6d1f2e-…",
    "texto": "Olá, seu pedido teve andamento."
  }'
200
{
  "mensagem_id": "a41c…",
  "conversa_id": "0b6d…",
  "estado": "enviada",
  "wamid": "wamid.HBgM…",
  "responsavel": { "tipo": "ia" }
}

Enviar template

POST/api/v1/whatsapp/templatemensagem:enviar

Envia um template aprovado pela Meta. Serve para iniciar conversa ou falar fora da janela de 24 horas.

Corpo

CampoTipoDescrição
template obrigatóriostringNome do template, letras minúsculas, números e _
idioma obrigatóriostringEx.: pt_BR
corpostring[]Variáveis do corpo, em ordem (até 60)
cabecalhostring[]Variável do cabeçalho (no máximo 1)
botao_urlstringParte variável do botão de link
nomestringNome do contato, se ele ainda não existir (até 120)
nota, etiquetasComo no envio de texto
curl -sS -X POST "https://app.atendai.pro/api/v1/whatsapp/template" \
  -H "Authorization: Bearer $CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
    "canal_id": "6e6834d2-…",
    "telefone_e164": "+5511999998888",
    "nome": "Maria Silva",
    "template": "aviso_audiencia",
    "idioma": "pt_BR",
    "corpo": ["Maria", "15/10 às 14h"],
    "chave_idempotencia": "tpl-0001-2026-10-12"
  }'
Exige o escopo contato:gravar quando usa telefone_e164

Enviar imagem

POST/api/v1/whatsapp/imagemmensagem:enviar

Envia uma imagem a partir de um endereço público. Aceita só https://. Não aceita nota nem etiquetas no mesmo pedido.

CampoTipoDescrição
imagem_url obrigatóriostringEndereço https, até 2048
legendastringAté 1024 caracteres
curl -sS -X POST "https://app.atendai.pro/api/v1/whatsapp/imagem" \
  -H "Authorization: Bearer $CHAVE" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: img-0001-2026-10-12" \
  -d '{
    "conversa_id": "0b6d1f2e-…",
    "imagem_url": "https://exemplo.com.br/comprovante.jpg",
    "legenda": "Segue o comprovante."
  }'

Consultar envio

GET/api/v1/whatsapp/template?chave=…mensagem:enviar

Devolve o resultado de qualquer envio pela chave de idempotência usada nele: o mesmo corpo e o mesmo status do POST, mais o pedido_id. Use quando o envio respondeu 202 ou quando a conexão caiu sem resposta.

Consultar uma chave que ainda não existe responde 404 e encerra essa chave: um POST com ela que ainda esteja a caminho passa a ser recusado com 409 CHAVE_ENCERRADA. Só consulte chaves que você já enviou.
curl -sS "https://app.atendai.pro/api/v1/whatsapp/template?chave=texto-0001-2026-10-12" \
  -H "Authorization: Bearer $CHAVE"

Ler conversa

GET/api/v1/conversas/{id}conversa:ler

Devolve os dados da conversa, sem o texto das mensagens (para o texto, use Mensagens da conversa). Não aceita parâmetros na URL.

Conversa privada, de grupo, de outro escritório ou de um número que a chave não alcança responde 404.

curl -sS "https://app.atendai.pro/api/v1/conversas/0b6d1f2e-…" \
  -H "Authorization: Bearer $CHAVE"
200
{
  "id": "0b6d…",
  "estado": "aguardando",
  "canal_id": "6e68…",
  "contato": { "id": "c912…", "nome": "Maria Silva", "telefone": "+5511999998888" },
  "responsavel": { "tipo": "fila", "id": "7a10…" },
  "etiquetas": ["Urgente"],
  "criada_em": "2026-10-10T12:00:00Z",
  "ultima_entrada_em": "2026-10-11T09:00:00Z",
  "atualizada_em": "2026-10-11T09:01:00Z"
}

Mensagens da conversa

GET/api/v1/conversas/{id}/mensagensmensagem:ler

Devolve as mensagens de uma conversa, da mais nova para a mais antiga. É a única rota que devolve o texto das mensagens, por isso exige um escopo próprio, que o Dono marca ao gerar a chave.

Parâmetros na https://app.atendai.pro/api/v1/conversas/0b6d1f2e-…/mensagens?limite=50

ParâmetroTipoDescrição
limiteinteiroQuantas mensagens por página, de 1 a 100. Padrão 50. Valor abaixo de 1 vira 1 e acima de 100 vira 100
antesuuidCursor: o id de uma mensagem desta conversa. Traz só as mensagens mais antigas que ela. Use o proximo_antes da página anterior

Outro parâmetro, parâmetro repetido, limite que não é número ou antes que não é uuid respondem 422 VALIDACAO.

Resposta

CampoDescrição
conversa_idA conversa pedida
mensagens[].idId da mensagem (serve de cursor em antes)
mensagens[].direcaoentrada (veio do cliente) ou saida
mensagens[].tipotexto, imagem, audio, video, documento, figurinha, localizacao, contato, template, lista ou botoes
mensagens[].textoO texto da mensagem, ou null
mensagens[].emData e hora da mensagem
mensagens[].statuspendente, enviada, entregue, lida ou falhou
mensagens[].origemQuem gerou: contato, atendente, ia, fluxo, automacao, agendada, aparelho, equipe ou integracao
mensagens[].erro_metaSó quando status é falhou: { "codigo": 131047 }, o código numérico do WhatsApp. Nos outros casos, null
proximo_antesO cursor da próxima página, ou null quando acabou

Regras

Mensagem apagada, pela equipe ou pelo cliente, vem na lista sem o texto (texto: null). Mensagem editada vem só com o texto atual; a versão anterior não é devolvida.

Registros internos da equipe, como transferência e encerramento, não aparecem. A resposta não traz arquivo de mídia, transcrição nem autor.

Conversa privada, de grupo, de outro escritório ou de um número que a chave não alcança responde 404, assim como um antes que não é uma mensagem desta conversa. Chave sem o escopo mensagem:ler responde 403 ESCOPO_AUSENTE.

curl -sS "https://app.atendai.pro/api/v1/conversas/0b6d1f2e-…/mensagens?limite=50" \
  -H "Authorization: Bearer $CHAVE"

# próxima página: o proximo_antes da resposta anterior
curl -sS "https://app.atendai.pro/api/v1/conversas/0b6d1f2e-…/mensagens?limite=50&antes=9c41b7e0-…" \
  -H "Authorization: Bearer $CHAVE"
200
{
  "conversa_id": "0b6d…",
  "mensagens": [
    {
      "id": "5d2a…",
      "direcao": "saida",
      "tipo": "texto",
      "texto": "Olá, seu pedido teve andamento.",
      "em": "2026-10-11T09:01:00Z",
      "status": "lida",
      "origem": "integracao",
      "erro_meta": null
    },
    {
      "id": "9c41…",
      "direcao": "entrada",
      "tipo": "texto",
      "texto": "Bom dia, alguma novidade?",
      "em": "2026-10-11T09:00:00Z",
      "status": "entregue",
      "origem": "contato",
      "erro_meta": null
    }
  ],
  "proximo_antes": "9c41…"
}

Nota interna

POST/api/v1/conversas/notanota:criar

Registra uma nota que só a equipe vê. Nada é enviado ao cliente. Funciona também em conversas privadas.

CampoTipoDescrição
nota obrigatóriostring1 a 4000 caracteres
nome, etiquetasOpcionais
curl -sS -X POST "https://app.atendai.pro/api/v1/conversas/nota" \
  -H "Authorization: Bearer $CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
    "conversa_id": "0b6d1f2e-…",
    "nota": "Cliente pediu retorno amanhã.",
    "chave_idempotencia": "nota-0001-2026-10-12"
  }'
200
{ "conversa_id": "0b6d…", "contato_id": "c912…", "nota_id": "e7f0…" }

Etiquetas

POST/api/v1/conversas/etiquetasetiqueta:aplicar

Aplica etiquetas que já existem no escritório, pelo nome. Etiqueta que não existe, ou com nome repetido, é recusada com 422: a API não cria etiqueta.

curl -sS -X POST "https://app.atendai.pro/api/v1/conversas/etiquetas" \
  -H "Authorization: Bearer $CHAVE" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: etq-0001-2026-10-12" \
  -d '{ "conversa_id": "0b6d1f2e-…", "etiquetas": ["Urgente"] }'

Erros

Todo erro vem no mesmo formato, com um código fixo para o seu sistema tratar e uma frase para pessoas.

HTTPCódigoQuando
400CHAVE_IDEMPOTENCIA_AUSENTEPOST sem chave de idempotência
401corpo vazioChave ausente, errada ou revogada, ou módulo desligado
403ESCOPO_AUSENTE, CANAL_NAO_PERMITIDOA chave não tem o escopo ou o número
404NAO_ENCONTRADORota, conversa, número ou cursor inexistente
409IDEMPOTENCIA_CONFLITOMesma chave com outro corpo
409CHAVE_ENCERRADAChave encerrada por uma consulta antes do envio
413CORPO_GRANDECorpo acima de 64 KiB
422VALIDACAOCampo inválido ou a mais; vem com erros_campos
422JANELA_FECHADATexto fora da janela de 24 horas
422TEMPLATE_INDISPONIVELTemplate inexistente ou não aprovado
422ETIQUETA_NAO_ENCONTRADAEtiqueta que não existe no escritório
422ERRO_METAO WhatsApp recusou; vem com o código da Meta
429LIMITEPassou do limite; respeite o retry-after
503INDISPONIVELFalhou antes de registrar; pode repetir com a mesma chave
{
  "erro": "VALIDACAO",
  "mensagem": "Algum campo está inválido.",
  "erros_campos": [
    { "campo": "texto", "motivo": "valor inválido" }
  ]
}

Em construção

Estas rotas ainda não estão disponíveis. A lista e os nomes podem mudar até a publicação.
RotaO que faz
GET /api/v1/contatos/{id}Dados de um contato, por id ou telefone
GET /api/v1/conversasLista de conversas, filtrando por data, estado e número
WebhooksAviso no seu sistema a cada mensagem recebida, com assinatura para conferir a origem. O texto da mensagem é opcional e só o Dono liga