Modelos e links
Lista os modelos de mensagem da conta na Meta, sugere modelos para criar, ajusta os modelos gerenciados e gera os links personalizados da mini-loja.
Um modelo de mensagem (template) é um texto que a Meta aprova antes do uso. É o único jeito de iniciar uma conversa ou de voltar a falar com o cliente depois de 24 horas sem resposta dele. O texto pode ter variáveis ({{1}}, {{2}}) e um botão com link. A criação do modelo na Meta é feita no Gerenciador de WhatsApp da Meta; estas rotas listam, sugerem e ajustam.
Há dois tipos de lista:
templatesmostra o que existe na conta da Meta, ao vivo.templates/managedmostra os modelos gerenciados pela plataforma: os mesmos modelos, com configurações extras (o texto de apoio, o rótulo do botão, o que o seller pode editar).
Modelos da conta na Meta
/api/v1/vendor/whatsapp/templatesSellerLista os modelos de mensagem da conta de WhatsApp Business
Consulta a Meta ao vivo, com a credencial do seller quando ela tem token e conta WhatsApp Business (business_account_id); senão, usa a conta padrão da loja. Devolve até 100 modelos.
Exemplo de requisição
curl "$BASE_URL/api/v1/vendor/whatsapp/templates" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"templates": [
{
"name": "venddor_checkout_link",
"language": "pt_BR",
"status": "APPROVED",
"category": "UTILITY",
"components": [
{ "type": "BODY", "text": "Pronto para pagar? Seu checkout da *{{1}}* está aqui:" },
{ "type": "BUTTONS", "buttons": [{ "type": "URL", "text": "Pagar agora", "url": "https://minhaloja.io.venddor.com.br/wa/{{1}}" }] }
]
}
],
"total": 1
}Campos da resposta
templatesarraytemplates[].namestringtemplates[].languagestringpt_BR.templates[].statusstringAPPROVED, PENDING ou REJECTED (a Meta pode devolver outros valores, como pausado).templates[].categorystringUTILITYMARKETINGAUTHENTICATIONMARKETING custa mais por mensagem.templates[].componentsarraytotalintegerErros
| Status | Quando | Corpo |
|---|---|---|
| 401 / 403 | Autenticação, módulo ou privilégio | veja Ajustes do canal |
| 422 | Nem o seller nem a loja têm token e conta da Meta | {"error":"WhatsApp Cloud API is not fully configured.","code":"whatsapp.templates.not_configured","graph_code":0} |
| 502 | A Meta recusou (token inválido, por exemplo) ou está fora do ar | {"error":"...","code":"whatsapp.templates.meta_unavailable","detail":"...","graph_code":190} |
O campo code é estável e serve para você tratar o erro. O graph_code repete o código de erro da Meta (190 é token inválido).
Modelos sugeridos
/api/v1/vendor/whatsapp/templates/modelsSellerSugere modelos prontos para criar na Meta
Não consulta a Meta. Devolve uma lista fixa de modelos recomendados (status de pedido, campanha com catálogo, link de checkout, retorno do atendente), cada um com o texto sugerido para colar na Meta, o nome sugerido e as variáveis que a plataforma preenche sozinha.
Exemplo de requisição
curl "$BASE_URL/api/v1/vendor/whatsapp/templates/models" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"models": [
{
"slug": "checkout_nudge",
"suggested_name": "venddor_checkout_link",
"language": "pt_BR",
"category": "UTILITY",
"use_case_pt": "Link de checkout (fora da janela 24h)",
"use_case_en": "Checkout link (outside 24h window)",
"body_example": "Pronto para pagar? Seu checkout da *{{1}}* está aqui:",
"body_param_hints": ["{{vendor_name}}"],
"has_url_button": true,
"url_button_base": "/wa/{{1}}",
"url_button_label": "Pagar agora",
"cta_purpose": "checkout"
}
],
"var_catalog": [
{ "key": "store_link", "label_pt": "Link da loja (mini-shop)", "label_en": "Store mini-shop link", "example": "https://loja…/wa/{token}" }
],
"meta_url": "https://business.facebook.com/wa/manage/message-templates/"
}Campos da resposta
modelsarraymodels[].slugstringmodels[].suggested_namestringmodels[].languagestringmodels[].categorystringUTILITYMARKETINGAUTHENTICATIONmodels[].use_case_ptstringmodels[].use_case_enstringmodels[].body_examplestring{{1}}, {{2}}.models[].body_param_hintsarraymodels[].has_url_buttonbooleantrue se o modelo tem botão com link dinâmico.models[].url_button_basestringmodels[].url_button_labelstringmodels[].cta_purposestringstorecartcheckoutmodels[].notes_ptstringmodels[].notes_enstringvar_catalogarraykey, label_pt, label_en, example.meta_urlstringErros
| Status | Quando | Corpo |
|---|---|---|
| 401 / 403 | Autenticação, módulo ou privilégio | veja Ajustes do canal |
Modelos gerenciados
/api/v1/vendor/whatsapp/templates/managedSellerLista os modelos gerenciados visíveis ao seller
Devolve os modelos da loja inteira (scope: "T") e os do próprio seller (scope: "V"). Por padrão só os aprovados.
Parâmetros de consulta
approvedstringpadrão: 10, devolve também os pendentes, rejeitados e desativados. Qualquer outro valor mantém só os aprovados.Exemplo de requisição
curl "$BASE_URL/api/v1/vendor/whatsapp/templates/managed" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"templates": [
{
"id": "3d4e5f60-0000-4000-8000-000000000001",
"name": "venddor_checkout_link",
"language": "pt_BR",
"category": "UTILITY",
"status": "A",
"status_label": "APPROVED",
"scope": "T",
"meta_template_id": "9988776655",
"body_param_defaults": ["{{vendor_name}}"],
"cta_purpose": "checkout",
"cta_label": "Pagar agora",
"seller_body_template": "Pronto para pagar? Seu checkout está aqui:",
"allow_seller_edit_params": true,
"allow_seller_edit_cta": false,
"created_at": "2026-10-01T12:00:00Z",
"updated_at": "2026-10-01T12:00:00Z"
}
]
}Campos da resposta
templatesarraytemplates[].iduuidmanaged/{id} e em web-preview/send.templates[].namestringtemplates[].languagestringtemplates[].categorystringtemplates[].statusstringAPRXA aprovado, P pendente, R rejeitado, X desativado ou pausado.templates[].status_labelstringAPPROVED, PENDING, REJECTED, DISABLED).templates[].scopestringTVT modelo de toda a loja, V modelo de um seller.templates[].vendor_iduuidscope é V.templates[].meta_template_idstringtemplates[].componentsarraytemplates[].body_param_defaultsarray{{vendor_name}}).templates[].cta_purposestringstore, cart ou checkout).templates[].cta_labelstringtemplates[].seller_body_templatestringtemplates[].allow_seller_edit_paramsbooleanbody_param_defaults e seller_body_template.templates[].allow_seller_edit_ctabooleancta_purpose e cta_label.templates[].rejection_reasonstringtemplates[].quality_scorestringtemplates[].synced_atstringtemplates[].created_atstringtemplates[].updated_atstringErros
| Status | Quando | Corpo |
|---|---|---|
| 401 / 403 | Autenticação, módulo ou privilégio | veja Ajustes do canal |
| 500 | Falha ao ler | {"error":"..."} |
Ajustar um modelo gerenciado
/api/v1/vendor/whatsapp/templates/managed/{id}SellerAjusta as variáveis, o botão ou o texto de apoio de um modelo gerenciado
O seller não altera a estrutura aprovada pela Meta (corpo, categoria, componentes, escopo), só o que o administrador deixou liberado: as variáveis e o texto de apoio quando allow_seller_edit_params é true, e o botão quando allow_seller_edit_cta é true. Se os dois forem false, a resposta é 403.
Parâmetros de caminho
iduuidobrigatórioCorpo da requisição
body_param_defaultsarrayallow_seller_edit_params for false.seller_body_templatestringcta_purposestringstorecartcheckoutallow_seller_edit_cta for false.cta_labelstringallow_seller_edit_cta for false.Exemplo de requisição
curl -X PUT "$BASE_URL/api/v1/vendor/whatsapp/templates/managed/$TEMPLATE_ID" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"body_param_defaults": [
"{{vendor_name}}"
],
"seller_body_template": "Pronto para pagar? Seu checkout está aqui:"
}'Resposta
{
"template": {
"id": "3d4e5f60-0000-4000-8000-000000000001",
"name": "venddor_checkout_link",
"language": "pt_BR",
"category": "UTILITY",
"status": "A",
"status_label": "APPROVED",
"scope": "T",
"body_param_defaults": ["{{vendor_name}}"],
"cta_purpose": "checkout",
"cta_label": "Pagar agora",
"seller_body_template": "Pronto para pagar? Seu checkout está aqui:",
"allow_seller_edit_params": true,
"allow_seller_edit_cta": false
}
}Os campos de template são os da listagem.
Erros
| Status | Quando | Corpo |
|---|---|---|
| 400 | JSON inválido | {"error":"invalid json"} |
| 400 | Falha ao gravar | {"error":"..."} |
| 401 / 403 | Autenticação, módulo ou privilégio | veja Ajustes do canal |
| 403 | O administrador bloqueou as duas edições | {"error":"admin disabled seller edits for this template"} |
| 404 | Modelo inexistente ou de outro seller | {"error":"not found"} |
Links personalizados da mini-loja
/api/v1/vendor/whatsapp/link-packSellerGera os links da mini-loja para o seller, com ou sem um cliente
Útil para pré-visualizar o que o cliente receberá e para preencher as variáveis de um modelo. Sem phone, devolve um link de visitante anônimo (nunca de um cliente real). Com phone, o link é personalizado para aquele telefone: quem abrir é reconhecido como esse cliente.
Parâmetros de consulta
phonestringnamestringExemplo de requisição
curl "$BASE_URL/api/v1/vendor/whatsapp/link-pack?phone=5511999990000" \
-H "Authorization: Bearer $TOKEN"Resposta
{
"link_pack": {
"store_link": "https://minhaloja.io.venddor.com.br/wa/eyJ0IjoicyJ9",
"cart_link": "https://minhaloja.io.venddor.com.br/wa/eyJ0IjoicyJ9/cart",
"checkout_link": "https://minhaloja.io.venddor.com.br/wa/eyJ0IjoicyJ9/checkout",
"wa_catalog_link": "https://minhaloja.io.venddor.com.br/wa/eyJ0IjoicyJ9",
"store_token": "eyJ0IjoicyJ9",
"cart_token": "eyJ0IjoicyJ9/cart",
"checkout_token": "eyJ0IjoicyJ9/checkout",
"vendor_name": "Loja Centro",
"vendor_id": "94bd7e9a-fdad-4d01-8fc2-ba9d677d8b36",
"business_phone": "5511999990000",
"wa_me_link": "https://wa.me/5511999990000",
"customer_phone": "5511999990000",
"public_base_url": "https://minhaloja.io.venddor.com.br",
"web_preview_path": "/wa"
},
"vars": {
"store_link": "https://minhaloja.io.venddor.com.br/wa/eyJ0IjoicyJ9",
"vendor_name": "Loja Centro"
},
"var_catalog": [
{ "key": "store_link", "label_pt": "Link da loja (mini-shop)", "label_en": "Store mini-shop link", "example": "https://loja…/wa/{token}" }
]
}Campos da resposta
link_packobjectlink_pack.store_linkstringlink_pack.cart_linkstringlink_pack.checkout_linkstringlink_pack.wa_catalog_linkstringstore_link).link_pack.store_tokenstring/wa/{{1}}.link_pack.cart_tokenstringlink_pack.checkout_tokenstringlink_pack.vendor_namestringlink_pack.vendor_iduuidlink_pack.business_phonestringlink_pack.wa_me_linkstringwa.me para abrir uma conversa com o número.link_pack.customer_phonestringlink_pack.customer_namestringlink_pack.public_base_urlstringlink_pack.web_preview_pathstringvarsobjectvar_catalogarraykey, label_pt, label_en, example.Erros
| Status | Quando | Corpo |
|---|---|---|
| 400 | Não foi possível montar os links (por exemplo, a loja sem endereço público) | {"error":"..."} |
| 401 / 403 | Autenticação, módulo ou privilégio | veja Ajustes do canal |