is_note: true pra nota internais_note, é mensagem normal.| Campo | Obrigatório | O que faz |
|---|---|---|
id_ticket | sim | UUID do ticket |
is_note | não | true = nota interna; default false = mensagem |
message | sim | Conteúdo (texto livre) |
trigger | só mensagem | Número de destino, E.164 sem + |
id_channel | só mensagem | Canal. 2 = WhatsApp |
id_broker | só mensagem | Broker. 9 = Pontal Tech (WhatsApp oficial) |
channel_token | só mensagem | id da conexão que vai enviar |
template_variables | só template | O template e seus parâmetros |
file | não | Anexos. Mande [] quando não houver |
Os campos marcados como "só mensagem" são obrigatórios em qualquer envio para
o cliente. Só a nota interna (is_note: true) dispensa todos eles.
message vai como string vazia ("") — o texto real vem do template.GET /api/v3/settings/channels-gateway/manager/templates?channel=whatsapp&contentType=hsmchannel_token é o id da conexão (channelConfigId), obtido emGET /api/v3/settings/channels-gateway/whatsapp?broker=pontal-tech.⚠️ O template tem que pertencer à conexão que você usar. A busca é feita pelo
nome do template, dentro daquela conexão, e apenas entre os que estãoactive.
Antes de enviar, case owabaIddo template com opontalTechWhatsAppAccount.wabaIdda conexão — se forem de WABAs diferentes, o
template não é encontrado e a mensagem não sai formatada.
template_variables"template_variables": {
"type": "whatsapp",
"content": {
"messageType": "template", // fixo, é o que liga o modo template
"templateName": "<name>", // campo `name` do template
"languageCode": "pt_BR", // `content.language`; se omitir, o back preenche
"parameters": [] // um item por variável — veja abaixo
}
}variables → parametersvariables que o GET de templates devolve é o molde; parameters éNo template (variables[]) | No envio (parameters[]) |
|---|---|
{"type":"body","parameterName":"agente","default":"João"} | {"type":"body","parameterName":"agente","value":"Maria"} |
{"type":"body","default":"São Paulo"} (posicional) | {"type":"body","value":"Belo Horizonte"} |
{"type":"header","subType":"image","default":"https://…"} | {"type":"header","subType":"image","value":"https://…"} |
{"type":"button","index":0,"subType":"url"} | {"type":"button","index":0,"value":"abc123"} |
value — texto, URL de mídia ou token de botão.named (content.parameterFormat): o parameterName é o que casa com {{agente}} no texto.positional: não há nome — o que vale é a posição no array, que vira {{1}}, {{2}}, …"variables": [] no template): mande "parameters": [].{{agente}}) chega literal para o cliente.type: "header":subType | O que enviar | Vira, na Meta |
|---|---|---|
image | value = URL da imagem | image.link |
video | value = URL do vídeo | video.link |
document | value = URL do arquivo + fileName | document.link + filename |
"parameters": [
{ "type": "header", "subType": "image", "value": "https://seu-dominio/promo-agosto.jpg" },
{ "type": "body", "parameterName": "cliente", "value": "Maria" }
]{ "type": "header", "subType": "document", "value": "https://seu-dominio/nota-fiscal.pdf", "fileName": "nota-fiscal.pdf" }subType tem que ser o mesmo do cabeçalho aprovado no template: um template combody também aceita subType: "image", para os poucos templates que trazem mídiadefault no mesmo parâmetro: isso não muda o que o{
"id": "d41a8c76-3b52-4e09-9f18-6c7b204ea351",
"name": "continuacao_conversa",
"wabaId": "900000000000001",
"status": "active",
"content": {
"type": "hsm",
"language": "pt_BR",
"parameterFormat": "named",
"components": [
{
"type": "body",
"text": "Olá! Meu nome é {{agente}} e vou dar continuidade ao seu atendimento.",
"variables": [{ "parameterName": "agente", "example": "João" }]
}
]
},
"variables": [{ "type": "body", "parameterName": "agente", "default": "João" }]
}{
"id": "3f2a91c4-7b60-4d15-9a2e-1c8d5e0b7411",
"name": "Atendimento Comercial",
"status": "active",
"whatsappAccount": {
"pontalTechWhatsAppAccount": { "wabaId": "900000000000001" }
}
}wabaId dos dois é o mesmo (900000000000001) — pode enviar por essa conexão.{
"id_ticket": "6a432bac-0e83-41eb-8931-5ab897f7ba66",
"trigger": "5511999990000",
"message": "",
"file": [],
"id_channel": 2,
"id_broker": 9,
"channel_token": "3f2a91c4-7b60-4d15-9a2e-1c8d5e0b7411",
"template_variables": {
"type": "whatsapp",
"content": {
"messageType": "template",
"templateName": "continuacao_conversa",
"languageCode": "pt_BR",
"parameters": [
{ "type": "body", "parameterName": "agente", "value": "Maria" }
]
}
}
}| Campo do body | Origem |
|---|---|
channel_token | id da conexão (passo 2) |
templateName | name do template (passo 1) |
languageCode | content.language do template |
parameters[0].type / .parameterName | item de variables[] do template |
parameters[0].value | você define — é o valor que o cliente vai ler |
trigger | número do destinatário |
id_ticket | ticket onde a mensagem será registrada |
template_id (não pelo nome), etemplate_variables é um mapa simples de variáveis, não a estruturacontent.parameters.| WhatsApp oficial | RCS | |
|---|---|---|
id_channel | 2 | 12 |
id_broker | 9 (Pontal Tech) | 9 (Pontal Tech) |
| Escolhe o template por | template_variables.content.templateName | template_id (UUID) |
template_variables | objeto com content.parameters[] | { "variavel": "valor" } |
| Aprovação externa | Meta | não se aplica |
| Campo | Obrigatório | O que faz |
|---|---|---|
id_channel | sim | 12 = RCS |
id_broker | sim | 9 = Pontal Tech |
channel_token | sim | id da conexão de RCS |
trigger | sim | Número de destino, E.164 sem + |
template_id | só template | id do template (UUID) — é ele que liga o modo template |
template_variables | não | Mapa { "nome": "valor" } das variáveis usadas no template |
message | sim | Texto da mensagem, ou "" quando o conteúdo vem do template |
channel_token é o id da conexão de RCS, obtido emGET /api/v3/settings/channels-gateway?channel=rcs.template_id vem de GET /api/v3/settings/channels-gateway/rcs?channel=rcs{{nome}} no título, na descrição ou no texto de um botão,"template_variables": { "nome": "Maria", "cidade": "Belo Horizonte" }type, sem parameterName — é substituição direta de{{chave}} pelo valor.textmessage do body. Na prática, para texto simples você nem precisa de template.{
"id_ticket": "6a432bac-0e83-41eb-8931-5ab897f7ba66",
"trigger": "5511999990000",
"id_channel": 12,
"id_broker": 9,
"channel_token": "b1d47e30-8a52-4c96-a7f1-30e5c2849b64",
"message": "Nosso atendimento estará indisponível neste domingo, das 2h às 6h."
}rich-card{
"id_ticket": "6a432bac-0e83-41eb-8931-5ab897f7ba66",
"trigger": "5511999990000",
"id_channel": 12,
"id_broker": 9,
"channel_token": "b1d47e30-8a52-4c96-a7f1-30e5c2849b64",
"message": "",
"template_id": "c8f37a02-4b19-4e65-9d10-72ab5f3e6841",
"template_variables": { "nome": "Maria" }
}{
"id": "c8f37a02-4b19-4e65-9d10-72ab5f3e6841",
"contentType": "rich-card",
"content": {
"type": "rich-card",
"title": "Olá, {{nome}}!",
"description": "Condições especiais até o fim do mês.",
"imageUrl": "https://seu-dominio/promo-agosto.jpg",
"actions": [
{ "type": "openUrl", "text": "Ver ofertas", "value": "https://exemplo.com.br/ofertas" },
{ "type": "reply", "text": "Falar com consultor", "value": "FALAR_CONSULTOR" }
]
}
}carouseltemplate_id. As variáveis valem para todos os cards{
"id_ticket": "6a432bac-0e83-41eb-8931-5ab897f7ba66",
"trigger": "5511999990000",
"id_channel": 12,
"id_broker": 9,
"channel_token": "b1d47e30-8a52-4c96-a7f1-30e5c2849b64",
"message": "",
"template_id": "e40b7c19-2d68-4a53-91cf-6b83d5027ae2",
"template_variables": { "cidade": "Belo Horizonte" }
}No carrossel, as variáveis são substituídas no título e na descrição de
cada card. O texto dos botões do carrossel sai como está cadastrado no template —
norich-card, esse texto também aceita variável.
imageUrl cadastrado no template — no card, norich-card, e em cada item, no carousel. Ela é fixa por template: não háPOST /api/v3/settings/channels-gateway/manager/templates/media eimageUrl do template.file do body não se aplica ao RCS — anexo avulso, fora de template,