Cadastro do número
Troca o código do Embedded Signup, assina o webhook e pede a importação única de histórico e contatos.
Trocar o código do Embedded Signup
Última etapa do cadastro no navegador: troca o code da Meta por um token de acesso, descobre a WABA concedida e cria uma conta para cada número dela. Devolve a conta principal (a primeira). Só administrador pode chamar, porque a conta criada é a da loja inteira.
/api/v1/admin/whatsapp-confluence/onboarding/exchange-codeAdminTroca o código do Embedded Signup
Corpo da requisição
codestringobrigatórioExemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/whatsapp-confluence/onboarding/exchange-code" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"code": "AQD3x...codigo-da-meta"}'Resposta
{
"id": "11111111-1111-4111-8111-111111111111",
"phone_number_id": "109876543210987",
"business_phone": "5511987654321",
"display_name": "Loja Exemplo",
"waba_id": "208765432109876",
"status": "P",
"onboarding_state": "X",
"step": "connected",
"is_on_biz_app": true,
"platform_type": "CLOUD_API",
"webhook_subscribed": false,
"sync_window_open": true,
"history_sync_requested": false,
"history_sync_status": "P",
"contacts_sync_requested": false,
"contacts_sync_status": "P",
"sync_deadline_at": "2026-10-12T14:30:00Z"
}Campos da resposta
(corpo)objectErros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | JSON inválido. | {"error":"invalid JSON body"} |
| 400 | Código vazio. | {"error":"código de autorização ausente","kind":""} |
| 400 | A Meta não devolveu token, a conta WABA ou número algum. | {"error":"Nenhum número encontrado na conta WhatsApp Business concedida.","kind":""} |
| 403 | Chamador não é administrador. | {"error":"acesso negado","kind":"forbidden"} |
| 409 | A plataforma não tem as credenciais do aplicativo da Meta. | {"error":"Credenciais da plataforma (app_id/app_secret) não configuradas no painel IO.","kind":"config_missing"} |
| 500 | Falha ao falar com a Meta. | {"error":"..."} |
| 401 | Sem token, token inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O usuário não tem papel de administrador. | {"error":"insufficient permissions"} |
Assinar o webhook
Registra a plataforma na Meta para receber as mensagens e os status deste número, apontando para um endereço exclusivo da loja. Marca a conta como webhook_subscribed e avança o cadastro para subscribed. Se você não chamar, uma rotina em segundo plano tenta por conta própria.
/api/v1/admin/whatsapp-confluence/onboarding/subscribe-webhookAdminAssina os eventos de um número
Corpo da requisição
account_iduuidobrigatórioid da URL, que nestas rotas não existe: então é obrigatório na prática.Exemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/whatsapp-confluence/onboarding/subscribe-webhook" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"account_id": "11111111-1111-4111-8111-111111111111"}'Resposta
{
"id": "11111111-1111-4111-8111-111111111111",
"phone_number_id": "109876543210987",
"business_phone": "5511987654321",
"display_name": "Loja Exemplo",
"waba_id": "208765432109876",
"status": "P",
"onboarding_state": "S",
"step": "subscribed",
"is_on_biz_app": true,
"platform_type": "CLOUD_API",
"webhook_subscribed": true,
"sync_window_open": false,
"history_sync_requested": false,
"history_sync_status": "P",
"contacts_sync_requested": false,
"contacts_sync_status": "P"
}Campos da resposta
(corpo)objectErros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | account_id ausente. | {"error":"account_id required"} |
| 403 | Seller tentando mexer em conta que não é dele. | {"error":"acesso negado","kind":"forbidden"} |
| 404 | Conta inexistente. | {"error":"conta não encontrada","kind":"not_found"} |
| 409 | Faltam o token de verificação ou a URL pública na plataforma. | {"error":"verify_token da plataforma não configurado no painel IO.","kind":"config_missing"} |
| 500 | A Meta recusou a assinatura. | {"error":"..."} |
| 401 | Sem token, token inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O usuário não tem papel de administrador. | {"error":"insufficient permissions"} |
Importar o histórico
Pede à Meta que envie as conversas dos últimos meses do aplicativo WhatsApp Business para dentro da caixa de entrada. A resposta é imediata, mas a importação chega depois, pelo webhook; acompanhe history_sync_status. Só uma vez, e só nas 24 horas depois do cadastro.
/api/v1/admin/whatsapp-confluence/onboarding/sync-historyAdminPede a importação do histórico
Corpo da requisição
account_iduuidobrigatórioid da URL, que nestas rotas não existe: então é obrigatório na prática.Exemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/whatsapp-confluence/onboarding/sync-history" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"account_id": "11111111-1111-4111-8111-111111111111"}'Resposta
{
"id": "11111111-1111-4111-8111-111111111111",
"phone_number_id": "109876543210987",
"business_phone": "5511987654321",
"display_name": "Loja Exemplo",
"waba_id": "208765432109876",
"status": "A",
"onboarding_state": "H",
"step": "sync_requested",
"is_on_biz_app": true,
"platform_type": "CLOUD_API",
"webhook_subscribed": true,
"sync_window_open": true,
"history_sync_requested": true,
"history_sync_status": "R",
"contacts_sync_requested": false,
"contacts_sync_status": "P"
}Campos da resposta
(corpo)objecthistory_sync_requested true e history_sync_status R.Erros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | account_id ausente. | {"error":"account_id required"} |
| 403 | Seller tentando mexer em conta que não é dele. | {"error":"acesso negado","kind":"forbidden"} |
| 404 | Conta inexistente. | {"error":"conta não encontrada","kind":"not_found"} |
| 409 | Janela de 24 horas encerrada. | {"error":"A janela de 24h para importar histórico/contatos já encerrou.","kind":"window_closed"} |
| 409 | Já foi pedido antes. | {"error":"A importação já foi solicitada uma vez (operação one-shot).","kind":"already_requested"} |
| 500 | A Meta recusou o pedido. | {"error":"..."} |
| 401 | Sem token, token inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O usuário não tem papel de administrador. | {"error":"insufficient permissions"} |
Importar os contatos
Igual a importar o histórico, mas para a agenda do aplicativo WhatsApp Business. Os contatos chegam pelo webhook e podem ser consultados em Contatos importados. Mesmas regras: uma vez só, dentro de 24 horas.
/api/v1/admin/whatsapp-confluence/onboarding/sync-contactsAdminPede a importação dos contatos
Corpo da requisição
account_iduuidobrigatórioid da URL, que nestas rotas não existe: então é obrigatório na prática.Exemplo de requisição
curl -X POST "$BASE_URL/api/v1/admin/whatsapp-confluence/onboarding/sync-contacts" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"account_id": "11111111-1111-4111-8111-111111111111"}'Resposta
{
"id": "11111111-1111-4111-8111-111111111111",
"phone_number_id": "109876543210987",
"business_phone": "5511987654321",
"display_name": "Loja Exemplo",
"waba_id": "208765432109876",
"status": "A",
"onboarding_state": "H",
"step": "sync_requested",
"is_on_biz_app": true,
"platform_type": "CLOUD_API",
"webhook_subscribed": true,
"sync_window_open": true,
"history_sync_requested": false,
"history_sync_status": "P",
"contacts_sync_requested": true,
"contacts_sync_status": "R"
}Campos da resposta
(corpo)objectcontacts_sync_requested true e contacts_sync_status R.Erros
| Status | Quando | Corpo de exemplo |
|---|---|---|
| 400 | account_id ausente. | {"error":"account_id required"} |
| 403 | Seller tentando mexer em conta que não é dele. | {"error":"acesso negado","kind":"forbidden"} |
| 404 | Conta inexistente. | {"error":"conta não encontrada","kind":"not_found"} |
| 409 | Janela de 24 horas encerrada. | {"error":"A janela de 24h para importar histórico/contatos já encerrou.","kind":"window_closed"} |
| 409 | Já foi pedido antes. | {"error":"A importação já foi solicitada uma vez (operação one-shot).","kind":"already_requested"} |
| 500 | A Meta recusou o pedido. | {"error":"..."} |
| 401 | Sem token, token inválido ou expirado. | {"error":"missing authorization header"} |
| 403 | O usuário não tem papel de administrador. | {"error":"insufficient permissions"} |