Quando usar
- Você precisa criar ou atualizar um contato por vez no Cloud Chat via API
- Você quer um endpoint mais simples e que preserva campos não enviados (não sobrescreve com null)
- Você está integrando com um sistema externo que emite eventos individuais (ex: novo cadastro)
Pré-requisitos
-
API Key em mãos — ver Como encontrar sua API Key no Cloud Chat
-
CLOUDCHAT_DOMAINeACCOUNT_ID -
Pelo menos um identificador entre
phone_number,emailouidentifier
Quer importar vários contatos de uma vez? Use o endpoint de Como importar contatos em massa via API. Os dois endpoints têm formatos de body diferentes — não misture.
Endpoint
POST https://{{CLOUDCHAT_DOMAIN}}/api/v1/accounts/{{ACCOUNT_ID}}/contacts/external_import
Headers
| Header | Valor |
|---|---|
content-type |
application/json |
api_access_token |
Seu token de API |
Corpo da requisição
O body é um objeto JSON simples (flat), sem arrays. Pelo menos um dos campos phone_number, identifier ou email deve estar presente.
{
"phone_number": "+5599123456789",
"identifier": "CUSTOM_ID",
"email": "[email protected]",
"name": "Nome do Contato",
"company_name": "Empresa X",
"tags": "tag1, tag2, tag3",
"ATRIBUTO_CUSTOMIZADO": "valor"
}
Campos disponíveis
| Campo | Obrigatório | Descrição |
|---|---|---|
phone_number |
Pelo menos 1 dos 3* | Telefone em E.164 com + (ex: +5511999998888) |
email |
Pelo menos 1 dos 3* | E-mail do contato |
identifier |
Pelo menos 1 dos 3* | Identificador externo único |
name |
Não | Nome do contato |
company_name |
Não | Nome da empresa |
tags |
Não | Tags separadas por vírgula |
| Campos customizados | Não | Use a chave do atributo customizado cadastrado no Cloud Chat |
*Pelo menos um entre phone_number, email ou identifier deve ser informado.
Exemplo de requisição
curl -X POST \
'https://{{CLOUDCHAT_DOMAIN}}/api/v1/accounts/{{ACCOUNT_ID}}/contacts/external_import' \
--header 'content-type: application/json' \
--header 'api_access_token: SEU_TOKEN' \
--data '{
"phone_number": "+5599123456789",
"name": "Nome do Contato",
"email": "[email protected]",
"company_name": "Empresa X",
"tags": "tag1, tag2"
}'
Comportamento de criação e atualização (upsert)
Este endpoint cria ou atualiza automaticamente. Para decidir se o contato já existe, o sistema busca na seguinte ordem de prioridade:
-
Primeiro busca por
email -
Se não enviou email, busca por
identifier -
Se não enviou identifier, busca por
phone_number
A busca usa apenas o primeiro campo disponível na ordem acima. Ela não tenta os campos seguintes se o primeiro não encontrar.
Lookup de variantes (BR mobile-9)
Este endpoint individual faz lookup exato por phone_number. Se você precisa criar/atualizar contatos com lookup de variantes (ex.: você envia +5511933334444 e o contato existe como +551133334444), use o endpoint de Import em massa com api_version: "v2" (ou normalize_lookup: true).
Mudança a partir de 30/04/2026: a busca por variantes está disponível apenas no caminho bulk.
O que isso significa na prática
Se você quer atualizar um contato que já existe pelo telefone (ex: adicionar um e-mail), e envia:
{
"phone_number": "+5511999998888",
"email": "[email protected]"
}
O sistema busca pelo email primeiro (porque o campo email está presente). Se [email protected] não existe em nenhum contato, ele não tenta buscar pelo phone_number — vai tentar criar um contato novo, que pode falhar silenciosamente por conflito de telefone.
Como fazer corretamente
Para atualizar um contato existente por telefone, faça o flow em duas etapas:
Passo 1 — Localize o contato (se precisar do ID):
curl -X GET \
'https://{{CLOUDCHAT_DOMAIN}}/api/v1/accounts/{{ACCOUNT_ID}}/contacts/search?q=+5511999998888' \
--header 'api_access_token: SEU_TOKEN'
Passo 2 — Atualize via endpoint de update individual:
curl -X PUT \
'https://{{CLOUDCHAT_DOMAIN}}/api/v1/accounts/{{ACCOUNT_ID}}/contacts/{{CONTACT_ID}}' \
--header 'content-type: application/json' \
--header 'api_access_token: SEU_TOKEN' \
--data '{"email": "[email protected]"}'
Resposta
| Status | Significado |
|---|---|
204 No Content |
Requisição processada (sem corpo de resposta) |
422 Unprocessable Entity |
Erro de validação |
O status 204 indica que a requisição foi recebida, mas não retorna o contato criado/atualizado. Se precisar confirmar a alteração, faça uma consulta após a chamada.
Diferença entre este endpoint e o Import em massa
Este endpoint (external_import) |
Import em massa (bulk_create) |
|
|---|---|---|
| Quando usar | Importar/atualizar 1 contato por chamada | Importar/atualizar vários contatos |
| Formato do body | Objeto JSON simples (flat) | {"upsert": true, "data": [{...}]} |
| Upsert | Sempre ativo (automático) | Precisa do flag "upsert": true |
| Resposta | 204 No Content (sem corpo) |
201 Created com resultado |
Não misture os formatos. Se enviar {"upsert": true, "data": [...]} para este endpoint, não vai funcionar. Esse formato é exclusivo do endpoint de import em massa.
Onde encontrar os parâmetros
-
CLOUDCHAT_DOMAIN— domínio visível na URL do navegador -
ACCOUNT_ID— em Configurações da conta -
API_TOKEN— emhttps://{{CLOUDCHAT_DOMAIN}}/app/accounts/{{ACCOUNT_ID}}/profile/settings
Observações
-
Para volumes grandes (muitos contatos): Como importar contatos em massa via API
-
Para integração com workflows do HubSpot: Como importar contatos via HubSpot
-
Para visão geral das APIs disponíveis: Guia Mestre — Como acessar e operar dados do Cloud Chat via API