POST /v1/templates : corps, exemples, en-tête image, boutons, et soumission à Meta.
POST /v1/templates — scope templates:write
Soumet un template pour revue Meta. Retourne la ligne créée au statut PENDING. Sondez GET /v1/templates jusqu'à APPROVED avant l'envoi.
Paramètres
| Paramètre | Type | Requis | Description |
|---|---|---|---|
name | string | Oui | Nom du template (minuscules, chiffres et _). Unique par langue. |
language | string | Oui | Code langue, ex. en, fr, en_US. |
category | string | Oui | UTILITY, AUTHENTICATION ou MARKETING. |
body_text | string | Oui | Le corps, avec {{1}}, {{2}}… ou {{nom}} pour les variables. |
example_values | string[] | Oui | Une valeur d'exemple par variable, dans l'ordre (requis par Meta). |
footer_text | string | Non | Pied de page court, sans variable. |
buttons | object[] | Non | Max 2 boutons du même type (voir plus bas). |
header_media_base64 | string | Non | Échantillon d'en-tête encodé en base64, pour un en-tête IMAGE, DOCUMENT (ex. un PDF) ou VIDEO. Ancien nom encore accepté : header_image_base64. Exige header_media_mime. |
header_media_mime | string | Non | Type MIME de l'échantillon (voir le tableau des formats acceptés ci-dessous). OBLIGATOIRE dès que header_media_base64 est fourni — c'est lui qui détermine le format Meta (IMAGE, DOCUMENT ou VIDEO), et l'omettre renvoie 422 plutôt que de deviner. Ancien nom accepté : header_image_mime. |
Requête
curl -X POST https://wa-api.geskap.com/v1/templates \
-H "Authorization: Bearer sk_live_…" \
-H "Content-Type: application/json" \
-d '{
"name": "order_update",
"language": "en",
"category": "UTILITY",
"body_text": "Hi {{1}}, your order {{2}} is confirmed.",
"example_values": ["Jean", "#8842"],
"footer_text": "Geskap"
}'
Réponse (201)
{
"name": "order_update",
"language": "en",
"status": "PENDING",
"category": "UTILITY",
"variables_count": 2
}
Un en-tête média se fournit via header_media_base64 + header_media_mime. Les deux vont ensemble : le MIME décide du format de l'en-tête (IMAGE, DOCUMENT ou VIDEO), et chaque envoi devra ensuite fournir une URL du MÊME format — sinon Meta refuse le message avec l'erreur #132012. Les boutons (max 2) sont soit des liens URL, soit des réponses rapides — ne mélangez pas les deux types.
| Format d'en-tête | Types MIME acceptés | Taille max |
|---|---|---|
| IMAGE | image/jpeg, image/png | 5 Mo |
| VIDEO | video/mp4, video/3gpp | 16 Mo |
| DOCUMENT | application/pdf, text/plain, application/msword, application/vnd.openxmlformats-officedocument.wordprocessingml.document, application/vnd.ms-excel, application/vnd.openxmlformats-officedocument.spreadsheetml.sheet, application/vnd.ms-powerpoint, application/vnd.openxmlformats-officedocument.presentationml.presentation | 16 Mo (échantillon) |
Attention — Le WebP n'est pas accepté en en-tête
image/webp est une image, mais WhatsApp ne l'accepte QUE dans les autocollants — jamais en en-tête de modèle. Convertissez en PNG ou JPEG. Le GIF n'est pas accepté non plus. Nous refusons ces types à la création (422) plutôt que de vous laisser attendre un rejet Meta sans explication.
Note — L'échantillon n'est pas le fichier envoyé
header_media_base64 ne transporte que l'ÉCHANTILLON soumis à Meta pour la revue du modèle — un exemple. À chaque envoi, le vrai fichier voyage par URL (header_document_url, header_image_url) et c'est Meta qui va le chercher : il doit donc être accessible publiquement. Meta accepte jusqu'à 100 Mo pour un document envoyé ; l'échantillon, lui, est plafonné à 16 Mo, car il transite encodé dans le corps de la requête.
Boutons
// bouton URL
{ "kind": "url", "text": "Suivre", "url": "https://exemple.com/suivi" }
// bouton réponse rapide
{ "kind": "quick_reply", "text": "Confirmer" }
Important — Meta interdit les liens wa.me
Un lien wa.me / WhatsApp dans un bouton URL est rejeté par Meta (code 2388081). Utilisez un bouton quick_reply à la place.