{
    "info": {
        "name": "GESFLOW SENDER API",
        "description": "API REST de **GESFLOW SENDER** pour envoyer des SMS (passerelle opérateur) et des messages WhatsApp (via le numéro WhatsApp appairé à votre compte), envoyer et vérifier des codes OTP, suivre vos campagnes, lire les messages reçus et recharger votre solde par Mobile Money.\n\n## Authentification\n\nToutes les routes, sauf `GET /api/v1/payments/fees-config`, exigent une **clé API** transmise dans l'en-tête :\n\n```\nAuthorization: Bearer VOTRE_CLE_API\n```\n\n- Créez la clé depuis l'application web, menu **Compte → Clés API**. La clé en clair (format `<id>|<secret>`) n'est affichée **qu'une seule fois**, juste après sa création.\n- Une date d'expiration est obligatoire à la création : la clé reste valable jusqu'à la fin de la journée choisie. Une clé peut être révoquée à tout moment depuis la même page.\n- Deux types de clés existent : **production** (envois réels et facturés) et **test / sandbox** (voir plus bas).\n- La clé est rattachée à l'utilisateur qui l'a créée, mais donne accès aux données de **tout le compte (entreprise)** : messages, campagnes, paiements, Sender IDs… de tous les membres.\n- Clé absente, invalide, expirée ou révoquée : réponse `401` avec `{\"message\": \"Unauthenticated.\"}`.\n\n## URL de base et format\n\n- Tous les chemins sont préfixés par `/api/v1` (ex. `https://sender.gesflow.biz/api/v1/messages`).\n- Les corps de requête sont acceptés en JSON (`Content-Type: application/json`) ; `POST /api/v1/messages/bulk` accepte aussi `multipart/form-data` pour l'envoi d'un fichier de contacts. Il est recommandé d'envoyer `Accept: application/json`, même si toutes les erreurs des routes `/api/*` sont de toute façon rendues en JSON.\n- Les dates sont renvoyées en ISO 8601, en UTC (ex. `2026-10-07T09:15:00.000000Z`). Les dates envoyées sans fuseau horaire sont interprétées en UTC.\n- Les montants monétaires des messages et des paiements sont renvoyés sous forme de **chaînes décimales à 4 décimales** (ex. `\"30.0000\"`), en FCFA (XAF).\n\n## Format des numéros de téléphone\n\n- Format international **sans le signe +**, uniquement des chiffres, de **8 à 15 chiffres** (ex. `242066000000`).\n- Pour `POST /messages`, `POST /messages/bulk` (`phones`), `POST /verify/send`, `POST /verify/check` et `GET /whatsapp/check-number`, tous les caractères non numériques sont supprimés avant validation : `+242 06 600 00 00` devient `242066000000`.\n- Le filtre `phone` de `GET /inbound-messages` n'est **pas** nettoyé : il doit déjà contenir uniquement 8 à 15 chiffres.\n- Exception : le champ `phone_number` de `POST /payments/initiate` est normalisé au format international **avec** `+` (préfixe `+242` ajouté s'il est absent).\n\n## Canaux\n\n| Valeur | Description |\n|---|---|\n| `sms` | Canal par défaut. Envoi via la passerelle SMS, avec l'un des Sender IDs actifs de votre compte comme expéditeur. |\n| `whatsapp` | Envoi depuis le numéro WhatsApp appairé au compte (session WhatsApp connectée requise, sauf en sandbox). Le champ `from` vaut toujours `WhatsApp`. Médias, position et fiches contact sont possibles. |\n\nL'envoi en masse (`POST /messages/bulk`) accepte les deux canaux : jusqu'à **10 000 destinataires** en SMS et **500** sur WhatsApp (texte et/ou média ; pas de position ni de fiche contact).\n\n## Mode sandbox (clé de test)\n\nLors de la création d'une clé, choisissez le mode « Test (sandbox) ». Avec une telle clé :\n\n- `POST /messages`, `POST /messages/bulk` et `POST /verify/send` **simulent** l'envoi : rien n'est transmis aux opérateurs et **rien n'est débité** (`price` = `\"0.0000\"`, champ `sandbox: true`).\n- La remise est simulée immédiatement : la réponse de création renvoie déjà le statut `sent` (même si `scheduled_at` est fourni). Le numéro **`242000000000`** simule toujours un échec (statut `failed`).\n- Les webhooks de statut (`callback_url`) sont tout de même envoyés.\n- Les règles de validation s'appliquent normalement (Sender ID, format…) ; en revanche aucune session WhatsApp n'est requise et le solde n'est pas contrôlé.\n- `POST /verify/send` renvoie le code généré dans le champ `code`. Un code sandbox ne peut être vérifié qu'avec une clé sandbox (et inversement).\n- `GET /messages` et `GET /messages/{message}` ne voient que les messages sandbox ; une clé de production ne voit jamais les messages sandbox.\n- Aucune campagne n'est créée pour un envoi en masse sandbox (`meta.campaign_id` vaut `null`).\n- ⚠️ Les autres routes ne font **pas** de distinction : une clé sandbox liste les campagnes, messages entrants et paiements réels du compte, lit et modifie ses vrais contacts, groupes et modèles (mais ne peut pas annuler une campagne, toujours réelle), `GET /whatsapp/check-number` interroge réellement WhatsApp (session connectée requise), et `POST /payments/initiate` déclenche un **vrai** paiement Mobile Money.\n\n## Crédits et tarification\n\n- Chaque message est payé sur le **solde de crédits** du compte (en FCFA). Le prix unitaire d'un SMS est le prix spécifique de votre compte s'il existe, sinon le tarif global de la plateforme ; le prix d'un message WhatsApp est un tarif fixe global, quelle que soit la longueur.\n- Le prix est **débité à la création** du message (y compris pour un envoi programmé). Si le solde est insuffisant, la requête échoue en `422` (`Solde de crédits insuffisant pour envoyer ce message.`) et rien n'est créé. Un envoi en masse est débité en une seule fois : soit tous les messages sont créés, soit aucun.\n- SMS : une fois le message accepté par la passerelle, son prix est ajusté à *prix unitaire × nombre de segments SMS* facturés par la passerelle ; la différence est débitée (sans nouveau contrôle de solde) et le champ `price` est mis à jour.\n- **Remboursement automatique** du prix du message lorsque : l'envoi échoue définitivement après les tentatives automatiques ; l'opérateur signale un échec non facturable ; WhatsApp refuse le message (numéro sans compte WhatsApp, restriction temporaire du numéro, accusé d'erreur) ; un envoi programmé est annulé (application web, `POST /messages/{message}/cancel` ou `POST /campaigns/{campaign}/cancel`).\n- **Pas de remboursement** lorsque l'opérateur signale un échec facturable (abonné absent `ABS`, erreur de remise `ERD`, pas d'accusé opérateur `NRC`, abonné inconnu `USB`) : le message passe en `failed` mais reste facturé.\n- Le solde se recharge par Mobile Money (`POST /payments/initiate`) : seul le **montant de base** (`base_amount`) est crédité, les frais et taxes s'y ajoutent à la charge du payeur.\n- Chaque mouvement du solde (envoi, envoi en masse, ajustement de SMS long, remboursement, annulation, recharge) est enregistré avec le solde qu'il laisse : consultez le solde et vos tarifs avec `GET /account`, l'historique avec `GET /account/transactions`.\n\n## Variables de personnalisation\n\nLe texte des messages (`POST /messages`, `POST /messages/bulk`) peut contenir des variables `{{ variable }}` ou `{{ variable|valeur par défaut }}`, remplacées à partir de vos **contacts** enregistrés pour le numéro destinataire : `phone` / `telephone` (toujours disponibles, même sans contact enregistré), `name` / `nom` / `contact`, `prenom` / `first_name` et chaque champ personnalisé du contact (ex. `{{ ville }}`). Une variable inconnue ou vide est remplacée par sa valeur par défaut, ou par une chaîne vide.\n\n## Erreurs\n\nToutes les erreurs sont des objets JSON contenant au minimum un champ `message`.\n\n| Code | Signification |\n|---|---|\n| `400` | En-tête `Idempotency-Key` vide ou de plus de 255 caractères. |\n| `401` | Clé API absente, invalide, expirée ou révoquée. `{\"message\": \"Unauthenticated.\"}` |\n| `404` | Ressource inexistante ou appartenant à un autre compte. |\n| `409` | Une requête avec la même `Idempotency-Key` est encore en cours de traitement : réessayez après le délai de l'en-tête `Retry-After`. |\n| `422` | Erreur de validation **ou** règle métier. Validation : `{\"message\": \"...\", \"errors\": {\"champ\": [\"...\"]}}` (messages en français ; le résumé `message` peut se terminer par « (and N more errors) »). Règle métier : `{\"message\": \"...\"}` sans `errors` (solde insuffisant, Sender ID non configuré, session WhatsApp non connectée, message ou campagne plus annulable, clé d'idempotence déjà utilisée pour une autre requête). |\n| `429` | Limite de débit dépassée (voir « Limites de débit »), ou limite d'envoi de codes OTP de `POST /verify/send` : `{\"message\": \"...\", \"retry_after\": 24}` + en-tête `Retry-After`. |\n| `500` | Erreur interne (`{\"message\": \"Server Error\"}`). |\n| `503` | `GET /whatsapp/check-number` uniquement : WhatsApp injoignable. |\n\nL'API ne renvoie pas de `403` : toute clé valide a accès à l'ensemble des routes de son compte.\n\n## Limites de débit\n\nChaque compte peut effectuer **600 requêtes par minute**, toutes clés API confondues ; les routes publiques (`GET /payments/fees-config`) sont limitées à **60 requêtes par minute et par adresse IP**. Chaque réponse indique le quota dans les en-têtes `X-RateLimit-Limit` et `X-RateLimit-Remaining`. Au-delà : `429` avec l'en-tête `Retry-After` et `{\"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\", \"retry_after\": 24}`. Pour envoyer beaucoup de messages, préférez `POST /messages/bulk` (un seul appel pour 10 000 destinataires).\n\nEn plus, `POST /verify/send` est limité par numéro de téléphone et par compte : **30 secondes minimum** entre deux codes et **5 codes maximum par fenêtre de 10 minutes** (compteurs séparés pour les clés sandbox). Au-delà : `429`.\n\nPour WhatsApp, un mécanisme anti-blocage côté plateforme peut **étaler** l'envoi des messages (le champ `deferred_until` indique alors l'heure d'envoi prévue) sans que la requête API ne soit refusée.\n\n## Pagination\n\nLes listes paginées suivent le format standard des collections de ressources Laravel : `data` (tableau), `links` (`first`, `last`, `prev`, `next`) et `meta` (`current_page`, `from`, `last_page`, `links`, `path`, `per_page`, `to`, `total`). Utilisez le paramètre `page` (à partir de 1).\n\n- `GET /messages`, `GET /campaigns`, `GET /inbound-messages`, `GET /account/transactions`, `GET /contacts`, `GET /contact-groups`, `GET /templates` : **25 éléments par page**, non modifiable.\n- `GET /payments/me` : 15 par défaut, modifiable via `per_page`.\n- Pour `GET /messages`, `GET /campaigns`, `GET /inbound-messages` et `GET /payments/me`, les URL de `links` et `meta.links` ne reprennent **que** le paramètre `page` : ajoutez vous-même vos filtres (`phone`, `since`, `per_page`) lorsque vous les suivez. Les autres listes conservent leurs filtres.\n\n## Webhooks\n\nLa plateforme peut appeler vos serveurs (voir la section `webhooks` de cette spécification) :\n\n- **Statut des messages** : passez un `callback_url` lors de l'envoi ; un `POST` JSON contenant le message complet est envoyé à chaque changement de statut.\n- **Messages entrants** : configurez l'URL HTTPS dans **Compte → Entreprise** ; chaque SMS ou message WhatsApp reçu est transmis sous la forme `{\"event\": \"message.received\", \"data\": {...}}`.\n\nChaque webhook est **signé** avec le secret de votre compte, affiché dans **Compte → Entreprise** (rubrique « Signature des webhooks ») :\n\n| En-tête | Contenu |\n|---|---|\n| `X-Gesflow-Event` | `message.status` ou `message.received`. |\n| `X-Gesflow-Delivery` | Identifiant unique du webhook (UUID), **identique d'une tentative à l'autre** : ignorez un identifiant déjà traité. |\n| `X-Gesflow-Timestamp` | Horodatage Unix (secondes) de l'envoi. |\n| `X-Gesflow-Signature` | `sha256=` suivi du HMAC-SHA256 hexadécimal de `{X-Gesflow-Timestamp}.{corps brut}`, calculé avec votre secret. |\n| `X-Gesflow-Previous-Signature` | Pendant les 24 heures qui suivent une régénération du secret : la même signature, calculée avec l'ancien secret. |\n\nPour vérifier un webhook : recalculez le HMAC sur le corps **brut** (avant tout décodage JSON), comparez-le en temps constant à la signature reçue et refusez les requêtes dont l'horodatage a plus de 5 minutes. Exemple en PHP :\n\n```php\n$expected = 'sha256='.hash_hmac('sha256', $timestamp.'.'.$rawBody, $secret);\n$valid = hash_equals($expected, $signature) && abs(time() - (int) $timestamp) < 300;\n```\n\nUn propriétaire du compte peut générer un nouveau secret à tout moment : les webhooks suivants sont signés avec lui. Pendant 24 heures, ils portent aussi l'en-tête `X-Gesflow-Previous-Signature`, calculé avec l'ancien secret : acceptez l'une ou l'autre signature le temps de mettre vos serveurs à jour.\n\nLes webhooks ne sont envoyés qu'à des adresses **publiques** : une URL visant `localhost`, une adresse IP privée, réservée ou locale (ou un nom de domaine qui y mène) est refusée à l'envoi (`422`) ou, si son nom de domaine y mène plus tard, n'est pas appelée. Les redirections ne sont pas suivies. Délai de réponse maximal : 10 secondes ; seule une réponse **`2xx`** est un succès ; sinon 3 tentatives au total, espacées de 60 secondes. Après échec de toutes les tentatives, les propriétaires du compte sont prévenus par e-mail (sauf messages sandbox).\n\n## Idempotence\n\nLes requêtes `POST` acceptent l'en-tête **`Idempotency-Key`** (1 à 255 caractères : un UUID, votre référence de commande…). Une requête renvoyée avec la même clé (après un timeout réseau, par exemple) n'est **pas exécutée une seconde fois** : la réponse de la première est renvoyée telle quelle, avec l'en-tête `Idempotent-Replayed: true`, et rien n'est débité à nouveau.\n\n- Les clés sont propres à votre compte et conservées **24 heures**.\n- Seules les réponses réussies (`2xx`) sont mémorisées : après une erreur (validation, solde insuffisant…), la même clé peut être réutilisée.\n- Clé déjà utilisée pour une requête différente (autre route, autre corps, autre type de clé API) : `422`.\n- Première requête encore en cours de traitement : `409` avec `Retry-After: 1` (si elle a été interrompue côté serveur, sa clé est libérée au bout d'une heure).\n\nSans `Idempotency-Key`, chaque `POST /messages`, `POST /messages/bulk` ou `POST /verify/send` réussi crée de nouveaux messages et débite le solde. Dans un envoi en masse, les numéros en double sont dédupliqués.",
        "version": "1.0.0",
        "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
    },
    "auth": {
        "type": "bearer",
        "bearer": [
            {
                "key": "token",
                "value": "{{apiKey}}",
                "type": "string"
            }
        ]
    },
    "variable": [
        {
            "key": "baseUrl",
            "value": "https://sender.gesflow.biz",
            "type": "string"
        },
        {
            "key": "apiKey",
            "value": "",
            "type": "string",
            "description": "Votre clé API (Clés API dans votre espace)."
        }
    ],
    "item": [
        {
            "name": "Messages",
            "description": "Envoi de SMS et de messages WhatsApp, unitaire ou en masse, et suivi de leur statut.",
            "item": [
                {
                    "name": "Lister les messages",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/messages?",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "messages"
                            ],
                            "query": [
                                {
                                    "key": "page",
                                    "value": "1",
                                    "description": "Numéro de page (à partir de 1).",
                                    "disabled": true
                                }
                            ],
                            "variable": []
                        },
                        "description": "Liste les messages envoyés par le compte (SMS et WhatsApp, tous utilisateurs confondus), du plus récent au plus ancien (date de création), **25 par page**. Aucun filtre n'est disponible.\n\nAvec une clé sandbox, seuls les messages sandbox sont listés ; avec une clé de production, seuls les messages réels."
                    },
                    "response": [
                        {
                            "name": "Page de messages.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"id\": 42,\n            \"campaign_id\": null,\n            \"sandbox\": false,\n            \"channel\": \"sms\",\n            \"phone\": \"242066000000\",\n            \"text\": \"Bonjour depuis mon application\",\n            \"media_url\": null,\n            \"media_type\": null,\n            \"interactive_type\": null,\n            \"interactive_payload\": null,\n            \"from\": \"MaMarque\",\n            \"status\": \"sent\",\n            \"failure_reason\": null,\n            \"price\": \"30.0000\",\n            \"currency\": \"XAF\",\n            \"scheduled_at\": \"2026-10-07T09:15:00.000000Z\",\n            \"deferred_until\": null,\n            \"sent_at\": \"2026-10-07T09:15:04.000000Z\",\n            \"created_at\": \"2026-10-07T09:15:00.000000Z\"\n        },\n        {\n            \"id\": 46,\n            \"campaign_id\": null,\n            \"sandbox\": false,\n            \"channel\": \"whatsapp\",\n            \"phone\": \"242066000000\",\n            \"text\": \"Notre nouvelle collection\",\n            \"media_url\": \"https://cdn.example.com/catalogue/automne.jpg\",\n            \"media_type\": \"image\",\n            \"interactive_type\": null,\n            \"interactive_payload\": null,\n            \"from\": \"WhatsApp\",\n            \"status\": \"sent\",\n            \"failure_reason\": null,\n            \"price\": \"2.5000\",\n            \"currency\": null,\n            \"scheduled_at\": \"2026-10-07T09:15:00.000000Z\",\n            \"deferred_until\": null,\n            \"sent_at\": \"2026-10-07T09:15:20.000000Z\",\n            \"created_at\": \"2026-10-07T09:15:00.000000Z\"\n        }\n    ],\n    \"links\": {\n        \"first\": \"https://sender.gesflow.biz/api/v1/messages?page=1\",\n        \"last\": \"https://sender.gesflow.biz/api/v1/messages?page=5\",\n        \"prev\": null,\n        \"next\": \"https://sender.gesflow.biz/api/v1/messages?page=2\"\n    },\n    \"meta\": {\n        \"current_page\": 1,\n        \"from\": 1,\n        \"last_page\": 5,\n        \"links\": [\n            {\n                \"url\": null,\n                \"label\": \"&laquo; Précédent\",\n                \"page\": null,\n                \"active\": false\n            },\n            {\n                \"url\": \"https://sender.gesflow.biz/api/v1/messages?page=1\",\n                \"label\": \"1\",\n                \"page\": 1,\n                \"active\": true\n            },\n            {\n                \"url\": \"https://sender.gesflow.biz/api/v1/messages?page=2\",\n                \"label\": \"2\",\n                \"page\": 2,\n                \"active\": false\n            },\n            {\n                \"url\": \"https://sender.gesflow.biz/api/v1/messages?page=2\",\n                \"label\": \"Suivant &raquo;\",\n                \"page\": 2,\n                \"active\": false\n            }\n        ],\n        \"path\": \"https://sender.gesflow.biz/api/v1/messages\",\n        \"per_page\": 25,\n        \"to\": 25,\n        \"total\": 112\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Envoyer un message (SMS ou WhatsApp) — SMS simple",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/messages",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "messages"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Crée un message et le place en file d'envoi. Le prix est **débité immédiatement** du solde (sauf sandbox). La réponse `201` renvoie le message avec le statut `processing` (envoi immédiat) ou `scheduled` (envoi programmé) ; suivez ensuite son statut via `GET /messages/{message}` ou le webhook `callback_url`.\n\n**SMS** : un Sender ID actif est requis (`sender_id`, sinon Sender ID par défaut ou unique Sender ID actif).\n\n**WhatsApp** (`channel: whatsapp`) : une session WhatsApp connectée est requise (hors sandbox). Le numéro est vérifié sur WhatsApp au moment de l'envoi : s'il n'a pas de compte WhatsApp, le message passe en `failed` et est remboursé. Médias (`media_url` + `media_type`), position (`latitude`, `longitude`, `title`) ou fiches contact (`contacts`) sont possibles — un seul type par message. Les messages à boutons ou à listes ne sont **pas** pris en charge. L'anti-blocage peut étaler l'envoi (`deferred_until`).\n\n**Sandbox** : rien n'est envoyé ni débité ; la réponse porte déjà le statut final simulé (`sent`, ou `failed` pour `242000000000`).",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"phone\": \"242066000000\",\n    \"text\": \"Bonjour depuis mon application\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Message créé (et débité, hors sandbox).",
                            "code": 201,
                            "status": "201",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 42,\n        \"campaign_id\": null,\n        \"sandbox\": false,\n        \"channel\": \"sms\",\n        \"phone\": \"242066000000\",\n        \"text\": \"Bonjour depuis mon application\",\n        \"media_url\": null,\n        \"media_type\": null,\n        \"interactive_type\": null,\n        \"interactive_payload\": null,\n        \"from\": \"MaMarque\",\n        \"status\": \"processing\",\n        \"failure_reason\": null,\n        \"price\": \"30.0000\",\n        \"currency\": null,\n        \"scheduled_at\": \"2026-10-07T09:15:00.000000Z\",\n        \"deferred_until\": null,\n        \"sent_at\": null,\n        \"created_at\": \"2026-10-07T09:15:00.000000Z\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Compte suspendu par l'équipe GESFLOW SENDER (fraude, abus, impayé…) : aucun envoi n'est accepté jusqu'à sa réactivation. Les autres appels (lecture des messages, du solde…) restent possibles.",
                            "code": 403,
                            "status": "403",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Votre compte est suspendu : aucun envoi n’est possible. Contactez le support pour en savoir plus.\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Erreur de validation (`errors` présent) ou erreur métier (`message` seul) : solde insuffisant, Sender ID non configuré, session WhatsApp non connectée.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Le champ numéro de téléphone est obligatoire. (and 1 more error)\",\n    \"errors\": {\n        \"phone\": [\n            \"Le champ numéro de téléphone est obligatoire.\"\n        ],\n        \"text\": [\n            \"Le champ message est obligatoire.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Envoyer un message (SMS ou WhatsApp) — SMS avec Sender ID, flash et webhook",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/messages",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "messages"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Crée un message et le place en file d'envoi. Le prix est **débité immédiatement** du solde (sauf sandbox). La réponse `201` renvoie le message avec le statut `processing` (envoi immédiat) ou `scheduled` (envoi programmé) ; suivez ensuite son statut via `GET /messages/{message}` ou le webhook `callback_url`.\n\n**SMS** : un Sender ID actif est requis (`sender_id`, sinon Sender ID par défaut ou unique Sender ID actif).\n\n**WhatsApp** (`channel: whatsapp`) : une session WhatsApp connectée est requise (hors sandbox). Le numéro est vérifié sur WhatsApp au moment de l'envoi : s'il n'a pas de compte WhatsApp, le message passe en `failed` et est remboursé. Médias (`media_url` + `media_type`), position (`latitude`, `longitude`, `title`) ou fiches contact (`contacts`) sont possibles — un seul type par message. Les messages à boutons ou à listes ne sont **pas** pris en charge. L'anti-blocage peut étaler l'envoi (`deferred_until`).\n\n**Sandbox** : rien n'est envoyé ni débité ; la réponse porte déjà le statut final simulé (`sent`, ou `failed` pour `242000000000`).",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"channel\": \"sms\",\n    \"phone\": \"+242 06 600 00 00\",\n    \"text\": \"Bonjour {{ prenom|cher client }}, votre commande est prête.\",\n    \"sender_id\": \"MaMarque\",\n    \"flash\": false,\n    \"callback_url\": \"https://votre-domaine.com/webhooks/sms-status\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Message créé (et débité, hors sandbox).",
                            "code": 201,
                            "status": "201",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 42,\n        \"campaign_id\": null,\n        \"sandbox\": false,\n        \"channel\": \"sms\",\n        \"phone\": \"242066000000\",\n        \"text\": \"Bonjour depuis mon application\",\n        \"media_url\": null,\n        \"media_type\": null,\n        \"interactive_type\": null,\n        \"interactive_payload\": null,\n        \"from\": \"MaMarque\",\n        \"status\": \"processing\",\n        \"failure_reason\": null,\n        \"price\": \"30.0000\",\n        \"currency\": null,\n        \"scheduled_at\": \"2026-10-07T09:15:00.000000Z\",\n        \"deferred_until\": null,\n        \"sent_at\": null,\n        \"created_at\": \"2026-10-07T09:15:00.000000Z\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Compte suspendu par l'équipe GESFLOW SENDER (fraude, abus, impayé…) : aucun envoi n'est accepté jusqu'à sa réactivation. Les autres appels (lecture des messages, du solde…) restent possibles.",
                            "code": 403,
                            "status": "403",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Votre compte est suspendu : aucun envoi n’est possible. Contactez le support pour en savoir plus.\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Erreur de validation (`errors` présent) ou erreur métier (`message` seul) : solde insuffisant, Sender ID non configuré, session WhatsApp non connectée.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Le champ numéro de téléphone est obligatoire. (and 1 more error)\",\n    \"errors\": {\n        \"phone\": [\n            \"Le champ numéro de téléphone est obligatoire.\"\n        ],\n        \"text\": [\n            \"Le champ message est obligatoire.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Envoyer un message (SMS ou WhatsApp) — SMS programmé",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/messages",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "messages"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Crée un message et le place en file d'envoi. Le prix est **débité immédiatement** du solde (sauf sandbox). La réponse `201` renvoie le message avec le statut `processing` (envoi immédiat) ou `scheduled` (envoi programmé) ; suivez ensuite son statut via `GET /messages/{message}` ou le webhook `callback_url`.\n\n**SMS** : un Sender ID actif est requis (`sender_id`, sinon Sender ID par défaut ou unique Sender ID actif).\n\n**WhatsApp** (`channel: whatsapp`) : une session WhatsApp connectée est requise (hors sandbox). Le numéro est vérifié sur WhatsApp au moment de l'envoi : s'il n'a pas de compte WhatsApp, le message passe en `failed` et est remboursé. Médias (`media_url` + `media_type`), position (`latitude`, `longitude`, `title`) ou fiches contact (`contacts`) sont possibles — un seul type par message. Les messages à boutons ou à listes ne sont **pas** pris en charge. L'anti-blocage peut étaler l'envoi (`deferred_until`).\n\n**Sandbox** : rien n'est envoyé ni débité ; la réponse porte déjà le statut final simulé (`sent`, ou `failed` pour `242000000000`).",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"phone\": \"242066000000\",\n    \"text\": \"Rappel : votre rendez-vous est demain à 10 h.\",\n    \"scheduled_at\": \"2026-10-08T08:00:00Z\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Message créé (et débité, hors sandbox).",
                            "code": 201,
                            "status": "201",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 42,\n        \"campaign_id\": null,\n        \"sandbox\": false,\n        \"channel\": \"sms\",\n        \"phone\": \"242066000000\",\n        \"text\": \"Bonjour depuis mon application\",\n        \"media_url\": null,\n        \"media_type\": null,\n        \"interactive_type\": null,\n        \"interactive_payload\": null,\n        \"from\": \"MaMarque\",\n        \"status\": \"processing\",\n        \"failure_reason\": null,\n        \"price\": \"30.0000\",\n        \"currency\": null,\n        \"scheduled_at\": \"2026-10-07T09:15:00.000000Z\",\n        \"deferred_until\": null,\n        \"sent_at\": null,\n        \"created_at\": \"2026-10-07T09:15:00.000000Z\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Compte suspendu par l'équipe GESFLOW SENDER (fraude, abus, impayé…) : aucun envoi n'est accepté jusqu'à sa réactivation. Les autres appels (lecture des messages, du solde…) restent possibles.",
                            "code": 403,
                            "status": "403",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Votre compte est suspendu : aucun envoi n’est possible. Contactez le support pour en savoir plus.\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Erreur de validation (`errors` présent) ou erreur métier (`message` seul) : solde insuffisant, Sender ID non configuré, session WhatsApp non connectée.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Le champ numéro de téléphone est obligatoire. (and 1 more error)\",\n    \"errors\": {\n        \"phone\": [\n            \"Le champ numéro de téléphone est obligatoire.\"\n        ],\n        \"text\": [\n            \"Le champ message est obligatoire.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Envoyer un message (SMS ou WhatsApp) — WhatsApp texte",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/messages",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "messages"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Crée un message et le place en file d'envoi. Le prix est **débité immédiatement** du solde (sauf sandbox). La réponse `201` renvoie le message avec le statut `processing` (envoi immédiat) ou `scheduled` (envoi programmé) ; suivez ensuite son statut via `GET /messages/{message}` ou le webhook `callback_url`.\n\n**SMS** : un Sender ID actif est requis (`sender_id`, sinon Sender ID par défaut ou unique Sender ID actif).\n\n**WhatsApp** (`channel: whatsapp`) : une session WhatsApp connectée est requise (hors sandbox). Le numéro est vérifié sur WhatsApp au moment de l'envoi : s'il n'a pas de compte WhatsApp, le message passe en `failed` et est remboursé. Médias (`media_url` + `media_type`), position (`latitude`, `longitude`, `title`) ou fiches contact (`contacts`) sont possibles — un seul type par message. Les messages à boutons ou à listes ne sont **pas** pris en charge. L'anti-blocage peut étaler l'envoi (`deferred_until`).\n\n**Sandbox** : rien n'est envoyé ni débité ; la réponse porte déjà le statut final simulé (`sent`, ou `failed` pour `242000000000`).",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"channel\": \"whatsapp\",\n    \"phone\": \"242066000000\",\n    \"text\": \"Bonjour sur WhatsApp\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Message créé (et débité, hors sandbox).",
                            "code": 201,
                            "status": "201",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 42,\n        \"campaign_id\": null,\n        \"sandbox\": false,\n        \"channel\": \"sms\",\n        \"phone\": \"242066000000\",\n        \"text\": \"Bonjour depuis mon application\",\n        \"media_url\": null,\n        \"media_type\": null,\n        \"interactive_type\": null,\n        \"interactive_payload\": null,\n        \"from\": \"MaMarque\",\n        \"status\": \"processing\",\n        \"failure_reason\": null,\n        \"price\": \"30.0000\",\n        \"currency\": null,\n        \"scheduled_at\": \"2026-10-07T09:15:00.000000Z\",\n        \"deferred_until\": null,\n        \"sent_at\": null,\n        \"created_at\": \"2026-10-07T09:15:00.000000Z\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Compte suspendu par l'équipe GESFLOW SENDER (fraude, abus, impayé…) : aucun envoi n'est accepté jusqu'à sa réactivation. Les autres appels (lecture des messages, du solde…) restent possibles.",
                            "code": 403,
                            "status": "403",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Votre compte est suspendu : aucun envoi n’est possible. Contactez le support pour en savoir plus.\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Erreur de validation (`errors` présent) ou erreur métier (`message` seul) : solde insuffisant, Sender ID non configuré, session WhatsApp non connectée.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Le champ numéro de téléphone est obligatoire. (and 1 more error)\",\n    \"errors\": {\n        \"phone\": [\n            \"Le champ numéro de téléphone est obligatoire.\"\n        ],\n        \"text\": [\n            \"Le champ message est obligatoire.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Envoyer un message (SMS ou WhatsApp) — WhatsApp image avec légende",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/messages",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "messages"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Crée un message et le place en file d'envoi. Le prix est **débité immédiatement** du solde (sauf sandbox). La réponse `201` renvoie le message avec le statut `processing` (envoi immédiat) ou `scheduled` (envoi programmé) ; suivez ensuite son statut via `GET /messages/{message}` ou le webhook `callback_url`.\n\n**SMS** : un Sender ID actif est requis (`sender_id`, sinon Sender ID par défaut ou unique Sender ID actif).\n\n**WhatsApp** (`channel: whatsapp`) : une session WhatsApp connectée est requise (hors sandbox). Le numéro est vérifié sur WhatsApp au moment de l'envoi : s'il n'a pas de compte WhatsApp, le message passe en `failed` et est remboursé. Médias (`media_url` + `media_type`), position (`latitude`, `longitude`, `title`) ou fiches contact (`contacts`) sont possibles — un seul type par message. Les messages à boutons ou à listes ne sont **pas** pris en charge. L'anti-blocage peut étaler l'envoi (`deferred_until`).\n\n**Sandbox** : rien n'est envoyé ni débité ; la réponse porte déjà le statut final simulé (`sent`, ou `failed` pour `242000000000`).",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"channel\": \"whatsapp\",\n    \"phone\": \"242066000000\",\n    \"text\": \"Notre nouvelle collection\",\n    \"media_url\": \"https://cdn.example.com/catalogue/automne.jpg\",\n    \"media_type\": \"image\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Message créé (et débité, hors sandbox).",
                            "code": 201,
                            "status": "201",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 42,\n        \"campaign_id\": null,\n        \"sandbox\": false,\n        \"channel\": \"sms\",\n        \"phone\": \"242066000000\",\n        \"text\": \"Bonjour depuis mon application\",\n        \"media_url\": null,\n        \"media_type\": null,\n        \"interactive_type\": null,\n        \"interactive_payload\": null,\n        \"from\": \"MaMarque\",\n        \"status\": \"processing\",\n        \"failure_reason\": null,\n        \"price\": \"30.0000\",\n        \"currency\": null,\n        \"scheduled_at\": \"2026-10-07T09:15:00.000000Z\",\n        \"deferred_until\": null,\n        \"sent_at\": null,\n        \"created_at\": \"2026-10-07T09:15:00.000000Z\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Compte suspendu par l'équipe GESFLOW SENDER (fraude, abus, impayé…) : aucun envoi n'est accepté jusqu'à sa réactivation. Les autres appels (lecture des messages, du solde…) restent possibles.",
                            "code": 403,
                            "status": "403",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Votre compte est suspendu : aucun envoi n’est possible. Contactez le support pour en savoir plus.\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Erreur de validation (`errors` présent) ou erreur métier (`message` seul) : solde insuffisant, Sender ID non configuré, session WhatsApp non connectée.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Le champ numéro de téléphone est obligatoire. (and 1 more error)\",\n    \"errors\": {\n        \"phone\": [\n            \"Le champ numéro de téléphone est obligatoire.\"\n        ],\n        \"text\": [\n            \"Le champ message est obligatoire.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Envoyer un message (SMS ou WhatsApp) — WhatsApp document",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/messages",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "messages"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Crée un message et le place en file d'envoi. Le prix est **débité immédiatement** du solde (sauf sandbox). La réponse `201` renvoie le message avec le statut `processing` (envoi immédiat) ou `scheduled` (envoi programmé) ; suivez ensuite son statut via `GET /messages/{message}` ou le webhook `callback_url`.\n\n**SMS** : un Sender ID actif est requis (`sender_id`, sinon Sender ID par défaut ou unique Sender ID actif).\n\n**WhatsApp** (`channel: whatsapp`) : une session WhatsApp connectée est requise (hors sandbox). Le numéro est vérifié sur WhatsApp au moment de l'envoi : s'il n'a pas de compte WhatsApp, le message passe en `failed` et est remboursé. Médias (`media_url` + `media_type`), position (`latitude`, `longitude`, `title`) ou fiches contact (`contacts`) sont possibles — un seul type par message. Les messages à boutons ou à listes ne sont **pas** pris en charge. L'anti-blocage peut étaler l'envoi (`deferred_until`).\n\n**Sandbox** : rien n'est envoyé ni débité ; la réponse porte déjà le statut final simulé (`sent`, ou `failed` pour `242000000000`).",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"channel\": \"whatsapp\",\n    \"phone\": \"242066000000\",\n    \"text\": \"Votre facture d'octobre\",\n    \"media_url\": \"https://cdn.example.com/factures/F-2026-10.pdf\",\n    \"media_type\": \"file\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Message créé (et débité, hors sandbox).",
                            "code": 201,
                            "status": "201",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 42,\n        \"campaign_id\": null,\n        \"sandbox\": false,\n        \"channel\": \"sms\",\n        \"phone\": \"242066000000\",\n        \"text\": \"Bonjour depuis mon application\",\n        \"media_url\": null,\n        \"media_type\": null,\n        \"interactive_type\": null,\n        \"interactive_payload\": null,\n        \"from\": \"MaMarque\",\n        \"status\": \"processing\",\n        \"failure_reason\": null,\n        \"price\": \"30.0000\",\n        \"currency\": null,\n        \"scheduled_at\": \"2026-10-07T09:15:00.000000Z\",\n        \"deferred_until\": null,\n        \"sent_at\": null,\n        \"created_at\": \"2026-10-07T09:15:00.000000Z\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Compte suspendu par l'équipe GESFLOW SENDER (fraude, abus, impayé…) : aucun envoi n'est accepté jusqu'à sa réactivation. Les autres appels (lecture des messages, du solde…) restent possibles.",
                            "code": 403,
                            "status": "403",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Votre compte est suspendu : aucun envoi n’est possible. Contactez le support pour en savoir plus.\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Erreur de validation (`errors` présent) ou erreur métier (`message` seul) : solde insuffisant, Sender ID non configuré, session WhatsApp non connectée.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Le champ numéro de téléphone est obligatoire. (and 1 more error)\",\n    \"errors\": {\n        \"phone\": [\n            \"Le champ numéro de téléphone est obligatoire.\"\n        ],\n        \"text\": [\n            \"Le champ message est obligatoire.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Envoyer un message (SMS ou WhatsApp) — WhatsApp message vocal (sans texte)",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/messages",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "messages"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Crée un message et le place en file d'envoi. Le prix est **débité immédiatement** du solde (sauf sandbox). La réponse `201` renvoie le message avec le statut `processing` (envoi immédiat) ou `scheduled` (envoi programmé) ; suivez ensuite son statut via `GET /messages/{message}` ou le webhook `callback_url`.\n\n**SMS** : un Sender ID actif est requis (`sender_id`, sinon Sender ID par défaut ou unique Sender ID actif).\n\n**WhatsApp** (`channel: whatsapp`) : une session WhatsApp connectée est requise (hors sandbox). Le numéro est vérifié sur WhatsApp au moment de l'envoi : s'il n'a pas de compte WhatsApp, le message passe en `failed` et est remboursé. Médias (`media_url` + `media_type`), position (`latitude`, `longitude`, `title`) ou fiches contact (`contacts`) sont possibles — un seul type par message. Les messages à boutons ou à listes ne sont **pas** pris en charge. L'anti-blocage peut étaler l'envoi (`deferred_until`).\n\n**Sandbox** : rien n'est envoyé ni débité ; la réponse porte déjà le statut final simulé (`sent`, ou `failed` pour `242000000000`).",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"channel\": \"whatsapp\",\n    \"phone\": \"242066000000\",\n    \"media_url\": \"https://cdn.example.com/audio/bienvenue.ogg\",\n    \"media_type\": \"voice\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Message créé (et débité, hors sandbox).",
                            "code": 201,
                            "status": "201",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 42,\n        \"campaign_id\": null,\n        \"sandbox\": false,\n        \"channel\": \"sms\",\n        \"phone\": \"242066000000\",\n        \"text\": \"Bonjour depuis mon application\",\n        \"media_url\": null,\n        \"media_type\": null,\n        \"interactive_type\": null,\n        \"interactive_payload\": null,\n        \"from\": \"MaMarque\",\n        \"status\": \"processing\",\n        \"failure_reason\": null,\n        \"price\": \"30.0000\",\n        \"currency\": null,\n        \"scheduled_at\": \"2026-10-07T09:15:00.000000Z\",\n        \"deferred_until\": null,\n        \"sent_at\": null,\n        \"created_at\": \"2026-10-07T09:15:00.000000Z\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Compte suspendu par l'équipe GESFLOW SENDER (fraude, abus, impayé…) : aucun envoi n'est accepté jusqu'à sa réactivation. Les autres appels (lecture des messages, du solde…) restent possibles.",
                            "code": 403,
                            "status": "403",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Votre compte est suspendu : aucun envoi n’est possible. Contactez le support pour en savoir plus.\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Erreur de validation (`errors` présent) ou erreur métier (`message` seul) : solde insuffisant, Sender ID non configuré, session WhatsApp non connectée.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Le champ numéro de téléphone est obligatoire. (and 1 more error)\",\n    \"errors\": {\n        \"phone\": [\n            \"Le champ numéro de téléphone est obligatoire.\"\n        ],\n        \"text\": [\n            \"Le champ message est obligatoire.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Envoyer un message (SMS ou WhatsApp) — WhatsApp position",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/messages",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "messages"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Crée un message et le place en file d'envoi. Le prix est **débité immédiatement** du solde (sauf sandbox). La réponse `201` renvoie le message avec le statut `processing` (envoi immédiat) ou `scheduled` (envoi programmé) ; suivez ensuite son statut via `GET /messages/{message}` ou le webhook `callback_url`.\n\n**SMS** : un Sender ID actif est requis (`sender_id`, sinon Sender ID par défaut ou unique Sender ID actif).\n\n**WhatsApp** (`channel: whatsapp`) : une session WhatsApp connectée est requise (hors sandbox). Le numéro est vérifié sur WhatsApp au moment de l'envoi : s'il n'a pas de compte WhatsApp, le message passe en `failed` et est remboursé. Médias (`media_url` + `media_type`), position (`latitude`, `longitude`, `title`) ou fiches contact (`contacts`) sont possibles — un seul type par message. Les messages à boutons ou à listes ne sont **pas** pris en charge. L'anti-blocage peut étaler l'envoi (`deferred_until`).\n\n**Sandbox** : rien n'est envoyé ni débité ; la réponse porte déjà le statut final simulé (`sent`, ou `failed` pour `242000000000`).",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"channel\": \"whatsapp\",\n    \"phone\": \"242066000000\",\n    \"latitude\": -4.2634,\n    \"longitude\": 15.2429,\n    \"title\": \"Agence Centre-ville\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Message créé (et débité, hors sandbox).",
                            "code": 201,
                            "status": "201",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 42,\n        \"campaign_id\": null,\n        \"sandbox\": false,\n        \"channel\": \"sms\",\n        \"phone\": \"242066000000\",\n        \"text\": \"Bonjour depuis mon application\",\n        \"media_url\": null,\n        \"media_type\": null,\n        \"interactive_type\": null,\n        \"interactive_payload\": null,\n        \"from\": \"MaMarque\",\n        \"status\": \"processing\",\n        \"failure_reason\": null,\n        \"price\": \"30.0000\",\n        \"currency\": null,\n        \"scheduled_at\": \"2026-10-07T09:15:00.000000Z\",\n        \"deferred_until\": null,\n        \"sent_at\": null,\n        \"created_at\": \"2026-10-07T09:15:00.000000Z\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Compte suspendu par l'équipe GESFLOW SENDER (fraude, abus, impayé…) : aucun envoi n'est accepté jusqu'à sa réactivation. Les autres appels (lecture des messages, du solde…) restent possibles.",
                            "code": 403,
                            "status": "403",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Votre compte est suspendu : aucun envoi n’est possible. Contactez le support pour en savoir plus.\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Erreur de validation (`errors` présent) ou erreur métier (`message` seul) : solde insuffisant, Sender ID non configuré, session WhatsApp non connectée.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Le champ numéro de téléphone est obligatoire. (and 1 more error)\",\n    \"errors\": {\n        \"phone\": [\n            \"Le champ numéro de téléphone est obligatoire.\"\n        ],\n        \"text\": [\n            \"Le champ message est obligatoire.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Envoyer un message (SMS ou WhatsApp) — WhatsApp fiche contact",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/messages",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "messages"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Crée un message et le place en file d'envoi. Le prix est **débité immédiatement** du solde (sauf sandbox). La réponse `201` renvoie le message avec le statut `processing` (envoi immédiat) ou `scheduled` (envoi programmé) ; suivez ensuite son statut via `GET /messages/{message}` ou le webhook `callback_url`.\n\n**SMS** : un Sender ID actif est requis (`sender_id`, sinon Sender ID par défaut ou unique Sender ID actif).\n\n**WhatsApp** (`channel: whatsapp`) : une session WhatsApp connectée est requise (hors sandbox). Le numéro est vérifié sur WhatsApp au moment de l'envoi : s'il n'a pas de compte WhatsApp, le message passe en `failed` et est remboursé. Médias (`media_url` + `media_type`), position (`latitude`, `longitude`, `title`) ou fiches contact (`contacts`) sont possibles — un seul type par message. Les messages à boutons ou à listes ne sont **pas** pris en charge. L'anti-blocage peut étaler l'envoi (`deferred_until`).\n\n**Sandbox** : rien n'est envoyé ni débité ; la réponse porte déjà le statut final simulé (`sent`, ou `failed` pour `242000000000`).",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"channel\": \"whatsapp\",\n    \"phone\": \"242066000000\",\n    \"contacts\": [\n        {\n            \"full_name\": \"Service client\",\n            \"phone_number\": \"+242066000099\",\n            \"organization\": \"MaMarque\"\n        }\n    ]\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Message créé (et débité, hors sandbox).",
                            "code": 201,
                            "status": "201",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 42,\n        \"campaign_id\": null,\n        \"sandbox\": false,\n        \"channel\": \"sms\",\n        \"phone\": \"242066000000\",\n        \"text\": \"Bonjour depuis mon application\",\n        \"media_url\": null,\n        \"media_type\": null,\n        \"interactive_type\": null,\n        \"interactive_payload\": null,\n        \"from\": \"MaMarque\",\n        \"status\": \"processing\",\n        \"failure_reason\": null,\n        \"price\": \"30.0000\",\n        \"currency\": null,\n        \"scheduled_at\": \"2026-10-07T09:15:00.000000Z\",\n        \"deferred_until\": null,\n        \"sent_at\": null,\n        \"created_at\": \"2026-10-07T09:15:00.000000Z\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Compte suspendu par l'équipe GESFLOW SENDER (fraude, abus, impayé…) : aucun envoi n'est accepté jusqu'à sa réactivation. Les autres appels (lecture des messages, du solde…) restent possibles.",
                            "code": 403,
                            "status": "403",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Votre compte est suspendu : aucun envoi n’est possible. Contactez le support pour en savoir plus.\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Erreur de validation (`errors` présent) ou erreur métier (`message` seul) : solde insuffisant, Sender ID non configuré, session WhatsApp non connectée.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Le champ numéro de téléphone est obligatoire. (and 1 more error)\",\n    \"errors\": {\n        \"phone\": [\n            \"Le champ numéro de téléphone est obligatoire.\"\n        ],\n        \"text\": [\n            \"Le champ message est obligatoire.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Envoyer un message (SMS ou WhatsApp) — WhatsApp programmé avec webhook",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/messages",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "messages"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Crée un message et le place en file d'envoi. Le prix est **débité immédiatement** du solde (sauf sandbox). La réponse `201` renvoie le message avec le statut `processing` (envoi immédiat) ou `scheduled` (envoi programmé) ; suivez ensuite son statut via `GET /messages/{message}` ou le webhook `callback_url`.\n\n**SMS** : un Sender ID actif est requis (`sender_id`, sinon Sender ID par défaut ou unique Sender ID actif).\n\n**WhatsApp** (`channel: whatsapp`) : une session WhatsApp connectée est requise (hors sandbox). Le numéro est vérifié sur WhatsApp au moment de l'envoi : s'il n'a pas de compte WhatsApp, le message passe en `failed` et est remboursé. Médias (`media_url` + `media_type`), position (`latitude`, `longitude`, `title`) ou fiches contact (`contacts`) sont possibles — un seul type par message. Les messages à boutons ou à listes ne sont **pas** pris en charge. L'anti-blocage peut étaler l'envoi (`deferred_until`).\n\n**Sandbox** : rien n'est envoyé ni débité ; la réponse porte déjà le statut final simulé (`sent`, ou `failed` pour `242000000000`).",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"channel\": \"whatsapp\",\n    \"phone\": \"242066000000\",\n    \"text\": \"Votre livraison arrive demain.\",\n    \"scheduled_at\": \"2026-10-08T08:00:00Z\",\n    \"callback_url\": \"https://votre-domaine.com/webhooks/wa-status\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Message créé (et débité, hors sandbox).",
                            "code": 201,
                            "status": "201",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 42,\n        \"campaign_id\": null,\n        \"sandbox\": false,\n        \"channel\": \"sms\",\n        \"phone\": \"242066000000\",\n        \"text\": \"Bonjour depuis mon application\",\n        \"media_url\": null,\n        \"media_type\": null,\n        \"interactive_type\": null,\n        \"interactive_payload\": null,\n        \"from\": \"MaMarque\",\n        \"status\": \"processing\",\n        \"failure_reason\": null,\n        \"price\": \"30.0000\",\n        \"currency\": null,\n        \"scheduled_at\": \"2026-10-07T09:15:00.000000Z\",\n        \"deferred_until\": null,\n        \"sent_at\": null,\n        \"created_at\": \"2026-10-07T09:15:00.000000Z\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Compte suspendu par l'équipe GESFLOW SENDER (fraude, abus, impayé…) : aucun envoi n'est accepté jusqu'à sa réactivation. Les autres appels (lecture des messages, du solde…) restent possibles.",
                            "code": 403,
                            "status": "403",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Votre compte est suspendu : aucun envoi n’est possible. Contactez le support pour en savoir plus.\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Erreur de validation (`errors` présent) ou erreur métier (`message` seul) : solde insuffisant, Sender ID non configuré, session WhatsApp non connectée.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Le champ numéro de téléphone est obligatoire. (and 1 more error)\",\n    \"errors\": {\n        \"phone\": [\n            \"Le champ numéro de téléphone est obligatoire.\"\n        ],\n        \"text\": [\n            \"Le champ message est obligatoire.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Envoyer en masse (campagne) — Liste de numéros",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/messages/bulk",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "messages",
                                "bulk"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Envoie le même message (personnalisé par destinataire via les variables) à une liste de destinataires issue de `phones`, d'un fichier de contacts (`file`), de groupes de contacts (`group_ids`) et/ou de tags (`tags`). Les numéros sont fusionnés et dédupliqués ; **10 000 destinataires maximum en SMS**, **500 sur WhatsApp**.\n\nLe coût total (prix unitaire × nombre de destinataires) est vérifié et débité **en une seule opération** : en cas de solde insuffisant, aucun message n'est créé. En production, une **campagne** est créée (identifiant dans `meta.campaign_id`, consultable via `GET /campaigns/{campaign}`) et ses messages sont remis en file d'envoi en arrière-plan : leur statut évolue ensuite comme celui de tout message. Sur WhatsApp, chaque message passe par l'anti-blocage, qui espace les envois (champ `deferred_until`). En sandbox, rien n'est débité ni aucune campagne créée.\n\nPour importer un fichier, envoyez la requête en `multipart/form-data`.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"phones\": [\n        \"242066000001\",\n        \"242066000002\"\n    ],\n    \"text\": \"Promo : -20 % ce week-end !\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Messages créés (un par destinataire).",
                            "code": 201,
                            "status": "201",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"id\": 43,\n            \"campaign_id\": 17,\n            \"sandbox\": false,\n            \"channel\": \"sms\",\n            \"phone\": \"242066000001\",\n            \"text\": \"Promo : -20 % ce week-end !\",\n            \"media_url\": null,\n            \"media_type\": null,\n            \"interactive_type\": null,\n            \"interactive_payload\": null,\n            \"from\": \"MaMarque\",\n            \"status\": \"processing\",\n            \"failure_reason\": null,\n            \"price\": \"30.0000\",\n            \"currency\": null,\n            \"scheduled_at\": \"2026-10-07T09:15:00.000000Z\",\n            \"deferred_until\": null,\n            \"sent_at\": null,\n            \"created_at\": \"2026-10-07T09:15:00.000000Z\"\n        },\n        {\n            \"id\": 44,\n            \"campaign_id\": 17,\n            \"sandbox\": false,\n            \"channel\": \"sms\",\n            \"phone\": \"242066000002\",\n            \"text\": \"Promo : -20 % ce week-end !\",\n            \"media_url\": null,\n            \"media_type\": null,\n            \"interactive_type\": null,\n            \"interactive_payload\": null,\n            \"from\": \"MaMarque\",\n            \"status\": \"processing\",\n            \"failure_reason\": null,\n            \"price\": \"30.0000\",\n            \"currency\": null,\n            \"scheduled_at\": \"2026-10-07T09:15:00.000000Z\",\n            \"deferred_until\": null,\n            \"sent_at\": null,\n            \"created_at\": \"2026-10-07T09:15:00.000000Z\"\n        }\n    ],\n    \"meta\": {\n        \"count\": 2,\n        \"skipped_rows\": 0,\n        \"campaign_id\": 17\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Compte suspendu par l'équipe GESFLOW SENDER (fraude, abus, impayé…) : aucun envoi n'est accepté jusqu'à sa réactivation. Les autres appels (lecture des messages, du solde…) restent possibles.",
                            "code": 403,
                            "status": "403",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Votre compte est suspendu : aucun envoi n’est possible. Contactez le support pour en savoir plus.\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Erreur de validation ou erreur métier (solde insuffisant pour l'ensemble des destinataires, Sender ID non configuré).",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Fournissez une liste de numéros ou un fichier de contacts. (and 1 more error)\",\n    \"errors\": {\n        \"phones\": [\n            \"Fournissez une liste de numéros ou un fichier de contacts.\"\n        ],\n        \"file\": [\n            \"Fournissez une liste de numéros ou un fichier de contacts.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Envoyer en masse (campagne) — Campagne nommée avec groupes, tags et personnalisation",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/messages/bulk",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "messages",
                                "bulk"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Envoie le même message (personnalisé par destinataire via les variables) à une liste de destinataires issue de `phones`, d'un fichier de contacts (`file`), de groupes de contacts (`group_ids`) et/ou de tags (`tags`). Les numéros sont fusionnés et dédupliqués ; **10 000 destinataires maximum en SMS**, **500 sur WhatsApp**.\n\nLe coût total (prix unitaire × nombre de destinataires) est vérifié et débité **en une seule opération** : en cas de solde insuffisant, aucun message n'est créé. En production, une **campagne** est créée (identifiant dans `meta.campaign_id`, consultable via `GET /campaigns/{campaign}`) et ses messages sont remis en file d'envoi en arrière-plan : leur statut évolue ensuite comme celui de tout message. Sur WhatsApp, chaque message passe par l'anti-blocage, qui espace les envois (champ `deferred_until`). En sandbox, rien n'est débité ni aucune campagne créée.\n\nPour importer un fichier, envoyez la requête en `multipart/form-data`.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"campaign_name\": \"Promo Black Friday\",\n    \"phones\": [\n        \"242066000001\",\n        \"242066000002\",\n        \"242066000003\"\n    ],\n    \"group_ids\": [\n        4\n    ],\n    \"tags\": [\n        \"vip\"\n    ],\n    \"text\": \"Bonjour {{ prenom|cher client }}, -20 % ce week-end !\",\n    \"sender_id\": \"MaMarque\",\n    \"callback_url\": \"https://votre-domaine.com/webhooks/sms-status\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Messages créés (un par destinataire).",
                            "code": 201,
                            "status": "201",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"id\": 43,\n            \"campaign_id\": 17,\n            \"sandbox\": false,\n            \"channel\": \"sms\",\n            \"phone\": \"242066000001\",\n            \"text\": \"Promo : -20 % ce week-end !\",\n            \"media_url\": null,\n            \"media_type\": null,\n            \"interactive_type\": null,\n            \"interactive_payload\": null,\n            \"from\": \"MaMarque\",\n            \"status\": \"processing\",\n            \"failure_reason\": null,\n            \"price\": \"30.0000\",\n            \"currency\": null,\n            \"scheduled_at\": \"2026-10-07T09:15:00.000000Z\",\n            \"deferred_until\": null,\n            \"sent_at\": null,\n            \"created_at\": \"2026-10-07T09:15:00.000000Z\"\n        },\n        {\n            \"id\": 44,\n            \"campaign_id\": 17,\n            \"sandbox\": false,\n            \"channel\": \"sms\",\n            \"phone\": \"242066000002\",\n            \"text\": \"Promo : -20 % ce week-end !\",\n            \"media_url\": null,\n            \"media_type\": null,\n            \"interactive_type\": null,\n            \"interactive_payload\": null,\n            \"from\": \"MaMarque\",\n            \"status\": \"processing\",\n            \"failure_reason\": null,\n            \"price\": \"30.0000\",\n            \"currency\": null,\n            \"scheduled_at\": \"2026-10-07T09:15:00.000000Z\",\n            \"deferred_until\": null,\n            \"sent_at\": null,\n            \"created_at\": \"2026-10-07T09:15:00.000000Z\"\n        }\n    ],\n    \"meta\": {\n        \"count\": 2,\n        \"skipped_rows\": 0,\n        \"campaign_id\": 17\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Compte suspendu par l'équipe GESFLOW SENDER (fraude, abus, impayé…) : aucun envoi n'est accepté jusqu'à sa réactivation. Les autres appels (lecture des messages, du solde…) restent possibles.",
                            "code": 403,
                            "status": "403",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Votre compte est suspendu : aucun envoi n’est possible. Contactez le support pour en savoir plus.\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Erreur de validation ou erreur métier (solde insuffisant pour l'ensemble des destinataires, Sender ID non configuré).",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Fournissez une liste de numéros ou un fichier de contacts. (and 1 more error)\",\n    \"errors\": {\n        \"phones\": [\n            \"Fournissez une liste de numéros ou un fichier de contacts.\"\n        ],\n        \"file\": [\n            \"Fournissez une liste de numéros ou un fichier de contacts.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Envoyer en masse (campagne) — Campagne programmée",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/messages/bulk",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "messages",
                                "bulk"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Envoie le même message (personnalisé par destinataire via les variables) à une liste de destinataires issue de `phones`, d'un fichier de contacts (`file`), de groupes de contacts (`group_ids`) et/ou de tags (`tags`). Les numéros sont fusionnés et dédupliqués ; **10 000 destinataires maximum en SMS**, **500 sur WhatsApp**.\n\nLe coût total (prix unitaire × nombre de destinataires) est vérifié et débité **en une seule opération** : en cas de solde insuffisant, aucun message n'est créé. En production, une **campagne** est créée (identifiant dans `meta.campaign_id`, consultable via `GET /campaigns/{campaign}`) et ses messages sont remis en file d'envoi en arrière-plan : leur statut évolue ensuite comme celui de tout message. Sur WhatsApp, chaque message passe par l'anti-blocage, qui espace les envois (champ `deferred_until`). En sandbox, rien n'est débité ni aucune campagne créée.\n\nPour importer un fichier, envoyez la requête en `multipart/form-data`.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"campaign_name\": \"Black Friday J-0\",\n    \"tags\": [\n        \"newsletter\"\n    ],\n    \"text\": \"C'est parti : -30 % sur tout le site aujourd'hui !\",\n    \"scheduled_at\": \"2026-11-27T07:00:00Z\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Messages créés (un par destinataire).",
                            "code": 201,
                            "status": "201",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"id\": 43,\n            \"campaign_id\": 17,\n            \"sandbox\": false,\n            \"channel\": \"sms\",\n            \"phone\": \"242066000001\",\n            \"text\": \"Promo : -20 % ce week-end !\",\n            \"media_url\": null,\n            \"media_type\": null,\n            \"interactive_type\": null,\n            \"interactive_payload\": null,\n            \"from\": \"MaMarque\",\n            \"status\": \"processing\",\n            \"failure_reason\": null,\n            \"price\": \"30.0000\",\n            \"currency\": null,\n            \"scheduled_at\": \"2026-10-07T09:15:00.000000Z\",\n            \"deferred_until\": null,\n            \"sent_at\": null,\n            \"created_at\": \"2026-10-07T09:15:00.000000Z\"\n        },\n        {\n            \"id\": 44,\n            \"campaign_id\": 17,\n            \"sandbox\": false,\n            \"channel\": \"sms\",\n            \"phone\": \"242066000002\",\n            \"text\": \"Promo : -20 % ce week-end !\",\n            \"media_url\": null,\n            \"media_type\": null,\n            \"interactive_type\": null,\n            \"interactive_payload\": null,\n            \"from\": \"MaMarque\",\n            \"status\": \"processing\",\n            \"failure_reason\": null,\n            \"price\": \"30.0000\",\n            \"currency\": null,\n            \"scheduled_at\": \"2026-10-07T09:15:00.000000Z\",\n            \"deferred_until\": null,\n            \"sent_at\": null,\n            \"created_at\": \"2026-10-07T09:15:00.000000Z\"\n        }\n    ],\n    \"meta\": {\n        \"count\": 2,\n        \"skipped_rows\": 0,\n        \"campaign_id\": 17\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Compte suspendu par l'équipe GESFLOW SENDER (fraude, abus, impayé…) : aucun envoi n'est accepté jusqu'à sa réactivation. Les autres appels (lecture des messages, du solde…) restent possibles.",
                            "code": 403,
                            "status": "403",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Votre compte est suspendu : aucun envoi n’est possible. Contactez le support pour en savoir plus.\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Erreur de validation ou erreur métier (solde insuffisant pour l'ensemble des destinataires, Sender ID non configuré).",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Fournissez une liste de numéros ou un fichier de contacts. (and 1 more error)\",\n    \"errors\": {\n        \"phones\": [\n            \"Fournissez une liste de numéros ou un fichier de contacts.\"\n        ],\n        \"file\": [\n            \"Fournissez une liste de numéros ou un fichier de contacts.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Envoyer en masse (campagne) — Envoi WhatsApp avec média",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/messages/bulk",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "messages",
                                "bulk"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Envoie le même message (personnalisé par destinataire via les variables) à une liste de destinataires issue de `phones`, d'un fichier de contacts (`file`), de groupes de contacts (`group_ids`) et/ou de tags (`tags`). Les numéros sont fusionnés et dédupliqués ; **10 000 destinataires maximum en SMS**, **500 sur WhatsApp**.\n\nLe coût total (prix unitaire × nombre de destinataires) est vérifié et débité **en une seule opération** : en cas de solde insuffisant, aucun message n'est créé. En production, une **campagne** est créée (identifiant dans `meta.campaign_id`, consultable via `GET /campaigns/{campaign}`) et ses messages sont remis en file d'envoi en arrière-plan : leur statut évolue ensuite comme celui de tout message. Sur WhatsApp, chaque message passe par l'anti-blocage, qui espace les envois (champ `deferred_until`). En sandbox, rien n'est débité ni aucune campagne créée.\n\nPour importer un fichier, envoyez la requête en `multipart/form-data`.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"channel\": \"whatsapp\",\n    \"campaign_name\": \"Catalogue de rentrée\",\n    \"group_ids\": [\n        4\n    ],\n    \"text\": \"Bonjour {{ prenom|cher client }}, voici notre nouveau catalogue.\",\n    \"media_url\": \"https://cdn.votre-domaine.com/catalogue.pdf\",\n    \"media_type\": \"file\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Messages créés (un par destinataire).",
                            "code": 201,
                            "status": "201",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"id\": 43,\n            \"campaign_id\": 17,\n            \"sandbox\": false,\n            \"channel\": \"sms\",\n            \"phone\": \"242066000001\",\n            \"text\": \"Promo : -20 % ce week-end !\",\n            \"media_url\": null,\n            \"media_type\": null,\n            \"interactive_type\": null,\n            \"interactive_payload\": null,\n            \"from\": \"MaMarque\",\n            \"status\": \"processing\",\n            \"failure_reason\": null,\n            \"price\": \"30.0000\",\n            \"currency\": null,\n            \"scheduled_at\": \"2026-10-07T09:15:00.000000Z\",\n            \"deferred_until\": null,\n            \"sent_at\": null,\n            \"created_at\": \"2026-10-07T09:15:00.000000Z\"\n        },\n        {\n            \"id\": 44,\n            \"campaign_id\": 17,\n            \"sandbox\": false,\n            \"channel\": \"sms\",\n            \"phone\": \"242066000002\",\n            \"text\": \"Promo : -20 % ce week-end !\",\n            \"media_url\": null,\n            \"media_type\": null,\n            \"interactive_type\": null,\n            \"interactive_payload\": null,\n            \"from\": \"MaMarque\",\n            \"status\": \"processing\",\n            \"failure_reason\": null,\n            \"price\": \"30.0000\",\n            \"currency\": null,\n            \"scheduled_at\": \"2026-10-07T09:15:00.000000Z\",\n            \"deferred_until\": null,\n            \"sent_at\": null,\n            \"created_at\": \"2026-10-07T09:15:00.000000Z\"\n        }\n    ],\n    \"meta\": {\n        \"count\": 2,\n        \"skipped_rows\": 0,\n        \"campaign_id\": 17\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Compte suspendu par l'équipe GESFLOW SENDER (fraude, abus, impayé…) : aucun envoi n'est accepté jusqu'à sa réactivation. Les autres appels (lecture des messages, du solde…) restent possibles.",
                            "code": 403,
                            "status": "403",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Votre compte est suspendu : aucun envoi n’est possible. Contactez le support pour en savoir plus.\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Erreur de validation ou erreur métier (solde insuffisant pour l'ensemble des destinataires, Sender ID non configuré).",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Fournissez une liste de numéros ou un fichier de contacts. (and 1 more error)\",\n    \"errors\": {\n        \"phones\": [\n            \"Fournissez une liste de numéros ou un fichier de contacts.\"\n        ],\n        \"file\": [\n            \"Fournissez une liste de numéros ou un fichier de contacts.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Récupérer un message",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/messages/:message",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "messages",
                                ":message"
                            ],
                            "query": [],
                            "variable": [
                                {
                                    "key": "message",
                                    "value": "42",
                                    "description": "Identifiant (`id`) du message."
                                }
                            ]
                        },
                        "description": "Renvoie un message du compte, avec son statut à jour. Une clé sandbox ne voit que les messages sandbox, une clé de production que les messages réels."
                    },
                    "response": [
                        {
                            "name": "Le message.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 42,\n        \"campaign_id\": null,\n        \"sandbox\": false,\n        \"channel\": \"sms\",\n        \"phone\": \"242066000000\",\n        \"text\": \"Bonjour depuis mon application\",\n        \"media_url\": null,\n        \"media_type\": null,\n        \"interactive_type\": null,\n        \"interactive_payload\": null,\n        \"from\": \"MaMarque\",\n        \"status\": \"sent\",\n        \"failure_reason\": null,\n        \"price\": \"30.0000\",\n        \"currency\": \"XAF\",\n        \"scheduled_at\": \"2026-10-07T09:15:00.000000Z\",\n        \"deferred_until\": null,\n        \"sent_at\": \"2026-10-07T09:15:04.000000Z\",\n        \"created_at\": \"2026-10-07T09:15:00.000000Z\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Message inexistant, appartenant à un autre compte, ou d'un autre type que la clé (sandbox / production). Un identifiant non numérique (ex. `/messages/abc`) ne correspond à aucune route : 404 également, avec un `message` différent.",
                            "code": 404,
                            "status": "404",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"No query results for model [App\\\\Models\\\\Message] 42\"\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Annuler un message programmé",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/messages/:message/cancel",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "messages",
                                ":message",
                                "cancel"
                            ],
                            "query": [],
                            "variable": [
                                {
                                    "key": "message",
                                    "value": "42",
                                    "description": "Identifiant du message."
                                }
                            ]
                        },
                        "description": "Annule un message encore programmé (`status` = `scheduled`, `scheduled_at` dans le futur) et rembourse son prix. Le message passe en `failed` avec `failure_reason` = « Envoi programmé annulé par l'utilisateur. » (le webhook de statut est envoyé). Un message déjà en cours d'envoi ou envoyé ne peut plus être annulé."
                    },
                    "response": [
                        {
                            "name": "Le message annulé.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 42,\n        \"campaign_id\": null,\n        \"sandbox\": false,\n        \"channel\": \"sms\",\n        \"phone\": \"242066000001\",\n        \"text\": \"Rappel : votre rendez-vous est demain à 10 h.\",\n        \"media_url\": null,\n        \"media_type\": null,\n        \"interactive_type\": null,\n        \"interactive_payload\": null,\n        \"from\": \"MaMarque\",\n        \"status\": \"failed\",\n        \"failure_reason\": \"Envoi programmé annulé par l'utilisateur.\",\n        \"price\": \"20.0000\",\n        \"currency\": null,\n        \"scheduled_at\": \"2026-10-08T08:00:00.000000Z\",\n        \"deferred_until\": null,\n        \"sent_at\": null,\n        \"replayed_at\": null,\n        \"replayable\": true,\n        \"created_at\": \"2026-10-07T09:15:00.000000Z\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Message inexistant, appartenant à un autre compte, ou d'un autre type que la clé (sandbox / production). Un identifiant non numérique (ex. `/messages/abc`) ne correspond à aucune route : 404 également, avec un `message` différent.",
                            "code": 404,
                            "status": "404",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"No query results for model [App\\\\Models\\\\Message] 42\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Le message n’est plus programmé.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Ce message n'est plus programmé : il ne peut plus être annulé.\"\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Campagnes",
            "description": "Campagnes créées par les envois en masse, avec leurs statistiques de remise.",
            "item": [
                {
                    "name": "Lister les campagnes",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/campaigns?",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "campaigns"
                            ],
                            "query": [
                                {
                                    "key": "page",
                                    "value": "1",
                                    "description": "Numéro de page (à partir de 1).",
                                    "disabled": true
                                }
                            ],
                            "variable": []
                        },
                        "description": "Liste les campagnes du compte (créées par `POST /messages/bulk` ou depuis l'application web) avec leurs statistiques, de la plus récente à la plus ancienne, **25 par page**."
                    },
                    "response": [
                        {
                            "name": "Page de campagnes.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"id\": 17,\n            \"name\": \"Promo Black Friday\",\n            \"channel\": \"sms\",\n            \"text\": \"Bonjour {{ prenom|cher client }}, -20 % ce week-end !\",\n            \"from\": \"MaMarque\",\n            \"recipients_count\": 1250,\n            \"scheduled_at\": \"2026-10-06T08:00:00.000000Z\",\n            \"created_at\": \"2026-10-06T08:00:00.000000Z\",\n            \"stats\": {\n                \"total\": 1250,\n                \"sent\": 1198,\n                \"failed\": 32,\n                \"pending\": 20,\n                \"scheduled\": 0,\n                \"delivery_rate\": 95.8,\n                \"failure_rate\": 2.6,\n                \"cost\": 36540\n            }\n        }\n    ],\n    \"links\": {\n        \"first\": \"https://sender.gesflow.biz/api/v1/campaigns?page=1\",\n        \"last\": \"https://sender.gesflow.biz/api/v1/campaigns?page=1\",\n        \"prev\": null,\n        \"next\": null\n    },\n    \"meta\": {\n        \"current_page\": 1,\n        \"from\": 1,\n        \"last_page\": 1,\n        \"links\": [\n            {\n                \"url\": null,\n                \"label\": \"&laquo; Précédent\",\n                \"page\": null,\n                \"active\": false\n            },\n            {\n                \"url\": \"https://sender.gesflow.biz/api/v1/campaigns?page=1\",\n                \"label\": \"1\",\n                \"page\": 1,\n                \"active\": true\n            },\n            {\n                \"url\": null,\n                \"label\": \"Suivant &raquo;\",\n                \"page\": null,\n                \"active\": false\n            }\n        ],\n        \"path\": \"https://sender.gesflow.biz/api/v1/campaigns\",\n        \"per_page\": 25,\n        \"to\": 1,\n        \"total\": 1\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Récupérer une campagne",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/campaigns/:campaign",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "campaigns",
                                ":campaign"
                            ],
                            "query": [],
                            "variable": [
                                {
                                    "key": "campaign",
                                    "value": "17",
                                    "description": "Identifiant de la campagne (`meta.campaign_id` de l'envoi en masse)."
                                }
                            ]
                        },
                        "description": "Renvoie une campagne du compte et ses statistiques calculées en temps réel. Les messages individuels de la campagne sont visibles dans `GET /messages` (champ `campaign_id`)."
                    },
                    "response": [
                        {
                            "name": "La campagne.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 17,\n        \"name\": \"Promo Black Friday\",\n        \"channel\": \"sms\",\n        \"text\": \"Bonjour {{ prenom|cher client }}, -20 % ce week-end !\",\n        \"from\": \"MaMarque\",\n        \"recipients_count\": 1250,\n        \"scheduled_at\": \"2026-10-06T08:00:00.000000Z\",\n        \"created_at\": \"2026-10-06T08:00:00.000000Z\",\n        \"stats\": {\n            \"total\": 1250,\n            \"sent\": 1198,\n            \"failed\": 32,\n            \"pending\": 20,\n            \"scheduled\": 0,\n            \"delivery_rate\": 95.8,\n            \"failure_rate\": 2.6,\n            \"cost\": 36540\n        }\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Campagne inexistante ou appartenant à un autre compte. Un identifiant non numérique (ex. `/campaigns/abc`) ne correspond à aucune route : 404 également, avec un `message` différent.",
                            "code": 404,
                            "status": "404",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"No query results for model [App\\\\Models\\\\Campaign] 17\"\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Annuler les envois programmés d’une campagne",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/campaigns/:campaign/cancel",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "campaigns",
                                ":campaign",
                                "cancel"
                            ],
                            "query": [],
                            "variable": [
                                {
                                    "key": "campaign",
                                    "value": "17",
                                    "description": "Identifiant de la campagne."
                                }
                            ]
                        },
                        "description": "Annule tous les messages encore programmés de la campagne et rembourse leur prix en un seul mouvement de solde. Les messages déjà envoyés ou en cours d’envoi ne sont pas concernés. `meta.cancelled` indique le nombre de messages annulés. Une clé sandbox ne peut pas annuler une campagne (les campagnes sont toujours réelles)."
                    },
                    "response": [
                        {
                            "name": "La campagne après annulation.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 17,\n        \"name\": \"Black Friday J-0\",\n        \"channel\": \"sms\",\n        \"text\": \"C'est parti : -30 % sur tout le site aujourd'hui !\",\n        \"from\": \"MaMarque\",\n        \"recipients_count\": 1250,\n        \"scheduled_at\": \"2026-11-27T07:00:00.000000Z\",\n        \"created_at\": \"2026-11-20T10:00:00.000000Z\",\n        \"stats\": {\n            \"total\": 1250,\n            \"sent\": 0,\n            \"failed\": 1250,\n            \"pending\": 0,\n            \"scheduled\": 0,\n            \"delivery_rate\": 0,\n            \"failure_rate\": 100,\n            \"cost\": 0\n        }\n    },\n    \"meta\": {\n        \"cancelled\": 1250\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Campagne inexistante ou appartenant à un autre compte. Un identifiant non numérique (ex. `/campaigns/abc`) ne correspond à aucune route : 404 également, avec un `message` différent.",
                            "code": 404,
                            "status": "404",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"No query results for model [App\\\\Models\\\\Campaign] 17\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Plus rien à annuler, ou clé sandbox.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Cette campagne n'a plus de message programmé à annuler.\"\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Messages entrants",
            "description": "Réponses SMS et messages WhatsApp reçus par le compte.",
            "item": [
                {
                    "name": "Lister les messages reçus",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/inbound-messages?",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "inbound-messages"
                            ],
                            "query": [
                                {
                                    "key": "phone",
                                    "value": "242066000000",
                                    "description": "Filtre exact sur le numéro de l'expéditeur. Doit contenir uniquement 8 à 15 chiffres (non nettoyé : `+242…` est refusé en 422).",
                                    "disabled": true
                                },
                                {
                                    "key": "since",
                                    "value": "2026-10-01 00:00:00",
                                    "description": "Ne renvoie que les messages reçus à partir de cette date (incluse, UTC). Toute date reconnue est acceptée ; le format `AAAA-MM-JJ HH:MM:SS` est recommandé (la valeur est comparée telle quelle à la date stockée).",
                                    "disabled": true
                                },
                                {
                                    "key": "page",
                                    "value": "1",
                                    "description": "Numéro de page (à partir de 1).",
                                    "disabled": true
                                }
                            ],
                            "variable": []
                        },
                        "description": "Liste les messages reçus par le compte (réponses SMS et messages WhatsApp entrants), du plus récent au plus ancien (`received_at`), **25 par page**. Les liens de pagination ne conservent pas les filtres."
                    },
                    "response": [
                        {
                            "name": "Page de messages reçus.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"id\": 129,\n            \"channel\": \"whatsapp\",\n            \"phone\": \"242066000000\",\n            \"to\": null,\n            \"text\": \"Voici la photo du colis\",\n            \"media_url\": \"https://waha.example.com/api/files/default/3EB0C767D26A1D.jpeg\",\n            \"media_mimetype\": \"image/jpeg\",\n            \"received_at\": \"2026-10-06T09:20:00.000000Z\",\n            \"read_at\": \"2026-10-06T09:25:00.000000Z\"\n        },\n        {\n            \"id\": 128,\n            \"channel\": \"sms\",\n            \"phone\": \"242066000000\",\n            \"to\": \"MaMarque\",\n            \"text\": \"Oui, je confirme ma réservation\",\n            \"media_url\": null,\n            \"media_mimetype\": null,\n            \"received_at\": \"2026-10-06T09:15:00.000000Z\",\n            \"read_at\": null\n        }\n    ],\n    \"links\": {\n        \"first\": \"https://sender.gesflow.biz/api/v1/inbound-messages?page=1\",\n        \"last\": \"https://sender.gesflow.biz/api/v1/inbound-messages?page=1\",\n        \"prev\": null,\n        \"next\": null\n    },\n    \"meta\": {\n        \"current_page\": 1,\n        \"from\": 1,\n        \"last_page\": 1,\n        \"links\": [\n            {\n                \"url\": null,\n                \"label\": \"&laquo; Précédent\",\n                \"page\": null,\n                \"active\": false\n            },\n            {\n                \"url\": \"https://sender.gesflow.biz/api/v1/inbound-messages?page=1\",\n                \"label\": \"1\",\n                \"page\": 1,\n                \"active\": true\n            },\n            {\n                \"url\": null,\n                \"label\": \"Suivant &raquo;\",\n                \"page\": null,\n                \"active\": false\n            }\n        ],\n        \"path\": \"https://sender.gesflow.biz/api/v1/inbound-messages\",\n        \"per_page\": 25,\n        \"to\": 2,\n        \"total\": 2\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Filtre invalide.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Le format du champ numéro de téléphone est invalide. (and 1 more error)\",\n    \"errors\": {\n        \"phone\": [\n            \"Le format du champ numéro de téléphone est invalide.\"\n        ],\n        \"since\": [\n            \"Le champ since n'est pas une date valide.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "OTP (Vérification)",
            "description": "Envoi et vérification de codes à usage unique par SMS ou WhatsApp.",
            "item": [
                {
                    "name": "Envoyer un code OTP — Code SMS par défaut (6 chiffres, 5 minutes)",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/verify/send",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "verify",
                                "send"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Génère un code numérique aléatoire, l'envoie par SMS ou WhatsApp et n'en conserve qu'une empreinte. Le message porteur du code est un message ordinaire : il est **facturé** au tarif du canal (sauf sandbox) et soumis aux mêmes erreurs métier (solde, Sender ID, session WhatsApp).\n\nUn nouveau code **invalide** le code précédent encore en attente pour ce numéro. 5 tentatives de vérification maximum par code.\n\n**Limites** (par compte et par numéro) : 30 secondes minimum entre deux codes, 5 codes maximum par fenêtre de 10 minutes → `429`. La limite est contrôlée et comptée **avant** l'envoi : une requête qui échoue ensuite en `422` métier (solde, Sender ID, session WhatsApp) compte tout de même dans les 5 codes de la fenêtre.\n\n**Sandbox** : rien n'est envoyé ni débité et le code est renvoyé dans `data.code`.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"phone\": \"242066000000\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Code envoyé.",
                            "code": 201,
                            "status": "201",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": \"01K6Z3X8T9Q4M2N7B5V1C0D8EF\",\n        \"phone\": \"242066000000\",\n        \"channel\": \"sms\",\n        \"status\": \"pending\",\n        \"message_id\": 512,\n        \"expires_at\": \"2026-10-07T09:20:00.000000Z\",\n        \"sandbox\": false\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Compte suspendu par l'équipe GESFLOW SENDER (fraude, abus, impayé…) : aucun envoi n'est accepté jusqu'à sa réactivation. Les autres appels (lecture des messages, du solde…) restent possibles.",
                            "code": 403,
                            "status": "403",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Votre compte est suspendu : aucun envoi n’est possible. Contactez le support pour en savoir plus.\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Erreur de validation ou erreur métier.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Le numéro de téléphone est invalide (8 à 15 chiffres attendus).\",\n    \"errors\": {\n        \"phone\": [\n            \"Le numéro de téléphone est invalide (8 à 15 chiffres attendus).\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Trop de codes envoyés à ce numéro. Également renvoyé quand le compte dépasse la limite de débit globale de l’API (600 requêtes par minute).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de codes envoyés à ce numéro. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Envoyer un code OTP — Code personnalisé",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/verify/send",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "verify",
                                "send"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Génère un code numérique aléatoire, l'envoie par SMS ou WhatsApp et n'en conserve qu'une empreinte. Le message porteur du code est un message ordinaire : il est **facturé** au tarif du canal (sauf sandbox) et soumis aux mêmes erreurs métier (solde, Sender ID, session WhatsApp).\n\nUn nouveau code **invalide** le code précédent encore en attente pour ce numéro. 5 tentatives de vérification maximum par code.\n\n**Limites** (par compte et par numéro) : 30 secondes minimum entre deux codes, 5 codes maximum par fenêtre de 10 minutes → `429`. La limite est contrôlée et comptée **avant** l'envoi : une requête qui échoue ensuite en `422` métier (solde, Sender ID, session WhatsApp) compte tout de même dans les 5 codes de la fenêtre.\n\n**Sandbox** : rien n'est envoyé ni débité et le code est renvoyé dans `data.code`.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"phone\": \"242066000000\",\n    \"channel\": \"sms\",\n    \"code_length\": 4,\n    \"expires_in\": 600,\n    \"template\": \"MyApp : votre code est {{ code }} ({{ minutes }} min).\",\n    \"sender_id\": \"MaMarque\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Code envoyé.",
                            "code": 201,
                            "status": "201",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": \"01K6Z3X8T9Q4M2N7B5V1C0D8EF\",\n        \"phone\": \"242066000000\",\n        \"channel\": \"sms\",\n        \"status\": \"pending\",\n        \"message_id\": 512,\n        \"expires_at\": \"2026-10-07T09:20:00.000000Z\",\n        \"sandbox\": false\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Compte suspendu par l'équipe GESFLOW SENDER (fraude, abus, impayé…) : aucun envoi n'est accepté jusqu'à sa réactivation. Les autres appels (lecture des messages, du solde…) restent possibles.",
                            "code": 403,
                            "status": "403",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Votre compte est suspendu : aucun envoi n’est possible. Contactez le support pour en savoir plus.\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Erreur de validation ou erreur métier.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Le numéro de téléphone est invalide (8 à 15 chiffres attendus).\",\n    \"errors\": {\n        \"phone\": [\n            \"Le numéro de téléphone est invalide (8 à 15 chiffres attendus).\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Trop de codes envoyés à ce numéro. Également renvoyé quand le compte dépasse la limite de débit globale de l’API (600 requêtes par minute).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de codes envoyés à ce numéro. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Envoyer un code OTP — Code par WhatsApp",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/verify/send",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "verify",
                                "send"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Génère un code numérique aléatoire, l'envoie par SMS ou WhatsApp et n'en conserve qu'une empreinte. Le message porteur du code est un message ordinaire : il est **facturé** au tarif du canal (sauf sandbox) et soumis aux mêmes erreurs métier (solde, Sender ID, session WhatsApp).\n\nUn nouveau code **invalide** le code précédent encore en attente pour ce numéro. 5 tentatives de vérification maximum par code.\n\n**Limites** (par compte et par numéro) : 30 secondes minimum entre deux codes, 5 codes maximum par fenêtre de 10 minutes → `429`. La limite est contrôlée et comptée **avant** l'envoi : une requête qui échoue ensuite en `422` métier (solde, Sender ID, session WhatsApp) compte tout de même dans les 5 codes de la fenêtre.\n\n**Sandbox** : rien n'est envoyé ni débité et le code est renvoyé dans `data.code`.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"phone\": \"242066000000\",\n    \"channel\": \"whatsapp\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Code envoyé.",
                            "code": 201,
                            "status": "201",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": \"01K6Z3X8T9Q4M2N7B5V1C0D8EF\",\n        \"phone\": \"242066000000\",\n        \"channel\": \"sms\",\n        \"status\": \"pending\",\n        \"message_id\": 512,\n        \"expires_at\": \"2026-10-07T09:20:00.000000Z\",\n        \"sandbox\": false\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Compte suspendu par l'équipe GESFLOW SENDER (fraude, abus, impayé…) : aucun envoi n'est accepté jusqu'à sa réactivation. Les autres appels (lecture des messages, du solde…) restent possibles.",
                            "code": 403,
                            "status": "403",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Votre compte est suspendu : aucun envoi n’est possible. Contactez le support pour en savoir plus.\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Erreur de validation ou erreur métier.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Le numéro de téléphone est invalide (8 à 15 chiffres attendus).\",\n    \"errors\": {\n        \"phone\": [\n            \"Le numéro de téléphone est invalide (8 à 15 chiffres attendus).\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Trop de codes envoyés à ce numéro. Également renvoyé quand le compte dépasse la limite de débit globale de l’API (600 requêtes par minute).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de codes envoyés à ce numéro. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Vérifier un code OTP",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/verify/check",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "verify",
                                "check"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Vérifie le code saisi par l'utilisateur contre le **dernier** code non encore approuvé envoyé à ce numéro (avec le même type de clé, sandbox ou production). Répond **toujours 200** quand la requête est valide : lisez `valid` et `status`. Chaque code faux consomme une tentative ; un code approuvé ne peut plus être réutilisé.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"phone\": \"242066000000\",\n    \"code\": \"482913\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Résultat de la vérification.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": \"01K6Z3X8T9Q4M2N7B5V1C0D8EF\",\n        \"phone\": \"242066000000\",\n        \"valid\": true,\n        \"status\": \"approved\",\n        \"attempts_remaining\": 4\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Erreur de validation.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Le code doit contenir entre 4 et 8 chiffres.\",\n    \"errors\": {\n        \"code\": [\n            \"Le code doit contenir entre 4 et 8 chiffres.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "WhatsApp",
            "description": "Fonctions propres au canal WhatsApp (session appairée au compte).",
            "item": [
                {
                    "name": "Vérifier qu'un numéro a WhatsApp",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/whatsapp/check-number?phone=242066000000",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "whatsapp",
                                "check-number"
                            ],
                            "query": [
                                {
                                    "key": "phone",
                                    "value": "242066000000",
                                    "description": "Numéro à vérifier ; les caractères non numériques sont supprimés, 8 à 15 chiffres.",
                                    "disabled": false
                                }
                            ],
                            "variable": []
                        },
                        "description": "Interroge WhatsApp, via la session connectée du compte, pour savoir si le numéro possède un compte WhatsApp. Aucun message n'est envoyé et rien n'est débité. Requiert une session WhatsApp connectée, **y compris avec une clé sandbox**."
                    },
                    "response": [
                        {
                            "name": "Résultat.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"phone\": \"242066000000\",\n        \"has_whatsapp\": true\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Numéro invalide ou session WhatsApp non connectée.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Le format du champ numéro de téléphone est invalide.\",\n    \"errors\": {\n        \"phone\": [\n            \"Le format du champ numéro de téléphone est invalide.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        },
                        {
                            "name": "WhatsApp injoignable ou erreur lors de la vérification.",
                            "code": 503,
                            "status": "503",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Impossible de vérifier ce numéro pour le moment. Réessayez dans quelques instants.\"\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Sender IDs",
            "description": "Noms d'expéditeur SMS actifs du compte.",
            "item": [
                {
                    "name": "Lister les Sender IDs",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/sender-ids",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "sender-ids"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Renvoie les Sender IDs **actifs** (non suspendus) du compte, utilisables dans `sender_id`. Le Sender ID par défaut apparaît en premier, puis les autres par ordre alphabétique. Liste non paginée.\n\nLes Sender IDs se demandent et se valident depuis l'application web ; un Sender ID suspendu n'apparaît plus et est refusé à l'envoi."
                    },
                    "response": [
                        {
                            "name": "Liste des Sender IDs actifs.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"id\": 1,\n            \"value\": \"MaMarque\",\n            \"is_default\": true,\n            \"created_at\": \"2026-01-15T10:30:00.000000Z\"\n        },\n        {\n            \"id\": 2,\n            \"value\": \"GESFLOW\",\n            \"is_default\": false,\n            \"created_at\": \"2026-03-22T14:12:00.000000Z\"\n        }\n    ]\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Paiements",
            "description": "Recharge du solde de crédits par Mobile Money (MTN, Airtel).",
            "item": [
                {
                    "name": "Configuration des frais de recharge",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/payments/fees-config",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "payments",
                                "fees-config"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Route **publique** (sans authentification). Renvoie les paramètres permettant de calculer le montant total d'une recharge :\n\n- `taxes = montant × tax_vat_percentage × (1 + tax_ca_percentage)`\n- `frais = (montant + taxes) × provider_fee_percentage + provider_fee_fixed`\n- `total = montant + taxes + frais`\n\nExemple pour 5000 : taxes 945, frais 233,075, total 6178,075 (6178 demandés au payeur).",
                        "auth": {
                            "type": "noauth"
                        }
                    },
                    "response": [
                        {
                            "name": "Configuration.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"min_amount\": 500,\n    \"provider_fee_percentage\": 0.035,\n    \"provider_fee_fixed\": 25,\n    \"tax_vat_percentage\": 0.18,\n    \"tax_ca_percentage\": 0.05,\n    \"country\": \"cg\",\n    \"currency\": \"XAF\",\n    \"phone_country_code\": \"+242\"\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Initier une recharge Mobile Money — Recharge MTN",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/payments/initiate",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "payments",
                                "initiate"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Crée une recharge Mobile Money (MTN ou Airtel) et envoie la demande de paiement au prestataire. Le payeur valide ensuite le paiement sur son téléphone (USSD). La réponse `201` renvoie le paiement au statut `processing` (demande transmise) ou directement `failed` (prestataire injoignable ou réponse invalide, raison dans `failure_message`) : un échec côté prestataire ne produit **pas** d'erreur HTTP.\n\nSuivez ensuite le statut avec `GET /payments/{payment}`. En cas de succès, `base_amount` est crédité sur le solde.\n\n⚠️ Aucun mode sandbox : même avec une clé de test, un vrai paiement est déclenché.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"amount\": 5000,\n    \"phone_number\": \"066000000\",\n    \"operator\": \"mtn\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Paiement créé.",
                            "code": 201,
                            "status": "201",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 31,\n        \"reference\": \"PAY-7QK2M9XA\",\n        \"status\": \"processing\",\n        \"status_label\": \"En cours\",\n        \"base_amount\": \"5000.0000\",\n        \"service_fee\": \"233.0750\",\n        \"transaction_fee\": \"945.0000\",\n        \"amount\": \"6178.0750\",\n        \"currency\": \"XAF\",\n        \"phone_number\": \"+242066000000\",\n        \"operator\": \"mtn\",\n        \"country\": \"cg\",\n        \"failure_message\": null,\n        \"created_at\": \"2026-10-07T09:15:00+00:00\",\n        \"updated_at\": \"2026-10-07T09:15:01+00:00\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Erreur de validation.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"La valeur de montant doit être au moins 500. (and 2 more errors)\",\n    \"errors\": {\n        \"amount\": [\n            \"La valeur de montant doit être au moins 500.\"\n        ],\n        \"phone_number\": [\n            \"Le format du champ numéro de téléphone est invalide.\"\n        ],\n        \"operator\": [\n            \"La valeur de opérateur est invalide.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Initier une recharge Mobile Money — Recharge Airtel, numéro international",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/payments/initiate",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "payments",
                                "initiate"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Crée une recharge Mobile Money (MTN ou Airtel) et envoie la demande de paiement au prestataire. Le payeur valide ensuite le paiement sur son téléphone (USSD). La réponse `201` renvoie le paiement au statut `processing` (demande transmise) ou directement `failed` (prestataire injoignable ou réponse invalide, raison dans `failure_message`) : un échec côté prestataire ne produit **pas** d'erreur HTTP.\n\nSuivez ensuite le statut avec `GET /payments/{payment}`. En cas de succès, `base_amount` est crédité sur le solde.\n\n⚠️ Aucun mode sandbox : même avec une clé de test, un vrai paiement est déclenché.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"amount\": 10000,\n    \"phone_number\": \"+242 05 500 00 00\",\n    \"operator\": \"airtel\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Paiement créé.",
                            "code": 201,
                            "status": "201",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 31,\n        \"reference\": \"PAY-7QK2M9XA\",\n        \"status\": \"processing\",\n        \"status_label\": \"En cours\",\n        \"base_amount\": \"5000.0000\",\n        \"service_fee\": \"233.0750\",\n        \"transaction_fee\": \"945.0000\",\n        \"amount\": \"6178.0750\",\n        \"currency\": \"XAF\",\n        \"phone_number\": \"+242066000000\",\n        \"operator\": \"mtn\",\n        \"country\": \"cg\",\n        \"failure_message\": null,\n        \"created_at\": \"2026-10-07T09:15:00+00:00\",\n        \"updated_at\": \"2026-10-07T09:15:01+00:00\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Erreur de validation.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"La valeur de montant doit être au moins 500. (and 2 more errors)\",\n    \"errors\": {\n        \"amount\": [\n            \"La valeur de montant doit être au moins 500.\"\n        ],\n        \"phone_number\": [\n            \"Le format du champ numéro de téléphone est invalide.\"\n        ],\n        \"operator\": [\n            \"La valeur de opérateur est invalide.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Historique des recharges",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/payments/me?",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "payments",
                                "me"
                            ],
                            "query": [
                                {
                                    "key": "page",
                                    "value": "1",
                                    "description": "Numéro de page (à partir de 1).",
                                    "disabled": true
                                },
                                {
                                    "key": "per_page",
                                    "value": "15",
                                    "description": "Nombre d'éléments par page (15 par défaut ; 0 ou valeur non numérique → 15). Aucune limite haute n'est appliquée.",
                                    "disabled": true
                                }
                            ],
                            "variable": []
                        },
                        "description": "Liste les recharges du compte (tous utilisateurs), de la plus récente à la plus ancienne. Le statut n'est **pas** rafraîchi auprès du prestataire dans cette liste (utilisez `GET /payments/{payment}`)."
                    },
                    "response": [
                        {
                            "name": "Page de paiements.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"id\": 31,\n            \"reference\": \"PAY-7QK2M9XA\",\n            \"status\": \"success\",\n            \"status_label\": \"Réussi\",\n            \"base_amount\": \"5000.0000\",\n            \"service_fee\": \"233.0750\",\n            \"transaction_fee\": \"945.0000\",\n            \"amount\": \"6178.0750\",\n            \"currency\": \"XAF\",\n            \"phone_number\": \"+242066000000\",\n            \"operator\": \"mtn\",\n            \"country\": \"cg\",\n            \"failure_message\": null,\n            \"created_at\": \"2026-10-07T09:15:00+00:00\",\n            \"updated_at\": \"2026-10-07T09:16:12+00:00\"\n        },\n        {\n            \"id\": 32,\n            \"reference\": \"PAY-Z81LQ0WE\",\n            \"status\": \"failed\",\n            \"status_label\": \"Échoué\",\n            \"base_amount\": \"5000.0000\",\n            \"service_fee\": \"233.0750\",\n            \"transaction_fee\": \"945.0000\",\n            \"amount\": \"6178.0750\",\n            \"currency\": \"XAF\",\n            \"phone_number\": \"+242066000000\",\n            \"operator\": \"mtn\",\n            \"country\": \"cg\",\n            \"failure_message\": \"Le service de paiement est temporairement injoignable. Veuillez réessayer.\",\n            \"created_at\": \"2026-10-07T09:15:00+00:00\",\n            \"updated_at\": \"2026-10-07T09:15:01+00:00\"\n        }\n    ],\n    \"links\": {\n        \"first\": \"https://sender.gesflow.biz/api/v1/payments/me?page=1\",\n        \"last\": \"https://sender.gesflow.biz/api/v1/payments/me?page=1\",\n        \"prev\": null,\n        \"next\": null\n    },\n    \"meta\": {\n        \"current_page\": 1,\n        \"from\": 1,\n        \"last_page\": 1,\n        \"links\": [\n            {\n                \"url\": null,\n                \"label\": \"&laquo; Précédent\",\n                \"page\": null,\n                \"active\": false\n            },\n            {\n                \"url\": \"https://sender.gesflow.biz/api/v1/payments/me?page=1\",\n                \"label\": \"1\",\n                \"page\": 1,\n                \"active\": true\n            },\n            {\n                \"url\": null,\n                \"label\": \"Suivant &raquo;\",\n                \"page\": null,\n                \"active\": false\n            }\n        ],\n        \"path\": \"https://sender.gesflow.biz/api/v1/payments/me\",\n        \"per_page\": 15,\n        \"to\": 2,\n        \"total\": 2\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Statut d'une recharge",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/payments/:payment",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "payments",
                                ":payment"
                            ],
                            "query": [],
                            "variable": [
                                {
                                    "key": "payment",
                                    "value": "31",
                                    "description": "Identifiant (`id`) du paiement."
                                }
                            ]
                        },
                        "description": "Renvoie une recharge du compte. Si elle est encore `pending` ou `processing`, son statut est d'abord **rafraîchi auprès du prestataire** : l'appel peut donc la faire passer à `success` (et créditer le solde) ou `failed`. Si le prestataire est injoignable, le statut actuel est renvoyé sans erreur."
                    },
                    "response": [
                        {
                            "name": "Le paiement.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 31,\n        \"reference\": \"PAY-7QK2M9XA\",\n        \"status\": \"success\",\n        \"status_label\": \"Réussi\",\n        \"base_amount\": \"5000.0000\",\n        \"service_fee\": \"233.0750\",\n        \"transaction_fee\": \"945.0000\",\n        \"amount\": \"6178.0750\",\n        \"currency\": \"XAF\",\n        \"phone_number\": \"+242066000000\",\n        \"operator\": \"mtn\",\n        \"country\": \"cg\",\n        \"failure_message\": null,\n        \"created_at\": \"2026-10-07T09:15:00+00:00\",\n        \"updated_at\": \"2026-10-07T09:16:12+00:00\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Paiement inexistant (`message` = « No query results for model [App\\Models\\Payment] … ») ou appartenant à un autre compte (`message` vide). Un identifiant non numérique (ex. `/payments/abc`) ne correspond à aucune route : 404 avec « The route … could not be found. ».",
                            "code": 404,
                            "status": "404",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"No query results for model [App\\\\Models\\\\Payment] 999\"\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Compte",
            "description": "Solde de crédits, tarifs et historique des mouvements du solde.",
            "item": [
                {
                    "name": "Consulter le solde et les tarifs",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/account",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "account"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Renvoie le solde de crédits du compte, les prix unitaires qui lui sont appliqués (SMS : prix spécifique du compte ou tarif global ; WhatsApp : tarif global) et le nombre de messages que le solde couvre encore."
                    },
                    "response": [
                        {
                            "name": "Le compte.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 12,\n        \"name\": \"Boutique Mbote\",\n        \"credit_balance\": \"12500.0000\",\n        \"currency\": \"XAF\",\n        \"prices\": {\n            \"sms\": \"20.0000\",\n            \"whatsapp\": \"2.5000\"\n        },\n        \"remaining\": {\n            \"sms\": 625,\n            \"whatsapp\": 5000\n        }\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Historique des mouvements du solde",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/account/transactions?",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "account",
                                "transactions"
                            ],
                            "query": [
                                {
                                    "key": "type",
                                    "value": "message_refund",
                                    "description": "Ne garder qu’un type de mouvement.",
                                    "disabled": true
                                },
                                {
                                    "key": "page",
                                    "value": "1",
                                    "description": "",
                                    "disabled": true
                                }
                            ],
                            "variable": []
                        },
                        "description": "Liste les mouvements du solde de crédits, du plus récent au plus ancien : chaque débit, ajustement, remboursement ou recharge, avec le solde qu’il a laissé (`balance_after`). La somme des montants est égale au solde du compte."
                    },
                    "response": [
                        {
                            "name": "Les mouvements.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"id\": 982,\n            \"type\": \"message_charge\",\n            \"label\": \"Envoi de message\",\n            \"amount\": \"-20.0000\",\n            \"balance_after\": \"12480.0000\",\n            \"description\": \"SMS vers 242066000001\",\n            \"reference\": {\n                \"type\": \"message\",\n                \"id\": 42\n            },\n            \"created_at\": \"2026-10-07T09:15:00.000000Z\"\n        },\n        {\n            \"id\": 981,\n            \"type\": \"payment\",\n            \"label\": \"Recharge Mobile Money\",\n            \"amount\": \"10000.0000\",\n            \"balance_after\": \"12500.0000\",\n            \"description\": \"Recharge Mobile Money (mtn) — PAY-20261007-AB12\",\n            \"reference\": {\n                \"type\": \"payment\",\n                \"id\": 77\n            },\n            \"created_at\": \"2026-10-07T08:02:11.000000Z\"\n        }\n    ],\n    \"links\": {\n        \"first\": \"https://sender.gesflow.biz/api/v1/account/transactions?page=1\",\n        \"last\": \"https://sender.gesflow.biz/api/v1/account/transactions?page=1\",\n        \"prev\": null,\n        \"next\": null\n    },\n    \"meta\": {\n        \"current_page\": 1,\n        \"from\": 1,\n        \"last_page\": 1,\n        \"links\": [],\n        \"path\": \"https://sender.gesflow.biz/api/v1/account/transactions\",\n        \"per_page\": 25,\n        \"to\": 2,\n        \"total\": 2\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Type inconnu.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Le champ type sélectionné est invalide.\",\n    \"errors\": {\n        \"type\": [\n            \"Le champ type sélectionné est invalide.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Contacts",
            "description": "Carnet de contacts du compte, utilisé par les variables de personnalisation et les envois en masse.",
            "item": [
                {
                    "name": "Lister les contacts",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/contacts?",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "contacts"
                            ],
                            "query": [
                                {
                                    "key": "search",
                                    "value": "Dupont",
                                    "description": "Recherche dans le nom ou le numéro.",
                                    "disabled": true
                                },
                                {
                                    "key": "group_id",
                                    "value": "4",
                                    "description": "Contacts d’un groupe.",
                                    "disabled": true
                                },
                                {
                                    "key": "tag",
                                    "value": "vip",
                                    "description": "Contacts portant ce tag (insensible à la casse).",
                                    "disabled": true
                                },
                                {
                                    "key": "page",
                                    "value": "1",
                                    "description": "",
                                    "disabled": true
                                }
                            ],
                            "variable": []
                        },
                        "description": "Liste les contacts du compte, du plus récent au plus ancien, avec leurs groupes."
                    },
                    "response": [
                        {
                            "name": "Les contacts.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"id\": 311,\n            \"name\": \"Jean Dupont\",\n            \"phone\": \"242066000001\",\n            \"tags\": [\n                \"client\",\n                \"vip\"\n            ],\n            \"custom_fields\": {\n                \"ville\": \"Brazzaville\"\n            },\n            \"groups\": [\n                {\n                    \"id\": 4,\n                    \"name\": \"Clients VIP\",\n                    \"description\": null,\n                    \"created_at\": \"2026-09-01T10:00:00.000000Z\"\n                }\n            ],\n            \"created_at\": \"2026-09-01T10:00:00.000000Z\",\n            \"updated_at\": \"2026-09-15T08:30:00.000000Z\"\n        }\n    ],\n    \"links\": {\n        \"first\": \"https://sender.gesflow.biz/api/v1/contacts?page=1\",\n        \"last\": \"https://sender.gesflow.biz/api/v1/contacts?page=1\",\n        \"prev\": null,\n        \"next\": null\n    },\n    \"meta\": {\n        \"current_page\": 1,\n        \"from\": 1,\n        \"last_page\": 1,\n        \"links\": [],\n        \"path\": \"https://sender.gesflow.biz/api/v1/contacts\",\n        \"per_page\": 25,\n        \"to\": 1,\n        \"total\": 1\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Créer un contact",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/contacts",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "contacts"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "Ajoute un contact au carnet du compte. Son nom et ses champs personnalisés alimentent les variables de personnalisation des messages qui lui sont envoyés.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"name\": \"Jean Dupont\",\n    \"phone\": \"242066000001\",\n    \"tags\": [\n        \"client\",\n        \"vip\"\n    ],\n    \"custom_fields\": {\n        \"ville\": \"Brazzaville\"\n    },\n    \"group_ids\": [\n        4\n    ]\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Le contact créé.",
                            "code": 201,
                            "status": "201",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 311,\n        \"name\": \"Jean Dupont\",\n        \"phone\": \"242066000001\",\n        \"tags\": [\n            \"client\",\n            \"vip\"\n        ],\n        \"custom_fields\": {\n            \"ville\": \"Brazzaville\"\n        },\n        \"groups\": [\n            {\n                \"id\": 4,\n                \"name\": \"Clients VIP\",\n                \"description\": null,\n                \"created_at\": \"2026-09-01T10:00:00.000000Z\"\n            }\n        ],\n        \"created_at\": \"2026-09-01T10:00:00.000000Z\",\n        \"updated_at\": \"2026-09-15T08:30:00.000000Z\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Données invalides ou numéro déjà présent.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Ce numéro de téléphone existe déjà dans vos contacts.\",\n    \"errors\": {\n        \"phone\": [\n            \"Ce numéro de téléphone existe déjà dans vos contacts.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Récupérer un contact",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/contacts/:contact",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "contacts",
                                ":contact"
                            ],
                            "query": [],
                            "variable": [
                                {
                                    "key": "contact",
                                    "value": "311",
                                    "description": "Identifiant du contact."
                                }
                            ]
                        },
                        "description": ""
                    },
                    "response": [
                        {
                            "name": "Le contact.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 311,\n        \"name\": \"Jean Dupont\",\n        \"phone\": \"242066000001\",\n        \"tags\": [\n            \"client\",\n            \"vip\"\n        ],\n        \"custom_fields\": {\n            \"ville\": \"Brazzaville\"\n        },\n        \"groups\": [\n            {\n                \"id\": 4,\n                \"name\": \"Clients VIP\",\n                \"description\": null,\n                \"created_at\": \"2026-09-01T10:00:00.000000Z\"\n            }\n        ],\n        \"created_at\": \"2026-09-01T10:00:00.000000Z\",\n        \"updated_at\": \"2026-09-15T08:30:00.000000Z\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Contact inexistant(e) ou appartenant à un autre compte.",
                            "code": 404,
                            "status": "404",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"No query results for model [App\\\\Models\\\\Contact] 42\"\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Modifier un contact",
                    "request": {
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/contacts/:contact",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "contacts",
                                ":contact"
                            ],
                            "query": [],
                            "variable": [
                                {
                                    "key": "contact",
                                    "value": "311",
                                    "description": "Identifiant du contact."
                                }
                            ]
                        },
                        "description": "Remplace le nom, le numéro, les tags et les champs personnalisés du contact. Ses groupes ne changent que si `group_ids` est envoyé.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"name\": \"Jean-Paul Dupont\",\n    \"phone\": \"242066000009\",\n    \"tags\": [\n        \"client\"\n    ]\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Le contact modifié.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 311,\n        \"name\": \"Jean-Paul Dupont\",\n        \"phone\": \"242066000009\",\n        \"tags\": [\n            \"client\"\n        ],\n        \"custom_fields\": {\n            \"ville\": \"Brazzaville\"\n        },\n        \"groups\": [\n            {\n                \"id\": 4,\n                \"name\": \"Clients VIP\",\n                \"description\": null,\n                \"created_at\": \"2026-09-01T10:00:00.000000Z\"\n            }\n        ],\n        \"created_at\": \"2026-09-01T10:00:00.000000Z\",\n        \"updated_at\": \"2026-09-15T08:30:00.000000Z\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Contact inexistant(e) ou appartenant à un autre compte.",
                            "code": 404,
                            "status": "404",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"No query results for model [App\\\\Models\\\\Contact] 42\"\n}"
                        },
                        {
                            "name": "Données invalides.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Le numéro de téléphone est invalide (8 à 15 chiffres attendus).\",\n    \"errors\": {\n        \"phone\": [\n            \"Le numéro de téléphone est invalide (8 à 15 chiffres attendus).\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Supprimer un contact",
                    "request": {
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/contacts/:contact",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "contacts",
                                ":contact"
                            ],
                            "query": [],
                            "variable": [
                                {
                                    "key": "contact",
                                    "value": "311",
                                    "description": "Identifiant du contact."
                                }
                            ]
                        },
                        "description": "Supprime le contact (et le retire de ses groupes). Les messages déjà envoyés à ce numéro sont conservés."
                    },
                    "response": [
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Contact inexistant(e) ou appartenant à un autre compte.",
                            "code": 404,
                            "status": "404",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"No query results for model [App\\\\Models\\\\Contact] 42\"\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Groupes de contacts",
            "description": "Groupes de contacts, ciblables lors d’un envoi en masse (`group_ids`).",
            "item": [
                {
                    "name": "Lister les groupes",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/contact-groups?",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "contact-groups"
                            ],
                            "query": [
                                {
                                    "key": "page",
                                    "value": "1",
                                    "description": "",
                                    "disabled": true
                                }
                            ],
                            "variable": []
                        },
                        "description": "Liste les groupes de contacts du compte, par nom, avec leur nombre de contacts."
                    },
                    "response": [
                        {
                            "name": "Les groupes.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"id\": 4,\n            \"name\": \"Clients VIP\",\n            \"description\": \"Meilleurs clients de l’année\",\n            \"contacts_count\": 128,\n            \"created_at\": \"2026-09-01T10:00:00.000000Z\"\n        }\n    ],\n    \"links\": {\n        \"first\": \"https://sender.gesflow.biz/api/v1/contact-groups?page=1\",\n        \"last\": \"https://sender.gesflow.biz/api/v1/contact-groups?page=1\",\n        \"prev\": null,\n        \"next\": null\n    },\n    \"meta\": {\n        \"current_page\": 1,\n        \"from\": 1,\n        \"last_page\": 1,\n        \"links\": [],\n        \"path\": \"https://sender.gesflow.biz/api/v1/contact-groups\",\n        \"per_page\": 25,\n        \"to\": 1,\n        \"total\": 1\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Créer un groupe",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/contact-groups",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "contact-groups"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"name\": \"Clients VIP\",\n    \"description\": \"Meilleurs clients de l’année\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Le groupe créé.",
                            "code": 201,
                            "status": "201",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 4,\n        \"name\": \"Clients VIP\",\n        \"description\": \"Meilleurs clients de l’année\",\n        \"contacts_count\": 0,\n        \"created_at\": \"2026-09-01T10:00:00.000000Z\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Nom manquant ou déjà utilisé.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"La valeur du champ nom est déjà utilisée.\",\n    \"errors\": {\n        \"name\": [\n            \"La valeur du champ nom est déjà utilisée.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Renommer un groupe",
                    "request": {
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/contact-groups/:contact_group",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "contact-groups",
                                ":contact_group"
                            ],
                            "query": [],
                            "variable": [
                                {
                                    "key": "contact_group",
                                    "value": "4",
                                    "description": "Identifiant du groupe."
                                }
                            ]
                        },
                        "description": "",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"name\": \"Clients fidèles\",\n    \"description\": null\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Le groupe modifié.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 4,\n        \"name\": \"Clients fidèles\",\n        \"description\": null,\n        \"contacts_count\": 128,\n        \"created_at\": \"2026-09-01T10:00:00.000000Z\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Groupe de contacts inexistant(e) ou appartenant à un autre compte.",
                            "code": 404,
                            "status": "404",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"No query results for model [App\\\\Models\\\\ContactGroup] 42\"\n}"
                        },
                        {
                            "name": "Nom manquant ou déjà utilisé.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"La valeur du champ nom est déjà utilisée.\",\n    \"errors\": {\n        \"name\": [\n            \"La valeur du champ nom est déjà utilisée.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Supprimer un groupe",
                    "request": {
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/contact-groups/:contact_group",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "contact-groups",
                                ":contact_group"
                            ],
                            "query": [],
                            "variable": [
                                {
                                    "key": "contact_group",
                                    "value": "4",
                                    "description": "Identifiant du groupe."
                                }
                            ]
                        },
                        "description": "Supprime le groupe. Ses contacts sont conservés."
                    },
                    "response": [
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Groupe de contacts inexistant(e) ou appartenant à un autre compte.",
                            "code": 404,
                            "status": "404",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"No query results for model [App\\\\Models\\\\ContactGroup] 42\"\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Ajouter des contacts à un groupe",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/contact-groups/:contact_group/contacts",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "contact-groups",
                                ":contact_group",
                                "contacts"
                            ],
                            "query": [],
                            "variable": [
                                {
                                    "key": "contact_group",
                                    "value": "4",
                                    "description": "Identifiant du groupe."
                                }
                            ]
                        },
                        "description": "Ajoute des contacts du compte au groupe (ceux qui y sont déjà sont ignorés).",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"contact_ids\": [\n        311,\n        312\n    ]\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Le groupe et son nouveau nombre de contacts.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 4,\n        \"name\": \"Clients VIP\",\n        \"description\": \"Meilleurs clients de l’année\",\n        \"contacts_count\": 130,\n        \"created_at\": \"2026-09-01T10:00:00.000000Z\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Groupe de contacts inexistant(e) ou appartenant à un autre compte.",
                            "code": 404,
                            "status": "404",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"No query results for model [App\\\\Models\\\\ContactGroup] 42\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Contact inconnu.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Ce contact est introuvable.\",\n    \"errors\": {\n        \"contact_ids.0\": [\n            \"Ce contact est introuvable.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Retirer des contacts d’un groupe",
                    "request": {
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/contact-groups/:contact_group/contacts",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "contact-groups",
                                ":contact_group",
                                "contacts"
                            ],
                            "query": [],
                            "variable": [
                                {
                                    "key": "contact_group",
                                    "value": "4",
                                    "description": "Identifiant du groupe."
                                }
                            ]
                        },
                        "description": "Retire des contacts du groupe. Les contacts eux-mêmes sont conservés.",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"contact_ids\": [\n        311\n    ]\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Le groupe et son nouveau nombre de contacts.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 4,\n        \"name\": \"Clients VIP\",\n        \"description\": \"Meilleurs clients de l’année\",\n        \"contacts_count\": 127,\n        \"created_at\": \"2026-09-01T10:00:00.000000Z\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Groupe de contacts inexistant(e) ou appartenant à un autre compte.",
                            "code": 404,
                            "status": "404",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"No query results for model [App\\\\Models\\\\ContactGroup] 42\"\n}"
                        },
                        {
                            "name": "Contact inconnu.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Ce contact est introuvable.\",\n    \"errors\": {\n        \"contact_ids.0\": [\n            \"Ce contact est introuvable.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                }
            ]
        },
        {
            "name": "Modèles",
            "description": "Modèles de messages réutilisables.",
            "item": [
                {
                    "name": "Lister les modèles",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/templates?",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "templates"
                            ],
                            "query": [
                                {
                                    "key": "search",
                                    "value": "bienvenue",
                                    "description": "Recherche dans le nom ou le texte.",
                                    "disabled": true
                                },
                                {
                                    "key": "page",
                                    "value": "1",
                                    "description": "",
                                    "disabled": true
                                }
                            ],
                            "variable": []
                        },
                        "description": ""
                    },
                    "response": [
                        {
                            "name": "Les modèles.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": [\n        {\n            \"id\": 7,\n            \"name\": \"Bienvenue\",\n            \"content\": \"Bonjour {{ prenom|cher client }}, bienvenue chez nous !\",\n            \"created_at\": \"2026-09-01T10:00:00.000000Z\",\n            \"updated_at\": \"2026-09-01T10:00:00.000000Z\"\n        }\n    ],\n    \"links\": {\n        \"first\": \"https://sender.gesflow.biz/api/v1/templates?page=1\",\n        \"last\": \"https://sender.gesflow.biz/api/v1/templates?page=1\",\n        \"prev\": null,\n        \"next\": null\n    },\n    \"meta\": {\n        \"current_page\": 1,\n        \"from\": 1,\n        \"last_page\": 1,\n        \"links\": [],\n        \"path\": \"https://sender.gesflow.biz/api/v1/templates\",\n        \"per_page\": 25,\n        \"to\": 1,\n        \"total\": 1\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Créer un modèle",
                    "request": {
                        "method": "POST",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/templates",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "templates"
                            ],
                            "query": [],
                            "variable": []
                        },
                        "description": "",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"name\": \"Bienvenue\",\n    \"content\": \"Bonjour {{ prenom|cher client }}, bienvenue chez nous !\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Le modèle créé.",
                            "code": 201,
                            "status": "201",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 7,\n        \"name\": \"Bienvenue\",\n        \"content\": \"Bonjour {{ prenom|cher client }}, bienvenue chez nous !\",\n        \"created_at\": \"2026-09-01T10:00:00.000000Z\",\n        \"updated_at\": \"2026-09-01T10:00:00.000000Z\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Une requête avec la même `Idempotency-Key` est encore en cours de traitement.",
                            "code": 409,
                            "status": "409",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Une requête avec cette clé d’idempotence est encore en cours de traitement.\"\n}"
                        },
                        {
                            "name": "Nom manquant ou déjà utilisé.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Un modèle avec ce nom existe déjà.\",\n    \"errors\": {\n        \"name\": [\n            \"Un modèle avec ce nom existe déjà.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Récupérer un modèle",
                    "request": {
                        "method": "GET",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/templates/:template",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "templates",
                                ":template"
                            ],
                            "query": [],
                            "variable": [
                                {
                                    "key": "template",
                                    "value": "7",
                                    "description": "Identifiant du modèle."
                                }
                            ]
                        },
                        "description": ""
                    },
                    "response": [
                        {
                            "name": "Le modèle.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 7,\n        \"name\": \"Bienvenue\",\n        \"content\": \"Bonjour {{ prenom|cher client }}, bienvenue chez nous !\",\n        \"created_at\": \"2026-09-01T10:00:00.000000Z\",\n        \"updated_at\": \"2026-09-01T10:00:00.000000Z\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Modèle inexistant(e) ou appartenant à un autre compte.",
                            "code": 404,
                            "status": "404",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"No query results for model [App\\\\Models\\\\Template] 42\"\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Modifier un modèle",
                    "request": {
                        "method": "PUT",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            },
                            {
                                "key": "Content-Type",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/templates/:template",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "templates",
                                ":template"
                            ],
                            "query": [],
                            "variable": [
                                {
                                    "key": "template",
                                    "value": "7",
                                    "description": "Identifiant du modèle."
                                }
                            ]
                        },
                        "description": "",
                        "body": {
                            "mode": "raw",
                            "raw": "{\n    \"name\": \"Bienvenue\",\n    \"content\": \"Bienvenue {{ prenom|cher client }} ! -10 % sur votre première commande.\"\n}",
                            "options": {
                                "raw": {
                                    "language": "json"
                                }
                            }
                        }
                    },
                    "response": [
                        {
                            "name": "Le modèle modifié.",
                            "code": 200,
                            "status": "200",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"data\": {\n        \"id\": 7,\n        \"name\": \"Bienvenue\",\n        \"content\": \"Bienvenue {{ prenom|cher client }} ! -10 % sur votre première commande.\",\n        \"created_at\": \"2026-09-01T10:00:00.000000Z\",\n        \"updated_at\": \"2026-09-01T10:00:00.000000Z\"\n    }\n}"
                        },
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Modèle inexistant(e) ou appartenant à un autre compte.",
                            "code": 404,
                            "status": "404",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"No query results for model [App\\\\Models\\\\Template] 42\"\n}"
                        },
                        {
                            "name": "Données invalides.",
                            "code": 422,
                            "status": "422",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Le champ content est obligatoire.\",\n    \"errors\": {\n        \"content\": [\n            \"Le champ content est obligatoire.\"\n        ]\n    }\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                },
                {
                    "name": "Supprimer un modèle",
                    "request": {
                        "method": "DELETE",
                        "header": [
                            {
                                "key": "Accept",
                                "value": "application/json"
                            }
                        ],
                        "url": {
                            "raw": "{{baseUrl}}/api/v1/templates/:template",
                            "host": [
                                "{{baseUrl}}"
                            ],
                            "path": [
                                "api",
                                "v1",
                                "templates",
                                ":template"
                            ],
                            "query": [],
                            "variable": [
                                {
                                    "key": "template",
                                    "value": "7",
                                    "description": "Identifiant du modèle."
                                }
                            ]
                        },
                        "description": ""
                    },
                    "response": [
                        {
                            "name": "Clé API absente, invalide, expirée ou révoquée.",
                            "code": 401,
                            "status": "401",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Unauthenticated.\"\n}"
                        },
                        {
                            "name": "Modèle inexistant(e) ou appartenant à un autre compte.",
                            "code": 404,
                            "status": "404",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"No query results for model [App\\\\Models\\\\Template] 42\"\n}"
                        },
                        {
                            "name": "Limite de débit dépassée : 600 requêtes par minute et par compte (60 par minute et par adresse IP pour les routes publiques).",
                            "code": 429,
                            "status": "429",
                            "_postman_previewlanguage": "json",
                            "header": [
                                {
                                    "key": "Content-Type",
                                    "value": "application/json"
                                }
                            ],
                            "body": "{\n    \"message\": \"Trop de requêtes. Réessayez dans 24 secondes.\",\n    \"retry_after\": 24\n}"
                        }
                    ]
                }
            ]
        }
    ]
}