API
Modèles
Listez et envoyez des modèles de messages WhatsApp approuvés
# Modèles > Listez et envoyez des modèles de messages WhatsApp approuvés - Page: https://tbit.app/fr/docs/api/templates - URL de base: `https://rest-api.tbit.app/v1` - Authentification: en-tête `X-API-Key` avec votre clé dans chaque requête (les exemples la lisent depuis la variable d'environnement `TBIT_API_KEY`) ## Vue d'ensemble Les modèles sont des formats de messages WhatsApp pré-approuvés, obligatoires pour ouvrir une conversation en dehors de la fenêtre de messagerie de 24 heures. Seuls les modèles approuvés par Meta peuvent être envoyés. ## Endpoints | Méthode | Chemin | Description | | --- | --- | --- | | `GET` | `/v1/templates` | Lister les modèles WhatsApp approuvés | | `GET` | `/v1/templates/:id` | Obtenir le détail d'un modèle | | `POST` | `/v1/templates/:id/send` | Envoyer un modèle à un contact | | `GET` | `/v1/channels/:channel_id/templates` | Modèles approuvés d'une ligne WhatsApp | | `GET` | `/v1/campaigns/:key/executions` | Statut de distribution par destinataire (envois faits avec une clé de campagne) | ## Lister les modèles `GET /v1/templates` ```bash curl "https://rest-api.tbit.app/v1/templates" \ -H "X-API-Key: $TBIT_API_KEY" ``` ## Obtenir le détail d'un modèle `GET /v1/templates/tpl_abc123` ```bash curl "https://rest-api.tbit.app/v1/templates/tpl_abc123" \ -H "X-API-Key: $TBIT_API_KEY" ``` ## Modèles par ligne WhatsApp Un modèle est approuvé sur un seul compte WhatsApp Business : un agent avec plusieurs lignes a donc un jeu de modèles par ligne. GET /v1/templates mélange toutes les lignes (chaque élément porte son channel_id) ; utilisez cet endpoint pour lister uniquement ce qu'une ligne peut envoyer. L'id du canal est celui affiché dans Plateforme → Canaux. `GET /v1/channels/6a7268abec6ecaf999a6c0ba/templates` ```bash curl "https://rest-api.tbit.app/v1/channels/6a7268abec6ecaf999a6c0ba/templates" \ -H "X-API-Key: $TBIT_API_KEY" ``` ## Envoyer un modèle Note sur l'envoi Le tableau de composants suit le format de l'API WhatsApp Business. Incluez les composants d'en-tête, de corps et de boutons selon ce que demande votre modèle. `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" } ] } ] }' ``` ## Statut de distribution La réponse de l'envoi signifie seulement que Meta a ACCEPTÉ le message ; délivré / lu / échoué arrivent quelques minutes plus tard via les webhooks de Meta. Pour les lire, passez `campaign` {key, name} dans le body de l'envoi (l'envoi est enregistré sous cette clé, visible aussi dans Plateforme → Campagnes) et interrogez cet endpoint. `status` vaut sent, delivered, read ou failed ; `message_id` est le wamid renvoyé par l'envoi (il figure aussi dans la réponse de l'envoi). `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" ``` Réponse: ```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 } ] } ``` ## Format de réponse Un objet modèle : ```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" } ] } ``` ## Réponse d'envoi Un envoi réussi renvoie l'ID du message : ```json { "data": { "message_sent": true, "message_id": "wamid.HBgLNTczMDAxMjM0NTY3FQIAERgSMUY2RUZGM0Y3RTJCRTQ5AA==", "parsed_message": "Hola John, your order #1234 ha sido confirmado." } } ```Les modèles sont des formats de messages WhatsApp pré-approuvés, obligatoires pour ouvrir une conversation en dehors de la fenêtre de messagerie de 24 heures. Seuls les modèles approuvés par Meta peuvent être envoyés.
| Méthode | Chemin | Description |
|---|---|---|
| GET | /v1/templates | Lister les modèles WhatsApp approuvés |
| GET | /v1/templates/:id | Obtenir le détail d'un modèle |
| POST | /v1/templates/:id/send | Envoyer un modèle à un contact |
| GET | /v1/channels/:channel_id/templates | Modèles approuvés d'une ligne WhatsApp |
| GET | /v1/campaigns/:key/executions | Statut de distribution par destinataire (envois faits avec une clé de campagne) |
/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);Un modèle est approuvé sur un seul compte WhatsApp Business : un agent avec plusieurs lignes a donc un jeu de modèles par ligne. GET /v1/templates mélange toutes les lignes (chaque élément porte son channel_id) ; utilisez cet endpoint pour lister uniquement ce qu'une ligne peut envoyer. L'id du canal est celui affiché dans Plateforme → Canaux.
/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);Note sur l'envoi
Le tableau de composants suit le format de l'API WhatsApp Business. Incluez les composants d'en-tête, de corps et de boutons selon ce que demande votre modèle.
/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);La réponse de l'envoi signifie seulement que Meta a ACCEPTÉ le message ; délivré / lu / échoué arrivent quelques minutes plus tard via les webhooks de Meta. Pour les lire, passez `campaign` {key, name} dans le body de l'envoi (l'envoi est enregistré sous cette clé, visible aussi dans Plateforme → Campagnes) et interrogez cet endpoint. `status` vaut sent, delivered, read ou failed ; `message_id` est le wamid renvoyé par l'envoi (il figure aussi dans la réponse de l'envoi).
/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
}
]
}Un objet modèle :
{
"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"
}
]
}Un envoi réussi renvoie l'ID du message :
{
"data": {
"message_sent": true,
"message_id": "wamid.HBgLNTczMDAxMjM0NTY3FQIAERgSMUY2RUZGM0Y3RTJCRTQ5AA==",
"parsed_message": "Hola John, your order #1234 ha sido confirmado."
}
}