Your AI Connector Docs

API de modèles WhatsApp

Les modèles de message WhatsApp sont des messages pré-rédigés qui ont été approuvés pour être envoyés en dehors de la fenêtre de conversation normale de 24 heures — par exemple, un message de bienvenue, un rappel de rendez-vous ou une relance de réengagement. Cette API vous permet de lister, créer, modifier, soumettre, vérifier, supprimer et envoyer des modèles par programmation.

Tous les chemins ci-dessous sont relatifs à l’URL de base de l’API :

https://api.youraiconnector.com/v1

Chaque requête doit être authentifiée. Consultez Authentification pour connaître les quatre méthodes acceptées. Les exemples sur cette page utilisent l’en-tête X-API-Key (et une forme de paramètre de requête pour cURL).

Remarque : Les modèles reposent sur le canal de l’API WhatsApp Business. Cette partie de l’API nécessite donc à la fois un accès à l’API et un forfait incluant les canaux WhatsApp. Sans cela, les requêtes seront rejetées avec une erreur 403.


Travailler avec des sous-comptes (agences)


États d’approbation

Comme les messages envoyés en dehors d’une conversation ouverte doivent d’abord être examinés par WhatsApp, chaque modèle comporte un status d’approbation :

Statut Signification
draft Créé ou enregistré mais pas encore envoyé pour examen. Vous pouvez toujours le modifier.
received Soumis et accepté dans la file d’attente d’examen.
pending En cours d’examen.
approved Autorisé pour l’envoi.
rejected Refusé. Le champ rejection_reason explique pourquoi ; corrigez-le, puis soumettez à nouveau.

Seuls les modèles draft et rejected peuvent être modifiés ou (re)soumis. Une fois qu’un modèle est approved, il est verrouillé — créez-en un nouveau si vous avez besoin de modifications.

Approbation automatique : Certains canaux ne nécessitent pas d’étape d’examen externe. Les modèles créés ou soumis pour une campagne sur un tel canal sont enregistrés immédiatement comme approved, sans identifiant de contenu (sid).


Modèles sur les comptes connectés à Meta

Ces points de terminaison fonctionnent de la même manière, quel que soit le type de connexion WhatsApp utilisé par votre compte, mais ce qui se passe en arrière-plan diffère :

  • Sur une connexion WhatsApp gérée, les modèles sont enregistrés auprès du fournisseur de messagerie et sid est l’identifiant de contenu du fournisseur (HXXXXXXXX…).
  • Sur un compte dont le numéro fonctionne sur son propre compte WhatsApp Business (l’une ou l’autre des options de connexion Meta), les modèles sont créés et examinés dans ce compte WhatsApp Business et sid est l’identifiant de modèle propre à Meta — une chaîne numérique telle que "3394843740694756". status utilise toujours les valeurs du tableau ci-dessus, et rejection_reason contient toujours l’explication de Meta.

Deux points de terminaison supplémentaires existent à cet effet : l’un pour demander sur quelle connexion vous vous trouvez, et l’autre pour réconcilier votre liste de modèles avec votre compte WhatsApp Business. Les modèles qui existent déjà dans le compte WhatsApp Business sont importés dans votre bibliothèque par la synchronisation, de sorte qu’un GET /whatsapp-templates ultérieur les répertorie comme n’importe quel autre modèle.

Vérifier sur quelle connexion les modèles fonctionnent

GET /whatsapp-templates/provider

Champ Description
provider twilio lorsque les modèles sont enregistrés auprès du fournisseur de messagerie géré, meta lorsqu’ils résident dans votre propre compte WhatsApp Business.
lane Quelle connexion Meta est utilisée — meta_cloud_api (votre propre application Meta) ou meta_embedded (connectée via notre application Meta). null sur une connexion gérée.
waba_id Le compte WhatsApp Business dans lequel les modèles sont créés, ou null.
templates_enabled false lorsque la connexion Meta n’est pas encore terminée (aucun compte WhatsApp Business ou jeton d’accès stocké). La création ou la soumission de modèles échoue avec un 400 tant que ce n’est pas le cas.

cURL

curl "https://api.youraiconnector.com/v1/whatsapp-templates/provider?apiKey=YOUR_API_KEY"

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/whatsapp-templates/provider", {
  headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();

Python

import requests

res = requests.get(
    "https://api.youraiconnector.com/v1/whatsapp-templates/provider",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()

Réponse

{
  "success": true,
  "provider": "meta",
  "lane": "meta_cloud_api",
  "waba_id": "2357661648036355",
  "templates_enabled": true
}

Synchroniser les modèles depuis Meta

Actualise le statut d’approbation de chaque modèle résidant dans votre compte WhatsApp Business et importe tout modèle qui y existe mais ne figure pas encore dans votre bibliothèque. Vous pouvez l’appeler aussi souvent que vous le souhaitez sans risque. Sur une connexion gérée, il n’y a rien à synchroniser, donc l’appel ne fait rien et indique simplement combien de modèles vous avez.

POST /whatsapp-templates/meta-sync

Champ Description
imported Modèles trouvés dans le compte WhatsApp Business qui ont été ajoutés à votre bibliothèque par cet appel.
updated Modèles existants dont le statut ou les détails ont changé.
total Modèles présents dans votre bibliothèque après la synchronisation.

cURL

curl -X POST "https://api.youraiconnector.com/v1/whatsapp-templates/meta-sync?apiKey=YOUR_API_KEY"

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/whatsapp-templates/meta-sync", {
  method: "POST",
  headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/whatsapp-templates/meta-sync",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()

Réponse

{
  "success": true,
  "provider": "meta",
  "imported": 2,
  "updated": 5,
  "total": 12
}

Communiquer directement avec Meta (avancé)

Si vous avez besoin de quelque chose que les points de terminaison ci-dessus n’exposent pas — en-têtes de modèle, pieds de page, boutons ou un modèle entièrement créé manuellement — /v1/meta-templates transmet votre demande directement à l’API de modèles de Meta, sans rien stocker dans votre bibliothèque de modèles. Cela ne fonctionne que sur les comptes dont le numéro fonctionne sur leur propre compte WhatsApp Business ; sur une connexion gérée, chaque appel renvoie 400 vous demandant de connecter d’abord une application Meta.

Point de terminaison Ce qu’il fait
GET /meta-templates Répertorie les modèles de votre compte WhatsApp Business avec leur dernier statut. Ajoutez ?name= pour filtrer sur un nom de modèle exact. Renvoie { "success": true, "templates": [...] }.
POST /meta-templates Crée un modèle et le soumet à l’examen de Meta en une seule étape. Nécessite name, language et body (ou un tableau components complet au lieu de body). Optionnel : variables (tableau de chaînes), category (MARKETING, UTILITY ou AUTHENTICATION), header, footer, buttons. Renvoie 201 avec { "success": true, "template": {...} }.
DELETE /meta-templates/{name} Supprime le modèle par son nom Meta — toutes ses langues. Ajoutez ?hsm_id= avec l’identifiant de modèle de Meta pour supprimer une seule langue. Renvoie { "success": true, "name": "..." }.

Un modèle refusé par Meta renvoie 400 avec l’explication de Meta dans error.


Lister les modèles

Renvoie tous les modèles de votre compte, avec un résumé léger de chacun.

GET /whatsapp-templates

cURL

curl "https://api.youraiconnector.com/v1/whatsapp-templates?apiKey=YOUR_API_KEY"

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/whatsapp-templates", {
  headers: { "X-API-Key": "YOUR_API_KEY" },
});
const data = await res.json();

Python

import requests

res = requests.get(
    "https://api.youraiconnector.com/v1/whatsapp-templates",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()

Réponse

{
  "success": true,
  "data": [
    {
      "id": "template_abc123",
      "name": "welcome_message",
      "status": "approved",
      "language": "en",
      "body": "Hi {{first_name}}, thanks for reaching out!"
    },
    {
      "id": "template_def456",
      "name": "appointment_reminder",
      "status": "pending",
      "language": "en",
      "body": "Hi {{first_name}}, this is a reminder about your appointment."
    }
  ]
}

Obtenir un modèle

Renvoie les détails complets d’un modèle unique, y compris ses variables, son statut et ses horodatages.

GET /whatsapp-templates/{templateId}

cURL

curl "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123" \
  -H "X-API-Key: YOUR_API_KEY"

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123",
  { headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();

Python

import requests

res = requests.get(
    "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()

Réponse

{
  "success": true,
  "template": {
    "id": "template_abc123",
    "name": "welcome_message",
    "body": "Hi {{first_name}}, thanks for reaching out!",
    "language": "en",
    "variables": ["first_name"],
    "status": "approved",
    "sid": "HXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
    "type": "general",
    "category": "marketing",
    "rejection_reason": null,
    "campaign_id": "campaign123",
    "date_created": "2026-06-01T10:00:00.000Z",
    "date_updated": "2026-06-02T08:30:00.000Z",
    "submitted_at": "2026-06-01T10:05:00.000Z",
    "approved_at": "2026-06-02T08:30:00.000Z"
  }
}

Un modèle qui n’existe pas sur votre compte renvoie 404 avec { "success": false, "error": "Template not found" }.


Créer un modèle

Crée un modèle pour le message d’ouverture d’une campagne et le soumet à approbation en une seule étape.

POST /whatsapp-templates

Champ Requis Description
campaign_id Oui La campagne à laquelle appartient le modèle.
name Oui Un nom pour le modèle.
language Oui Code de langue, par exemple en, es, de, pt_BR, zh_CN.
body Oui Le texte du message, jusqu’à 1024 caractères.
variables Non Liste ordonnée des noms de variables utilisés dans le corps du message.

Les espaces réservés de variables peuvent être écrits sous la forme {{first_name}}, {first_name} ou [first_name] — ils sont tous normalisés au format à double accolade.

Le résultat dépend des canaux de la campagne :

  • Campagne WhatsApp Business API : le contenu est envoyé pour examen par WhatsApp. La réponse contient campaign_status (received ou pending) et un template_sid.
  • Un canal sans étape d’examen externe : le modèle est stocké et automatiquement approuvé (campaign_status: "approved", template_sid: null).
  • Aucun canal WhatsApp sur la campagne : rien n’est créé et campaign_status est not_applicable.

cURL

curl -X POST "https://api.youraiconnector.com/v1/whatsapp-templates?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "campaign_id": "campaign123",
    "name": "welcome_message",
    "language": "en",
    "body": "Hi {{first_name}}, thanks for reaching out!",
    "variables": ["first_name"]
  }'

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/whatsapp-templates", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    campaign_id: "campaign123",
    name: "welcome_message",
    language: "en",
    body: "Hi {{first_name}}, thanks for reaching out!",
    variables: ["first_name"],
  }),
});
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/whatsapp-templates",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "campaign_id": "campaign123",
        "name": "welcome_message",
        "language": "en",
        "body": "Hi {{first_name}}, thanks for reaching out!",
        "variables": ["first_name"],
    },
)
data = res.json()

Réponse (soumis pour examen)

{
  "success": true,
  "campaign_status": "pending",
  "template_sid": "HXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}

Créer un modèle autonome

Crée un modèle dans votre bibliothèque de modèles sans le lier au message d’ouverture d’une campagne. Il s’agit de l’étape de création du cycle de vie que le reste de cette page suit : créez-le ici, modifiez-le, soumettez-le pour examen, vérifiez son statut et supprimez-le lorsque vous n’en avez plus besoin.

POST /whatsapp-templates/docs

Champ Requis Description
name Oui Un nom pour le modèle.
language Oui Code de langue, par exemple en, es, de, pt_BR, zh_CN.
body Oui Le texte du message, jusqu’à 1024 caractères.
variables Non Liste ordonnée des noms de variables utilisés dans le corps.
status Non draft (par défaut) le stocke sans le soumettre ; submitted le place immédiatement dans la file d’attente pour examen par WhatsApp.
type Non general (par défaut) ou smart_followup.
category Non marketing, utility, authentication ou authentication-international.
campaign_id Non Lie le modèle à l’une de vos campagnes.

Modèles d’authentification (code à usage unique). WhatsApp n’accepte pas les modèles d’authentification en texte libre : le corps du message est prédéfini par WhatsApp et le modèle doit comporter un bouton « copier le code ». Lorsque vous créez un modèle avec category: "authentication", nous le soumettons dans ce format fixe pour vous. Votre body est conservé comme aperçu affiché dans l’application, mais le texte que votre contact reçoit est celui de WhatsApp (le code, un rappel de sécurité et une note d’expiration de 10 minutes). Déclarez exactement une variable, par exemple ["code"], et transmettez le code lors de l’envoi (voir le champ variables sur Envoyer un modèle à un contact). Le code doit comporter moins de 15 caractères.

Quelle méthode de création utiliser ? Utilisez celle-ci lorsque vous souhaitez un modèle que vous pouvez modifier et soumettre vous-même. Utilisez POST /whatsapp-templates (ci-dessus) lorsque vous souhaitez définir le message d’ouverture d’une campagne — celle-ci nécessite campaign_id et écrit directement dans la campagne.

Un modèle créé en tant que submitted est envoyé pour examen par WhatsApp en arrière-plan ; vérifiez donc le point de terminaison de statut pour connaître le résultat plutôt que de l’attendre dans la réponse.

cURL

curl -X POST "https://api.youraiconnector.com/v1/whatsapp-templates/docs?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "welcome_message",
    "language": "en",
    "body": "Hi {{first_name}}, thanks for reaching out!",
    "variables": ["first_name"],
    "status": "draft",
    "category": "marketing"
  }'

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/whatsapp-templates/docs", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    name: "welcome_message",
    language: "en",
    body: "Hi {{first_name}}, thanks for reaching out!",
    variables: ["first_name"],
    status: "draft",
    category: "marketing",
  }),
});
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/whatsapp-templates/docs",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "name": "welcome_message",
        "language": "en",
        "body": "Hi {{first_name}}, thanks for reaching out!",
        "variables": ["first_name"],
        "status": "draft",
        "category": "marketing",
    },
)
data = res.json()

Réponse

{
  "success": true,
  "template_id": "template_abc123",
  "status": "draft"
}

Un name, language ou body manquant, une langue non prise en charge, un status autre que draft ou submitted, un type ou category inconnu, ou un corps de plus de 1024 caractères renvoie 400 avec un error explicatif. Un campaign_id qui ne correspond pas à l’une de vos campagnes renvoie 404.


Mettre à jour un modèle

Modifie un modèle qui n’a pas encore été approuvé. Seuls les modèles avec le statut draft ou rejected peuvent être modifiés. Fournissez n’importe quelle combinaison de name, body, language et variables — seuls les champs que vous envoyez sont modifiés.

PUT /whatsapp-templates/{templateId}

La modification ne soumet pas à nouveau le modèle pour examen. Utilisez le point de terminaison de soumission par la suite.

cURL

curl -X PUT "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123" \
  -H "X-API-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "body": "Hi {{first_name}}, here is an update for you.",
    "variables": ["first_name"]
  }'

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123",
  {
    method: "PUT",
    headers: {
      "X-API-Key": "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({
      body: "Hi {{first_name}}, here is an update for you.",
      variables: ["first_name"],
    }),
  }
);
const data = await res.json();

Python

import requests

res = requests.put(
    "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "body": "Hi {{first_name}}, here is an update for you.",
        "variables": ["first_name"],
    },
)
data = res.json()

Réponse

{
  "success": true,
  "template_id": "template_abc123"
}

Tenter de modifier un modèle qui est déjà approved (ou qui n’est pas modifiable pour une autre raison), envoyer des champs vides ou envoyer une valeur non valide renvoie 400 avec un error explicatif.


Soumettre un modèle pour approbation

Soumet un modèle draft ou rejected pour examen. Les modèles sur un canal qui ne nécessite pas d’examen externe sont approuvés immédiatement ; tous les autres sont envoyés à WhatsApp et le status renvoyé (généralement received ou pending) est stocké sur le modèle.

POST /whatsapp-templates/{templateId}/submit

Les modèles de suivi doivent déclarer et utiliser leurs variables requises avant de pouvoir être soumis : un espace réservé pour le prénom, ainsi qu’un espace réservé pour le contexte personnel pour les suivis intelligents.

cURL

curl -X POST "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/submit" \
  -H "X-API-Key: YOUR_API_KEY"

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/submit",
  { method: "POST", headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/submit",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()

Réponse

{
  "success": true,
  "template_id": "template_abc123",
  "status": "pending",
  "sid": "HXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
}

Vérifier le statut d’approbation

Un point de terminaison léger pour interroger le statut actuel d’un modèle. Le statut est lu à partir de l’enregistrement stocké, qui est actualisé périodiquement en arrière-plan, de sorte qu’une approbation ou un rejet très récent peut mettre un court instant à apparaître.

GET /whatsapp-templates/{templateId}/status

cURL

curl "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/status" \
  -H "X-API-Key: YOUR_API_KEY"

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/status",
  { headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();

Python

import requests

res = requests.get(
    "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/status",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()

Réponse

{
  "success": true,
  "template_id": "template_abc123",
  "name": "welcome_message",
  "status": "approved",
  "sid": "HXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "rejection_reason": null,
  "date_updated": "2026-06-02T08:30:00.000Z"
}

Supprimer un modèle

Supprime l’enregistrement du modèle de votre compte.

DELETE /whatsapp-templates/{templateId}

Important : Sur une connexion gérée, seul l’enregistrement stocké est supprimé ; le contenu déjà approuvé par WhatsApp peut rester enregistré auprès du fournisseur de messagerie. Sur un compte utilisant son propre compte WhatsApp Business, le modèle est également supprimé de ce compte. Dans les deux cas, si une campagne utilise toujours ce modèle, redirigez cette campagne vers un autre modèle avant la suppression, sinon les envois qui en dépendent échoueront.

cURL

curl -X DELETE "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123" \
  -H "X-API-Key: YOUR_API_KEY"

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123",
  { method: "DELETE", headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();

Python

import requests

res = requests.delete(
    "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()

Réponse

{
  "success": true,
  "template_id": "template_abc123",
  "note": "The template record was removed from your account. Content already approved by WhatsApp may remain registered with the messaging provider."
}

Envoyer un modèle à un contact

Envoie un modèle approuvé à un contact, même en l’absence de conversation ouverte — cela rouvre la session de chat. Vous pouvez cibler le contact par contactId ou par phoneNumber, et choisir le modèle par whatsappTemplateId ou par templateName.

POST /whatsapp-templates/send

Champ Requis Description
contactId L’un de ces deux L’identifiant du contact.
phoneNumber L’un de ces deux Le numéro de téléphone du contact (avec l’indicatif pays, sans espaces). Recherché ou créé si nécessaire.
whatsappTemplateId L’un de ces deux L’identifiant du modèle.
templateName L’un de ces deux Le nom du modèle, tel qu’affiché dans l’application.
firstName Non Utilisé pour remplir un contact nouvellement créé.
lastName Non Utilisé pour remplir un contact nouvellement créé.
email Non Utilisé pour remplir un contact nouvellement créé.
variables Non Valeurs explicites pour les variables du modèle, indexées par nom de variable, par exemple { "code": "482913" }. Une valeur donnée ici prévaut sur les champs du contact pour cette variable ; les variables que vous omettez sont toujours remplies à partir du contact comme décrit ci-dessous. C’est ainsi que vous transmettez un code à usage unique à un modèle d’authentification.

Le corps du modèle prend en charge la substitution avancée de variables :

  • Variables de base : {{first_name}}, {{email}}, {{company}}
  • Valeurs par défaut : {{first_name|there}} affiche there si le champ est vide
  • Transformations : {{company|uppercase}}, {{name|lowercase}}, {{name|capitalize}}
  • Combiné : {{company|Your Company|uppercase}}

Crédits : L’envoi d’un modèle consomme des crédits. Le coût exact dépend du pays du destinataire et de la catégorie du modèle.

cURL

curl -X POST "https://api.youraiconnector.com/v1/whatsapp-templates/send?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "contactId": "contact123",
    "whatsappTemplateId": "template_abc123"
  }'

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/whatsapp-templates/send", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    contactId: "contact123",
    whatsappTemplateId: "template_abc123",
  }),
});
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/whatsapp-templates/send",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "contactId": "contact123",
        "whatsappTemplateId": "template_abc123",
    },
)
data = res.json()

Réponse

{
  "success": true,
  "data": "WhatsApp template message sent successfully"
}

Une requête manquant à la fois d’un identifiant de contact et des deux identifiants de modèle renvoie 400. Si votre compte ne dispose pas des identifiants de messagerie nécessaires pour l’envoi, la réponse est 403.


Créer ou mettre à jour le modèle actif d’une campagne

Une seconde paire de points de terminaison pour le modèle d’ouverture d’une campagne, définis par le chemin d’accès plutôt que par un campaign_id dans le corps de la requête. Ce sont ceux à utiliser pour une campagne déjà active : contrairement à Créer un modèle ci-dessus, la mise à jour ici soumet également à nouveau les brouillons de suivi de la campagne pour examen, afin que le modèle d’ouverture et ses suivis restent synchronisés.

POST /whatsapp-templates/campaign/{campaignId} crée le modèle d’ouverture de la campagne. PUT /whatsapp-templates/campaign/{campaignId} le modifie — la campagne doit déjà posséder un modèle, sinon cela renvoie 400.

Champ Requis Description
name Oui Un nom pour le modèle.
language Oui Code de langue, par exemple en, es, de, pt_BR, zh_CN.
body Oui Le texte du message, jusqu’à 1024 caractères.
variables Oui Liste ordonnée des noms de variables utilisés dans le corps. Passez un tableau vide si le modèle n’en utilise aucun.

cURL (créer)

curl -X POST "https://api.youraiconnector.com/v1/whatsapp-templates/campaign/campaign123?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "welcome_message",
    "language": "en",
    "body": "Hi {{first_name}}, thanks for reaching out!",
    "variables": ["first_name"]
  }'

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/whatsapp-templates/campaign/campaign123", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    name: "welcome_message",
    language: "en",
    body: "Hi {{first_name}}, thanks for reaching out!",
    variables: ["first_name"],
  }),
});
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/whatsapp-templates/campaign/campaign123",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "name": "welcome_message",
        "language": "en",
        "body": "Hi {{first_name}}, thanks for reaching out!",
        "variables": ["first_name"],
    },
)
data = res.json()

Réponse

{
  "success": true,
  "campaign_status": "pending",
  "template_sid": "HXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",
  "message": "WhatsApp template created and campaign updated successfully."
}

Pour modifier, changez la méthode pour PUT et utilisez les mêmes champs — cela soumet à nouveau le modèle d’ouverture (et les brouillons de suivi de la campagne, sur une campagne WhatsApp API) pour examen.

Une campagne qui n’appartient pas à votre compte renvoie 404 ; une campagne appartenant à un autre compte pour lequel vous n’êtes pas autorisé renvoie 403. La modification d’une campagne sans modèle existant renvoie 400.


Envoyer un modèle à un contact existant

Une alternative plus simple, définie par le chemin d’accès, à Envoyer un modèle à un contact ci-dessus : le modèle et le contact doivent déjà exister — rien n’est recherché par nom ou créé à la volée.

POST /whatsapp-templates/{templateId}/send-to-contact

Champ Requis Description
contactId Oui L’identifiant du contact. Doit appartenir à votre compte.

cURL

curl -X POST "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/send-to-contact?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "contactId": "contact123" }'

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/send-to-contact",
  {
    method: "POST",
    headers: {
      "X-API-Key": "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ contactId: "contact123" }),
  }
);
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/send-to-contact",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={"contactId": "contact123"},
)
data = res.json()

Réponse

{
  "success": true,
  "data": "WhatsApp template message sent successfully"
}

Crédits : L’envoi consomme des crédits, facturés de la même manière que le point de terminaison ci-dessus. Un contactId manquant ou n’appartenant pas à votre compte renvoie 403 ; un templateId inexistant renvoie 404.


Envoi groupé d’un modèle

Envoyez un modèle à de nombreux contacts en un seul appel, avec un aperçu du coût que vous pouvez afficher avant de confirmer.

Estimer le coût au préalable

Renvoie le coût d’un envoi, détaillé par pays de destination, sans rien envoyer ni utiliser de crédits. La tarification des modèles est par pays de destination, elle doit donc être calculée côté serveur par rapport aux contacts réels plutôt qu’estimée côté client.

POST /whatsapp-templates/{templateId}/estimate-bulk-cost

Champ Requis Description
contactIds Oui Contacts à tarifer, jusqu’à 500 par appel. Les doublons sont comptés une seule fois.

cURL

curl -X POST "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/estimate-bulk-cost?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "contactIds": ["contact123", "contact456"] }'

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/estimate-bulk-cost",
  {
    method: "POST",
    headers: {
      "X-API-Key": "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ contactIds: ["contact123", "contact456"] }),
  }
);
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/estimate-bulk-cost",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={"contactIds": ["contact123", "contact456"]},
)
data = res.json()

Réponse

{
  "success": true,
  "data": {
    "countries": [
      {
        "countryCode": "1",
        "name": "United States",
        "iso": "US",
        "flag": "🇺🇸",
        "contactCount": 120,
        "costPerContact": 0.5,
        "subtotal": 60.0
      }
    ],
    "totalContacts": 120,
    "totalTemplateCost": 60.0,
    "templateCategory": "marketing",
    "skippedContacts": 2
  }
}

skippedContacts compte les identifiants manquants, qui ne vous appartiennent pas ou qui n’ont pas de numéro de téléphone — l’estimation ne couvre que le reste, donc une valeur non nulle signifie que l’envoi réel atteindra moins de contacts que ceux sélectionnés.

Envoyer le lot

Envoie le modèle à chaque contact de la liste, en résolvant toutes les variables intelligentes par contact et en débitant des crédits par envoi.

POST /whatsapp-templates/{templateId}/bulk-send

Champ Requis Description
contactIds Oui Contacts auxquels envoyer, jusqu’à 5000 par appel.

cURL

curl -X POST "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/bulk-send?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "contactIds": ["contact123", "contact456"] }'

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/bulk-send",
  {
    method: "POST",
    headers: {
      "X-API-Key": "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ contactIds: ["contact123", "contact456"] }),
  }
);
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/whatsapp-templates/template_abc123/bulk-send",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={"contactIds": ["contact123", "contact456"]},
)
data = res.json()

Réponse

{
  "success": true,
  "data": { "sent": 118, "failed": 2, "total": 120 }
}

Un contact qui échoue (non trouvé, pas sur votre compte ou erreur d’envoi) est ignoré et compté dans failed au lieu d’arrêter le lot. Un contactIds vide, plus de 5000 identifiants sur un envoi (500 sur une estimation) ou un templateId manquant renvoie 400.


Réessayer un message ayant échoué

Deux points de terminaison pour renvoyer un message ayant échoué, sans créer de nouvel enregistrement de message ni dépenser à nouveau des crédits.

POST /whatsapp-templates/messages/{contactId}/{messageId}/retry-template réessaie spécifiquement un message de modèle ayant échoué — il résout à nouveau le contenu du modèle à partir de la campagne si le message ayant échoué ne le contient pas déjà. Seuls les messages avec le statut failed et le type template peuvent être réessayés de cette manière.

POST /whatsapp-templates/messages/{contactId}/{messageId}/retry est indépendant du canal et fonctionne pour tout message non basé sur un modèle ayant échoué (par exemple WhatsApp Web), en le dirigeant vers le bon chemin d’envoi en fonction du canal du message. Il accepte les statuts failed, failed_connection, limit_exceeded ou queued_retry.

Aucun des deux points de terminaison ne prend de corps de requête.

cURL

curl -X POST "https://api.youraiconnector.com/v1/whatsapp-templates/messages/contact123/msg_abc789/retry-template?apiKey=YOUR_API_KEY"

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/whatsapp-templates/messages/contact123/msg_abc789/retry-template",
  { method: "POST", headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/whatsapp-templates/messages/contact123/msg_abc789/retry-template",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()

Réponse

{
  "success": true,
  "data": "Message retry initiated successfully"
}

Pour la version indépendante du canal, remplacez le chemin par .../msg_abc789/retry. Un message dont le statut n’est pas éligible à une nouvelle tentative, ou (sur le point de terminaison de modèle) qui n’est pas un message de modèle, renvoie 400. Un contact ou un message manquant renvoie 404.


Profil WhatsApp Business

Gérez le profil WhatsApp Business (à propos, adresse, description, e-mail, sites web, catégorie d’entreprise et logo) affiché aux contacts sur WhatsApp. Fonctionne à la fois sur une connexion gérée et sur un compte utilisant son propre compte WhatsApp Business.

Enregistrer le profil

PUT /whatsapp-templates/profile

Champ Requis Description
phoneNumber Oui Le numéro WhatsApp auquel appartient ce profil. Doit être connecté sur votre compte.
about Non Court texte « À propos » affiché sur le profil.
address Non Adresse de l’entreprise.
description Non Description plus longue de l’entreprise.
email Non E-mail de contact affiché sur le profil.
websites Non Tableau d’URLs de sites web. Chacune doit être une URL valide.
vertical Non Catégorie d’entreprise, par exemple Retail ou Professional Services.
profilePictureHandle Non L’identifiant renvoyé par le point de terminaison de téléchargement d’image ci-dessous, pour définir la photo de profil.

cURL

curl -X PUT "https://api.youraiconnector.com/v1/whatsapp-templates/profile?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "phoneNumber": "+31612345678",
    "about": "We reply within a few hours",
    "email": "support@example.com",
    "websites": ["https://example.com"]
  }'

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/whatsapp-templates/profile", {
  method: "PUT",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    phoneNumber: "+31612345678",
    about: "We reply within a few hours",
    email: "support@example.com",
    websites: ["https://example.com"],
  }),
});
const data = await res.json();

Python

import requests

res = requests.put(
    "https://api.youraiconnector.com/v1/whatsapp-templates/profile",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "phoneNumber": "+31612345678",
        "about": "We reply within a few hours",
        "email": "support@example.com",
        "websites": ["https://example.com"],
    },
)
data = res.json()

Réponse

{
  "success": true,
  "data": "WhatsApp Business profile updated successfully"
}

Un phoneNumber manquant, une URL de site web invalide ou un phoneNumber non connecté sur votre compte renvoie 400 ou 404.

Télécharger une photo de profil

Télécharge une image à partir d’une URL que vous fournissez et l’envoie sur WhatsApp, en renvoyant un identifiant. Transmettez cet identifiant en tant que profilePictureHandle lors de l’appel d’enregistrement du profil ci-dessus pour la définir comme photo — ce point de terminaison télécharge uniquement l’image, il ne la définit pas lui-même.

POST /whatsapp-templates/profile/picture

Champ Requis Description
phoneNumber Oui Le numéro WhatsApp auquel appartient ce profil.
fileUrl Oui Une URL accessible publiquement vers l’image à télécharger.

cURL

curl -X POST "https://api.youraiconnector.com/v1/whatsapp-templates/profile/picture?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "phoneNumber": "+31612345678",
    "fileUrl": "https://example.com/logo.png"
  }'

JavaScript

const res = await fetch("https://api.youraiconnector.com/v1/whatsapp-templates/profile/picture", {
  method: "POST",
  headers: {
    "X-API-Key": "YOUR_API_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    phoneNumber: "+31612345678",
    fileUrl: "https://example.com/logo.png",
  }),
});
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/whatsapp-templates/profile/picture",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={
        "phoneNumber": "+31612345678",
        "fileUrl": "https://example.com/logo.png",
    },
)
data = res.json()

Réponse

{
  "success": true,
  "data": "1234567890123456"
}

data est l’identifiant de l’image téléchargée. Un phoneNumber ou fileUrl manquant, ou un phoneNumber sans jeton d’accès WhatsApp enregistré, renvoie 400 ; une fileUrl inaccessible ou invalide renvoie une erreur décrivant la raison de l’échec du téléchargement.


Vérifier le statut d’un expéditeur

Interroge (et actualise) le statut d’envoi en direct d’un numéro WhatsApp connecté auprès du fournisseur de messagerie. Utile pour confirmer qu’un numéro est réellement capable d’envoyer des messages avant de vous y fier.

GET /whatsapp-templates/sender-status/{phoneNumber}

cURL

curl "https://api.youraiconnector.com/v1/whatsapp-templates/sender-status/+31612345678" \
  -H "X-API-Key: YOUR_API_KEY"

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/whatsapp-templates/sender-status/+31612345678",
  { headers: { "X-API-Key": "YOUR_API_KEY" } }
);
const data = await res.json();

Python

import requests

res = requests.get(
    "https://api.youraiconnector.com/v1/whatsapp-templates/sender-status/+31612345678",
    headers={"X-API-Key": "YOUR_API_KEY"},
)
data = res.json()

Réponse

{
  "success": true,
  "data": "ONLINE"
}

data est l’un des états suivants : ONLINE (envoi normal), PENDING (en cours de vérification) ou DELETED (le fournisseur ne reconnaît plus cet expéditeur — reconnectez le numéro). Un phoneNumber sans informations professionnelles WhatsApp enregistrées renvoie 404.


Générer des modèles de suivi avec l’IA

La plateforme peut rédiger pour vous les modèles de suivi WhatsApp d’une campagne — les relances envoyées lorsqu’une conversation s’essouffle — à partir des instructions et de l’objectif de la campagne. Il existe un point de terminaison de tâche qui s’exécute en arrière-plan, ainsi que trois anciens points de terminaison conservés pour les intégrations existantes. Tous utilisent des crédits IA.

Démarrer une tâche de génération

POST /campaigns/{campaignId}/template-generation

Champ Requis Description
type Non all (par défaut) rédige l’ensemble complet des suivis. cold_only rédige uniquement les messages pour les contacts qui n’ont jamais répondu.

cURL

curl -X POST "https://api.youraiconnector.com/v1/campaigns/campaign_abc123/template-generation?apiKey=YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "type": "all" }'

JavaScript

const res = await fetch(
  "https://api.youraiconnector.com/v1/campaigns/campaign_abc123/template-generation",
  {
    method: "POST",
    headers: {
      "X-API-Key": "YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: JSON.stringify({ type: "all" }),
  }
);
const data = await res.json();

Python

import requests

res = requests.post(
    "https://api.youraiconnector.com/v1/campaigns/campaign_abc123/template-generation",
    headers={"X-API-Key": "YOUR_API_KEY"},
    json={"type": "all"},
)
data = res.json()

Réponse (202)

{ "success": true, "campaign_id": "campaign_abc123", "type": "all" }

L’appel renvoie une réponse dès que la tâche est mise en file d’attente. Lisez la campagne (GET /campaigns/{campaignId}, voir l’API Campagnes) et surveillez son objet template_generation_status jusqu’à ce qu’elle soit terminée :

Champ Description
status processing pendant l’exécution de la tâche, puis completed ou failed.
progress De 0 à 100.
current_template, total_templates Combien de modèles ont été rédigés jusqu’à présent, sur le nombre total que la tâche doit générer — 11 pour une campagne sortante ou combinée, 9 sinon.
error Raison pour laquelle une tâche failed s’est arrêtée, par exemple un manque de crédits.
started_at, completed_at Date et heure de début et de fin de la tâche.

Les modèles générés sont ajoutés à la campagne comme n’importe quel autre, ils apparaissent donc dans Lister les modèles et doivent toujours passer par l’approbation WhatsApp avant de pouvoir être envoyés. Un 400 signifie que type était différent de all ou cold_only ; un 404 signifie que la campagne n’existe pas ou appartient à un autre compte.

Les agents disposent d’un équivalent de cet appel, POST /agents/{agentId}/template-generation, qui rédige les suivis pour un Agent et se termine pendant l’appel dans le cas habituel — voir Générer des messages de suivi dans l’API des Agents IA.

Les anciens points de terminaison de génération

Trois points de terminaison antérieurs effectuent le même travail et sont conservés afin que les intégrations existantes continuent de fonctionner. Le nouveau code doit utiliser le point de terminaison de tâche ci-dessus.

Point de terminaison Ce qu’il fait
POST /whatsapp-templates/campaign/{campaignId}/generate-async Démarre la génération de suivi pour la campagne en arrière-plan et renvoie 202 avec { "success": true, "data": { "result": "success", "message": "..." } }. Les crédits sont débités à l’avance (ignoré sur un compte qui utilise sa propre clé IA) et l’objet template_generation_status de la campagne rapporte la progression exactement comme ci-dessus.
POST /whatsapp-templates/campaign/{campaignId}/generate-followups Génère les neuf modèles de suivi pendant l’appel — pour une campagne créée avant l’existence des suivis automatiques, ou une campagne nécessitant une nouvelle rédaction — et renvoie 200 avec templatesGenerated dans data.
POST /whatsapp-templates/agent/{agentId}/generate-followups La même génération synchrone adressée par Agent. La réponse ajoute agent_id, campaign_id et target : "campaign" lorsque les modèles ont été écrits sur la campagne de l’Agent, "agent" (avec campaign_id: null) lorsque l’Agent n’a pas de campagne et qu’ils ont été stockés sur l’Agent lui-même. Un Agent manquant ou étranger est un 404.

Tous les trois nécessitent que les suivis automatiques soient activés sur le compte et qu’il y ait suffisamment de crédits — un 400 indique lequel manque — et la paire adressée à la campagne renvoie 403 lorsque la campagne appartient à un autre compte.


Erreurs de l’API des modèles

Les points de terminaison des modèles renvoient l’enveloppe d’erreur standard :

{
  "success": false,
  "error": "Template not found"
}

Une 404 sur ces points de terminaison signifie généralement que la ressource est introuvable — soit elle n’existe pas, soit elle appartient à un autre compte. Quelques points de terminaison (la création/mise à jour au niveau de la campagne, et les envois vers un contact existant) renvoient 403 à la place lorsque la campagne ou le contact appartient à quelqu’un d’autre plutôt que de ne pas exister du tout. Certains points de terminaison incluent également un champ error_code reflétant le statut HTTP. Les codes partagés que chaque point de terminaison peut renvoyer — 400, 401, 403 (votre forfait n’inclut pas l’accès à l’API), 429 (limite de débit) et 500 — sont répertoriés avec des conseils de nouvelle tentative dans Erreurs et pagination.


Étapes suivantes