Assistente de cadastro
Adiciona um número novo de WhatsApp Business, pede e confirma o código da Meta, consulta a situação e sugere nome e texto do perfil.
O assistente é a sequência que o painel mostra a quem ainda não tem o número no WhatsApp Business. São seis rotas: quatro formam a sequência register, request-code, verify e status; duas são ajudas de preenchimento (suggest-names e suggest-description).
Os identificadores e o ciclo do número estão no resumo da seção. Antes de começar, o telefone precisa estar livre: se ele ainda tem uma conta de WhatsApp comum (a do aplicativo), a Meta recusa e a rota devolve 409 whatsapp_exists. Apague essa conta no aplicativo primeiro.
Estas rotas devolvem erros no formato {"error": "texto em português", "kind": "codigo"}. Trate o kind, que é estável; a frase pode mudar.
Cadastrar o número
/api/v1/vendor/whatsapp/self-setup/registerSellerAdiciona o número à conta da Meta e define o perfil
Adiciona o número à conta WhatsApp Business da loja, envia o nome de exibição e o perfil à Meta e cria a credencial do seller no estado pendente. O seller é sempre o dono do token; um vendor_id no corpo é ignorado.
Com um número ativo no seller, a chamada devolve 409 limit_reached, a menos que você envie replace_existing: true.
Corpo da requisição
phone_numberstringobrigatório11999990000.country_codestringpadrão: 55+.display_namestringobrigatóriodisplay_name_2stringdisplay_name_3stringcategorystringAUTOAPPARELBEAUTYEDUENTERTAINEVENT_PLANFINANCEGROCERYHEALTHHOTELPROF_SERVICESRESTAURANTRETAILTRAVELdescriptionstringaddressstringemailstringwebsitestringwebsite_2stringusernamestring@) do WhatsApp, opcional e aplicado sem garantia.profile_picture_urlstringreplace_existingbooleanpadrão: falsetrue autoriza trocar o número ativo pelo novo, depois que a Meta aceitar o cadastro dele.Exemplo de requisição
curl -X POST "$BASE_URL/api/v1/vendor/whatsapp/self-setup/register" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"phone_number": "11999990000",
"country_code": "55",
"display_name": "Loja Centro",
"category": "RETAIL",
"description": "Moda e acessórios no centro de São Paulo.",
"email": "contato@minhaloja.example.com"
}'Resposta
{
"success": true,
"data": {
"phone_number_id": "104857392011234",
"business_phone": "+5511999990000",
"already_existed": false,
"status": "pending_verification"
}
}Campos da resposta
successbooleantrue nesta resposta.data.phone_number_idstringdata.business_phonestring+.data.already_existedbooleantrue quando o número já estava na conta da Meta (por exemplo, de uma tentativa anterior) e foi reaproveitado.data.statusstringpending_verification: falta pedir e confirmar o código.data.route_pendingbooleantrue) quando o número já entrega mensagens a outro destino e a plataforma não o sobrescreveu.data.route_pending_reasonstringroute_pending.Erros
| Status | Quando | Corpo |
|---|---|---|
| 400 | JSON inválido | {"error":"Invalid request body"} |
| 500 | Falta phone_number ou display_name | {"error":"whatsapp self-setup: phone number required"} ou {"error":"whatsapp self-setup: display name required"} |
| 401 / 403 | Autenticação, módulo ou privilégio | {"error":"insufficient permissions"} e demais |
| 409 | O seller já tem número ativo | {"error":"Esta loja já tem um número de WhatsApp ativo. Remova o atual antes de adicionar outro.","kind":"limit_reached"} |
| 409 | O telefone tem conta de WhatsApp comum | {"error":"Este número já possui uma conta WhatsApp ativa. ...","kind":"whatsapp_exists"} |
| 409 | Número de outro seller ou da própria loja | {"error":"Este número já está conectado a outro vendedor ...","kind":"number_in_use"} |
| 409 | Número de outra loja da plataforma | {"error":"Este número já está conectado a outra loja da plataforma. ...","kind":"number_in_use_other_store"} |
| 409 | Usuário sem seller próprio e a loja tem números de vários sellers | {"error":"Esta loja tem números de vários vendedores. ...","kind":"seller_required_for_number"} |
| 503 | Token da Meta da loja inválido ou ausente | {"error":"Token de acesso da Meta inválido ou expirado. ...","kind":"config_missing"} |
| 500 | Outro erro da Meta, repassado | {"error":"<mensagem da Meta>"} |
Pedir o código
/api/v1/vendor/whatsapp/self-setup/request-codeSellerPede à Meta o envio do código de verificação
A Meta envia um código de 6 dígitos ao telefone, por SMS ou ligação de voz. Se o número já estiver verificado, a chamada apenas responde sucesso.
A plataforma protege a Meta de excesso de pedidos: entre dois pedidos do mesmo método há um intervalo de 60 segundos que dobra a cada tentativa, até 15 minutos. Se a Meta bloquear, a espera sobe de 15 minutos até 24 horas. SMS e voz têm contagens separadas, então trocar de método é uma saída.
Corpo da requisição
phone_number_idstringobrigatórioregister. Precisa ser o número do seller; caso contrário a resposta é 403.methodstringpadrão: SMSSMSVOICESMS.Exemplo de requisição
curl -X POST "$BASE_URL/api/v1/vendor/whatsapp/self-setup/request-code" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"phone_number_id": "104857392011234", "method": "SMS"}'Resposta
{ "success": true }{
"error": "Aguarde 45 segundos para solicitar um novo código via SMS, ou tente outro método.",
"kind": "rate_limited",
"retry_after_seconds": 45,
"method": "SMS"
}Campos da resposta
successbooleantrue quando a Meta aceitou o pedido (ou o número já estava verificado).retry_after_secondsinteger429: segundos até poder pedir de novo com o mesmo método.methodstring429: o método a que a espera se aplica (SMS ou VOICE).Erros
| Status | Quando | Corpo |
|---|---|---|
| 400 | JSON inválido | {"error":"Invalid request body"} |
| 403 | phone_number_id vazio ou que não é do seller | {"error":"Número não pertence a esta loja"} |
| 409 | Número removido da Meta | {"error":"Este número foi removido da Meta. ...","kind":"phone_deleted"} |
| 429 | Intervalo ou bloqueio em vigor | veja acima |
| 503 | Token da Meta da loja inválido | {"kind":"config_missing", ...} |
Confirmar o código
/api/v1/vendor/whatsapp/self-setup/verifySellerConfirma o código e ativa o número
Envia o código à Meta e, aceito, conclui o registro do número na API de nuvem com um PIN de duas etapas gerado pela plataforma. Em seguida ativa a credencial, reaplica o perfil, configura a criptografia dos formulários do WhatsApp, garante que o seller tenha um fluxo de boas-vindas e registra a rota das mensagens recebidas.
O PIN gerado é gravado e devolvido (two_step_pin); ele também aparece na credencial. Guarde-o: a Meta pode pedi-lo se o número for registrado de novo.
Corpo da requisição
phone_number_idstringobrigatóriocodestringobrigatórioExemplo de requisição
curl -X POST "$BASE_URL/api/v1/vendor/whatsapp/self-setup/verify" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"phone_number_id": "104857392011234", "code": "123456"}'Resposta
{
"success": true,
"two_step_pin": "482910",
"register_ok": true,
"data": { "two_step_pin": "482910", "register_ok": true }
}Campos da resposta
successbooleantrue: o código foi aceito pela Meta.two_step_pinstringregister_okbooleanfalse quando a Meta recusou o registro na API de nuvem por um motivo que não é "já registrado". O código foi aceito, mas o número pode não enviar mensagens: refaça o passo.dataobjecttwo_step_pin e register_ok.route_pendingbooleantrue) quando o número já entrega a outro destino e não foi redirecionado.route_pending_reasonstringroute_pending.Erros
| Status | Quando | Corpo |
|---|---|---|
| 400 | JSON inválido | {"error":"Invalid request body"} |
| 500 | A Meta recusou o código (errado ou expirado) | {"error":"<mensagem da Meta>"} |
| 403 | Falta o code ou o número não é do seller | {"error":"Número não pertence a esta loja ou código ausente"} |
| 503 | Token da Meta da loja inválido | {"kind":"config_missing", ...} |
Situação do número
/api/v1/vendor/whatsapp/self-setup/statusSellerConsulta na Meta a situação do número do seller
Faz uma consulta ao vivo à Meta. Use para saber se o código já foi aceito e qual nome foi aprovado.
Parâmetros de consulta
phone_number_idstringobrigatórioExemplo de requisição
curl "$BASE_URL/api/v1/vendor/whatsapp/self-setup/status?phone_number_id=104857392011234" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"success": true,
"data": {
"phone_number_id": "104857392011234",
"verified_name": "Loja Centro",
"display_phone_number": "+55 11 99999-0000",
"code_verification_status": "VERIFIED"
}
}Campos da resposta
data.phone_number_idstringdata.verified_namestringdata.display_phone_numberstringdata.code_verification_statusstringVERIFIED ou NOT_VERIFIED. O valor vem da Meta e a plataforma não o altera.Erros
| Status | Quando | Corpo |
|---|---|---|
| 403 | phone_number_id ausente ou que não é do seller | {"error":"Número não pertence a esta loja"} |
| 503 | Token da Meta da loja inválido | {"kind":"config_missing", ...} |
| 500 | Erro da Meta repassado | {"error":"<mensagem da Meta>"} |
Sugerir nomes de exibição
/api/v1/vendor/whatsapp/self-setup/suggest-namesSellerSugere até 3 nomes de exibição para o número
Gera nomes curtos que costumam passar na análise da Meta (nome fantasia encurtado, razão social com a UF, nome com a cidade). Não envia nada à Meta. Campos que você não mandar são completados com os dados do cadastro do seller.
Corpo da requisição
company_namestringlegal_namestringcitystringstatestringExemplo de requisição
curl -X POST "$BASE_URL/api/v1/vendor/whatsapp/self-setup/suggest-names" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"company_name": "Loja Centro Moda", "city": "São Paulo", "state": "SP"}'Resposta
{
"success": true,
"names": ["Loja Centro Moda", "Loja Centro Moda SP", "Loja Centro Moda Sao Pau"]
}Campos da resposta
successbooleantrue.namesarrayErros
| Status | Quando | Corpo |
|---|---|---|
| 401 / 403 | Autenticação, módulo ou perfil | veja o resumo |
| 404 | Usuário sem cadastro de seller | {"error":"vendor profile not found","code":"vendor_profile_not_found"} |
Um corpo JSON inválido é ignorado: a rota responde como se ele estivesse vazio.
Sugerir o texto "Sobre"
/api/v1/vendor/whatsapp/self-setup/suggest-descriptionSellerSugere o texto Sobre do perfil do WhatsApp Business
Devolve um texto curto e comercial, em português, de até 512 caracteres. Usa um redator automático quando está disponível; se não, monta o texto por um modelo fixo. O campo source diz qual foi usado. Nada é salvo: o seller revisa e envia pelo perfil.
Corpo da requisição
company_namestringcategorystringpadrão: RETAILregister).citystringExemplo de requisição
curl -X POST "$BASE_URL/api/v1/vendor/whatsapp/self-setup/suggest-description" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"company_name": "Loja Centro Moda", "category": "APPAREL", "city": "São Paulo"}'Resposta
{
"success": true,
"description": "Moda e acessórios em São Paulo. Fale com a Loja Centro Moda e veja as novidades.",
"source": "template"
}Campos da resposta
successbooleantrue.descriptionstringsourcestringaitemplateai quando foi escrito pelo redator automático; template quando veio do modelo fixo.Erros
| Status | Quando | Corpo |
|---|---|---|
| 401 / 403 | Autenticação, módulo ou perfil | veja o resumo |
| 404 | Usuário sem cadastro de seller | {"error":"vendor profile not found","code":"vendor_profile_not_found"} |