API
Modelos
Liste e envie modelos de mensagem do WhatsApp aprovados
# Modelos > Liste e envie modelos de mensagem do WhatsApp aprovados - Página: https://tbit.app/pt/docs/api/templates - URL base: `https://rest-api.tbit.app/v1` - Autenticação: cabeçalho `X-API-Key` com a sua chave em cada requisição (os exemplos a leem da variável de ambiente `TBIT_API_KEY`) ## Visão geral Os modelos são formatos de mensagem do WhatsApp pré-aprovados, exigidos para iniciar conversas fora da janela de mensagens de 24 horas. Só podem ser enviados os modelos com status aprovado pela Meta. ## Endpoints | Método | Rota | Descrição | | --- | --- | --- | | `GET` | `/v1/templates` | Listar os modelos de WhatsApp aprovados | | `GET` | `/v1/templates/:id` | Obter o detalhe de um modelo | | `POST` | `/v1/templates/:id/send` | Enviar um modelo a um contato | | `GET` | `/v1/channels/:channel_id/templates` | Modelos aprovados de uma linha de WhatsApp | | `GET` | `/v1/campaigns/:key/executions` | Status de entrega por destinatário (envios feitos com uma chave de campanha) | ## Listar modelos `GET /v1/templates` ```bash curl "https://rest-api.tbit.app/v1/templates" \ -H "X-API-Key: $TBIT_API_KEY" ``` ## Obter o detalhe de um modelo `GET /v1/templates/tpl_abc123` ```bash curl "https://rest-api.tbit.app/v1/templates/tpl_abc123" \ -H "X-API-Key: $TBIT_API_KEY" ``` ## Modelos por linha de WhatsApp Um modelo é aprovado em uma única conta do WhatsApp Business, então um agente com várias linhas tem um conjunto de modelos por linha. GET /v1/templates mistura todas as linhas (cada item traz o seu channel_id); use este endpoint para listar só o que uma linha pode enviar. O id do canal é o que aparece em Plataforma → Canais. `GET /v1/channels/6a7268abec6ecaf999a6c0ba/templates` ```bash curl "https://rest-api.tbit.app/v1/channels/6a7268abec6ecaf999a6c0ba/templates" \ -H "X-API-Key: $TBIT_API_KEY" ``` ## Enviar modelo Nota de envio O array de componentes segue o formato da API do WhatsApp Business. Inclua componentes de cabeçalho, corpo e botões conforme o seu modelo exigir. `POST /v1/templates/tpl_abc123/send` ```bash curl -X POST "https://rest-api.tbit.app/v1/templates/tpl_abc123/send" \ -H "X-API-Key: $TBIT_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "to": "573001234567", "components": [ { "type": "body", "parameters": [ { "type": "text", "text": "John" }, { "type": "text", "text": "your order #1234" } ] } ] }' ``` ## Status de entrega A resposta do envio só significa que a Meta ACEITOU a mensagem; entregue / lida / falha chegam minutos depois pelos webhooks da Meta. Para ler esses status, passe `campaign` {key, name} no body do envio (o envio fica registrado sob essa chave, visível também em Plataforma → Campanhas) e consulte este endpoint. `status` é sent, delivered, read ou failed; `message_id` é o wamid que o envio devolve (também vem na resposta do envio). `GET /v1/campaigns/my-app/executions` ```bash curl "https://rest-api.tbit.app/v1/campaigns/my-app/executions?since=2026-08-27T00:00:00Z&limit=100" \ -H "X-API-Key: $TBIT_API_KEY" ``` Resposta: ```json { "data": [ { "id": "6a90ea1f...", "to": "573001234567", "template_id": "tpl_abc123", "message_id": "wamid.HBgLNTcz...", "status": "failed", "error_message": "This message was not delivered to maintain healthy ecosystem engagement.", "sent_at": "2026-08-28T02:17:59.494Z", "delivered_at": null, "read_at": null } ] } ``` ## Formato da resposta Um objeto de modelo: ```json { "data": [ { "id": "tpl_abc123", "name": "order_confirmation", "language": "es", "status": "APPROVED", "category": "UTILITY", "channel_id": "6a7268abec6ecaf999a6c0ba", "components": [ { "type": "BODY", "text": "Hola {{1}}, {{2}} ha sido confirmado." } ], "created_at": "2024-08-15T10:00:00Z" } ] } ``` ## Resposta do envio Um envio bem-sucedido retorna o ID da mensagem: ```json { "data": { "message_sent": true, "message_id": "wamid.HBgLNTczMDAxMjM0NTY3FQIAERgSMUY2RUZGM0Y3RTJCRTQ5AA==", "parsed_message": "Hola John, your order #1234 ha sido confirmado." } } ```Os modelos são formatos de mensagem do WhatsApp pré-aprovados, exigidos para iniciar conversas fora da janela de mensagens de 24 horas. Só podem ser enviados os modelos com status aprovado pela Meta.
| Método | Rota | Descrição |
|---|---|---|
| GET | /v1/templates | Listar os modelos de WhatsApp aprovados |
| GET | /v1/templates/:id | Obter o detalhe de um modelo |
| POST | /v1/templates/:id/send | Enviar um modelo a um contato |
| GET | /v1/channels/:channel_id/templates | Modelos aprovados de uma linha de WhatsApp |
| GET | /v1/campaigns/:key/executions | Status de entrega por destinatário (envios feitos com uma chave de campanha) |
/v1/templatescurl "https://rest-api.tbit.app/v1/templates" \
-H "X-API-Key: $TBIT_API_KEY"const response = await fetch('https://rest-api.tbit.app/v1/templates', {
headers: {
'X-API-Key': process.env.TBIT_API_KEY,
},
});
const data = await response.json();import axios from 'axios';
const { data } = await axios.get(
'https://rest-api.tbit.app/v1/templates',
{
headers: {
'X-API-Key': process.env.TBIT_API_KEY,
},
},
);import os
import requests
response = requests.get(
'https://rest-api.tbit.app/v1/templates',
headers={'X-API-Key': os.environ['TBIT_API_KEY']},
)
data = response.json()<?php
$ch = curl_init('https://rest-api.tbit.app/v1/templates');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'X-API-Key: ' . getenv('TBIT_API_KEY'),
],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);/v1/templates/tpl_abc123curl "https://rest-api.tbit.app/v1/templates/tpl_abc123" \
-H "X-API-Key: $TBIT_API_KEY"const response = await fetch('https://rest-api.tbit.app/v1/templates/tpl_abc123', {
headers: {
'X-API-Key': process.env.TBIT_API_KEY,
},
});
const data = await response.json();import axios from 'axios';
const { data } = await axios.get(
'https://rest-api.tbit.app/v1/templates/tpl_abc123',
{
headers: {
'X-API-Key': process.env.TBIT_API_KEY,
},
},
);import os
import requests
response = requests.get(
'https://rest-api.tbit.app/v1/templates/tpl_abc123',
headers={'X-API-Key': os.environ['TBIT_API_KEY']},
)
data = response.json()<?php
$ch = curl_init('https://rest-api.tbit.app/v1/templates/tpl_abc123');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'X-API-Key: ' . getenv('TBIT_API_KEY'),
],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);Um modelo é aprovado em uma única conta do WhatsApp Business, então um agente com várias linhas tem um conjunto de modelos por linha. GET /v1/templates mistura todas as linhas (cada item traz o seu channel_id); use este endpoint para listar só o que uma linha pode enviar. O id do canal é o que aparece em Plataforma → Canais.
/v1/channels/6a7268abec6ecaf999a6c0ba/templatescurl "https://rest-api.tbit.app/v1/channels/6a7268abec6ecaf999a6c0ba/templates" \
-H "X-API-Key: $TBIT_API_KEY"const response = await fetch('https://rest-api.tbit.app/v1/channels/6a7268abec6ecaf999a6c0ba/templates', {
headers: {
'X-API-Key': process.env.TBIT_API_KEY,
},
});
const data = await response.json();import axios from 'axios';
const { data } = await axios.get(
'https://rest-api.tbit.app/v1/channels/6a7268abec6ecaf999a6c0ba/templates',
{
headers: {
'X-API-Key': process.env.TBIT_API_KEY,
},
},
);import os
import requests
response = requests.get(
'https://rest-api.tbit.app/v1/channels/6a7268abec6ecaf999a6c0ba/templates',
headers={'X-API-Key': os.environ['TBIT_API_KEY']},
)
data = response.json()<?php
$ch = curl_init('https://rest-api.tbit.app/v1/channels/6a7268abec6ecaf999a6c0ba/templates');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'X-API-Key: ' . getenv('TBIT_API_KEY'),
],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);Nota de envio
O array de componentes segue o formato da API do WhatsApp Business. Inclua componentes de cabeçalho, corpo e botões conforme o seu modelo exigir.
/v1/templates/tpl_abc123/sendcurl -X POST "https://rest-api.tbit.app/v1/templates/tpl_abc123/send" \
-H "X-API-Key: $TBIT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"to": "573001234567",
"components": [
{
"type": "body",
"parameters": [
{
"type": "text",
"text": "John"
},
{
"type": "text",
"text": "your order #1234"
}
]
}
]
}'const response = await fetch('https://rest-api.tbit.app/v1/templates/tpl_abc123/send', {
method: 'POST',
headers: {
'X-API-Key': process.env.TBIT_API_KEY,
'Content-Type': 'application/json',
},
body: JSON.stringify({
to: '573001234567',
components: [
{
type: 'body',
parameters: [
{
type: 'text',
text: 'John',
},
{
type: 'text',
text: 'your order #1234',
},
],
},
],
}),
});
const data = await response.json();import axios from 'axios';
const { data } = await axios.post(
'https://rest-api.tbit.app/v1/templates/tpl_abc123/send',
{
to: '573001234567',
components: [
{
type: 'body',
parameters: [
{
type: 'text',
text: 'John',
},
{
type: 'text',
text: 'your order #1234',
},
],
},
],
},
{
headers: {
'X-API-Key': process.env.TBIT_API_KEY,
},
},
);import os
import requests
response = requests.post(
'https://rest-api.tbit.app/v1/templates/tpl_abc123/send',
headers={'X-API-Key': os.environ['TBIT_API_KEY']},
json={
'to': '573001234567',
'components': [
{
'type': 'body',
'parameters': [
{
'type': 'text',
'text': 'John',
},
{
'type': 'text',
'text': 'your order #1234',
},
],
},
],
},
)
data = response.json()<?php
$ch = curl_init('https://rest-api.tbit.app/v1/templates/tpl_abc123/send');
curl_setopt_array($ch, [
CURLOPT_CUSTOMREQUEST => 'POST',
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'X-API-Key: ' . getenv('TBIT_API_KEY'),
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'to' => '573001234567',
'components' => [
[
'type' => 'body',
'parameters' => [
[
'type' => 'text',
'text' => 'John',
],
[
'type' => 'text',
'text' => 'your order #1234',
],
],
],
],
]),
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);A resposta do envio só significa que a Meta ACEITOU a mensagem; entregue / lida / falha chegam minutos depois pelos webhooks da Meta. Para ler esses status, passe `campaign` {key, name} no body do envio (o envio fica registrado sob essa chave, visível também em Plataforma → Campanhas) e consulte este endpoint. `status` é sent, delivered, read ou failed; `message_id` é o wamid que o envio devolve (também vem na resposta do envio).
/v1/campaigns/my-app/executionscurl "https://rest-api.tbit.app/v1/campaigns/my-app/executions?since=2026-08-27T00:00:00Z&limit=100" \
-H "X-API-Key: $TBIT_API_KEY"const response = await fetch('https://rest-api.tbit.app/v1/campaigns/my-app/executions?since=2026-08-27T00:00:00Z&limit=100', {
headers: {
'X-API-Key': process.env.TBIT_API_KEY,
},
});
const data = await response.json();import axios from 'axios';
const { data } = await axios.get(
'https://rest-api.tbit.app/v1/campaigns/my-app/executions?since=2026-08-27T00:00:00Z&limit=100',
{
headers: {
'X-API-Key': process.env.TBIT_API_KEY,
},
},
);import os
import requests
response = requests.get(
'https://rest-api.tbit.app/v1/campaigns/my-app/executions?since=2026-08-27T00:00:00Z&limit=100',
headers={'X-API-Key': os.environ['TBIT_API_KEY']},
)
data = response.json()<?php
$ch = curl_init('https://rest-api.tbit.app/v1/campaigns/my-app/executions?since=2026-08-27T00:00:00Z&limit=100');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'X-API-Key: ' . getenv('TBIT_API_KEY'),
],
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);{
"data": [
{
"id": "6a90ea1f...",
"to": "573001234567",
"template_id": "tpl_abc123",
"message_id": "wamid.HBgLNTcz...",
"status": "failed",
"error_message": "This message was not delivered to maintain healthy ecosystem engagement.",
"sent_at": "2026-08-28T02:17:59.494Z",
"delivered_at": null,
"read_at": null
}
]
}Um objeto de modelo:
{
"data": [
{
"id": "tpl_abc123",
"name": "order_confirmation",
"language": "es",
"status": "APPROVED",
"category": "UTILITY",
"channel_id": "6a7268abec6ecaf999a6c0ba",
"components": [
{
"type": "BODY",
"text": "Hola {{1}}, {{2}} ha sido confirmado."
}
],
"created_at": "2024-08-15T10:00:00Z"
}
]
}Um envio bem-sucedido retorna o ID da mensagem:
{
"data": {
"message_sent": true,
"message_id": "wamid.HBgLNTczMDAxMjM0NTY3FQIAERgSMUY2RUZGM0Y3RTJCRTQ5AA==",
"parsed_message": "Hola John, your order #1234 ha sido confirmado."
}
}