# Templates

> Soumettre des templates à la revue de Meta, suivre leur statut, les synchroniser et les utiliser dans vos envois.

Un **template** est un modèle de message pré-approuvé par Meta. C'est le seul moyen d'écrire à quelqu'un qui ne vous a pas écrit dans les dernières 24 heures. Les templates appartiennent à un **compte WhatsApp** (WABA) : tous les numéros de ce compte partagent les mêmes templates.

## Le cycle de vie

```text
Vous soumettez ──► pending ──► approved   (utilisable)
                          └──► rejected   (motif dans rejectionReason)
                               paused / disabled  (qualité insuffisante : décidé par Meta)
```

Le `status` est celui de Meta, en minuscules. **Seul `approved` est envoyable** (`usable: true`).

## Créer un template

<ApiExample method="POST" path="/waba-connections/{wabaConnectionId}/templates" />

| Règle | Détail |
|---|---|
| `name` | Minuscules, chiffres et underscores : `rappel_rdv`. |
| `language` | `fr`, `en`, `en_US`… Un même nom peut exister en plusieurs langues. |
| `category` | `MARKETING`, `UTILITY` ou `AUTHENTICATION`. Meta décide de la catégorie retenue et de la tarification qui en découle. |
| `components` | Au format Meta. Le composant `BODY` est obligatoire ; `HEADER`, `FOOTER` et `BUTTONS` sont facultatifs. Les variables s'écrivent avec des doubles accolades numérotées, et le champ `example` fournit une valeur d'exemple pour chaque variable. |

L'API valide le brouillon (nom, langue, catégorie, présence du `BODY`) **avant** d'appeler Meta et répond `400 validation_error` avec le détail si quelque chose ne va pas. Meta applique ensuite ses propres règles de contenu : un rejet arrive plus tard, en statut `rejected`.

## Suivre la revue

Vous avez deux moyens :

- **Les webhooks** : l'événement `template.status_updated` vous prévient dès que Meta statue.
- **La synchronisation**, un chemin de réparation plus qu'une boucle de scrutation :

<ApiExample method="POST" path="/waba-connections/{wabaConnectionId}/templates/sync" />

La synchronisation aligne la base sur Meta : statuts mis à jour, et templates créés ailleurs (directement chez Meta, par exemple) ajoutés. Les changements de statut déclenchent aussi `template.status_updated`.

<ApiExample method="GET" path="/waba-connections/{wabaConnectionId}/templates" />

## Envoyer un template

Référencez-le par `name` et `language`. Les variables se passent dans `components`, dans l'ordre de leurs numéros :

```json title="Corps de POST /messages"
{
  "phoneNumberId": "…",
  "to": "+237600000000",
  "type": "template",
  "template": {
    "name": "rappel_rdv",
    "language": "fr",
    "components": [
      { "type": "body", "parameters": [
        { "type": "text", "text": "Awa" },
        { "type": "text", "text": "14 novembre à 10 h" }
      ] }
    ]
  }
}
```

Si le template existe chez Bref Point Inbox mais n'est **pas approuvé**, l'envoi est refusé immédiatement, avec le statut et le motif :

```json title="422 template_not_approved"
{ "error": { "code": "template_not_approved",
  "message": "Le template « rappel_rdv » (fr) est « rejected » : INVALID_FORMAT. Seul un template approuvé peut être envoyé" } }
```

Un template **inconnu** de Bref Point Inbox (créé directement chez Meta et pas encore synchronisé) n'est pas bloqué en amont : c'est Meta qui tranche, et le message passe en `failed` si le template n'existe pas.

## Supprimer

<ApiExample method="DELETE" path="/waba-connections/{wabaConnectionId}/templates/{name}" />

La suppression retire le template **dans toutes ses langues**, chez Meta puis chez Bref Point Inbox.

<Callout type="note" title="Les templates d'authentification (OTP)">
La catégorie `AUTHENTICATION` est acceptée à la création. Les composants spécifiques aux codes à usage unique suivent le format de Meta.
</Callout>
