Cadastro no App (In-App Signup)
POST /v1/accounts/{id}/signups — gere deep links de opt-in de marketing (wa.me) para contatos optarem em receber suas mensagens sem enviar nada antes.
Gera um deep link de opt-in de marketing (wa.me/{telefone}/signup/{id}) — o cliente final clica e opta em receber mensagens sem precisar mandar mensagem primeiro pra sua empresa. Resolve o “cold start” de opt-in pra campanhas (sem isso, só dá pra usar template pra quem já é contato). Não exige nenhuma configuração prévia de conta na Meta.
privacyPolicyUrl é a política de privacidade do seu negócio (qualquer URL válida aprovada pela Meta). Internamente, na primeira criação de cada WABA, a API aceita automaticamente os Termos de Serviço da Meta pra essa feature (policy.tos, valor fixo da própria Meta) — você não precisa fornecer nem configurar nada sobre isso.
Quando o contato aceita o link, você recebe um webhook user.preferences_updated com value: "signup" + signup_id (qual link foi usado). Registre um endpoint em POST /v1/webhooks com esse evento habilitado pra saber em tempo real quando alguém opta em receber suas mensagens. Veja o payload completo em Eventos de webhook.
POST /v1/accounts/{id}/signups
Cria um cadastro e retorna o deep link de opt-in.
Body (JSON):
{
"signupMessage": "Cadastre-se pra novidades!",
"confirmationMessage": "Cadastro confirmado!",
"privacyPolicyUrl": "https://suaempresa.com/privacidade",
"promoCode": "PROMO10",
"displayName": "Minha Empresa",
"websiteUrl": "https://suaempresa.com"
}
| Campo | Tipo | Obrigatório | Regras |
|---|---|---|---|
signupMessage | string | Sim | mensagem mostrada antes do opt-in |
confirmationMessage | string | Sim | mensagem enviada após confirmar. Se usar {{promo_code}}, promoCode vira obrigatório |
privacyPolicyUrl | string | Sim | política de privacidade do seu negócio — precisa ser URL aprovada pela Meta |
promoCode | string | Não | obrigatório só se confirmationMessage contém {{promo_code}} |
displayName | string | Não | — |
websiteUrl | string | Não | — |
Resposta 201:
Resposta 201
{
"id": "su_1",
"status": "ACTIVE",
"deepLink": "https://wa.me/+5511999990000/signup/su_1"
} Erros: 400 INVALID_BODY, 404 ACCOUNT_NOT_FOUND, 422 META_ERROR (erro retornado pela Meta — inclui ToS não aprovada), 429 (rate limit).
Exemplo
curl -X POST https://api.wablastmessage.com/v1/accounts/ckv.../signups \
-H "Authorization: Bearer wak_sua_chave" \
-H "Content-Type: application/json" \
-d '{
"signupMessage": "Cadastre-se pra novidades!",
"confirmationMessage": "Cadastro confirmado!",
"privacyPolicyUrl": "https://suaempresa.com/privacidade"
}'const res = await fetch('https://api.wablastmessage.com/v1/accounts/ckv.../signups', {
method: 'POST',
headers: {
'Authorization': 'Bearer ' + process.env.WABLAST_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
signupMessage: 'Cadastre-se pra novidades!',
confirmationMessage: 'Cadastro confirmado!',
privacyPolicyUrl: 'https://suaempresa.com/privacidade',
}),
});
console.log(res.status, await res.json());import os, requests
res = requests.post(
'https://api.wablastmessage.com/v1/accounts/ckv.../signups',
headers={'Authorization': 'Bearer ' + os.environ['WABLAST_API_KEY']},
json={
'signupMessage': 'Cadastre-se pra novidades!',
'confirmationMessage': 'Cadastro confirmado!',
'privacyPolicyUrl': 'https://suaempresa.com/privacidade',
},
)
print(res.status_code, res.json())<?php
$ch = curl_init('https://api.wablastmessage.com/v1/accounts/ckv.../signups');
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: Bearer ' . getenv('WABLAST_API_KEY'),
'Content-Type: application/json',
]);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode([
'signupMessage' => 'Cadastre-se pra novidades!',
'confirmationMessage' => 'Cadastro confirmado!',
'privacyPolicyUrl' => 'https://suaempresa.com/privacidade',
]));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$res = curl_exec($ch);
echo curl_getinfo($ch, CURLINFO_HTTP_CODE) . " " . $res; GET /v1/accounts/{id}/signups
Lista os cadastros criados nesta conexão.
Resposta 200: array com o mesmo shape do POST (id, status, deepLink).
POST /v1/accounts/{id}/signups/{signupId}
Ativa ou desativa um cadastro. A Meta não tem endpoint de delete — só dá pra desabilitar.
Body (JSON):
{ "status": "ACTIVE" }
status aceita ACTIVE | DISABLED.
Resposta 200:
{ "success": true }