API · Atualizado em 12/10/2026

Contatos pela API: criar, buscar, editar e etiquetar

Crie ou encontre contatos sem duplicar, busque por telefone, e-mail ou documento, edite campos e atributos, etiquete e leia o histórico do contato.

O contato é a pessoa do outro lado da conversa. Pela API você cria, encontra, edita e etiqueta contatos e lê o histórico de mensagens de cada um.

Quando usar

  • Para sincronizar clientes do seu CRM com o Pipe antes de uma campanha ou de um atendimento.
  • Para gravar dados do seu sistema no contato, como plano contratado, em atributos.
  • Para buscar o contato de um telefone e abrir um ticket para ele.

Pré-requisitos

  • Chave com contatos:ler para consultar e contatos:escrever para criar, editar e etiquetar.
  • Telefones no formato internacional E.164, como +5511955550101.

Rotas

MétodoRotaEscopoO que faz
GET/v1/contactscontatos:lerLista e busca contatos
GET/v1/contacts/:idcontatos:lerLê um contato
POST/v1/contactscontatos:escreverCria ou encontra um contato
PATCH/v1/contacts/:idcontatos:escreverEdita campos e junta atributos
GET/v1/contacts/:id/messagesmensagens:lerLê o histórico de mensagens, incluindo o bot
GET/v1/contacts/:id/labelscontatos:lerLista as etiquetas do contato
POST/v1/contacts/:id/labelscontatos:escreverAplica uma etiqueta
DELETE/v1/contacts/:id/labels/:labelIdcontatos:escreverRemove uma etiqueta

Passo a passo: criar ou encontrar um contato

  1. Envie os dados que você tem. Informe ao menos um identificador: telefone, e-mail ou identidade de canal.
curl -s -X POST https://http.pipebr.app/v1/contacts \
  -H "Authorization: Bearer $PIPE_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Maria Exemplo",
    "phoneE164": "+5511955550101",
    "email": "maria@exemplo.test",
    "atributos": { "plano": "ouro", "cliente_desde": "2024" }
  }'
  1. A resposta é 201 se o contato foi criado e 200 se já existia. O campo created diz qual foi:
{
  "id": "b3a1c9de-0000-4000-8000-000000000010",
  "nome": "Maria Exemplo",
  "telefone_e164": "+5511955550101",
  "email": "maria@exemplo.test",
  "documento": null,
  "bloqueado": false,
  "criado_em": "2026-10-12T14:30:00.000Z",
  "atributos": { "plano": "ouro", "cliente_desde": "2024" },
  "created": true
}

Campos do corpo

CampoRegra
nameAté 200 caracteres
phoneE164Formato internacional. Inválido dá 400 contact_phone_invalid
emailAté 320 caracteres. Inválido dá 400 contact_email_invalid
documentAté 40 caracteres
atributosObjeto com valores simples (texto até 2000 caracteres, número, booleano ou null), até 100 chaves
channelTypewhatsapp_cloud (padrão), instagram, messenger ou widget
channelIdentity{ channelType, identifier }. Obrigatório fora do WhatsApp. No WhatsApp o identificador são os dígitos do telefone

Se o contato já existe, os atributos enviados são juntados aos atuais e os campos name, email e document que você enviou preenchem o contato. O telefone é guardado na forma canônica, com o nono dígito.

Para falhar em vez de mesclar, use POST /v1/contacts?upsert=false. Um identificador já usado responde 409 com contact_phone_in_use, contact_identity_in_use ou contact_email_in_use.

Buscar contatos

ParâmetroBusca
telefoneTelefone em qualquer grafia, incluindo o nono dígito
emailE-mail exato
documentoDocumento exato
searchParte do nome, sem diferenciar maiúsculas
limit, cursor, order_by=criado_em[desc]Paginação, como em Erros, respostas e paginação
curl -s "https://http.pipebr.app/v1/contacts?telefone=%2B5511955550101" \
  -H "Authorization: Bearer $PIPE_CHAVE"

Editar um contato

PATCH /v1/contacts/:id muda só o que você enviar. Um campo enviado com null é apagado. Os atributos são sempre juntados aos existentes, nunca substituídos.

curl -s -X PATCH https://http.pipebr.app/v1/contacts/b3a1c9de-0000-4000-8000-000000000010 \
  -H "Authorization: Bearer $PIPE_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{"email": "maria.nova@exemplo.test", "atributos": {"plano": "diamante"}}'

Um telefone que já pertence a outro contato dá 409 contact_phone_in_use. A edição não muda as identidades de canal nem o campo bloqueado.

Histórico do contato

GET /v1/contacts/:id/messages junta, em ordem, as mensagens dos tickets do contato e as da conversa com o bot, mesmo quando nunca houve ticket.

ParâmetroO que faz
orderasc (padrão) ou desc
since, untilLimites de data (ISO ou AAAA-MM-DD)
include_botfalse para ver só tickets
limit, cursorPaginação, até 100 por página

Cada mensagem traz source (bot ou ticket), conversationId e executionId. Notas internas nunca aparecem.

Etiquetas do contato

Para aplicar, envie o id da etiqueta:

curl -s -X POST https://http.pipebr.app/v1/contacts/b3a1c9de-0000-4000-8000-000000000010/labels \
  -H "Authorization: Bearer $PIPE_CHAVE" \
  -H "Content-Type: application/json" \
  -d '{"etiqueta_id": "b3a1c9de-0000-4000-8000-000000000500"}'

A resposta traz etiqueta_id, nome e aplicada. Para descobrir os ids, use GET /v1/labels?scope=contato, em Consultar cadastros.

Resultado esperado

O contato fica criado ou atualizado, com os atributos do seu sistema, e pronto para receber ticket, mensagem ativa ou campanha.

Problemas comuns

  • 409 em chave de fluxo ao criar contato: o telefone já existe, mas o contato está fora do seu fluxo. A chave não altera nem revela contatos de outros fluxos, então nada é gravado.
  • 404 logo depois de criar com chave de fluxo: a chave só enxerga contatos que têm ticket ou sessão de bot no fluxo. Abra um ticket ou envie uma mensagem ativa para ele entrar no alcance.
  • 400 contact_without_identifier: informe telefone, e-mail ou identidade de canal. Sem um deles, o contato não receberia mensagem.

Boas práticas

  • Normalize o telefone para E.164 antes de enviar.
  • Use atributos para dados de negócio e mantenha as chaves em um padrão fixo, como plano e cliente_desde.
  • Envie Idempotency-Key se sua rotina de sincronização puder repetir chamadas.

Próximos passos

Perguntas frequentes

Criar um contato duas vezes duplica o cadastro?

Não. POST /v1/contacts procura primeiro pela identidade do canal, depois pelo telefone em qualquer grafia e, por último, pelo e-mail. Se achar, devolve 200 e created: false e junta os atributos enviados.

Como recebo erro em vez de mesclar?

Use POST /v1/contacts?upsert=false. Se já existir contato com o mesmo telefone, identidade ou e-mail, a resposta é 409.

A busca por telefone entende o nono dígito?

Sim. +5571997012615 e +557197012615 encontram o mesmo contato. Número fixo nunca ganha o 9.

Minha chave de fluxo não acha o contato que acabei de criar. Por quê?

Chaves de fluxo só enxergam contatos que têm ticket ou sessão de bot no fluxo. Um contato recém-criado, sem conversa, ainda não está no alcance da chave.