API de gestion des modèles
Vue d'ensemble
L'API de gestion des modèles vous permet de créer, supprimer, modifier et consulter les modèles d'un WABA, et de regrouper les modèles à l'aide d'étiquettes personnalisées. Ce document couvre deux groupes de points de terminaison :
- Points de terminaison des modèles : Obtenir les modèles, Consulter les informations d'un modèle, Téléverser un fichier multimédia d'exemple, Créer un modèle, Mettre à jour un modèle, Supprimer un modèle.
- Points de terminaison des étiquettes : Obtenir la liste des étiquettes, Créer une étiquette, Modifier une étiquette, Supprimer une étiquette, Affecter des étiquettes à un modèle. Les étiquettes s'appliquent au sein du WABA auquel appartient la clé API courante. Elles servent uniquement à la gestion des modèles côté EngageLab : elles ne modifient pas le contenu des modèles WhatsApp et ne déclenchent pas de nouvel examen par Meta.
Validation des appels
EngageLab REST API utilise l'authentification HTTP Basic comme méthode de vérification : ajoutez l'en-tête HTTP Authorization :
Authorization: Basic ${base64_auth_string}
L'algorithme de génération du base64_auth_string est le suivant : base64(dev_key:dev_secret)
- Le nom de l'en-tête est "Authorization" et la valeur est une paire "username:password" convertie en base64 (avec deux-points au milieu).
- Dans le scénario de l'API WhatsApp, le username est DevKey et le password est DevSecret. Dans la console, allez dans gestion de la configuration - clé API pour obtenir la page.
Obtenir les modèles
Adresse d'appel
GET https://wa.api.engagelab.cc/v1/templates
Paramètres de la requête
| Paramètre | Type | Option | Description |
|---|---|---|---|
| name | String | Facultatif | Nom du modèle. Notez que ce champ utilise une correspondance approximative. |
| language_code | String | Facultatif | Langue du modèle, voir Codes de langue. |
| category | String | Facultatif | Catégorie du modèle. ● AUTHENTICATION : code de vérification ● MARKETING : marketing ● UTILITY : notification de service |
| status | String | Facultatif | Statut du modèle : Les développeurs doivent principalement surveiller APPROVED/PENDING/REJECTED/DISABLED. |
| tag_id | String | Facultatif | ID d'étiquette, utilisé pour filtrer les modèles par étiquette. Valeurs acceptées :ungrouped - ne renvoyer que les modèles sans aucune étiquette ; insensible à la casse |
tag_id est en relation ET avec les autres critères de recherche tels que name, language_code, category et status. L'envoi de plusieurs étiquettes à la fois n'est pas pris en charge actuellement. Si le format de tag_id est invalide, le code d'erreur 3002 est renvoyé ; si l'étiquette n'existe pas ou n'appartient pas au WABA courant, le code d'erreur 4001 est renvoyé.
Remarque : si une étiquette nommée « ungrouped » (ou son équivalent traduit) existe dans le WABA, vous devez transmettre son ID numérique pour filtrer sur cette étiquette. Transmettre directement ungrouped est toujours interprété comme « filtrer les modèles sans aucune étiquette ».
Exemple de requête
Filtrer par étiquette :
GET https://wa.api.engagelab.cc/v1/templates?tag_id=101
Filtrer les modèles sans aucune étiquette :
GET https://wa.api.engagelab.cc/v1/templates?tag_id=ungrouped
Paramètres de la réponse
| Paramètre | Type | Option | Description |
|---|---|---|---|
| id | String | Obligatoire | ID du modèle |
| name | String | Obligatoire | Nom du modèle |
| language | String | Obligatoire | Langue du modèle, voir Codes de langue. |
| category | String | Obligatoire | Catégorie du modèle. |
| components | Object Array | Obligatoire | Composants du contenu du modèle, voir l'objet components dans Créer un modèle. |
| status | String | Obligatoire | Statut du modèle : Les développeurs doivent principalement surveiller APPROVED/PENDING/REJECTED/DISABLED. |
| tags | Object Array | Obligatoire | Étiquettes actuellement affectées au modèle. Renvoie un tableau vide si aucune étiquette n'est définie. |
Exemple de réponse
// Un tableau JSON dont chaque objet contient les informations d'un modèle
[
{
"id": "406979728071589", // ID du modèle
"name": "code", // nom du modèle
"language": "zh_CN", // langue du modèle
"status": "APPROVED", // statut ; APPROVED signifie approuvé et utilisable
"category": "OTP", // catégorie ; OTP/TRANSACTIONAL/MARKETING sont actuellement pris en charge
"components": [ // contenu du modèle ; peut inclure HEADER/BODY/FOOTER/BUTTON
{
"type": "HEADER",
"format": "text", // format ; text/image/location/video/document sont pris en charge, TEXT par défaut
"text": "Code d'inscription" // contenu texte ; obligatoire lorsque format vaut text
},
{
"type": "BODY",
"text": "Votre code de vérification est {{1}}. Veuillez le saisir dans les 5 minutes." // le texte entre doubles accolades {{}} est une variable de modèle
}
],
"tags": [ // étiquettes affectées à ce modèle ; tableau vide si aucune étiquette n'est définie
{
"id": "101",
"name": "Notification de livraison"
}
]
},
......
]
Consulter les informations d'un modèle
Adresse d'appel
GET https://wa.api.engagelab.cc/v1/templates/{template_id}
Où {template_id} est l'ID du modèle à consulter.
Paramètres de la requête
NULL
Exemple de requête
GET https://wa.api.engagelab.cc/v1/templates/406979728071589
Paramètres de la réponse
| Paramètre | Type | Option | Description |
|---|---|---|---|
| id | String | Obligatoire | ID du modèle |
| name | String | Obligatoire | Nom du modèle |
| language | String | Obligatoire | Langue du modèle, voir Codes de langue. |
| category | String | Obligatoire | Catégorie du modèle. Remarque : les catégories de modèles ont été mises à jour au plus tard le 1er mai 2023 en : |
| components | Object Array | Obligatoire | Composants du contenu du modèle, voir l'objet components dans Créer un modèle. |
| status | String | Obligatoire | Statut du modèle : APPROVED, IN_APPEAL, PENDING, REJECTED, PENDING_DELETION, DELETED, DISABLED, PAUSED, LIMIT_EXCEEDED |
| tags | Object Array | Obligatoire | Étiquettes actuellement affectées au modèle. Renvoie un tableau vide si aucune étiquette n'est définie. |
Exemple de réponse
{
"id": "406979728071589", // ID du modèle
"name": "code", // nom du modèle
"language": "zh_CN", // langue du modèle
"status": "APPROVED", // statut ; APPROVED signifie approuvé et utilisable
"category": "OTP", // catégorie ; OTP/TRANSACTIONAL/MARKETING sont actuellement pris en charge
"components": [ // contenu du modèle ; peut inclure HEADER/BODY/FOOTER/BUTTON
{
"type": "HEADER",
"format": "text", // format ; text/image/location/video/document sont pris en charge, TEXT par défaut
"text": "Code d'inscription" // contenu texte ; obligatoire lorsque format vaut text
},
{
"type": "BODY",
"text": "Votre code de vérification est {{1}}. Veuillez le saisir dans les 5 minutes." // le texte entre doubles accolades {{}} est une variable de modèle
}
],
"tags": [ // étiquettes affectées à ce modèle ; tableau vide si aucune étiquette n'est définie
{
"id": "101",
"name": "Notification de livraison"
}
]
}
Téléverser un fichier multimédia d'exemple
Lors de la création ou de la modification d'un modèle comportant un en-tête multimédia (image, video, document), Meta exige que le fichier soit d'abord téléversé sur ses serveurs. Cette API téléverse le fichier d'exemple du modèle et renvoie un handle_id, que vous devez indiquer dans le champ header_handle du point de terminaison de création/modification de modèle.
Adresse d'appel
POST https://wa.api.engagelab.cc/v1/media/handles
Paramètres de la requête
Content-Type : multipart/form-data
| Paramètre | Type | Option | Description |
|---|---|---|---|
| file | file | Obligatoire | Fichier multimédia d'exemple. Taille maximale 20 Mo. Pour les exigences de format, voir Exigences de format des messages multimédias. |
Exemple de requête
POST '/v1/media/handles'
--header 'Authorization: Basic amlndWFuZ2RldjpkZXZfc2VjcmV0'
--form 'file=@"/Users/demo/files/demopic.jpeg"'
Paramètres de la réponse
Réponse en cas de succès
| Champ | Type | Option | Description |
|---|---|---|---|
| handle_id | String | Obligatoire | L'identifiant de fichier renvoyé par Meta, à indiquer dans le champ example.header_handle lors de la création ou de la modification d'un modèle. |
Exemple de réponse :
{
"handle_id": "4::aW1hZ2UvanBlZw==:ARb2JGd8LbvJbfmpMASFAlczcn4hxLC6tkwjasjD4WL6_i34tIisq0IdWNFFFj1KwJMRXPU4xwygHSJd4DHu1f19LcBBl2qeb8EuEcgnIUPYIQ:e:1682169041:4985146461608173:100084026087657:ARazr9kxfzKshJE4WpY"
}
Réponse en cas d'échec
Le code de statut HTTP est 4xx ou 5xx, et le corps de la réponse contient les champs suivants :
| Champ | Type | Option | Description |
|---|---|---|---|
| code | int | Obligatoire | Code d'erreur |
| message | String | Obligatoire | Détail de l'erreur |
Exemple de réponse :
{
"code": 3002,
"message": "whatsapp.template field must be set correctly when type is template"
}
Créer un modèle
Adresse d'appel
POST https://wa.api.engagelab.cc/v1/templates
Exemple d'appel
{
"name": "template_name", // nom du modèle ; les homonymes sont autorisés ; seuls les minuscules, les chiffres et les tirets bas sont pris en charge
"language": "zh_CN", // langue du modèle ; deux modèles portant le même nom ne peuvent pas utiliser la même langue
"category": "OTP", // catégorie ; OTP/TRANSACTIONAL/MARKETING sont actuellement pris en charge
"components": [
{ // contenu du modèle
"type": "BODY", // bloc de contenu ; HEADER/BODY/FOOTER/BUTTONS sont actuellement pris en charge
"text": "define var as {{1}}" // le texte lui-même ; le champ format n'est pas nécessaire lorsque le body est du texte
"example": {
"body_text": [
[
"var1"
]
]
}
},
{
"type": "HEADER",
"format": "image", // type de contenu ; text/image/video/document/location sont pris en charge
"example": {
"header_handle": [
"https://jiguang.cn/demopic.jpg"
]
}
},
{
"type": "FOOTER",
"text": "footer only support text without variable"
},
{
"type": "BUTTONS",
"buttons": [
{
"type": "PHONE_NUMBER", // type de bouton ; PHONE_NUMBER/URL/QUICK_REPLY sont pris en charge
"text": "this is a phone number",
"phone_number": "8613800138000"
}
]
}
]
}
Paramètres de la requête
| Paramètre | Type | Option | Description |
|---|---|---|---|
| name | String | Obligatoire | Nom du modèle. Seuls les minuscules, les chiffres et les tirets bas sont pris en charge, dans la limite de 512 caractères. |
| language | String | Obligatoire | Langue du modèle, voir Codes de langue. |
| category | String | Obligatoire | Catégorie du modèle. Remarque : les catégories de modèles ont été mises à jour au plus tard le 1er mai 2023 en : |
| components | Object Array | Obligatoire | Composants décrivant le contenu du modèle, voir l'objet components. Notez qu'un composant de type=BODY doit être présent. |
Objet components
Cet objet décrit le contenu du modèle. Un modèle se compose des composants « en-tête HEADER », « corps BODY », « pied de page FOOTER » et « boutons BUTTONS », indiqués par type. Chaque type de composant accepte des paramètres différents :
Composant header
Le composant header est facultatif dans son ensemble. Si vous n'avez pas besoin d'en-tête, n'incluez pas ce composant.
| Paramètre | Type | Option | Description |
|---|---|---|---|
| type | String | Obligatoire | Type de composant, valeur HEADER |
| format | String | Obligatoire | Format de l'en-tête, valeurs : text, image, video, document, correspondant respectivement à texte, image, vidéo et fichier. |
| text | String | Facultatif | Contenu texte de l'en-tête. Renseignez ce champ lorsque format=text. Le texte de l'en-tête peut contenir une variable, mais une seule est prise en charge, notée {{1}}. |
| example | JSON Object | Facultatif | Exemple d'en-tête. Obligatoire lorsque text contient une variable ou que format est un type multimédia. Voir la description de l'objet example. |
Description de l'objet example
| Paramètre | Type | Option | Description |
|---|---|---|---|
| header_handle | String Array | Facultatif | Obligatoire lorsque format vaut image, video ou document. Ce champ n'accepte plus d'URL multimédia ; vous devez transmettre le handle_id obtenu via l'API de téléversement de fichier multimédia d'exemple. |
| header_text | String Array | Facultatif | Lorsque format vaut text et contient une variable, transmettez dans ce champ la valeur de remplacement de cette variable. Par exemple : "header_text": ["var1"] |
Composant body
Le composant body est obligatoire ; vous devez définir le contenu du corps.
| Paramètre | Type | Option | Description |
|---|---|---|---|
| type | String | Obligatoire | Type de composant, valeur BODY |
| text | String | Obligatoire | Contenu du corps, 1024 caractères maximum. Plusieurs variables sont prises en charge. Une variable se compose de doubles accolades et du numéro de la variable ; la numérotation doit commencer à 1 et être croissante, par exemple {{1}} et {{2}}. |
| example | JSON Object | Facultatif | Exemple de corps. Les examinateurs de Meta s'appuient sur cet exemple pour juger de la conformité de votre message. Voir la description de l'objet example. Obligatoire lorsque text contient des variables. |
Description de l'objet example
| Paramètre | Type | Option | Description |
|---|---|---|---|
| body_text | String Array | Facultatif | Lorsque text contient des variables, transmettez dans ce champ les valeurs de remplacement de toutes les variables, dans l'ordre de leur numérotation. Par exemple : "body_text": [["var1","var2","var3"]] |
Composant footer
Le composant footer est facultatif dans son ensemble. Si vous n'avez pas besoin de pied de page, n'incluez pas ce composant.
| Paramètre | Type | Option | Description |
|---|---|---|---|
| type | String | Obligatoire | Type de composant, valeur FOOTER |
| text | String | Obligatoire | Contenu du pied de page. Texte brut uniquement ; les variables ne sont pas autorisées. |
Composant buttons
Le composant buttons est facultatif dans son ensemble. Si vous n'avez pas besoin de boutons, n'incluez pas ce composant.
| Paramètre | Type | Option | Description |
|---|---|---|---|
| type | String | Obligatoire | Type de composant, valeur BUTTONS |
| buttons | Object Array | Obligatoire | Informations sur les boutons, voir la description de l'objet buttons. |
Description de l'objet buttons
| Paramètre | Type | Option | Description |
|---|---|---|---|
| type | String | Obligatoire | Type de bouton, valeurs : QUICK_REPLY, URL, PHONE_NUMBER, correspondant respectivement à réponse rapide, visiter un site web et appeler un numéro de téléphone. |
| text | String | Obligatoire | Le texte affiché sur le bouton. Ne peut pas contenir de variables ; texte brut uniquement, 25 caractères maximum. |
| url | String | Facultatif | Obligatoire lorsque type=URL. Vous pouvez placer une variable à la fin de l'URL, mais une seule est prise en charge, notée {{1}}. |
| phone_number | String | Facultatif | Obligatoire lorsque type=PHONE_NUMBER. Ne peut pas contenir de variables. La valeur est un numéro de téléphone incluant l'indicatif international. |
| example | String Array | Facultatif | Obligatoire lorsque type=QUICK_REPLY et type=URL. Par exemple : "example": [" https://www.website.com/dynamic-url-example"] |
Remarques particulières sur les modèles d'authentification
Points d'attention
Pour les modèles de la catégorie authentification (c'est-à-dire AUTHENTICATION) :
- Ne définissez pas de composant HEADER dans Components.
- Le texte du contenu du modèle est localisé automatiquement en fonction du champ language du modèle.
- Pour le mode ONE_TAP qui ouvre une application, seules les applications Android sont prises en charge actuellement, et vous devez implémenter le handshake correspondant dans votre application. Pour un guide détaillé, consultez la documentation officielle - Modèles d'authentification.
- Les champs transmis lors de la création d'un modèle ne correspondent pas aux champs du modèle enregistrés côté WhatsApp après la création : concrètement, WhatsApp remplace les BODY, FOOTER et BUTTONS des modèles de cette catégorie. Soyez donc particulièrement attentif lors de l'envoi de messages modèles : vous devez ajouter la variable de bouton. Pour plus de détails, consultez la documentation de l'API d'envoi de messages.
Exemple COPY_CODE
Données transmises :
{
"name": "copycodetmpl",
"language": "zh_CN",
"category": "AUTHENTICATION",
"components": [
{
// body est obligatoire
"type": "BODY",
"add_security_recommendation": true // faut-il ajouter le texte de recommandation de sécurité
},
{
// footer est facultatif
"type": "FOOTER",
"code_expiration_minutes": 2 // ajoute l'affichage du délai d'expiration, plage [1,90] ; omettez ce champ si vous n'en avez pas besoin
},
{
"type": "BUTTONS",
"buttons": [
{
"type": "OTP",
"otp_type": "copy_code",
"text": "copy it" // limite de 25 caractères
}
]
}
]
}
Le contenu du modèle réellement enregistré côté WhatsApp après une création réussie :
{
"name": "copycodetmpl",
"language": "zh_CN",
"category": "AUTHENTICATION",
"components": [
{
"type": "BODY",
"text": "*{{1}}* est votre code de vérification. Pour votre sécurité, ne partagez pas ce code.",
"example": {
"body_text": [
["123456"]
]
}
},
{
"type": "FOOTER",
"text": "Ce code expire dans 2 minutes."
},
{
"type": "BUTTONS",
"buttons": [{
"type": "URL",
"text": "Copy code",
"url": "https://www.whatsapp.com/otp/code/?otp_type=COPY_CODE&code=otp{{1}}",
"example": [
"https://www.whatsapp.com/otp/code/?otp_type=COPY_CODE&code=otp123456"
]
}]
}
]
}
Exemple ONE_TAP
Données transmises :
{
"name": "copycodetmpl",
"language": "zh_CN",
"category": "AUTHENTICATION",
"components": [
{
// body est obligatoire
"type": "BODY",
"add_security_recommendation": true // faut-il ajouter le texte de recommandation de sécurité
},
{
// footer est facultatif
"type": "FOOTER",
"code_expiration_minutes": 2 // ajoute l'affichage du délai d'expiration, plage [1,90] ; omettez ce champ si vous n'en avez pas besoin
},
{
"type": "BUTTONS",
"buttons": [
{
"type": "OTP",
"otp_type": "one_tap",
"text": "auto1", // limite de 25 caractères
"autofill_text": "auto1", // limite de 25 caractères
"package_name": "ppssd",
"signature_hash": "asds"
}
]
}
]
}
Le contenu du modèle réellement enregistré côté WhatsApp après une création réussie :
{
"name": "copycodetmpl",
"language": "zh_CN",
"category": "AUTHENTICATION",
"components": [
{
"type": "BODY",
"text": "*{{1}}* est votre code de vérification. Pour votre sécurité, ne partagez pas ce code.",
"example": {
"body_text": [
["123456"]
]
}
},
{
"type": "FOOTER",
"text": "Ce code expire dans 2 minutes."
},
{
"type": "BUTTONS",
"buttons": [{
"type": "URL",
"text": "copy1",
"url": "https://www.whatsapp.com/otp/code/?otp_type=ONE_TAP&cta_display_name=auto1&package_name=ppssd&signature_hash=asds&code=otp{{1}}",
"example": ["https://www.whatsapp.com/otp/code/?otp_type=ONE_TAP&cta_display_name=auto1&package_name=ppssd&signature_hash=asds&code=otp123456"]
}]
}
]
}
Paramètres de la réponse
Réponse en cas de succès
| Paramètre | Type | Option | Description |
|---|---|---|---|
| template_id | String | Obligatoire | ID du modèle, renvoyé en cas de succès |
{
"template_id": "1275172986566180" // ID du modèle
}
Réponse en cas d'échec
| Paramètre | Type | Option | Description |
|---|---|---|---|
| code | int | Obligatoire | Code d'erreur, renvoyé en cas d'échec |
| message | String | Obligatoire | Message d'erreur, renvoyé en cas d'échec |
{
"code": 5002,
"message": "Invalid parameter. code:100:2388042"
}
Mettre à jour un modèle
Adresse d'appel
PUT https://wa.api.engagelab.cc/v1/templates/{templateId}
Exemple d'appel
{
"components": [{ // contenu du modèle
"type": "BODY", // bloc de contenu
"text": "define var as {{1}}",
"example": {
"body_text": [["var1"]]
}
},{
"type": "HEADER",
"format": "image", // type de contenu : image/video/document
"example": {
// Remarque : vous devez indiquer ici le handle_id renvoyé par le point de terminaison de téléversement ; une URL d'image n'est plus prise en charge
"header_handle": ["4::aW1hZ2UvanBlZw==:ARb2JGd8LbvJbfmpMASFAlcz..."]
}
},{
"type": "FOOTER",
"text": "footer only support text without variable"
},{
"type": "BUTTONS",
"buttons": [{
"type": "PHONE_NUMBER",
"text": "this is a phone number",
"phone_number": "8613800138000"
}]
}]
}
Paramètres de la requête
Identiques aux paramètres de la requête du point de terminaison de création de modèle.
Paramètres de la réponse
Réponse en cas de succès
| Paramètre | Type | Option | Description |
|---|---|---|---|
| code | int | Obligatoire | Code de retour, toujours 0 |
| message | String | Obligatoire | Message de retour, toujours success |
{
"code": 0,
"message": "success"
}
Réponse en cas d'échec
| Paramètre | Type | Option | Description |
|---|---|---|---|
| code | int | Obligatoire | Code d'erreur, renvoyé en cas d'échec |
| message | String | Obligatoire | Message d'erreur, renvoyé en cas d'échec |
{
"code": 5002,
"message": "Invalid parameter. code:100:2593002"
}
Supprimer un modèle
Adresse d'appel
DELETE https://wa.api.engagelab.cc/v1/templates/{template_name}
Remarque : c'est le nom du modèle qui est transmis ici, et non son ID. Toutes les versions linguistiques du modèle portant ce nom seront supprimées.
Paramètres de la réponse
Réponse en cas de succès
| Paramètre | Type | Option | Description |
|---|---|---|---|
| code | int | Obligatoire | Code de retour, toujours 0 |
| message | String | Obligatoire | Message de retour, toujours success |
{
"code": 0,
"message": "success"
}
Réponse en cas d'échec
| Paramètre | Type | Option | Description |
|---|---|---|---|
| code | int | Obligatoire | Code d'erreur, renvoyé en cas d'échec |
| message | String | Obligatoire | Message d'erreur, renvoyé en cas d'échec |
{
"code": 2004,
"message": "something error"
}
Obtenir la liste des étiquettes
Renvoie toutes les étiquettes du WABA auquel appartient la clé API courante, sans pagination.
Adresse d'appel
GET https://wa.api.engagelab.cc/v1/template-tags
Paramètres de la requête
NULL
Exemple de requête
GET https://wa.api.engagelab.cc/v1/template-tags
Paramètres de la réponse
| Paramètre | Type | Option | Description |
|---|---|---|---|
| id | String | Obligatoire | ID de l'étiquette |
| name | String | Obligatoire | Nom de l'étiquette |
| template_count | Integer | Obligatoire | Nombre de modèles du WABA courant portant cette étiquette. Les modèles homonymes dans des langues différentes sont comptés séparément selon leur ID. |
Exemple de réponse
[
{
"id": "101",
"name": "Notification de livraison",
"template_count": 3
},
{
"id": "102",
"name": "Service après-vente",
"template_count": 0
}
]
Si le WABA ne comporte aucune étiquette, un tableau vide [] est renvoyé.
Créer une étiquette
Adresse d'appel
POST https://wa.api.engagelab.cc/v1/template-tags
Paramètres de la requête
| Paramètre | Type | Option | Description |
|---|---|---|---|
| name | String | Obligatoire | Nom de l'étiquette, de 1 à 64 caractères. Pour les exigences de nommage, voir Règles de nommage des étiquettes. |
Exemple de requête
{
"name": "Notification de livraison"
}
Paramètres de la réponse
Réponse en cas de succès
| Paramètre | Type | Option | Description |
|---|---|---|---|
| id | String | Obligatoire | ID de l'étiquette |
| name | String | Obligatoire | Le nom de l'étiquette après normalisation |
{
"id": "101",
"name": "Notification de livraison"
}
Réponse en cas d'échec
| Paramètre | Type | Option | Description |
|---|---|---|---|
| code | int | Obligatoire | Code d'erreur, renvoyé en cas d'échec |
| message | String | Obligatoire | Message d'erreur, renvoyé en cas d'échec |
{
"code": 3003,
"message": "template tag name already exists"
}
Modifier une étiquette
Adresse d'appel
PUT https://wa.api.engagelab.cc/v1/template-tags/{tag_id}
Où {tag_id} est l'ID de l'étiquette à modifier.
Paramètres de la requête
| Paramètre | Type | Option | Description |
|---|---|---|---|
| name | String | Obligatoire | Le nouveau nom de l'étiquette, de 1 à 64 caractères. Pour les exigences de nommage, voir Règles de nommage des étiquettes. |
Exemple de requête
{
"name": "Service après-vente"
}
Paramètres de la réponse
Réponse en cas de succès
| Paramètre | Type | Option | Description |
|---|---|---|---|
| id | String | Obligatoire | ID de l'étiquette |
| name | String | Obligatoire | Le nom de l'étiquette après modification |
{
"id": "101",
"name": "Service après-vente"
}
Réponse en cas d'échec
| Paramètre | Type | Option | Description |
|---|---|---|---|
| code | int | Obligatoire | Code d'erreur, renvoyé en cas d'échec |
| message | String | Obligatoire | Message d'erreur, renvoyé en cas d'échec |
{
"code": 4001,
"message": "template tag not found"
}
Supprimer une étiquette
Adresse d'appel
DELETE https://wa.api.engagelab.cc/v1/template-tags/{tag_id}
Remarque : la suppression d'une étiquette ne fait que dissocier les modèles de cette étiquette. Elle ne supprime pas les modèles et n'affecte pas leur envoi.
Où {tag_id} est l'ID de l'étiquette à supprimer.
Paramètres de la requête
NULL
Exemple de requête
DELETE https://wa.api.engagelab.cc/v1/template-tags/101
Paramètres de la réponse
Réponse en cas de succès
| Paramètre | Type | Option | Description |
|---|---|---|---|
| affected_template_count | Integer | Obligatoire | Nombre de modèles dissociés par cette opération. Les modèles homonymes dans des langues différentes sont comptés séparément selon leur ID. |
{
"affected_template_count": 3
}
Réponse en cas d'échec
| Paramètre | Type | Option | Description |
|---|---|---|---|
| code | int | Obligatoire | Code d'erreur, renvoyé en cas d'échec |
| message | String | Obligatoire | Message d'erreur, renvoyé en cas d'échec |
{
"code": 4001,
"message": "template tag not found"
}
Affecter des étiquettes à un modèle
Adresse d'appel
PUT https://wa.api.engagelab.cc/v1/templates/{template_id}/tags
Remarque : ce point de terminaison procède par écrasement complet. tag_ids correspond à l'ensemble complet des étiquettes que portera le modèle après enregistrement ; toute étiquette existante non incluse sera dissociée.
Où {template_id} est l'ID du modèle dont vous souhaitez définir les étiquettes.
Paramètres de la requête
| Paramètre | Type | Option | Description |
|---|---|---|---|
| tag_ids | String Array | Obligatoire | L'ensemble complet des ID d'étiquettes que portera le modèle après enregistrement. Il doit être transmis explicitement et ne peut pas valoir null. Tous les ID doivent appartenir au WABA courant ; les doublons sont automatiquement supprimés. |
À propos de la valeur de tag_ids :
- Transmettre
[]supprime toutes les étiquettes de ce modèle. - Si tag_ids n'est pas transmis ou vaut
null, la requête échoue et les étiquettes existantes ne sont pas supprimées. - En cas d'échec de la requête, l'ensemble des étiquettes du modèle reste inchangé ; vous pouvez donc réessayer directement.
- Le nombre d'étiquettes par modèle n'est pas limité ; vous pouvez transmettre toutes les étiquettes du WABA courant.
Exemple de requête
{
"tag_ids": ["101", "102"]
}
Paramètres de la réponse
Réponse en cas de succès
| Paramètre | Type | Option | Description |
|---|---|---|---|
| code | int | Obligatoire | Code de retour, toujours 0 |
| message | String | Obligatoire | Message de retour, toujours success |
{
"code": 0,
"message": "success"
}
Réponse en cas d'échec
| Paramètre | Type | Option | Description |
|---|---|---|---|
| code | int | Obligatoire | Code d'erreur, renvoyé en cas d'échec |
| message | String | Obligatoire | Message d'erreur, renvoyé en cas d'échec |
Le modèle n'existe pas ou n'appartient pas au WABA courant :
{
"code": 4001,
"message": "template not found"
}
L'étiquette n'existe pas ou n'appartient pas au WABA courant :
{
"code": 4001,
"message": "template tag not found"
}
tag_ids n'a pas été transmis ou vaut null :
{
"code": 3002,
"message": "template tag IDs must be provided as an array"
}
Codes d'erreur
Dans le tableau ci-dessous, « points de terminaison des étiquettes » désigne les cinq points de terminaison d'étiquettes listés dans la Vue d'ensemble, et inclut également le cas du filtrage par tag_id lors de l'obtention des modèles.
| Code d'erreur | Code HTTP | Points de terminaison concernés | Description |
|---|---|---|---|
| 1000 | 500 | Tous les points de terminaison | Erreur interne |
| 2001 | 401 | Tous les points de terminaison | Échec de l'authentification côté EngageLab : aucun jeton au format de données valide n'a été transmis |
| 2002 | 401 | Tous les points de terminaison | Échec de l'authentification côté EngageLab : le jeton a expiré ou a été désactivé |
| 2003 | 400 | Tous les points de terminaison | Échec de l'authentification côté WhatsApp. Veuillez contacter le service client EngageLab. |
| 2004 | 403 | Tous les points de terminaison | Aucune autorisation d'appeler cette API, ou le compte ou le WABA concerné a été désactivé |
| 3001 | 400 | Tous les points de terminaison | Format des paramètres de la requête invalide. Vérifiez que le format JSON est utilisé et que les types des champs sont conformes. |
| 3002 | 400 | Tous les points de terminaison | Paramètres de requête incorrects. Vérifiez qu'ils sont conformes aux exigences. |
| 3002 | 400 | Points de terminaison des étiquettes | Le nom de l'étiquette est vide |
| 3002 | 400 | Points de terminaison des étiquettes | Le nom de l'étiquette dépasse 64 caractères, voir Règles de nommage des étiquettes |
| 3002 | 400 | Points de terminaison des étiquettes | Le nom de l'étiquette contient des caractères non autorisés, voir Règles de nommage des étiquettes |
| 3002 | 400 | Points de terminaison des étiquettes | Format d'ID d'étiquette invalide ; il doit s'agir d'une chaîne d'entiers positifs |
| 3002 | 400 | Points de terminaison des étiquettes | tag_ids n'a pas été transmis lors de l'affectation des étiquettes, ou sa valeur est null |
| 3003 | 400 | Tous les points de terminaison | Paramètres de requête incorrects : la validation métier correspondante a échoué |
| 3003 | 400 | Points de terminaison des étiquettes | Une étiquette portant le même nom existe déjà dans le WABA. La détection des doublons ne tient compte ni de la casse ni des accents. |
| 3003 | 400 | Points de terminaison des étiquettes | La limite de 20 étiquettes par WABA est atteinte |
| 3003 | 400 | Points de terminaison des étiquettes | Les opérations sur les étiquettes sont saturées. Réessayez plus tard ; une nouvelle tentative ne crée pas de doublons. |
| 4001 | 400 | Tous les points de terminaison | Le modèle n'existe pas ou n'appartient pas au WABA courant |
| 4001 | 400 | Points de terminaison des étiquettes | L'étiquette n'existe pas ou n'appartient pas au WABA courant |
| 5002 | 400 | Tous les points de terminaison | La requête de modèle a échoué côté Meta. Consultez la description de l'erreur dans le champ message. |
Notes
Exigences de format des messages multimédias
| Type de média | Content-Type pris en charge | Limite de taille |
|---|---|---|
| image | image/jpeg, image/png ; les fonds transparents ne sont pas pris en charge | 5 Mo |
| video | video/mp4 | 16 Mo |
| document | Format PDF uniquement | 100 Mo |
Règles de nommage des étiquettes
Lors de la création et de la modification d'étiquettes, le serveur normalise d'abord le nom, puis vérifie sa longueur et l'absence de doublon.
Normalisation : les espaces en début et en fin sont supprimés, et les espaces consécutifs à l'intérieur du nom sont réduits à un seul espace. Par exemple, si vous transmettez " Notification de livraison ", le nom réellement enregistré et renvoyé est "Notification de livraison".
Restrictions de caractères : les espaces, tirets bas, traits d'union, caractères visibles de toutes les langues et emojis sont autorisés ; les sauts de ligne, tabulations, caractères de contrôle et caractères de formatage invisibles ne le sont pas.
Longueur : après normalisation, le nom doit comporter de 1 à 64 caractères. La longueur est comptée en points de code Unicode, et un emoji peut occuper plusieurs points de code.
Détection des doublons : les noms doivent être uniques au sein d'un WABA. La détection ne tient compte ni de la casse ni des accents : par exemple, Logistics, logistics et Logístics sont considérés comme le même nom. Il n'y a pas de mots réservés.
Limites d'utilisation des étiquettes
- Un WABA peut créer au maximum 20 étiquettes.
- Le nombre d'étiquettes par modèle n'est pas limité ; vous pouvez affecter toutes les étiquettes existantes du WABA courant, ce qui porte la limite effective à 20.
- Les ID d'étiquettes sont des chaînes de caractères aussi bien dans les requêtes que dans les réponses (par exemple
"101"). Ne les interprétez pas comme des nombres. - Les modèles homonymes dans des langues différentes reçoivent leurs étiquettes indépendamment, selon leur ID respectif. Les versions française et anglaise d'un même modèle doivent donc être configurées séparément.
- Les étiquettes ne sont pas transmises à Meta. Elles ne modifient ni le statut ni la note de qualité du modèle et ne déclenchent pas de nouvel examen.
Codes de langue
| Langue | Code |
|---|---|
| Afrikaans | af |
| Albanais | sq |
| Arabe | ar |
| Azerbaïdjanais | az |
| Bengali | bn |
| Bulgare | bg |
| Catalan | ca |
| Chinois (Chine continentale) | zh_CN |
| Chinois (Hong Kong) | zh_HK |
| Chinois (Taïwan) | zh_TW |
| Croate | hr |
| Tchèque | cs |
| Danois | da |
| Néerlandais | nl |
| Anglais | en |
| Anglais (Royaume-Uni) | en_GB |
| Anglais (États-Unis) | en_US |
| Estonien | et |
| Filipino | fil |
| Finnois | fi |
| Français | fr |
| Géorgien | ka |
| Allemand | de |
| Grec | el |
| Gujarati | gu |
| Haoussa | ha |
| Hébreu | he |
| Hindi | hi |
| Hongrois | hu |
| Indonésien | id |
| Irlandais | ga |
| Italien | it |
| Japonais | ja |
| Kannada | kn |
| Kazakh | kk |
| Kinyarwanda | rw_RW |
| Coréen | ko |
| Kirghiz | ky_KG |
| Lao | lo |
| Letton | lv |
| Lituanien | lt |
| Macédonien | mk |
| Malais | ms |
| Malayalam | ml |
| Marathi | mr |
| Norvégien | nb |
| Persan | fa |
| Polonais | pl |
| Portugais (Brésil) | pt_BR |
| Portugais (Portugal) | pt_PT |
| Pendjabi | pa |
| Roumain | ro |
| Russe | ru |
| Serbe | sr |
| Slovaque | sk |
| Slovène | sl |
| Espagnol | es |
| Espagnol (Argentine) | es_AR |
| Espagnol (Espagne) | es_ES |
| Espagnol (Mexique) | es_MX |
| Swahili | sw |
| Suédois | sv |
| Tamoul | ta |
| Télougou | te |
| Thaï | th |
| Turc | tr |
| Ukrainien | uk |
| Ourdou | ur |
| Ouzbek | uz |
| Vietnamien | vi |
| Zoulou | zu |
Vous pouvez également télécharger ce fichier pour consulter la correspondance entre les langues et leurs codes :
Codes de langue des modèles.xlsx










