> ## Documentation Index
> Fetch the complete documentation index at: https://docs.famulor.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Envoyer un modèle de message WhatsApp

> Envoie un message WhatsApp à l'aide d'un modèle approuvé via Famulor

<Warning>
  **API Famulor 1.0 (héritée).** Cette page concerne uniquement Famulor 1.0 (`app.famulor.de`) et est conservée pour la compatibilité. Pour la plateforme actuelle, consultez la [référence API Famulor 2.0](/fr/api-reference/introduction).
</Warning>

Envoie un message WhatsApp à l'aide d'un modèle Meta préapprouvé via votre expéditeur WhatsApp Famulor. Les messages modèles sont requis pour initier une conversation avec un utilisateur pour la première fois ou pour envoyer un message en dehors de la fenêtre de messagerie de 24 heures.

<Note>
  Ce point de terminaison est limité à **5 requêtes par seconde** par utilisateur.
</Note>

### Corps de la requête

<ParamField body="sender_id" type="integer" required>
  L'ID de l'expéditeur WhatsApp depuis lequel envoyer (obtenu via le point de terminaison [Récupérer les expéditeurs](/fr/api-v1/whatsapp/get-senders))
</ParamField>

<ParamField body="template_id" type="integer" required>
  L'ID du modèle de message à utiliser (obtenu via le point de terminaison [Récupérer les modèles](/fr/api-v1/whatsapp/get-templates))
</ParamField>

<ParamField body="recipient_phone" type="string" required>
  Le numéro de téléphone du destinataire au format international (par ex. `+1234567890`)
</ParamField>

<ParamField body="recipient_name" type="string">
  Le nom du destinataire, 255 caractères maximum (utilisé pour le suivi des conversations et à des fins de CRM)
</ParamField>

<ParamField body="variables" type="object">
  Paires clé-valeur pour les variables du modèle. Les clés doivent correspondre aux noms de variables du modèle. Si le modèle comporte les variables `{{1}}`, `{{2}}`, etc., fournissez-les sous la forme `{"1": "value1", "2": "value2"}` ou en utilisant les clés nommées du tableau `variables` du modèle.

  <Expandable title="Exemple de variables">
    <ParamField body="1" type="string">
      Valeur de la première variable du modèle
    </ParamField>

    <ParamField body="2" type="string">
      Valeur de la deuxième variable du modèle
    </ParamField>
  </Expandable>
</ParamField>

### Champs de réponse

<ResponseField name="success" type="boolean">
  Indique si le message a été envoyé avec succès
</ResponseField>

<ResponseField name="conversation_id" type="integer">
  L'ID de la conversation (nouvelle ou existante) associée à ce message
</ResponseField>

<ResponseField name="message_id" type="integer">
  L'ID de l'enregistrement du message de conversation
</ResponseField>

<ResponseField name="whatsapp_message_id" type="integer">
  L'ID de l'enregistrement du message WhatsApp
</ResponseField>

<ResponseField name="message_sid" type="string">
  Le SID de message Twilio pour le suivi de la livraison
</ResponseField>

<ResponseField name="status" type="string">
  Le statut de livraison initial du message (par ex. `queued`, `sent`)
</ResponseField>

### Réponses d'erreur

<ResponseField name="402 Insufficient Balance">
  <Expandable title="Réponse d'erreur">
    <ResponseField name="success" type="boolean">`false`</ResponseField>
    <ResponseField name="error" type="string">`Insufficient balance. Please top up your account.`</ResponseField>
    <ResponseField name="error_code" type="string">`INSUFFICIENT_BALANCE`</ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="404 Not Found">
  <Expandable title="Réponse d'erreur">
    <ResponseField name="success" type="boolean">`false`</ResponseField>
    <ResponseField name="error" type="string">`Sender not found or does not belong to you` ou `Template not found or does not belong to this sender`</ResponseField>
    <ResponseField name="error_code" type="string">`SENDER_NOT_FOUND` ou `TEMPLATE_NOT_FOUND`</ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="422 Unprocessable Entity">
  <Expandable title="Réponse d'erreur">
    <ResponseField name="success" type="boolean">`false`</ResponseField>
    <ResponseField name="error" type="string">Message d'erreur détaillé</ResponseField>

    <ResponseField name="error_code" type="string">
      L'une des valeurs suivantes : `SENDER_OFFLINE`, `TEMPLATE_NOT_APPROVED`, `TEMPLATE_NOT_SYNCED`, `TEMPLATE_MISMATCH`, `NO_ASSISTANT_CONFIGURED`, `INVALID_PHONE`, `MESSAGING_LIMIT_UNAVAILABLE`, `VOICE_CALL_LIMIT_NOT_MET`, `TWILIO_ERROR_{code}`, `UNKNOWN_ERROR`
    </ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
  ```bash cURL theme={null} theme={null}
  curl -X POST "https://app.famulor.de/api/user/whatsapp/send" \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "sender_id": 12,
      "template_id": 45,
      "recipient_phone": "+1234567890",
      "recipient_name": "John Doe",
      "variables": {
        "1": "John",
        "2": "January 15, 2026",
        "3": "2:00 PM"
      }
    }'
  ```

  ```bash Template without variables theme={null} theme={null}
  curl -X POST "https://app.famulor.de/api/user/whatsapp/send" \
    -H "Authorization: Bearer YOUR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "sender_id": 12,
      "template_id": 46,
      "recipient_phone": "+1234567890"
    }'
  ```

  ```javascript JavaScript theme={null} theme={null}
  const response = await fetch(
    'https://app.famulor.de/api/user/whatsapp/send',
    {
      method: 'POST',
      headers: {
        'Authorization': 'Bearer YOUR_API_KEY',
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        sender_id: 12,
        template_id: 45,
        recipient_phone: '+1234567890',
        recipient_name: 'John Doe',
        variables: {
          '1': 'John',
          '2': 'January 15, 2026',
          '3': '2:00 PM'
        }
      })
    }
  );

  const data = await response.json();
  console.log(data);
  ```

  ```python Python theme={null} theme={null}
  import requests

  response = requests.post(
      'https://app.famulor.de/api/user/whatsapp/send',
      headers={
          'Authorization': 'Bearer YOUR_API_KEY',
          'Content-Type': 'application/json'
      },
      json={
          'sender_id': 12,
          'template_id': 45,
          'recipient_phone': '+1234567890',
          'recipient_name': 'John Doe',
          'variables': {
              '1': 'John',
              '2': 'January 15, 2026',
              '3': '2:00 PM'
          }
      }
  )

  print(response.json())
  ```
</RequestExample>

<ResponseExample>
  ```json 200 Success theme={null} theme={null}
  {
    "success": true,
    "conversation_id": 1234,
    "message_id": 567,
    "whatsapp_message_id": 890,
    "message_sid": "SMxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
    "status": "queued"
  }
  ```

  ```json 402 Insufficient Balance theme={null} theme={null}
  {
    "success": false,
    "error": "Insufficient balance. Please top up your account.",
    "error_code": "INSUFFICIENT_BALANCE"
  }
  ```

  ```json 404 Sender Not Found theme={null} theme={null}
  {
    "success": false,
    "error": "Sender not found or does not belong to you",
    "error_code": "SENDER_NOT_FOUND"
  }
  ```

  ```json 404 Template Not Found theme={null} theme={null}
  {
    "success": false,
    "error": "Template not found or does not belong to this sender",
    "error_code": "TEMPLATE_NOT_FOUND"
  }
  ```

  ```json 422 Template Not Approved theme={null} theme={null}
  {
    "success": false,
    "error": "Template is not approved. Current status: pending",
    "error_code": "TEMPLATE_NOT_APPROVED"
  }
  ```

  ```json 422 Invalid Phone theme={null} theme={null}
  {
    "success": false,
    "error": "Invalid phone number format. Use E.164 format (e.g., +14155551234).",
    "error_code": "INVALID_PHONE"
  }
  ```

  ```json 422 Sender Offline theme={null} theme={null}
  {
    "success": false,
    "error": "Sender is not online. Current status: Offline",
    "error_code": "SENDER_OFFLINE"
  }
  ```
</ResponseExample>

### Remarques

* Les messages modèles doivent utiliser des modèles **approuvés**. Les modèles au statut `pending` ou `rejected` échoueront.
* L'expéditeur doit être `online`. Les expéditeurs hors ligne ne peuvent pas envoyer de messages.
* Le coût des messages est automatiquement déduit du solde de votre compte Famulor (crédits pour les utilisateurs tenant, minutes pour les utilisateurs directs).
* Après l'envoi d'un message modèle, une fenêtre de messagerie de 24 heures s'ouvre. Pendant cette fenêtre, vous pouvez envoyer des [messages libres](/fr/api-v1/whatsapp/send-freeform) sans avoir besoin d'un modèle.
* Si une conversation existe déjà avec le destinataire, le message est ajouté à la conversation existante.
* Limite de débit : 5 requêtes par seconde par utilisateur.
