Contatos
Os campos de contato são uma parte central de como a Turn.io armazena dados relacionados a um determinado contato.
Oferecemos alguns campos padrão para todos os contatos, bem como a capacidade de criar seus próprios campos personalizados.
Você pode gerenciar os campos de contato na interface do usuário em Configurações
> Pessoas
e importar e segmentar seus usuários na aba Pessoas
.
Como alternativa, documentamos abaixo como você pode realizar as seguintes ações programaticamente com nossa API REST:
- Gerenciar seu esquema de contato
- Gerenciar dados de contatos individuais
- Importar contatos em massa
API de Perfil de Contatos da Turn.io
Por padrão, os seguintes campos são reservados e imediatamente disponíveis para todos os contatos na Turn.io:
name
: STRING, pode sernull
surname
: STRING, pode sernull
location
: LOCATION, pode sernull
language
: ENUM, limitado a códigos de país ISO-639-3, pode sernull
opted_in
: BOOLEAN, padrão éfalse
opted_in_at
: DATETIME, pode sernull
birthday
: DATETIME, pode sernull
whatsapp_profile_name
: STRING, pode sernull
whatsapp_id
: STRING, pode sernull
Qualquer campo criado usando o endpoint /v1/contacts/schema
será adicionado a esses campos.
Obtendo o Esquema do Perfil de Contato
Para obter o esquema atual para um determinado número, você pode fazer o seguinte:
curl https://whatsapp.turn.io/v1/contacts/schemas \
-H 'Authorization: Bearer token' \
-H 'Content-Type: application/json'
> {
"fields": [
{
"custom": false,
"default": null,
"display": "Nome do Perfil do WhatsApp",
"is_private": true,
"name": "whatsapp_profile_name",
"null": true,
"type": "STRING"
},
{
"custom": false,
"default": null,
"display": "Última Visualização",
"is_private": false,
"name": "last_seen_at",
"null": true,
"type": "DATETIME"
},
{
"custom": false,
"default": null,
"display": "Nome",
"is_private": true,
"name": "name",
"null": true,
"type": "STRING"
},
{
"custom": false,
"default": null,
"display": "Sobrenome",
"is_private": true,
"name": "surname",
"null": true,
"type": "STRING"
},
{
"custom": false,
"default": null,
"display": "Localização",
"is_private": true,
"name": "location",
"null": true,
"type": "LOCATION"
},
{
"custom": false,
"default": false,
"display": "Optou por Participar",
"is_private": false,
"name": "opted_in",
"null": false,
"type": "BOOLEAN"
},
{
"custom": false,
"default": null,
"display": "Idioma",
"enum": [],
"is_private": true,
"name": "language",
"null": true,
"type": "ENUM"
},
{
"custom": false,
"default": null,
"display": "Aniversário",
"is_private": true,
"name": "birthday",
"null": true,
"type": "DATETIME"
},
{
"custom": false,
"default": null,
"display": "Primeira Mensagem Recebida Em",
"is_private": false,
"name": "first_message_received_at",
"null": true,
"type": "DATETIME"
},
{
"custom": false,
"default": null,
"display": "Última Mensagem Enviada Em",
"is_private": false,
"name": "last_message_sent_at",
"null": true,
"type": "DATETIME"
},
{
"custom": false,
"default": null,
"display": "Última Mensagem Recebida Em",
"is_private": false,
"name": "last_message_received_at",
"null": true,
"type": "DATETIME"
},
{
"custom": false,
"default": null,
"display": "Optou por Participar Em",
"is_private": false,
"name": "opted_in_at",
"null": true,
"type": "DATETIME"
},
{
"custom": false,
"default": null,
"display": "ID do WhatsApp",
"is_private": true,
"name": "whatsapp_id",
"null": true,
"type": "STRING"
},
{
"custom": false,
"default": false,
"display": "Está Bloqueado",
"is_private": false,
"name": "is_blocked",
"null": false,
"type": "BOOLEAN"
}
],
"uuid": "d4deddbf-9cca-4e26-ab55-9b6653da1325",
"version": "0.0.1-alpha"
}
Criando Novos Campos no Perfil de Contato
Para criar campos adicionais, envie uma solicitação HTTP POST
para /v1/contacts/schemas
. Isso criará uma nova definição de esquema com um novo uuid
.
A partir desse ponto, a Turn.io continuará retornando contatos de acordo com esquemas anteriores, mas permitirá apenas a escrita de contatos de acordo com o esquema criado mais recentemente.
É responsabilidade do client da API migrar os detalhes do perfil de contato entre alterações de esquema.
curl -X POST https://whatsapp.turn.io/v1/contacts/schemas \
-H 'Authorization: Bearer token' \
-H 'Accept: application/vnd.v1+json' \
-H 'Content-Type: application/json' \
-d '{
"version": "0.0.1-alpha",
"fields": [{
"name": "consent",
"display": "Consentimento Dado",
"type": "BOOLEAN",
"default": false,
"is_private": true
}, {
"name": "gender",
"display": "Gênero",
"type": "ENUM",
"null": false,
"is_private": false,
"default": "UNDISCLOSED",
"enum": [
{"value": "MALE", "display": "Masculino"},
{"value": "FEMALE", "display": "Feminino"},
{"value": "OTHER", "display": "Outro"},
{"value": "UNDISCLOSED", "display": "Não Informado"}
]
}]
}'
> {
"version": "0.0.1-alpha",
"uuid": "<o-novo-uuid-do-esquema>",
"fields": [{
"name": "consent",
"display": "Consentimento Dado",
"type": "BOOLEAN",
"default": false,
"is_private": true
}, {
"name": "gender",
"display": "Gênero",
"type": "ENUM",
"null": false,
"is_private": false,
"default": "UNDISCLOSED",
"enum": [
{"value": "MALE", "display": "Masculino"},
{"value": "FEMALE", "display": "Feminino"},
{"value": "OTHER", "display": "Outro"},
{"value": "UNDISCLOSED", "display": "Não Informado"}
]
}]
}
A resposta é o esquema com o valor uuid
identificando o esquema na payload.
Os tipos de campo suportados são:
DATETIME
, restrito a timestamps formatados no padrãoISO8601
no fuso horárioUTC
.BOOLEAN
, restrito aos tipos booleanos JSONtrue
efalse
.STRING
FLOAT
INTEGER
ENUM
, que requer um parâmetro adicionalenum
especificando a lista de valores permitidos.LOCATION
, que espera um objeto{"latitude": ..., "longitude": ...}
.
Todos os campos podem ser configurados para aceitar valores null
especificando "null": true
ou "null": false
.
A única exceção é o tipo de campo BOOLEAN
.
O campo BOOLEAN
exige um valor default
definido como true
ou false
e não pode ser configurado para permitir valores null
.
Todos os campos devem fornecer um valor default
, que pode ser null
se "null": true
for especificado, com exceção dos campos BOOLEAN
.
O parâmetro display
é o nome amigável do campo.
O parâmetro name
deve estar em letras minúsculas, começar com uma letra e conter apenas caracteres alfanuméricos minúsculos e sublinhados.
O parâmetro enum
aceita apenas uma lista de opções. As opções são objetos que possuem campos value
e display
. O campo value
deve estar em letras maiúsculas, começar com uma letra e conter apenas caracteres alfanuméricos maiúsculos ou underscores.
Para recuperar um esquema anterior, faça uma solicitação HTTP GET
para o endpoint /v1/contacts/schemas/<uuid>
.
Obtendo um Perfil de Contato
Para obter os detalhes do perfil de um contato, faça uma chamada para o endpoint /v1/contacts/<wa-id>/profile
.
curl https://whatsapp.turn.io/v1/contacts/27123456789/profile \
-H 'Authorization: Bearer token' \
-H 'Accept: application/vnd.v1+json'
> '{
"version": "0.0.1-alpha",
"schema": "<o-uuid-do-esquema>",
"generation": 0,
"fields": {
"language": "ENG",
"date_of_birth": null,
"age": 2,
"consent": false,
"location": null,
"name": null,
"risk_profile": 2.0,
"surname": null,
"birthday": null,
"opted_in": false,
"opted_in_at": null,
"whatsapp_id": null,
"whatsapp_profile_name": null
}
}'
Por favor, note que um campo recém-criado só aparecerá no perfil de um contato se seu valor tiver sido explicitamente definido ou atualizado. Valores padrão para novos campos não são automaticamente incluídos no perfil do contato. Por exemplo, se um campo de contato for referenciado, mas não tiver sido explicitamente definido, o valor padrão desse campo será exibido sempre que for referenciado. No entanto, ao consultar os campos de contato via o endpoint /v1/contacts/{wa_number}/profile
, a resposta incluirá apenas os campos que foram explicitamente persistidos nos dados do contato. Novos campos criados na interface do usuário não aparecerão na resposta, a menos que seus valores tenham sido atualizados e salvos.
Para recuperar um perfil de contato para um esquema anterior, forneça o uuid
do esquema como um parâmetro de consulta:
curl "https://whatsapp.turn.io/v1/contacts/27123456789/profile?schema=<o-uuid-do-esquema>" \
-H 'Authorization: Bearer token' \
-H 'Accept: application/vnd.v1+json'
> '{
"version": "0.0.1-alpha",
"schema": "<o-uuid-do-esquema>",
"generation": 0,
"fields": {
"language": "ENG",
"date_of_birth": null,
"age": 2,
"consent": false,
"location": null,
"name": null,
"risk_profile": 2.0,
"surname": null,
"birthday": null,
"opted_in": false,
"opted_in_at": null,
"whatsapp_id": null,
"whatsapp_profile_name": null
}
}'
O campo generation
é automaticamente incrementado em 1 para cada alteração feita no perfil do contato.
Substituir um Perfil de Contato
Para substituir os detalhes completos do perfil de um contato, faça uma chamada HTTP PUT
para o endpoint /v1/contacts/<wa-id>/profile
.
curl -X PUT https://whatsapp.turn.io/v1/contacts/27123456789/profile \
-H 'Authorization: Bearer token' \
-H 'Accept: application/vnd.v1+json' \
-H 'Content-Type: application/json' \
-d '{"name": "Fizbo"}'
> '{
"version": "0.0.1-alpha",
"generation": 1,
"schema": "<o-uuid-do-esquema>",
"fields": {
"language": null,
"date_of_birth": null,
"age": 0,
"consent": false,
"location": null,
"name": "Fizbo",
"risk_profile": 0.0,
"surname": null,
"birthday": null,
"opted_in": false,
"opted_in_at": null,
"whatsapp_id": null,
"whatsapp_profile_name": null
}
}'
Por favor, note que as atualizações de perfis de contato serão sempre validadas de acordo com o esquema mais recente.
Atualizar um Perfil de Contato
Para atualizar parcialmente um perfil de contato, faça uma chamada HTTP PATCH
para o endpoint /v1/contacts/<wa-id>/profile
fornecendo apenas os campos que precisam ser atualizados.
curl -X PATCH https://whatsapp.turn.io/v1/contacts/27123456789/profile \
-H 'Authorization: Bearer token' \
-H 'Accept: application/vnd.v1+json' \
-H 'Content-Type: application/json' \
-d '{"name": "Fizbo"}'
> '{
"version": "0.0.1-alpha",
"generation": 2,
"schema": "<o-uuid-do-esquema>",
"fields": {
"language": "ENG",
"date_of_birth": null,
"age": 2,
"consent": false,
"location": null,
"name": "Fizbo",
"risk_profile": 2.0,
"surname": null,
"birthday": null,
"opted_in": false,
"opted_in_at": null,
"whatsapp_id": null,
"whatsapp_profile_name": null
}
}'
Por favor, note que atualizações parciais de perfis de contato serão sempre validadas de acordo com o esquema mais recente.
Redefinir um Perfil de Contato
Para redefinir todos os detalhes do perfil de um contato para os padrões do esquema, faça uma chamada HTTP DELETE
para o endpoint /v1/contacts/<wa-id>/profile
.
Por favor, note que esse comportamento excluirá o perfil do contato, redefinindo todos os valores para seus padrões ou para null. Se você deseja excluir o próprio Contato, bem como o perfil do contato, utilize o endpoint de exclusão de Chat.
$ curl -X DELETE https://whatsapp.turn.io/v1/contacts/27123456789/profile \
-H 'Authorization: Bearer token' \
-H 'Accept: application/vnd.v1+json' \
-H 'Content-Type: application/json'
> '{}'
Importar Perfis de Contato via CSV
Para importar informações de contato em massa, você pode fazer o upload de um arquivo CSV com todos os detalhes usando o endpoint da API /v1/contacts
.
Os dados importados do arquivo CSV são regidos pelo esquema de contato definido usando a API de Perfil de Contato.
O arquivo CSV fornecido deve ter uma coluna chamada urn, que contém o número de telefone do contato que você deseja criar ou atualizar. Se já existir um perfil de contato para o número de telefone informado, ele será atualizado com os campos fornecidos. Caso contrário, será criado um novo perfil com os campos fornecidos.
Os valores das colunas substituirão os valores existentes dos contatos no banco de dados. Quaisquer outros valores de campos de contato permanecerão inalterados.
urn,name,surname,age
+271234567890,Peter,Parker,21
+271234567891,Peter,Barker,22
+271234567892,Peter,Porker,19
+271234567893,Spider,Ham,20
Para cada um desses contatos, a importação verificará um perfil existente com o URN
fornecido e atualizará os campos. Os campos são convertidos para os tipos correspondentes no perfil de contato e retornará um erro se o campo não puder ser convertido.
Observe que qualquer campo fornecido no CSV que não seja conhecido pelo esquema de contato será ignorado.
Os contatos são importados imediatamente no banco de dados principal e estarão disponíveis para mensagens. Eles são indexados de forma assíncrona no banco de dados de pesquisa secundário, podendo levar um ou dois minutos para estarem disponíveis em Reminders e Gatilhos após a conclusão da importação.
Esta API transmitirá o resultado da importação em tempo real como uma resposta formatada em CSV:
$ curl \
-X POST
-H 'Content-Type: text/csv' \
-H 'Authorization: Bearer token' \
--data-binary 'urn,name,surname
+27123456789,spider,ham
+27123456790,peter,parker
' https://whatsapp.turn.io/v1/contacts
> 'urn,name,surname
+27123456789,spider,ham
+27123456790,peter,parker'
Relatórios de erro para tipos incompatíveis
Se tentarmos enviar um CSV com dados inválidos, a API retornará o erro inline com o prefixo ERROR
na posição do campo em questão.
$ curl \
-X POST \
-H 'Content-Type: text/csv' \
-H 'Authorization: Bearer token' \
--data-binary 'urn,name,surname,opted_in
+27123456789,peter,parker,"yes"
' https://whatsapp.turn.io/v1/contacts
> "+27123456789,,,ERROR: não foi possível converter o valor 'yes' para booleano"
Colunas desconhecidas
Se o próprio URN
estiver com formato incorreto, o erro será exibido na segunda coluna.
Qualquer coluna fornecida no CSV que não possa ser mapeada para um campo conhecido será descartada e não será incluída na resposta.
$ curl \
-X POST \
-H 'Content-Type: text/csv' \
-H 'Authorization: Bearer token' \
--data-binary 'urn,name,surname,unknown_field
+27123456789,peter,parker,unknown_field_value
' https://whatsapp.turn.io/v1/contacts
> 'urn,name,surname
+27123456789,peter,parker'
Conversão para tipos de campos de contato
Todos os valores conhecidos são transmitidos de volta após o parsing e a conversão de tipo, representando as representações internas desses valores na Turn.io. O URN será normalizado no formato E164
e a string "true" será convertida para o booleano true
para o campo opted_in
.
$ curl \
-X POST \
-H 'Content-Type: text/csv' \
-H 'Authorization: Bearer token' \
--data-binary 'urn,name,surname,opted_in
+27123456789,peter,parker,"true"
' https://whatsapp.turn.io/v1/contacts
> '+27123456789,peter,parker,true'
Limitações de tamanho do arquivo
Atualmente, o limite da API permite arquivos de até 1 Megabyte. Se você precisar enviar mais dados de contatos do que podem ser representados em 1 Megabyte, será necessário dividir os dados em arquivos CSV separados, cada um com seu próprio header.
[Descontinuado] Busca de Perfis de Contato
O endpoint em /v1/export/contacts/details
foi descontinuado. Para exportar dados de contato, use a API de Exportação de Dados.
[Descontinuado] Verificação de Status do WhatsApp
A API de Contatos original on-premisse foi reformulada a partir da versão v2.43 da API do WhatsApp Business. Ela não fornece mais informações de status sobre um número de telefone.
As respostas desse endpoint não retornam mais um status
'inválido'. Um status
'válido' e um wa_id
serão fornecidos para todas as solicitações, independentemente de o número de telefone estar conectado a uma conta do WhatsApp. Não há garantia de que o wa_id
retornado seja válido. Essas mudanças se aplicam tanto para respostas diretas quanto para respostas via webhook em chamadas não bloqueantes. O WhatsApp continuará retornando as mesmas respostas 'processing' e 'failed', como faz atualmente.
A implementação original da API permanece ativa, mas não está mais documentada e será removida completamente no futuro.