import requests
url = "https://pombo.digital/api/integrations/v1/templates"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)curl --request GET \
--url https://pombo.digital/api/integrations/v1/templates \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://pombo.digital/api/integrations/v1/templates', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"data": [
{
"template_id": "PBD_TPL_01J9Z2Q8XK3M7WPTV6RB4CYH0N",
"organization_id": "PBD_ORG_01J8A1B2C3D4E5F6G7H8J9K0LM",
"name": "cobranca_vencida",
"channel": "whatsapp",
"body": "Prezado(a) {{1}}, consta débito de R$ {{2}} com vencimento em {{3}}.",
"template_type": "TEXT",
"language_code": "pt_BR",
"template_status": "APPROVED",
"template_origin": "ORG",
"declined_reason": null,
"rejected_reason": null,
"updated_at": "2026-08-27T14:31:52.109Z",
"variables": {
"{{1}}": {
"variable_name": "nome",
"variable_example": "Maria Silva"
},
"{{2}}": {
"variable_name": "valor",
"variable_example": "1.250,00"
},
"{{3}}": {
"variable_name": "vencimento",
"variable_example": "10/09/2026"
}
},
"created_at": "2026-08-27T14:03:11.482Z"
},
{
"template_id": "PBD_TPL_01J8A1B2C3D4E5F6G7H8J9K0LM",
"organization_id": null,
"name": "cobranca_pre_aprovada",
"channel": "whatsapp",
"body": "Prezado(a) {{1}}, consta débito de R$ {{2}} em aberto.",
"template_type": "TEXT",
"language_code": "pt_BR",
"template_status": "APPROVED",
"template_origin": "SYSTEM",
"declined_reason": null,
"rejected_reason": null,
"updated_at": "2026-08-02T09:00:00.000Z",
"variables": {
"{{1}}": {
"variable_name": "nome",
"variable_example": "Maria Silva"
},
"{{2}}": {
"variable_name": "valor",
"variable_example": "1.250,00"
}
},
"created_at": "2026-08-02T09:00:00.000Z"
}
],
"has_more": true,
"next_cursor": "PBD_TPL_01J8A1B2C3D4E5F6G7H8J9K0LM"
}Listar modelos
Lista os modelos que a sua credencial pode consultar, os seus e os pré-aprovados do Pombo.
import requests
url = "https://pombo.digital/api/integrations/v1/templates"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)curl --request GET \
--url https://pombo.digital/api/integrations/v1/templates \
--header 'Authorization: Bearer <token>'const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://pombo.digital/api/integrations/v1/templates', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));{
"data": [
{
"template_id": "PBD_TPL_01J9Z2Q8XK3M7WPTV6RB4CYH0N",
"organization_id": "PBD_ORG_01J8A1B2C3D4E5F6G7H8J9K0LM",
"name": "cobranca_vencida",
"channel": "whatsapp",
"body": "Prezado(a) {{1}}, consta débito de R$ {{2}} com vencimento em {{3}}.",
"template_type": "TEXT",
"language_code": "pt_BR",
"template_status": "APPROVED",
"template_origin": "ORG",
"declined_reason": null,
"rejected_reason": null,
"updated_at": "2026-08-27T14:31:52.109Z",
"variables": {
"{{1}}": {
"variable_name": "nome",
"variable_example": "Maria Silva"
},
"{{2}}": {
"variable_name": "valor",
"variable_example": "1.250,00"
},
"{{3}}": {
"variable_name": "vencimento",
"variable_example": "10/09/2026"
}
},
"created_at": "2026-08-27T14:03:11.482Z"
},
{
"template_id": "PBD_TPL_01J8A1B2C3D4E5F6G7H8J9K0LM",
"organization_id": null,
"name": "cobranca_pre_aprovada",
"channel": "whatsapp",
"body": "Prezado(a) {{1}}, consta débito de R$ {{2}} em aberto.",
"template_type": "TEXT",
"language_code": "pt_BR",
"template_status": "APPROVED",
"template_origin": "SYSTEM",
"declined_reason": null,
"rejected_reason": null,
"updated_at": "2026-08-02T09:00:00.000Z",
"variables": {
"{{1}}": {
"variable_name": "nome",
"variable_example": "Maria Silva"
},
"{{2}}": {
"variable_name": "valor",
"variable_example": "1.250,00"
}
},
"created_at": "2026-08-02T09:00:00.000Z"
}
],
"has_more": true,
"next_cursor": "PBD_TPL_01J8A1B2C3D4E5F6G7H8J9K0LM"
}Authorizations
Sua credencial de API no cabeçalho Authorization: Bearer sk_live_.... Crie e revogue credenciais no painel, em Conta → API Keys. O segredo aparece uma única vez, na criação.
A credencial identifica a organização: organization_id não é aceito em nenhuma requisição.
Query Parameters
Quantos modelos trazer, de 1 a 50. O padrão é 10.
Um valor fora da faixa, ou que não seja um inteiro, é recusado com 400 e a mensagem limit must be an integer from 1 through 50.
1 <= x <= 50O cursor da próxima página: copie o next_cursor da resposta anterior e repita a chamada com ele.
É um valor que você recebe, nunca um que você monta. Precisa ser um template_id, no formato PBD_TPL_.... Um notification_id ou qualquer outro texto é recusado com 400 e a mensagem after must be a valid template cursor.
^PBD_TPL_[0-9A-HJKMNP-TV-Z]{26}$"PBD_TPL_01J9Z2Q8XK3M7WPTV6RB4CYH0N"
Traz só os modelos do canal informado.
Só em minúsculas, que é como o canal fica gravado em um modelo. WHATSAPP é recusado com 400, assim como qualquer valor fora dos dois canais.
Em GET /notifications o mesmo parâmetro aceita qualquer caixa. A diferença acompanha o que cada registro guarda.
whatsapp, email Response
Uma página de modelos.
Uma página de modelos.
A paginação é por cursor: não existe número de página e não existe total. Para avançar, repita a chamada com after igual ao next_cursor que veio aqui, e pare quando has_more for false.
Os modelos da página, do mais recente para o mais antigo. Vem vazio quando não há nenhum.
Cada item é o mesmo objeto que a consulta de um modelo devolve. A listagem não traz o histórico de alterações.
Hide child attributes
Hide child attributes
whatsapp, email O body com cada marcador substituído pelo variable_example da variável, entre colchetes. Montado pelo Pombo, serve para pré-visualizar o texto sem preencher nada.
O tipo de cabeçalho. DOCUMENT e IMAGE são os que levam arquivo; TEXT é só texto.
VIDEO e LOCATION podem aparecer em modelos antigos e não são aceitos ao criar um modelo novo. Um envio com eles não leva arquivo.
DOCUMENT, IMAGE, LOCATION, TEXT, VIDEO pt_BR, en_US, es_ES Só um modelo APPROVED pode ser usado em um envio de WhatsApp. A aprovação é da Meta, não do Pombo.
Um modelo de whatsapp nasce PENDING: consulte GET /templates/{id} até chegar a APPROVED, e crie os seus modelos com antecedência, porque um envio com modelo não aprovado é recusado com 422.
Um modelo de email nasce APPROVED e serve para enviar na mesma hora.
PENDING, APPROVED, REJECTED, PAUSED, DISABLED, DELETED, IN_APPEAL, FLAGGED, FAILED SYSTEM são modelos do catálogo do Pombo; ORG, os da sua organização.
Na listagem, os seus aparecem em qualquer template_status, inclusive PENDING e REJECTED; os do catálogo aparecem só quando já estão APPROVED. Rascunhos e modelos apagados ficam de fora.
SYSTEM, ORG Anotação de quem criou o modelo, sem efeito nenhum: nada no envio a consulta, e enviar sem arquivo não é recusado por causa dela. Não a envie.
Um modelo de whatsapp devolve sempre null, tenha você enviado o campo ou não; só um modelo de email devolve o valor como chegou.
Para um modelo que leve arquivo, o campo que importa é template_type, com DOCUMENT ou IMAGE.
As variáveis do modelo. Estas chaves são as de parameters no envio.
Os marcadores do rodapé do remetente estão deliberadamente ausentes daqui, embora apareçam no body: é o Pombo que os preenche, a partir do sender do envio. Um marcador do body sem entrada em variables é isso, e não um erro.
Hide child attributes
Hide child attributes
Hide child attributes
Hide child attributes
Um rótulo seu, para se orientar. Não é a chave.
"nome"
Um valor de exemplo. Em whatsapp a Meta o usa para aprovar o modelo.
Em email a marcação é removida antes de armazenar, então um exemplo com HTML volta sem ele em GET /templates/{id}.
"Maria Silva"
Campo histórico, sem efeito: não é o assunto que o destinatário recebe. O assunto de um e-mail é montado no momento do envio a partir do nome da organização.
Sempre null em um modelo criado pela API, nos dois canais: o campo não é gravado na criação. Só traz conteúdo em modelos antigos.
Por que a Meta recusou o modelo, quando template_status é REJECTED ou FAILED. null enquanto não houve recusa.
ABUSIVE_CONTENT e SCAM exigem reescrever o texto. INVALID_FORMAT, TAG_CONTENT_MISMATCH e INCORRECT_CATEGORY são erros de forma. REVIEW_TIMEOUT é falha da própria revisão e um modelo novo com o mesmo texto pode passar.
ABUSIVE_CONTENT, SCAM, INVALID_FORMAT, TAG_CONTENT_MISMATCH, INCORRECT_CATEGORY, REVIEW_TIMEOUT, UNKNOWN, null O motivo em texto livre, como o provedor o enviou. Não é estável e não deve ser comparado em código: para ramificar, use declined_reason.
A última alteração do registro. Muda sem você fazer nada: a Meta atualiza o status e a categoria por webhook, e cada atualização mexe neste campo.
Se existe ao menos mais uma página depois desta.
O template_id que a próxima chamada deve mandar em after. null quando has_more é false.
Repasse este valor como ele veio. Ele não é montado pelo cliente.
"PBD_TPL_01J9Z2Q8XK3M7WPTV6RB4CYH0N"

