{
  "openapi": "3.0.3",
  "info": {
    "title": "PI - API BUSINESS - OpenAPI 3.0",
    "x-logo": {
      "url": "https://developers.pi-bceao.com/assets/images/logo/Logo_SPI_1.png"
    },
    "description": "# Généralités\n\nL'API Business est une API exposée par les participants (PSP) de la Plateforme d'Interopérabilité PI à leurs clients business.\n\nElle permet au participant de fournir des services d’automatisation des opérations de paiement à son client :\n\n- Créer des alias de compte\n- Recevoir des paiements\n- Retourner des paiements\n\n- Envoyer des paiements\n- Effectuer des paiements en masse\n- Envoyer des demandes d'annulation\n\n- Envoyer des demandes de paiements\n- Envoyer des demandes de paiements en masse\n\n- Consulter la liste des opérations\n- Consulter les détails d'une opération\n- Effectuer des transferts entre ses comptes\n\n\nCette spécification a pour but d'encadrer les solutions à valeurs ajoutées offertes par les participants à leurs clients business.\nElle permettra ainsi de faciliter l'interopérabilité et d'éviter le cloisonnement des solutions techniques mises en œuvre.\n\n## Gestion des versions\n\nLa stratégie de développement de l'API est de maintenir la rétrocompatibilité entre l'API et ses ressources et services dans la mesure du possible.\nLes APIs utilisent la spécification __SemVer__ (La gestion sémantique de versions); en ce sens, les modifications compatibles ne doivent pas générer une nouvelle version majeure.\n\nLa version de l’API utilise ainsi le format` MAJEUR.MINEUR.CORRECTIF`\n* le numéro de version `MAJEUR` quand il y a des changements non rétrocompatibles,\n* le numéro de version `MINEUR` quand il y a des ajouts de fonctionnalités rétrocompatibles,\n* le numéro de version de `CORRECTIF` quand il y a des corrections d’anomalies rétrocompatibles.\n\nChaque fois qu'un changement dans ce document définissant les caractéristiques de l'API est mis à jour et affecte d'une manière ou d'une autre un service d'API, une nouvelle version de l’API sera publiée.\nLa version initiale de chaque API est `1.0.0`.\n\n### __1) Versions de correction__\nL’identifiant de version de correction est  incrémenté si des corrections rétrocompatibles sont introduites. Une correction est définie comme un changement interne qui corrige un comportement incorrect.\n\n### __2) Versions mineures__\nCertaines modifications n'affectent pas la version de la ressource API; par exemple, si l'ordre des paramètres dans une requête change.\n\nLa liste suivante décrit quelques modifications considérées comme rétrocompatibles. Les participants doivent implémenter leur système de manière à ce que les services d'API prennent automatiquement en charge ces modifications sans interrompre le fonctionnement du système:\n* paramètres de requêtes facultatifs\n* ajout de nouveaux codes d'erreur\n\nCes types de modifications affectent la version mineure du service d'API.\n\n### __3) Versions majeures__\nLa liste suivante décrit les modifications considérées comme rétro-incompatibles si la modification affecte un service d'API connecté à une ressource. Les intégrateurs d'API n'ont pas besoin d'implémenter de manière à prendre automatiquement en charge ces modifications.\nEn effet, pour des changements importants, un plan de migration sera défini et dépendra de la nature de ces changements.\nLes situations suivantes peuvent entraîner la publication d’une version majeure:\n* Paramètres obligatoires supprimés ou ajoutés à une requête\n* Paramètres facultatifs changés en obligatoires dans une requête\n* Paramètres renommés\n* Types de données modifiés\n* La logique métier d’un service modifiée\n* Les URI de ressource/service d'API modifiées\n\nCes types de modifications affectent la version principale du service d'API. Veuillez noter que la liste n'est pas exhaustive ; il peut également y avoir d'autres modifications susceptibles d'affecter la version principale du service d'API.\n### __4) Informations de version__\nLa gestion des versions s’effectuera via le chemin URI qui consiste à inclure le numéro de version dans le chemin URI et permet de gérer facilement plusieurs versions parallèles de l’API.\nLe numéro de version majeure sera inclus dans l’URL de l’API comme suit: __https://www.example.com/api/v1/products__\n\n## Notes de version\nPour consulter les changements apportés à l'API, veuillez consulter le [changelog](./CHANGELOG.md).\n\n## Gestion des erreurs\n\nL'API BUSINESS renvoie des codes d'états HTTP pour indiquer le succès ou l'échec à l'issue du traitement d'une requête\n\n  - Les codes `2xx` indiquent un succès.\n\n  - Les codes `4xx` indiquent un échec causé par les informations envoyées par le client ou l'état actuel des entités.\n\n  - Les codes `5xx` généralement liés aux serveurs ou à l'application\n\n  - Les réponses d'erreur incluent dans le corps les détails de l'erreur.\n\n  - Le champ `type` identifie le type d'erreur rencontrée.\n\nEn ce qui concerne les réponses notifiant une erreur, PI utilise le format décrit dans la `RFC 7807` qui décrit comment les API peuvent renvoyer des informations d'erreur de manière standardisée.  Une telle réponse contient les éléments suivants :\n<table>\n  <tr>\n    <td><b>type</b></td>\n    <td>Le champ \"type\" est une URI unique qui identifie le type de problème. L’URI peut être relative.</td>\n  </tr>\n  <tr>\n    <td><b>title</b></td>\n    <td>Le champ \"title\"  fournit une description courte pour comprendre le problème. Il est identique pour le même type de problème.</td>\n  </tr>\n  <tr>\n    <td><b>detail</b></td>\n    <td>Le champ \"detail\" donne des explications sur le problème.</td>\n  </tr>\n  <tr>\n    <td><b>instance</b></td>\n    <td>Il indique une référence URI de ressource concernée par le problème. Il est optionnel.</td>\n  </tr>\n  <tr>\n    <td><b>status</b></td>\n    <td>Le champ \"status\" renvoie le code de statut HTTP qui a déclenché cette réponse. Ce champ est optionnel.</td>\n  </tr>\n</table>\n\nPour donner des informations détaillées sur le problème, des extensions sont permises. Les extensions sont des champs additionnels qui peuvent figurer dans la réponse.\n\nCi-dessous un exemple de réponse en JSON:\n\n<img src=\"./images/exemple-erreur-json.png\" />\n\nIci, le problème `format-invalide` __(identifié par son type URI)__  indique la raison de l’erreur `400` retournée par le serveur lors de la création d’un client; deux extensions sont ajoutées: `typeClient` qui indique le __champ incorrect__, et `invalid-params` qui indiquent les __paramètres invalides et la raison d’invalidité__.\nPar ailleurs, l'URI de type d'un problème devrait référencer une page HTML expliquant comment résoudre le problème. Cependant des types prédéfinis existent: c’est le cas du type `about:blank` qui indique que __le problème n'a pas de sémantique supplémentaire au-delà de celle du code de statut HTTP__. Lorsque `about:blank` est utilisé, le champ `title` est le même que le libellé du statut HTTP comme montré dans l’exemple suivant:\n\nLes erreurs suivantes peuvent être renvoyées par n'importe quel endpoint de l'API:\n\n### `BadRequest`\n\n  * Signification: Requête invalide.\n  * __HTTP Status Code__: [400 Bad Request](https://tools.ietf.org/html/rfc7231#section-6.5.1).\n\n### `Unauthorized`\n\n  * Signification: Requête non authentifiée. Les informations d'authentification sont manquantes ou invalides.\n  * __HTTP Status Code__: [401 Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1).\n\n### `Forbidden`\n\n  * Signification: Requête authentifiée qui enfreint une règle d'autorisation.\n  * __HTTP Status Code__: [403 Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3).\n\n### `NotFound`\n\n  * Signification: Entité non trouvée.\n  * __HTTP Status Code__: [404 Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4).\n\n### `Gone`\n\n  * Signification: Indique que l'entité a existé mais qu'elle a été définitivement supprimée.\n  * __HTTP Status Code__: [410 Gone](https://tools.ietf.org/html/rfc7231#section-6.5.9).\n\n### `InternalServerError`\n\n  * Signification: Erreur interne du serveur\n  * __HTTP Status Code__: [500 Internal Server Error](https://tools.ietf.org/html/rfc7231#section-6.6.1).\n\n### `BadGateway`\n\n  * Signification: Le serveur a reçu une réponse invalide du serveur en amont.\n  * __HTTP Status Code__: [502 Bad Gateway](https://tools.ietf.org/html/rfc7231#section-6.6.3).\n\n### `ServiceUnavailable`\n\n  * Signification: Le service n'est pas disponible actuellement. Le service demandé peut être en cours de maintenance ou en dehors de la fenêtre d'exploitation.\n  * __HTTP Status Code__: [503 Service Unavailable](https://tools.ietf.org/html/rfc7231#section-6.6.4).\n\n### `GatewayTimeout`\n\n  * Signification: Indique que le service a mis plus de temps que prévu à revenir.\n  * __HTTP Status Code__: [504 Gateway Timeout](https://tools.ietf.org/html/rfc7231#section-6.6.5).\n\n\n## Pagination et filtres\n\nLes endpoints qui retournent des listes de ressources utilisent un format de réponse standardisé pour assurer une expérience cohérente et faciliter la pagination et le filtrage.\n\n### Structure de la réponse\n\nToutes les listes suivent une structure commune avec deux sections principales :\n\n```json\n{\n  \"data\": [...],  // Tableau contenant les éléments de la page actuelle\n  \"meta\": {...}   // Métadonnées sur la pagination et le nombre total d'éléments\n}\n```\n\n#### Section `data`\nContient le tableau des éléments de la page actuelle. Le nombre d'éléments est limité par le paramètre `size`.\n\n#### Section `meta`\nContient les informations de pagination et de contexte :\n\n```json\n{\n  \"meta\": {\n    \"total\": 100,                              // Nombre total d'éléments (optionnel, si calculé)\n    \"page\": 2,                    // Page actuelle (peut être un entier ou un token)\n    \"size\": 20,                                // Nombre d'éléments par page\n    \"next\": 3,  // Token ou numéro de la page suivante (optionnel)\n    \"prev\": 1   // Token ou numéro de la page précédente (optionnel)\n  }\n}\n```\n\n**Remarques importantes** :\n- Les champs `page`, `next` et `prev` peuvent être des **nombres entiers** ou des **chaînes de caractères** (tokens)\n- Le champ `total` est optionnel car son calcul peut être coûteux pour de grandes collections\n- Les champs `next` et `prev` sont optionnels et absents s'il n'y a pas de page suivante ou précédente\n\n### Paramètres de pagination\n\nLes paramètres de requête suivants permettent de contrôler la pagination :\n\n#### Paramètres standards\n\n- **`page`** : Identifie la page à récupérer\n  - Type : `integer` ou `string` (token)\n  - Par défaut : `1` (première page)\n  - Exemples :\n    - Pagination par numéro : `GET /comptes?page=2&size=20`\n    - Pagination par token : `GET /comptes?page=eyJrZXkiOiIxMjM0NTY3ODkifQ==&size=20`\n\n- **`size`** : Nombre d'éléments par page\n  - Type : `integer`\n  - Valeur minimale : `1`\n  - Valeur maximale : `100` (peut varier selon l'endpoint)\n  - Par défaut : `20`\n  - Exemple : `GET /comptes?page=1&size=50`\n\n#### Types de pagination\n\n**Pagination par offset (numérique)** :\n```\nGET /comptes?page=2&size=20\n```\nRetourne les éléments 21 à 40 (page 2 × 20 éléments par page).\n\n**Pagination par curseur (token)** :\n```\nGET /comptes?page=eyJrZXkiOiIxMjM0NTY3ODkifQ==&size=20\n```\nUtilise un token opaque pour garantir la cohérence lors de modifications fréquentes des données.\n\n### Filtrage des résultats\n\nLes endpoints de liste supportent le filtrage via des paramètres de requête avec la syntaxe `propriete[operateur]=valeur` :\n\n**Exemples** :\n```\n# Filtrer par statut\nGET /paiements-immediats?statut=IRREVOCABLE\nGET /paiements-immediats?statut[ne]=INITIE\n\n# Filtrer par date de début\nGET /paiements-immediats?dateIrrevocabilite[gte]=2024-01-01\n\n# Filtrer les demandes de paiement de type PICO (retrait dans le cadre d'un achat)\nGET /demandes-paiements?montantAchat[exists]=true\n\n# Filtrer les demandes de paiement de type PICASH (retrait simple)\nGET /demandes-paiements?montantAchat[exists]=false&montantRetrait[exists]=true\n\n# Combiner plusieurs filtres\nGET /paiements-immediats?dateIrrevocabilite[gte]=2024-01-01&statut[ne]=INITIE\n```\n\n**Operateurs** :\n- `eq` : égal à\n- `ne` : différent de\n- `gt` : supérieur à\n- `gte` : supérieur ou égal à\n- `lt` : inférieur à\n- `lte` : inférieur ou égal à\n- `in` : dans la liste\n- `contains` : la liste ou la chaine de caractères contient la valeur\n- `notContains` : la liste ou la chaine de caractères ne contient pas la valeur\n- `beginsWith` : commence par la valeur\n- `exists` : existe\n\n### Tri des résultats\n\nLe paramètre `sort` permet de trier les résultats. Pour indiquer l'ordre de tri :\n\n- **Sans préfixe** : tri ascendant (croissant)\n- **Préfixe `-`** : tri descendant (décroissant)\n\n**Syntaxe** : `sort=champ` ou `sort=-champ`\n\n**Exemples** :\n```\n# Trier par type croissant\nGET /comptes/123456/alias?sort=type\n\n# Trier par date décroissant\nGET /paiements-immediats?sort=-dateCreation\n```\n\n### Exemples complets\n\n**Liste simple sans pagination** :\n```\nGET /comptes/123456/alias\n```\n\n**Liste paginée avec taille personnalisée** :\n```\nGET /paiements-immediats?page=1&size=50\n```\n\n**Liste avec filtrage et tri** :\n```\nGET /paiements-immediats?statut=IRREVOCABLE&sort=-dateCreation&page=1&size=20\n```\n\n**Navigation vers la page suivante avec token** :\n```\n# Première requête\nGET /comptes?page=1&size=20\n\n# Réponse\n{\n  \"data\": [...],\n  \"meta\": {\n    \"total\": 150,\n    \"size\": 20,\n    \"page\": \"1\",\n    \"next\": \"eyJrZXkiOiIxMjM0NTY3ODkifQ\"\n  }\n}\n\n# Requête pour la page suivante\nGET /comptes?page=eyJrZXkiOiIxMjM0NTY3ODkifQ&size=20\n```\n\n\n# Sécurité\n\n## Sécurité de l'API\n\nLes endpoints de l'API Business sont sécurisés de manière robuste, combinant à la fois:\n- le protocole Mutual TLS (MTLS) pour une authentification forte au niveau du transport\n- OAuth2 pour une gestion fine des autorisations.\nAssurant ainsi une sécurité complète de l'accès aux ressources.\n\n<SecurityDefinitions />\n",
    "contact": {
      "name": "support",
      "email": "pisfn-sandbox@bceao.int"
    },
    "license": {
      "name": "Proprietary - BCEAO",
      "url": "https://www.bceao.int"
    },
    "version": "1.3.0"
  },
  "servers": [
    {
      "url": "https://sandbox-api-pi.baobab.com/piz/v1",
      "description": "Sandbox Baobab"
    }
  ],
  "tags": [
    {
      "name": "Comptes",
      "description": "Le module de gestion des comptes permet aux clients business de gérer leurs comptes à distance et en toute sécurité.\n\nIl offre trois fonctionnalités principales :\n\n* **Consulter le solde d'un compte** : Obtenir à tout moment les informations relatives au solde et aux détails d'un compte spécifique.\n\n* **Lister les opérations** : Afficher l'historique des opérations effectuées sur les comptes (en provenance ou à destination), avec des options de filtrage et de pagination.\n\n* **Effectuer des transferts intra-comptes** : Initier des transferts de fonds entre les comptes détenus par le même client et domiciliés dans la même institution financière.\n"
    },
    {
      "name": "Alias",
      "description": "Un alias de compte est une identification choisie par un client qui lui permet de recevoir des virements sans fournir les informations d’identification de son compte.\n\nLes alias améliorent l’expérience client en permettant au client d'effectuer des transactions de manière transparente sans avoir besoin de connaître et de saisir les détails de compte bancaire du payé.\nLa correspondance entre un alias et un compte client est stockée dans le répertoire des alias centralisé (RAC) de la plateforme PI-SPI.\n"
    },
    {
      "name": "Enrôlement",
      "description": "L'enrôlement de l'alias est le processus par lequel une entreprise enregistre et associe un alias — l'adresse de paiement — à chacun de ses clients ou fournisseurs.\nCet alias devient alors la référence utilisée pour recevoir ou envoyer des paiements, ce qui simplifie la gestion des opérations.\n\nPour plus d'informations, veuillez consulter la documentation sur l'enrôlement des alias.\n"
    },
    {
      "name": "Notification",
      "x-displayName": "Gestion des webhooks",
      "description": "Les clients business peuvent configurer des webhooks pour recevoir des notifications lorsque des opérations sont effectuées sur leurs comptes.\n\nLes webhooks sont une technologie utilisée pour établir une communication instantanée entre différents systèmes et plateformes,\npermettant l'échange d'informations et de données en temps réel.\n\nDans le contexte de l'API business, les webhooks sont un moyen efficace de tenir les clients informés des mouvements financiers sur leurs comptes sans avoir à vérifier constamment la plateforme (polling).\n\nAinsi, lorsqu'un mouvement se produit sur un compte, comme un transfert ou une demande de paiement, le webhook se déclenche et envoie un message automatiquement au système du client, l'informant de l'opération effectuée.\n\nCe processus est très utile pour les clients qui ont besoin de suivre leurs comptes en temps réel, notamment les entreprises qui doivent gérer des flux financiers complexes. Il permet également d'**automatiser des actions métier** suite à la réception de notifications. Par exemple :\n- Imprimer automatiquement un reçu lorsqu'un paiement est reçu\n- Déclencher une livraison de produit ou service dès confirmation du paiement\n- Mettre à jour automatiquement le statut d'une commande\n- Envoyer des confirmations par email ou SMS au client final\n\nDe plus, les webhooks sont hautement personnalisables, permettant aux clients de configurer les notifications en fonction de leurs besoins de gestion et de suivi.\n\n## Types d'évènements\nIl existe différentes catégories d'événements :\n\n* Événements liés aux ordres de paiement\n* Événements liés aux demandes de paiement\n* Événements liés aux retours de fonds\n\n### Événements liés aux ordres de paiement\n<table>\n  <tr>\n    <th>Code</th>\n    <th>Description de l'évènement</th>\n  </tr>\n  <tr>\n    <td><b>PAIEMENT_RECU</b></td>\n    <td>Lorsque le business reçoit un paiement ou lorsqu'une demande de paiement est acceptée</td>\n  </tr>\n  <tr>\n    <td><b>PAIEMENT_ENVOYE</b></td>\n    <td>Lorsque le business envoie un ordre de paiement et que celui-ci est irrévocable.\n  </tr>\n  <tr>\n    <td><b>PAIEMENT_REJETE</b></td>\n    <td>Lorsque le business envoie un ordre de paiement et que celui-ci est rejeté.\n  </tr>\n</table>\n\n### Événements liés aux demandes de paiement\n<table>\n  <tr>\n    <th>Code</th>\n    <th>Description de l'évènement</th>\n  </tr>\n  <tr>\n    <td><b>RTP_RECU</b></td>\n    <td>Lorsque le business reçoit une demande de paiement</td>\n  </tr>\n  <tr>\n    <td><b>RTP_REJETE</b></td>\n    <td>Lorsque le business envoie une demande de paiement et que cette demande est rejetée.\n  </tr>\n  <tr>\n    <td><b>RTP_REPONSE_REJETE</b></td>\n    <td>Lorsque le business rejette une demande de paiement et que cette réponse de rejet est rejetée.\n  </tr>\n</table>\n\n### Événements liés aux retours de fonds et demandes d'annulation\n<table>\n  <tr>\n    <th>Code</th>\n    <th>Description de l'évènement</th>\n  </tr>\n  <tr>\n    <td><b>ANNULATION_DEMANDE</b></td>\n    <td>Lorsque le business reçoit une demande d'annulation de paiement</td>\n  </tr>\n  <tr>\n    <td><b>ANNULATION_REPONSE_REJETE</b></td>\n    <td>Lorsque le business rejette une demande d'annulation de paiement et que cette réponse de rejet est rejetée.</td>\n  </tr>\n   <tr>\n    <td><b>RETOUR_ENVOYE</b></td>\n    <td>Lorsque le business envoie un retour de fonds et que celui-ci est irrévocable.\n  </tr>\n  <tr>\n    <td><b>RETOUR_REJETE</b></td>\n    <td>Lorsque le business envoie un retour de fonds et que celui-ci est rejeté.\n  </tr>\n  <tr>\n    <td><b>RETOUR_RECU</b></td>\n    <td>Lorsque le business reçoit un retour de fonds ou lorsqu'une demande d'annulation de paiement a été acceptée</td>\n  </tr>\n  <tr>\n    <td><b>ANNULATION_REJETE</b></td>\n    <td>Lorsque le business envoie une demande d'annulation de paiement et que celle-ci est rejetée.</td>\n  </tr>\n</table>\n\n## Sécurité des webhooks\n\n### Cryptage des données\nToutes les communications doivent se faire en utilisant une connexion SSL.\n\n### Authentification\nLe lien de rappel doit être protégé par un système d'authentification.\nmTLS doit être utilisé pour gérer l'authentification du participant appelant.\nLe certificat mTLS utilisé doit être délivré par une autorité de certification de la BCEAO.\n\n### Signature des données\nPour éviter les modifications indésirables, les événements doivent être signés.\nCela peut se faire via l'utilisation d'un code d'authentification de message basé sur le hachage (HMAC),\nqui consiste en un algorithme de hachage et un code secret ou une clé que les deux parties partagent.\n"
    },
    {
      "name": "DemandesDePaiement",
      "x-displayName": "Demandes de paiement",
      "description": "Une demande de paiement est une demande adressée à une personne ou à une entité pour solliciter le règlement d'un achat, d'un service rendu, d'une dette ou de toute autre obligation financière.\n\nLa demande de paiement indique au payeur identifié par son alias les modalités de réglement.\n\nLes options de paiement du payeur sont données par `dateLimitePaiement` et `dateLimiteReponse`:\n- la demande de paiement ne peut être acceptée ou rejetée apres _dateLimiteReponse_\n- Lorsque _dateLimiteReponse_ n'est pas renseigné, la valeur par défaut est la date de la demande + 90 jours (3 mois)\n- le date d'échéance du paiement doit être indiquée avec _dateLimitePaiement_\n- Lorsqu'une remise est appliquée, elle reste valide jusqu'à _dateLimitePaiement_\n\nLorsqu'un client reçoit une demande de paiement, il peut choisir de:\n  1. `Accepter et Payer tout de suite`\n  2. `Accepter et Payer plus tard` (Programmer le paiement)\n  3. `Refuser`\n  4. `Ignorer`\n\nLorsque _dateLimiteReponse_ est inférieure à 24h, le paiement ne peut pas être programmé par le payeur.\n\nPour les demandes de paiement immédiats sur site, les champs _dateLimitePaiement_ et _dateLimiteReponse_ ne sont pas envoyés.\nLa demande expire au plus tard 24h après sa création.\n\nPour les demandes de paiement e-commerce et les demandes de paiement de facture, la  _dateLimitePaiement_ doit être renseignée.\nPour limiter l'exposition des clients aux cas de fraude, la  _dateLimitePaiement_ doit être inférieure à 3 minutes pour les demandes  de paiement e-commerce.\n"
    },
    {
      "name": "DemandesDePaiementRecues",
      "x-displayName": "Demandes de paiement recues",
      "description": "Les demandes de paiement recues sont les demandes de paiement reçues par le business.\nLe business peut accepter ou rejeter les demandes de paiement recues.\n"
    },
    {
      "name": "DemandesDePaiementEnMasse",
      "x-displayName": "Demandes de paiement en masse",
      "description": "La demande de paiement en masse permet d'envoyer plusieurs demandes de paiement en une seule action.\n"
    },
    {
      "name": "PaiementRecu",
      "x-displayName": "Paiements reçus",
      "description": "Cette fonctionnalité permet au business de consulter les paiements reçus.\n"
    },
    {
      "name": "PaiementEnvoye",
      "x-displayName": "Paiements envoyés",
      "description": "Cette fonctionnalité permet au business d'effectuer des paiements à destination\n- des clients de type **P** (Personne physique / Particulier),\n- des clients de type **C** (Personne physique commerçante / Commerçant),\n- des clients de type **B** (Entreprise / Business),\n- des clients de type **G** (Entité gouvernementale)\n\n### Seuils de paiement\n\nLes montants maximaux des paiements dépendent du type de client émetteur et du type de client destinataire.\nTous les montants sont exprimés en **francs CFA (XOF)**.\n\n#### Montants maximaux par type de transaction\n\n| Type de transaction | Émetteur | Destinataire | Montant maximum |\n|---------------------|----------|--------------|-----------------|\n| **P2P** | Particulier | Particulier | 5 000 000 XOF |\n| **P2C** | Particulier | Commerçant | 5 000 000 XOF |\n| **P2B** | Particulier | Entreprise | 5 000 000 XOF |\n| **P2G** | Particulier | Gouvernement | 5 000 000 XOF |\n| **C2P** | Commerçant | Particulier | 5 000 000 XOF |\n| **C2C** | Commerçant | Commerçant | 5 000 000 XOF |\n| **C2B** | Commerçant | Entreprise | 5 000 000 XOF |\n| **C2G** | Commerçant | Gouvernement | 5 000 000 XOF |\n| **B2P** | Entreprise | Particulier | 10 000 000 XOF |\n| **B2C** | Entreprise | Commerçant | 10 000 000 XOF |\n| **B2B** | Entreprise | Entreprise | 100 000 000 XOF |\n| **B2G** | Entreprise | Gouvernement | 100 000 000 XOF |\n| **G2P** | Gouvernement | Particulier | 10 000 000 XOF |\n| **G2C** | Gouvernement | Commerçant | 10 000 000 XOF |\n| **G2B** | Gouvernement | Entreprise | 100 000 000 XOF |\n| **G2G** | Gouvernement | Gouvernement | 100 000 000 XOF |\n\nEn tant qu'entreprise, vous pouvez :\n\n**Envoyer des paiements :**\n- Jusqu'à **10 000 000 XOF** vers les Particuliers (P) et Commerçants (C)\n- Jusqu'à **100 000 000 XOF** vers les Entreprises (B) et entités Gouvernementales (G)\n\n**Recevoir des paiements :**\n- Jusqu'à **5 000 000 XOF** de la part des Particuliers (P) et Commerçants (C)\n- Jusqu'à **100 000 000 XOF** de la part des Entreprises (B) et entités Gouvernementales (G)\n"
    },
    {
      "name": "PaiementVerification",
      "x-displayName": "Vérification des paiements",
      "description": "Cette fonctionnalité permet au business de vérifier le statut d'un paiement à partir du txId ou du end2endId.\n"
    },
    {
      "name": "PaiementEnMasse",
      "x-displayName": "Paiements en masse",
      "description": "Un paiement en masse est un ensemble de paiements qui sont liés entre eux par un identifiant unique (instructionId).\nLe paiement en masse peut être relancé en cas d'échec de paiement.\n\n**Taille maximale d'une transaction**:\nLa taille maximale d'une transaction a été estimée en considérant **la longueur maximale de chaque champ** (`txId`, `payeAlias`, `montant`, `motif`, `refDocNumero`, `refDocType`).\n- Taille maximale par transaction : ~310 octets\n  - `txId` : 35 caractères\n  - `payeAlias` : 36 caractères\n  - `montant` : 10 caractères pour 1 milliard\n  - `motif` : 140 caractères\n  - `refDocNumero` : 35 caractères\n  - `refDocType` : 4 caractères\n  - JSON overhead : ~50 octets\n\n**Exemples**:\n| Nombre de transactions | Taille JSON approximative |\n|------------------------|--------------------------|\n| 1 000 | ~0,31 MB |\n| 5 000 | ~1,55 MB |\n| 10 000 | ~3,1 MB |\n\n**Enjeux à prendre en compte**:\n- Performance du serveur : plus le lot est volumineux, plus le traitement peut être long.\n- Timeout HTTP : des lots très gros peuvent provoquer des erreurs côté client ou serveur.\n- Risque d’échec partiel : en cas de problème réseau ou serveur, un lot très gros est plus difficile à relancer.\n- Recommandation pratique : les lots de 500 à 5 000 transactions restent faciles à gérer. Pour des volumes supérieurs, découper le paiement en plusieurs sous-lots.\n"
    },
    {
      "name": "RetoursdeFonds",
      "x-displayName": "Retours de fonds",
      "description": "L'opération de retour de fonds est initiée par le client payé pour retourner les fonds d'un paiement reçu.\nLe payé peut retourner les fonds jusqu'à 90 jours après la date de paiement.\nAprès 90 jours, le retour de fonds ne peut plus être effectué.\n"
    },
    {
      "name": "DemandeAnnulation",
      "x-displayName": "Demandes d'annulation",
      "description": "La demande d'annulation est une opération initiée par le client payeur pour solliciter le retour des fonds d'un paiement envoyé.\n\nTant que le payé n'a pas retourné les fonds, le payeur peut demander l'annulation du paiement.\nPar exemple lorsque le payeur demande une deuxième fois l'annulation du paiement, une nouvelle demande d'annulation sera envoyée au payé.\n\nLe payeur peut demander l'annulation du paiement jusqu'à 90 jours après la date de paiement.\nAprès 90 jours, la demande d'annulation ne peut plus être effectuée.\n"
    }
  ],
  "x-tagGroups": [
    {
      "name": "Gestion des comptes",
      "tags": [
        "Alias",
        "Comptes"
      ]
    },
    {
      "name": "Enrôlement des alias",
      "tags": [
        "Enrôlement"
      ]
    },
    {
      "name": "Notifications",
      "tags": [
        "Notification"
      ]
    },
    {
      "name": "Demandes de paiement",
      "tags": [
        "DemandesDePaiement",
        "DemandesDePaiementRecues",
        "DemandesDePaiementEnMasse"
      ]
    },
    {
      "name": "Paiements",
      "tags": [
        "PaiementEnvoye",
        "PaiementRecu",
        "PaiementVerification",
        "PaiementEnMasse"
      ]
    },
    {
      "name": "Retours de fonds",
      "tags": [
        "RetoursdeFonds",
        "DemandeAnnulation"
      ]
    }
  ],
  "security": [
    {
      "api_key": []
    }
  ],
  "paths": {
    "/comptes": {
      "get": {
        "tags": [
          "Comptes"
        ],
        "summary": "Lister les comptes",
        "description": "Cet endpoint permet au client business de consulter la liste de tous ses comptes auprès du participant.\n\nLes informations retournées pour chaque compte incluent :\n- Le numéro du compte\n- Le type de compte \n- La date d'ouverture\n- Le statut du compte (ouvert, bloqué ou clôturé)\n\nCette consultation permet au client business d'obtenir la liste de ses comptes.\n",
        "security": [
          {
            "OAuth2": [
              "compte.read"
            ]
          }
        ],
        "operationId": "comptesLister",
        "responses": {
          "200": {
            "description": "Succès de l'opération",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompteListe"
                },
                "examples": {
                  "liste-comptes": {
                    "$ref": "#/components/examples/CompteListe"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/comptes/{numero}": {
      "parameters": [
        {
          "name": "numero",
          "in": "path",
          "description": "Le numéro de compte sur lequel porte la demande",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "get": {
        "tags": [
          "Comptes"
        ],
        "summary": "Détails d'un compte",
        "description": "Cet endpoint permet au client de consulter à tout moment les informations détaillées relatives à un compte spécifique.\n\nLes informations retournées incluent :\n- Le type de compte (compte courant, épargne, etc.)\n- Le numéro du compte\n- La date d'ouverture du compte\n- Le solde actuel du compte\n- Le statut du compte (ouvert, bloqué ou clôturé)\n- L'indicateur de pré-confirmation pour les opérations\n\nCette consultation permet au client business de surveiller l'état de ses comptes en temps réel et de prendre des décisions éclairées concernant ses opérations financières.\n",
        "security": [
          {
            "OAuth2": [
              "compte.read"
            ]
          }
        ],
        "operationId": "compteSoldeConsulter",
        "responses": {
          "200": {
            "description": "Succès de l'opération",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompteSolde"
                },
                "examples": {
                  "solde-compte": {
                    "$ref": "#/components/examples/CompteSolde"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "404": {
            "$ref": "#/components/responses/RessourceInexistant"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/comptes/transactions": {
      "post": {
        "tags": [
          "Comptes"
        ],
        "summary": "Transfert intra-comptes",
        "operationId": "compteTransfertIntraCreer",
        "security": [
          {
            "OAuth2": [
              "compte_transaction.write"
            ]
          }
        ],
        "description": "Le transfert intra-comptes est un transfert de fonds entre deux comptes détenus par la même entité juridique et domiciliés au sein de la même institution financière. Le compte source (débiteur/payeur) et le compte destination (créditeur/bénéficiaire) appartiennent donc au même client.\n",
        "requestBody": {
          "description": "Le client business peut effectuer un transfert intra-comptes en utilisant les numéros de compte.\n",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/CompteTransfertIntraRequest"
              },
              "examples": {
                "transfert-intra": {
                  "$ref": "#/components/examples/CompteTransfertRequestNumero"
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Transfert effectué avec succès.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompteTransfertIntraReponse"
                },
                "examples": {
                  "transfert-success-reponse": {
                    "$ref": "#/components/examples/CompteTransfertReponseInitie"
                  },
                  "transfert-irrevocable-reponse": {
                    "$ref": "#/components/examples/CompteTransfertReponseIrrevocable"
                  },
                  "transfert-rejete-reponse": {
                    "$ref": "#/components/examples/CompteTransfertReponseRejete"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/FormatInvalide"
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "403": {
            "description": "Interdiction d'effectuer le paiement",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem7807"
                },
                "examples": {
                  "transfert-solde-insuffisant": {
                    "$ref": "#/components/examples/CompteTransfertReponseSoldeInsuffisant"
                  },
                  "transfert-paye-bloque": {
                    "$ref": "#/components/examples/CompteTransfertReponsePayeBloque"
                  }
                }
              }
            }
          },
          "409": {
            "description": "Identifiant de transaction (txId) déjà utilisé avec des données différentes.",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem7807"
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      },
      "get": {
        "tags": [
          "Comptes"
        ],
        "summary": "Lister les transferts intra-comptes",
        "description": "Endpoint pour la consultation des transferts entre ses differents comptes chez le participant.\n",
        "operationId": "compteTransfertIntraLister",
        "security": [
          {
            "OAuth2": [
              "compte_transaction.read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "txId",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Identifiant de la transaction",
              "description": "Filtre les opérations selon l'identifiant de la transaction"
            }
          },
          {
            "name": "statut",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Statut du compte",
              "description": "Filtre les opérations selon le statut de ceux-ci"
            }
          },
          {
            "name": "payeurNumero",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Compte payeur",
              "description": "Filtre les opérations selon le numéro de compte du payeur"
            }
          },
          {
            "name": "payeNumero",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Compte payé",
              "description": "Filtre les opérations selon le numéro de compte du payé"
            }
          },
          {
            "name": "dateEnvoi",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time",
              "title": "Date d'envoi",
              "description": "Filtre les opérations selon la date d'envoi"
            }
          },
          {
            "name": "dateIrrevocabilite",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time",
              "title": "Date d'irrévocabilité",
              "description": "Filtre les opérations selon la date d'irrévocabilité"
            }
          },
          {
            "name": "motif",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Motif",
              "description": "Filtre les opérations selon le motif"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Page",
              "description": "Identifiant de la page"
            }
          },
          {
            "name": "size",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Taille de la page",
              "description": "Nombre d'éléments à retourner"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Triage",
              "description": "Trie les éléments selon le champ spécifié"
            }
          },
          {
            "$ref": "#/components/parameters/Champs"
          }
        ],
        "responses": {
          "200": {
            "description": "Succès de l'opération",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompteOperationListe"
                },
                "examples": {
                  "transfert-liste-reponse": {
                    "$ref": "#/components/examples/CompteTransfertListeReponse"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/comptes/{numero}/alias": {
      "parameters": [
        {
          "name": "numero",
          "in": "path",
          "description": "Le numéro de compte sur lequel porte la demande",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "post": {
        "tags": [
          "Alias"
        ],
        "summary": "Créer un alias",
        "security": [
          {
            "OAuth2": [
              "alias.write"
            ]
          }
        ],
        "description": "Le répertoire des alias de compte permet au business de créer les types d'alias suivants :\n- Une adresse de paiement, codifiée par SHID: cet alias est obtenu par génération d'une clé aléatoire unique sur 36 positions par le système.\n- Un identifiant de compte marchand, codifié par MCOD: ce type d'alias est prévu pour supporter les paiements par code USSD.\n\nUn client business peut créer plusieurs alias pour un compte donné.\n\nUne limite de 20 alias par compte est fixée par défaut. Cette limite peut être augmentée selon les besoins du client.\n",
        "operationId": "aliasCreer",
        "requestBody": {
          "description": "Données pour la création d'alias.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AliasCreationRequest"
              },
              "examples": {
                "alias-SHID": {
                  "$ref": "#/components/examples/AliasCreationRequestSHID"
                },
                "alias-MCOD": {
                  "$ref": "#/components/examples/AliasCreationRequestMCOD"
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Opération effectuée avec succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AliasCreationReponse"
                },
                "examples": {
                  "alias-SHID": {
                    "$ref": "#/components/examples/AliasCreationReponseSHID"
                  },
                  "alias-MCOD": {
                    "$ref": "#/components/examples/AliasCreationReponseMCOD"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/FormatInvalide"
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "403": {
            "description": "Opération interdite",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem7807"
                },
                "examples": {
                  "limite-alias": {
                    "$ref": "#/components/examples/AliasCreationReponseDepassementLimit"
                  }
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/RessourceInexistant"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      },
      "get": {
        "tags": [
          "Alias"
        ],
        "summary": "Lister les alias",
        "security": [
          {
            "OAuth2": [
              "alias.read"
            ]
          }
        ],
        "description": "Ce point de terminaison permet de consulter la liste des alias d'un compte.\n",
        "operationId": "aliasLister",
        "responses": {
          "200": {
            "description": "Succès de l'opération",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AliasReponseListe"
                },
                "examples": {
                  "liste-alias": {
                    "$ref": "#/components/examples/AliasReponseListe"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/comptes/{numero}/alias/{cle}": {
      "parameters": [
        {
          "name": "numero",
          "in": "path",
          "description": "Le numéro de compte",
          "required": true,
          "schema": {
            "type": "string"
          }
        },
        {
          "name": "cle",
          "in": "path",
          "description": "La cle de l'alias",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "delete": {
        "tags": [
          "Alias"
        ],
        "summary": "Supprimer un alias",
        "security": [
          {
            "OAuth2": [
              "alias.delete"
            ]
          }
        ],
        "description": "Le client peut supprimer à tout moment un alias de compte.\n",
        "operationId": "aliasSupprimer",
        "responses": {
          "204": {
            "description": "Opération effectué avec succès"
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "404": {
            "$ref": "#/components/responses/RessourceInexistant"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/alias/{cle}": {
      "parameters": [
        {
          "name": "cle",
          "in": "path",
          "description": "Clé de l'alias (UUID v4)",
          "required": true,
          "schema": {
            "type": "string",
            "format": "uuid",
            "pattern": "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$"
          },
          "example": "550e8400-e29b-41d4-a716-446655440000"
        }
      ],
      "get": {
        "tags": [
          "Enrôlement"
        ],
        "summary": "Rechercher un alias",
        "security": [
          {
            "OAuth2": [
              "enrolement_alias.read"
            ]
          }
        ],
        "description": "Ce endpoint permet de vérifier l'existence d'un alias dans le système.\nL'alias doit être une adresse de paiement valide.\nRetourne les informations du client et de l'alias si l'alias existe,\nou un code 404 si l'alias n'existe pas.\n",
        "operationId": "enrolementVerifier",
        "responses": {
          "200": {
            "description": "L'alias existe et les informations sont retournées",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object",
                  "properties": {
                    "client": {
                      "type": "object",
                      "properties": {
                        "nom": {
                          "type": "string",
                          "description": "Nom du client ou Dénomination sociale de l'entreprise",
                          "example": "Jean Dupont"
                        },
                        "pays": {
                          "type": "string",
                          "description": "Code pays ISO 3166-1 alpha-2",
                          "example": "CI"
                        },
                        "photo": {
                          "type": "string",
                          "description": "Photo ou logo du client URL (Optionnel)",
                          "example": "https://example.com/photo.jpg"
                        },
                        "categorie": {
                          "type": "string",
                          "enum": [
                            "P",
                            "C",
                            "B",
                            "G"
                          ],
                          "description": "Type de client :\n- P : Particulier (Personne physique)\n- C : Commerçant ou Entreprise individuelle\n- B : Entreprise\n- G : Entité gouvernementale\n",
                          "example": "P"
                        }
                      }
                    },
                    "alias": {
                      "type": "object",
                      "properties": {
                        "cle": {
                          "type": "string",
                          "format": "uuid",
                          "description": "Clé unique de l'alias (UUID v4)",
                          "example": "550e8400-e29b-41d4-a716-446655440000"
                        }
                      }
                    }
                  }
                },
                "examples": {
                  "client-particulier": {
                    "summary": "Exemple pour un client de type P (Particulier)",
                    "value": {
                      "client": {
                        "nom": "Jean Dupont",
                        "pays": "CI",
                        "categorie": "P"
                      },
                      "alias": {
                        "cle": "550e8400-e29b-41d4-a716-446655440000"
                      }
                    }
                  },
                  "client-commercant": {
                    "summary": "Exemple pour un client de type C (Commerçant)",
                    "value": {
                      "client": {
                        "nom": "Boutique ABC SARL",
                        "pays": "SN",
                        "categorie": "C"
                      },
                      "alias": {
                        "cle": "550e8400-e29b-41d4-a716-446655440000"
                      }
                    }
                  },
                  "client-entreprise": {
                    "summary": "Exemple pour un client de type B (Entreprise)",
                    "value": {
                      "client": {
                        "nom": "Kdi & Sisters",
                        "pays": "SN",
                        "photo": "https://example.com/logos/sgci.png",
                        "categorie": "B"
                      },
                      "alias": {
                        "cle": "550e8400-e29b-41d4-a716-446655440000"
                      }
                    }
                  },
                  "client-gouvernement": {
                    "summary": "Exemple pour un client de type G (Entité gouvernementale)",
                    "value": {
                      "client": {
                        "nom": "Ministère de l'Economie et des Finances",
                        "pays": "BF",
                        "photo": "https://example.com/logos/mef.png",
                        "categorie": "G"
                      },
                      "alias": {
                        "cle": "550e8400-e29b-41d4-a716-446655440000"
                      }
                    }
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/FormatInvalide"
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "404": {
            "description": "L'alias n'existe pas dans le système",
            "$ref": "#/components/responses/RessourceInexistant"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/webhooks": {
      "post": {
        "tags": [
          "Notification"
        ],
        "summary": "Créer un lien de rappel.",
        "security": [
          {
            "OAuth2": [
              "webhook.write"
            ]
          }
        ],
        "operationId": "webhookCreer",
        "description": "Cet endpoint permet au client de configurer des webhooks (liens de rappel) pour recevoir des notifications en temps réel.\n\nLe client dispose d'une grande flexibilité dans la configuration de ses webhooks et peut choisir parmi plusieurs stratégies :\n\n**1. Callback URL général**\n- Un seul point de rappel pour toutes les notifications\n- Tous les événements de tous les comptes/alias sont envoyés à la même URL\n- Configuration simple, idéale pour centraliser toutes les notifications\n\n**2. Callback URL par alias**\n- Un point de rappel distinct pour chaque alias de compte\n- Permet de router les notifications vers des systèmes différents selon le compte concerné\n- Utile pour isoler les flux de notifications par compte ou par service\n\n**3. Callback URL par événement**\n- Un point de rappel spécifique pour chaque type d'événement (PAIEMENT_RECU, RTP_RECU, etc.)\n- Permet de traiter différemment chaque catégorie d'événement\n- Facilite la séparation des traitements métier (paiements vs demandes vs retours)\n\n**4. Callback URL par événement et alias**\n- Granularité maximale : un point de rappel pour chaque combinaison événement/alias\n- Configuration la plus fine pour des besoins très spécifiques\n- Permet de router précisément chaque notification vers le système approprié\n\nCette flexibilité permet aux clients d'adapter la configuration des webhooks à leur architecture technique et à leurs besoins métier.\n\n**Note** : Un business peut configurer maximum 20 webhooks. Si le business essaie de créer plus de 20 webhooks, la requête sera rejetée avec le code 403.\n\n## Notifications webhook\n\nUne fois le webhook configuré, le participant enverra des notifications POST vers l'URL de callback spécifiée (`callbackUrl`) lorsque les événements configurés se produisent.\n\n### Format de la notification\n\nChaque notification est envoyée avec :\n- **Méthode** : `POST`\n- **Content-Type** : `application/json`\n- **En-tête X-Signature** : Signature HMAC-SHA256 du corps de la requête pour vérifier l'authenticité\n- **Authentification mTLS** : Le participant utilise un certificat délivré par l'autorité de certification BCEAO\n\n### Corps de la notification\n\nLe corps de la requête contient un tableau d'événements (voir schéma `WebhookEventsList`). Chaque événement inclut :\n- Le type d'événement (ex: `PAIEMENT_RECU`, `RTP_RECU`, etc.)\n- Les données associées à l'événement\n- Les métadonnées de la transaction\n\n### Réponse attendue\n\nVotre endpoint de callback doit répondre avec :\n- **204 No Content** : Si la notification a été traitée avec succès\n- **401 Unauthorized** : Si la signature est invalide\n- **500 Internal Server Error** : En cas d'erreur interne lors du traitement\n\n⚠️ **Important** : Répondez rapidement (dans les 5 secondes) pour éviter les timeouts. Si le traitement prend du temps, traitez la notification de manière asynchrone.\n",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookCreationRequest"
              },
              "examples": {
                "toutes-les-notifications": {
                  "$ref": "#/components/examples/WebhookCreationRequestUnSeul"
                },
                "notifications-par-alias": {
                  "$ref": "#/components/examples/NotificationCreationWebhookAlias"
                },
                "notifications-par-event": {
                  "$ref": "#/components/examples/NotificationCreationWebhookRTP"
                },
                "notifications-par-event-et-alias": {
                  "$ref": "#/components/examples/NotificationCreationWebhookPaiementRecu"
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "201": {
            "description": "Webhook créé avec succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookCreationResponse"
                },
                "examples": {
                  "notification-paiement-recu": {
                    "$ref": "#/components/examples/NotificationCreationWebhookReponsePaiementRecu"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/FormatInvalide"
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "409": {
            "$ref": "#/components/responses/DejaExistant"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        },
        "callbacks": {
          "webhookNotification": {
            "{$request.body#/callbackUrl}": {
              "post": {
                "operationId": "webhookNotification",
                "summary": "Notification webhook",
                "security": [],
                "description": "Callback POST envoyé par le participant vers l'URL configurée par le client.\n\n**En-têtes de sécurité** :\n- `X-Signature` : Signature HMAC pour vérifier l'authenticité de la notification\n\n**Authentification** :\n- Le callback utilise mTLS avec un certificat délivré par l'autorité de certification BCEAO\n",
                "parameters": [
                  {
                    "name": "X-Signature",
                    "in": "header",
                    "required": true,
                    "description": "Signature HMAC-SHA256 du corps de la requête.\n\nPermet au client de vérifier que la notification provient bien du participant.\nLa signature est calculée avec une clé secrète partagée entre le participant et le client.\n",
                    "schema": {
                      "type": "string",
                      "example": "a1b2c3d4e5f6g7h8i9j0k1l2m3n4o5p6"
                    }
                  },
                  {
                    "name": "Content-Type",
                    "in": "header",
                    "required": true,
                    "description": "Type de contenu de la requête",
                    "schema": {
                      "type": "string",
                      "enum": [
                        "application/json"
                      ],
                      "example": "application/json"
                    }
                  }
                ],
                "requestBody": {
                  "required": true,
                  "content": {
                    "application/json": {
                      "schema": {
                        "$ref": "#/components/schemas/WebhookEventsList"
                      },
                      "examples": {
                        "PAIEMENT_RECU": {
                          "$ref": "#/components/examples/WebhookEventPAIEMENT_RECU"
                        },
                        "PAIEMENT_REJETE": {
                          "$ref": "#/components/examples/WebhookEventPAIEMENT_REJETE"
                        },
                        "PAIEMENT_ENVOYE": {
                          "$ref": "#/components/examples/WebhookEventPAIEMENT_ENVOYE"
                        },
                        "RTP_RECU": {
                          "$ref": "#/components/examples/WebhookEventRTP_RECU"
                        },
                        "RTP_REJETE": {
                          "$ref": "#/components/examples/WebhookEventRTP_REJETE"
                        },
                        "PAIEMENT_RECU_RTP_ACCEPTE": {
                          "$ref": "#/components/examples/WebhookEventRTP_ENVOYE_ACCEPTE"
                        },
                        "ANNULATION_DEMANDE": {
                          "$ref": "#/components/examples/WebhookEventANNULATION_DEMANDE"
                        },
                        "ANNULATION_REJETE": {
                          "$ref": "#/components/examples/WebhookEventANNULATION_REJETE"
                        },
                        "RETOUR_ENVOYE": {
                          "$ref": "#/components/examples/WebhookEventRETOUR_ENVOYE"
                        },
                        "RETOUR_REJETE": {
                          "$ref": "#/components/examples/WebhookEventRETOUR_REJETE"
                        },
                        "RETOUR_RECU": {
                          "$ref": "#/components/examples/WebhookEventRETOUR_RECU"
                        },
                        "EVENEMENTS_MULTIPLES": {
                          "$ref": "#/components/examples/WebhookEventsMultiples"
                        }
                      }
                    }
                  }
                },
                "responses": {
                  "204": {
                    "description": "Notification reçue avec succès"
                  },
                  "400": {
                    "description": "Requête malformée"
                  },
                  "401": {
                    "description": "Autorisations manquantes"
                  },
                  "403": {
                    "description": "Accès refusé"
                  },
                  "500": {
                    "description": "Erreur interne du serveur"
                  },
                  "502": {
                    "description": "Erreur de communication"
                  },
                  "503": {
                    "description": "Service temporairement indisponible"
                  }
                }
              }
            }
          }
        }
      },
      "get": {
        "tags": [
          "Notification"
        ],
        "summary": "Lister les webhooks",
        "operationId": "webhookLister",
        "security": [
          {
            "OAuth2": [
              "webhook.read"
            ]
          }
        ],
        "description": "Endpoint pour lister les webhooks\n",
        "responses": {
          "200": {
            "description": "Liste des webhooks configurés",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookList"
                },
                "examples": {
                  "liste-webhooks": {
                    "$ref": "#/components/examples/WebhookListReponse"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/FormatInvalide"
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/webhooks/{id}": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "title": "Identifiant du webhook"
          }
        }
      ],
      "put": {
        "tags": [
          "Notification"
        ],
        "summary": "Modifier un Webhook",
        "operationId": "webhookModifier",
        "security": [
          {
            "OAuth2": [
              "webhook.write"
            ]
          }
        ],
        "description": "Endpoint pour la modification d'un webhook.\n",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookModificationRequest"
              },
              "examples": {
                "modification-callback-url": {
                  "$ref": "#/components/examples/NotificationModificationWebhookCallbackUrl"
                },
                "modification-alias": {
                  "$ref": "#/components/examples/NotificationModificationWebhookAlias"
                },
                "modification-events": {
                  "$ref": "#/components/examples/NotificationModificationWebhookEvents"
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Le Webhook a été modifié avec succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookData"
                },
                "examples": {
                  "notification-paiement-recu": {
                    "$ref": "#/components/examples/NotificationModificationReponsePaiementRecu"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      },
      "delete": {
        "tags": [
          "Notification"
        ],
        "summary": "Supprimer un Webhook",
        "operationId": "webhookSupprimer",
        "security": [
          {
            "OAuth2": [
              "webhook.delete"
            ]
          }
        ],
        "description": "Endpoint pour la suppression d'un webhook.\n",
        "responses": {
          "204": {
            "description": "Le Webhook  a été supprimé."
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      },
      "get": {
        "tags": [
          "Notification"
        ],
        "summary": "Recuperer un webhook",
        "operationId": "webhookConsulter",
        "security": [
          {
            "OAuth2": [
              "webhook.read"
            ]
          }
        ],
        "description": "Endpoint pour la consultation des informations d'un Webhook",
        "responses": {
          "200": {
            "description": "Details du webhook",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookData"
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/webhooks/{id}/secrets": {
      "parameters": [
        {
          "name": "id",
          "in": "path",
          "required": true,
          "schema": {
            "type": "string",
            "title": "Identifiant du webhook"
          }
        }
      ],
      "post": {
        "tags": [
          "Notification"
        ],
        "summary": "Renouveler le secret d'un webhook",
        "security": [
          {
            "OAuth2": [
              "webhook.write"
            ]
          }
        ],
        "operationId": "webhookSecretCreer",
        "description": "Cet endpoint permet au business de renouveler le secret d'un webhook.\n\nLe secret est utilisé pour signer les notifications envoyées par le participant.\n\nLors de la demande de renouvellement, le business doit préciser la date d'expiration du secret.\nA cette date, le secret actuel du webhook sera invalidé et le nouveau secret sera utilisé.\n",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/WebhookRenouvellementSecretRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Secret renouvellé avec succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/WebhookCreationResponse"
                },
                "examples": {
                  "notification-paiement-recu": {
                    "$ref": "#/components/examples/NotificationCreationWebhookReponsePaiementRecu"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/FormatInvalide"
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/demandes-paiements": {
      "post": {
        "tags": [
          "DemandesDePaiement"
        ],
        "summary": "Envoyer une demande",
        "security": [
          {
            "OAuth2": [
              "demande_paiement.write"
            ]
          }
        ],
        "description": "Ce point de terminaison permet d'envoyer une demande de paiement.\n\nLe business peut définir le champ `confirmation` à `true` pour demander une validation en deux étapes : le PSP retournera d'abord le résultat de la recherche d'alias (avec le nom et le pays du payeur), puis attendra une confirmation explicite avant d'envoyer la demande de paiement au payeur via l'endpoint `PUT /demandes-paiements/{txId}/confirmations`.\n\nSi le champ `confirmation` n'est pas défini ou est à `false`, le système envoie directement la demande de paiement au payeur.\n\n**Timeout de confirmation** : Si le business demande une validation en deux étapes , il dispose de **24 heures** pour confirmer ou annuler. Passé ce délai, la demande expire automatiquement.\n",
        "operationId": "demandePaiementCreer",
        "requestBody": {
          "description": "Données pour envoyer une demande de paiement.",
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DemandePaiementRequest"
              },
              "examples": {
                "paiement-avec-confirmation": {
                  "$ref": "#/components/examples/DemandePaiementRequestCasAvecConfirmation"
                },
                "paiement-sans-confirmation": {
                  "$ref": "#/components/examples/DemandePaiementRequestCasSansConfirmation"
                },
                "paiement-immediat-sur-site": {
                  "$ref": "#/components/examples/DemandePaiementImmediatSurSite"
                },
                "paiement-pico": {
                  "$ref": "#/components/examples/DemandePaiementPICO"
                },
                "paiement-picash": {
                  "$ref": "#/components/examples/DemandePaiementPICASH"
                },
                "paiement-sur-site-debit-differe": {
                  "$ref": "#/components/examples/DemandePaiementSurSiteDebitDiffere"
                },
                "paiement-immediat-en-ligne": {
                  "$ref": "#/components/examples/DemandePaiementImmediatEnLigne"
                },
                "paiement-en-ligne-debit-differe": {
                  "$ref": "#/components/examples/DemandePaiementEnLigneDebitDiffere"
                },
                "paiement-facture": {
                  "$ref": "#/components/examples/DemandePaiementFacture"
                },
                "paiement-facture-avec-remise": {
                  "$ref": "#/components/examples/DemandePaiementFactureAvecRemise"
                }
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Demande de paiement traitée. Le champ `statut` indique le résultat :\n- `INITIE` : En attente de confirmation (si `confirmation: true`)\n- `ENVOYE` : Demande envoyée au payeur avec succès (si `confirmation: false`)\n- `REJETE` : Demande rejetée. Le champ `statutRaison` contient le code d'erreur :\n  - `DU03` : txId dupliqué (déjà utilisé)\n  - `BE23` : Alias payeur invalide\n  - Autres codes ISO 20022\n",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DemandePaiementReponse"
                },
                "examples": {
                  "sans-confirmation": {
                    "$ref": "#/components/examples/DemandePaiementReponseCasSansConfirmation"
                  },
                  "avec-confirmation": {
                    "$ref": "#/components/examples/DemandePaiementReponseCasAvecConfirmation"
                  },
                  "rejete-txid-duplique": {
                    "$ref": "#/components/examples/DemandePaiementRejeteDU03"
                  },
                  "rejete-alias-invalide": {
                    "$ref": "#/components/examples/DemandePaiementRejeteBE23"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/FormatInvalide"
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      },
      "get": {
        "parameters": [
          {
            "name": "payeAlias",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "alias du client payé"
            }
          },
          {
            "name": "payeCompte",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "numéro de compte du client payé"
            }
          },
          {
            "name": "statut",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "INITIE",
                "ANNULE",
                "ENVOYE",
                "IRREVOCABLE",
                "REJETE"
              ],
              "title": "Statut de la demande de paiement"
            }
          },
          {
            "name": "categorie",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Categorie de la demande",
              "enum": [
                "631",
                "500",
                "521",
                "401"
              ]
            }
          },
          {
            "in": "query",
            "name": "dateDemande",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time",
              "title": "Date de la demande de paiement"
            }
          },
          {
            "in": "query",
            "name": "dateLimitePaiement",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time",
              "title": "Date limite de paiement"
            }
          },
          {
            "name": "payeurAlias",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "alias du client payeur"
            }
          },
          {
            "name": "montantAchat",
            "in": "query",
            "schema": {
              "type": "number",
              "title": "Montant de l'achat"
            }
          },
          {
            "name": "montantRetrait",
            "in": "query",
            "schema": {
              "type": "number",
              "title": "Montant du retrait"
            }
          },
          {
            "name": "debitDiffere",
            "in": "query",
            "schema": {
              "type": "boolean",
              "title": "Debit Differe",
              "description": "Recherche les enregistrements en fonction du debit differe."
            }
          },
          {
            "name": "remise",
            "in": "query",
            "schema": {
              "type": "boolean",
              "title": "Remise",
              "description": "Recherche les transactions avec ou sans remise."
            }
          },
          {
            "name": "motif",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Motif de la demande de paiement",
              "description": "Recherche les enregistrements en fonction du motif de la demande de paiement."
            }
          },
          {
            "in": "query",
            "name": "refDocType",
            "required": false,
            "schema": {
              "$ref": "#/components/schemas/RefDocType"
            }
          },
          {
            "name": "instructionId",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Instruction Id",
              "description": "Recherche les transactions d'une demande de paiement en masse"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Page",
              "description": "Identifiant de la page"
            }
          },
          {
            "name": "size",
            "in": "query",
            "schema": {
              "type": "number",
              "title": "Taille de la page",
              "description": "Nombre d'éléments à retourner"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Triage",
              "description": "Trie les éléments selon le champ spécifié"
            }
          },
          {
            "$ref": "#/components/parameters/Champs"
          }
        ],
        "tags": [
          "DemandesDePaiement"
        ],
        "summary": "Lister les demandes",
        "security": [
          {
            "OAuth2": [
              "demande_paiement.read"
            ]
          }
        ],
        "description": "Ce point de terminaison permet de lister les demandes de paiements effectuées par le client.",
        "operationId": "demandePaiementLister",
        "responses": {
          "200": {
            "description": "Succès de l'opération",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DemandePaiementListe"
                },
                "examples": {
                  "liste-demandes": {
                    "$ref": "#/components/examples/DemandePaiementEnvoyeesListe"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/demandes-paiements/{txId}": {
      "parameters": [
        {
          "name": "txId",
          "in": "path",
          "description": "L'identifiant de la transaction dans le SI du client business",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "get": {
        "tags": [
          "DemandesDePaiement"
        ],
        "summary": "Consulter une demande",
        "security": [
          {
            "OAuth2": [
              "demande_paiement.read"
            ]
          }
        ],
        "description": "Cet point de terminaison permet de consulter les details d'une demande de paiement envoyée.\n",
        "operationId": "demandePaiementRecuperer",
        "responses": {
          "200": {
            "description": "Opération effectuée avec succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DemandePaiementConsultationReponse"
                },
                "examples": {
                  "demande-envoyee": {
                    "$ref": "#/components/examples/DemandePaiementReponseCasSansConfirmation"
                  },
                  "demande-attente": {
                    "$ref": "#/components/examples/DemandePaiementReponseCasAvecConfirmation"
                  },
                  "demande-acceptee": {
                    "$ref": "#/components/examples/DemandePaiementReponseAcceptation"
                  },
                  "demande-rejetee-demandeur-inconnu": {
                    "$ref": "#/components/examples/DemandePaiementReponseRejetDemandeurInconnu"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "404": {
            "$ref": "#/components/responses/RessourceInexistant"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/demandes-paiements/{txId}/confirmations": {
      "parameters": [
        {
          "name": "txId",
          "in": "path",
          "description": "L'identifiant de la transaction dans le SI du payé",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "put": {
        "tags": [
          "DemandesDePaiement"
        ],
        "summary": "Confirmer la demande",
        "security": [
          {
            "OAuth2": [
              "demande_paiement.write"
            ]
          }
        ],
        "description": "Ce point de terminaison permet d'envoyer la confirmation de l'envoi d'une demande de paiement.\n\nLe client business confirme oui ou non si le PSP peut envoyer la demande au payeur après vérification des informations d'identification (nom et pays du payeur).\n\n**Idempotence** : Cet endpoint est idempotent.\n- Premier appel avec `decision: true` → Envoie la demande, retourne `200 OK {statut: \"ENVOYE\"}`\n- Appels suivants avec `decision: true` → Retourne `200 OK` avec l'état actuel (ENVOYE, IRREVOCABLE, ou REJETE) - idempotent\n- Premier appel avec `decision: false` → Annule, retourne `200 OK {statut: \"ANNULE\"}`\n- Appels suivants avec `decision: false` → Retourne `200 OK {statut: \"ANNULE\"}` (idempotent)\n- `decision: true` après `decision: false` → Retourne `403 Forbidden` (déjà annulé)\n- `decision: false` après `decision: true` → Retourne `403 Forbidden` (déjà confirmé)\n\n**Timeout** : La confirmation doit être envoyée dans les **24 heures** suivant la création de la demande. Passé ce délai, la demande expire automatiquement et ne peut plus être confirmée.\n\n**Changement de décision** : Une fois une décision prise, elle est définitive. Impossible de confirmer après avoir annulé, et vice-versa.\n",
        "operationId": "demandePaiementConfirmer",
        "requestBody": {
          "description": "Le client envoie oui ou non s'il confirme l'envoi de la demande",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DemandePaiementConfirmationRequest"
              },
              "examples": {
                "confirme": {
                  "$ref": "#/components/examples/DemandePaiementConfirmationRequeteCasConfirmationOui"
                },
                "annule": {
                  "$ref": "#/components/examples/DemandePaiementConfirmationRequeteCasConfirmationNon"
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Opération effectuée avec succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DemandePaiementConfirmationReponse"
                },
                "examples": {
                  "confirmation-oui": {
                    "$ref": "#/components/examples/DemandePaiementConfirmationReponseCasOui"
                  },
                  "confirmation-non": {
                    "$ref": "#/components/examples/DemandePaiementConfirmationReponseCasNon"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "403": {
            "description": "Opération interdite",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem7807"
                },
                "examples": {
                  "decision-true-apres-false": {
                    "summary": "Tentative de confirmation après annulation",
                    "value": {
                      "type": "about:blank",
                      "title": "Forbidden",
                      "status": 403,
                      "detail": "Impossible de confirmer une demande de paiement déjà annulée"
                    }
                  },
                  "decision-false-apres-true": {
                    "summary": "Tentative d'annulation après confirmation",
                    "value": {
                      "type": "about:blank",
                      "title": "Forbidden",
                      "status": 403,
                      "detail": "Impossible d'annuler une demande de paiement déjà confirmée"
                    }
                  },
                  "timeout-depasse": {
                    "summary": "Délai de confirmation dépassé",
                    "value": {
                      "type": "about:blank",
                      "title": "Forbidden",
                      "status": 403,
                      "detail": "Le délai de confirmation de 24 heures a été dépassé"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/RessourceInexistant"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/demandes-paiements-recues": {
      "get": {
        "parameters": [
          {
            "name": "statut",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "INITIE",
                "IRREVOCABLE",
                "REJETE"
              ],
              "title": "Statut de la demande de paiement"
            }
          },
          {
            "name": "categorie",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Categorie de la demande",
              "enum": [
                "631",
                "500",
                "521",
                "401"
              ]
            }
          },
          {
            "name": "payeurAlias",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "alias du compte qui a reçu la demande de paiement"
            }
          },
          {
            "name": "payeurCompte",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "numéro de compte qui a reçu la demande de paiement"
            }
          },
          {
            "name": "payeAlias",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "alias du client payé qui a envoyé la demande de paiement"
            }
          },
          {
            "in": "query",
            "name": "dateDemande",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time",
              "title": "Date de la demande de paiement"
            }
          },
          {
            "in": "query",
            "name": "dateLimitePaiement",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time",
              "title": "Date limite de paiement"
            }
          },
          {
            "name": "remise",
            "in": "query",
            "schema": {
              "type": "boolean",
              "title": "Remise",
              "description": "Recherche les transactions avec ou sans remise."
            }
          },
          {
            "name": "motif",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Motif de la demande de paiement",
              "description": "Recherche les enregistrements en fonction du motif de la demande de paiement."
            }
          },
          {
            "name": "refDocType",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Type de document justificatif",
              "description": "Recherche les enregistrements en fonction du type de document justificatif."
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Page",
              "description": "Identifiant de la page"
            }
          },
          {
            "name": "size",
            "in": "query",
            "schema": {
              "type": "number",
              "title": "Taille de la page",
              "description": "Nombre d'éléments à retourner"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Triage",
              "description": "Trie les éléments selon le champ spécifié"
            }
          },
          {
            "$ref": "#/components/parameters/Champs"
          }
        ],
        "tags": [
          "DemandesDePaiementRecues"
        ],
        "summary": "Lister les demandes reçues",
        "security": [
          {
            "OAuth2": [
              "demande_paiement.read"
            ]
          }
        ],
        "description": "Ce point de terminaison permet de lister les demandes de paiements reçues par l'entreprise.",
        "operationId": "demandePaiementRecueLister",
        "responses": {
          "200": {
            "description": "Succès de l'opération",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DemandePaiementListe"
                },
                "examples": {
                  "liste-demandes": {
                    "$ref": "#/components/examples/DemandePaiementRecuesListe"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/demandes-paiements-recues/{end2endId}": {
      "parameters": [
        {
          "name": "end2endId",
          "in": "path",
          "description": "L'identifiant de la demande de paiement reçue",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "get": {
        "tags": [
          "DemandesDePaiementRecues"
        ],
        "summary": "Consulter une demande reçue",
        "security": [
          {
            "OAuth2": [
              "demande_paiement.read"
            ]
          }
        ],
        "description": "Cet point de terminaison permet de consulter les details d'une demande de paiement reçue.\n",
        "operationId": "demandePaiementRecueRecuperer",
        "responses": {
          "200": {
            "description": "Opération effectuée avec succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DemandePaiementConsultationReponse"
                },
                "examples": {
                  "demande-recue-en-attente": {
                    "$ref": "#/components/examples/DemandePaiementRecueEnAttente"
                  },
                  "demande-recue-acceptee": {
                    "$ref": "#/components/examples/DemandePaiementRecueAcceptee"
                  },
                  "demande-recue-rejetee": {
                    "$ref": "#/components/examples/DemandePaiementRecueRejetee"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "404": {
            "$ref": "#/components/responses/RessourceInexistant"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/demandes-paiements-recues/{end2endId}/reponses": {
      "parameters": [
        {
          "name": "end2endId",
          "in": "path",
          "description": "L'identifiant de la demande de paiement reçue",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "put": {
        "tags": [
          "DemandesDePaiementRecues"
        ],
        "summary": "Accepter ou rejeter la demande",
        "security": [
          {
            "OAuth2": [
              "demande_paiement_reponse.write"
            ]
          }
        ],
        "description": "Ce point de terminaison permet au client d'accepter ou de rejeter une demande de paiement reçue.\n\nLe business peut accepter ou refuser la demande de paiement :\n- `accepter: true` : Accepte la demande de paiement (un paiement sera envoyé)\n- `accepter: false` : Refuse la demande de paiement\n\n**Idempotence** : Cet endpoint est idempotent.\n- Premier appel avec `accepter: true` → Accepte la demande, retourne `200 OK {statut: \"ENVOYE\"}`\n- Appels suivants avec `accepter: true` → Retourne `200 OK` avec l'état actuel - idempotent\n- Premier appel avec `accepter: false` → Rejette la demande, retourne `200 OK {statut: \"REJETE\"}`\n- Appels suivants avec `accepter: false` → Retourne `200 OK {statut: \"REJETE\"}` (idempotent)\n- `accepter: true` après `accepter: false` → Retourne `403 Forbidden` (déjà rejetée)\n- `accepter: false` après `accepter: true` → Retourne `403 Forbidden` (déjà acceptée)\n",
        "operationId": "demandePaiementRecueRepondre",
        "requestBody": {
          "description": "Réponse à la demande de paiement reçue.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DemandePaiementReponseRequest"
              },
              "examples": {
                "accepte": {
                  "$ref": "#/components/examples/DemandePaiementReponseRequeteAccepter"
                },
                "rejete": {
                  "$ref": "#/components/examples/DemandePaiementReponseRequeteRejeter"
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Opération effectuée avec succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DemandePaiementReponse"
                },
                "examples": {
                  "accepte": {
                    "$ref": "#/components/examples/DemandePaiementReponseReponseAcceptation"
                  },
                  "rejete": {
                    "$ref": "#/components/examples/DemandePaiementReponseRejetDemandeurInconnu"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "403": {
            "description": "Interdiction d'envoyer la réponse à la demande de paiement (déjà traitée ou déjà rejetée)",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem7807"
                },
                "examples": {
                  "deja-accepte": {
                    "$ref": "#/components/examples/DemandePaiementConfirmationImpossibleDejaEnvoye"
                  },
                  "deja-rejete": {
                    "$ref": "#/components/examples/DemandePaiementConfirmationImpossibleDejaAnnule"
                  }
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/RessourceInexistant"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/demandes-paiements-groupes": {
      "post": {
        "tags": [
          "DemandesDePaiementEnMasse"
        ],
        "summary": "Envoyer une demande de paiement en masse",
        "security": [
          {
            "OAuth2": [
              "demande_paiement_groupe.write"
            ]
          }
        ],
        "description": "Ce point de terminaison permet au client business d'envoyer plusieurs demandes de paiement à la fois.\n\nLa catégorie des demandes de paiement en masse est toujours `401` (Autres demandes de paiement de facture).\n\n**Traitement asynchrone :** La création retourne immédiatement `202 Accepted`. Le traitement des transactions se fait de manière asynchrone.\n\n**Sans confirmation (`confirmation: false` ou non spécifié) :**\n- Les transactions sont créées et validées (unicité des txId)\n- Les demandes de paiement sont envoyées directement aux payeurs\n- Les transactions avec txId dupliqué sont automatiquement rejetées avec le code `DU03`\n- Les transactions avec alias de payeur invalide sont automatiquement rejetées avec le code `BE23`\n\n**Avec confirmation (`confirmation: true`) :**\n- Les transactions sont créées et validées (unicité des txId + recherche d'alias des payeurs)\n- Les transactions avec alias de payeur invalide sont rejetées avec le code `BE23`\n- Les transactions avec txId dupliqué sont rejetées avec le code `DU03`\n- Les transactions valides passent à l'état `INITIE` avec les noms et pays des payeurs\n- Le business dispose d'un **délai adaptatif** pour confirmer ou annuler via `PUT /demandes-paiements-groupes/{instructionId}/confirmations` :\n  - **1 à 500 transactions** : 24 heures\n  - **501 à 1000 transactions** : 48 heures\n  - **Plus de 1000 transactions** : 72 heures\n- Lors de la confirmation, seules les transactions `INITIE` sont envoyées (les transactions `REJETE` sont automatiquement exclues)\n- Passé le délai, la demande expire automatiquement\n\n**Consultation des détails :**\n- Statut global du bulk : `GET /demandes-paiements-groupes/{instructionId}`\n- Liste de toutes les transactions : `GET /demandes-paiements?instructionId={instructionId}`\n- Seulement les rejetées (validation) : `GET /demandes-paiements?instructionId={instructionId}&statut=REJETE`\n- Seulement les valides (avec noms/pays des payeurs) : `GET /demandes-paiements?instructionId={instructionId}&statut=INITIE`\n\n**Convention de nommage des instructionId (important) :**\n\nL'`instructionId` doit être **unique** pour chaque création de bulk. Pour faciliter le suivi métier, nous recommandons la convention suivante :\n\n```\n<IDENTIFIANT_METIER>-<NUMERO_TENTATIVE>\n```\n\n**Exemples :**\n- Première tentative : `FACTURES-2025-01-1` (factures de janvier 2025, tentative 1)\n- Deuxième tentative : `FACTURES-2025-01-2` (corrections après échecs)\n- Troisième tentative : `FACTURES-2025-01-3` (nouvelles corrections)\n\n**Avantages :**\n- ✅ Chaque bulk a un statut indépendant (INITIE, CONFIRME, ANNULE)\n- ✅ Traçabilité claire des tentatives successives\n- ✅ Possibilité de filtrer par identifiant métier : `GET /demandes-paiements?instructionId[beginsWith]=FACTURES-2025-01`\n- ✅ Respect de l'unicité de l'instructionId\n",
        "operationId": "demandePaiementGroupeCreer",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DemandePaiementEnMasseRequest"
              },
              "examples": {
                "sans-confirmation": {
                  "summary": "Demande de paiement en masse sans confirmation",
                  "description": "Envoi direct des demandes de paiement sans vérification préalable",
                  "$ref": "#/components/examples/DemandePaiementEnMasseRequete"
                },
                "avec-confirmation": {
                  "summary": "Demande de paiement en masse avec confirmation",
                  "description": "Vérification des alias des payeurs avant envoi des demandes",
                  "$ref": "#/components/examples/DemandePaiementEnMasseRequeteAvecConfirmation"
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "description": "La demande a été acceptée et est en cours de traitement.\n\nConsultez le statut via `GET /demandes-paiements-groupes/{instructionId}`.\n",
            "headers": {
              "Location": {
                "description": "URL pour consulter le statut de la demande de paiement en masse",
                "schema": {
                  "type": "string",
                  "example": "/demandes-paiements-groupes/FACTURES-2025-01-1"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/FormatInvalide"
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "409": {
            "description": "Conflit - instructionId déjà utilisé",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem7807"
                },
                "examples": {
                  "instructionId-duplique": {
                    "summary": "instructionId déjà existant",
                    "value": {
                      "type": "about:blank",
                      "title": "Conflict",
                      "status": 409,
                      "detail": "Une demande de paiement en masse avec cet instructionId existe déjà",
                      "invalid-params": [
                        {
                          "name": "instructionId",
                          "reason": "L'instructionId 'FACTURES-2025-01-1' est déjà utilisé par une autre demande de paiement en masse"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      },
      "get": {
        "tags": [
          "DemandesDePaiementEnMasse"
        ],
        "summary": "Lister les demandes de paiement en masse",
        "security": [
          {
            "OAuth2": [
              "demande_paiement_groupe.read"
            ]
          }
        ],
        "description": "Ce point de terminaison permet de consulter la liste de toutes les demandes de paiement en masse.\n\nPour chaque demande de paiement en masse, les informations retournées incluent :\n- L'instructionId de la demande\n- Le statut (INITIE, CONFIRME, ANNULE)\n- La date de création de la demande\n\nPour obtenir les détails complets d'une demande spécifique, utilisez `GET /demandes-paiements-groupes/{instructionId}`.\n",
        "operationId": "demandesPaiementGroupeLister",
        "parameters": [
          {
            "name": "statut",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "INITIE",
                "CONFIRME",
                "ANNULE"
              ],
              "title": "Statut de la demande",
              "description": "Filtre les demandes selon le statut"
            }
          },
          {
            "$ref": "#/components/parameters/Page"
          },
          {
            "$ref": "#/components/parameters/ItemsParPage"
          },
          {
            "$ref": "#/components/parameters/SortBy"
          }
        ],
        "responses": {
          "200": {
            "description": "Succès de l'opération",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DemandePaiementEnMasseListe"
                },
                "examples": {
                  "liste-demandes": {
                    "$ref": "#/components/examples/DemandePaiementEnMasseListe"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/demandes-paiements-groupes/{instructionId}": {
      "parameters": [
        {
          "name": "instructionId",
          "in": "path",
          "description": "L'identifiant de la demande de paiement en masse dans le SI du client",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "get": {
        "tags": [
          "DemandesDePaiementEnMasse"
        ],
        "summary": "Détails d'une demande de paiement en masse",
        "security": [
          {
            "OAuth2": [
              "demande_paiement_groupe.read"
            ]
          }
        ],
        "description": "Ce point de terminaison permet de consulter les détails d'une demande de paiement en masse.\n\n**Statut du bulk :**\n- `INITIE` : Créée avec confirmation demandée, en attente de confirmation\n- `CONFIRME` : Confirmée par le business (si confirmation demandée) ou en cours de traitement (si sans confirmation)\n- `ANNULE` : Annulée par le business avant confirmation (seulement si confirmation demandée)\n\n**Note :** \n- Si créée **avec confirmation** (`confirmation: true`) : Le statut évolue de `INITIE` → `CONFIRME` ou `ANNULE`\n- Si créée **sans confirmation** (`confirmation: false`) : Le statut est directement `CONFIRME` (aucune action requise du business)\n\n**Vérification de fin de validation (important pour confirmation) :**\n\nLorsque `confirmation: true`, la validation des transactions se fait de manière asynchrone. \nPour savoir si la validation est terminée et que vous pouvez confirmer, vérifiez que :\n\n```\ntransactionsInitiees + transactionsRejetees = transactionsTotal\n```\n\n- Si égalité → Validation terminée, vous pouvez confirmer ✅\n- Si inégalité → Validation en cours, attendez encore (consultez à nouveau plus tard) ⏳\n\nLe détail de chaque transaction se consulte via `GET /demandes-paiements?txId={txId}`.\n\n**Consultation des transactions individuelles :**  \nPour obtenir la liste détaillée des transactions (avec noms des payeurs, codes d'erreur, etc.), utilisez :\n- Toutes les transactions : `GET /demandes-paiements?instructionId={instructionId}`\n- Seulement les rejetées : `GET /demandes-paiements?instructionId={instructionId}&statut=REJETE`\n- Seulement les réussies : `GET /demandes-paiements?instructionId={instructionId}&statut=IRREVOCABLE`\n",
        "operationId": "demandePaiementGroupeConsulter",
        "responses": {
          "200": {
            "description": "Opération effectuée avec succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DemandePaiementEnMasseStatutReponse"
                },
                "examples": {
                  "statut-initie": {
                    "$ref": "#/components/examples/DemandePaiementEnMasseStatutReponseInitie"
                  },
                  "statut-confirme": {
                    "$ref": "#/components/examples/DemandePaiementEnMasseStatutReponse"
                  },
                  "statut-annule": {
                    "$ref": "#/components/examples/DemandePaiementEnMasseStatutReponseAnnule"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "404": {
            "$ref": "#/components/responses/RessourceInexistant"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/demandes-paiements-groupes/{instructionId}/confirmations": {
      "parameters": [
        {
          "name": "instructionId",
          "in": "path",
          "description": "L'identifiant de la demande de paiement en masse dans le SI du client",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "put": {
        "tags": [
          "DemandesDePaiementEnMasse"
        ],
        "summary": "Confirmer la demande de paiement en masse",
        "security": [
          {
            "OAuth2": [
              "demande_paiement_groupe.write"
            ]
          }
        ],
        "description": "Ce point de terminaison permet de confirmer ou d'annuler une demande de paiement en masse créée avec `confirmation: true`.\n\n**Processus de vérification :**\n1. Après la création (`POST /demandes-paiements-groupes`), le participant valide toutes les transactions (unicité des txId + recherche d'alias des payeurs)\n2. Les transactions invalides sont automatiquement rejetées (`statut: REJETE`) avec codes `BE23` (alias invalide) ou `DU03` (txId dupliqué)\n3. Les transactions valides passent à l'état `INITIE` avec les noms et pays des payeurs\n4. Le business consulte via `GET /demandes-paiements-groupes/{instructionId}` pour vérifier la progression de la validation\n5. **La validation (unicité des txId + recherche d'alias) est terminée quand** : `transactionsInitiees + transactionsRejetees = transactionsTotal`\n6. Le business peut alors confirmer ou annuler l'envoi des demandes de paiement\n\n**Important :** La confirmation n'est possible que lorsque la validation de toutes les transactions est terminée. \nSi le business tente de confirmer pendant que la validation est en cours, une erreur 403 sera retournée avec la progression actuelle.\n\n**Comportement de la confirmation :**\n- `decision: true` → Le système envoie **automatiquement SEULEMENT** les demandes de paiement pour les transactions avec `statut: INITIE`\n- Les transactions `REJETE` (erreurs de validation) sont **automatiquement exclues** (pas besoin de les lister)\n- Le statut du bulk passe de `INITIE` à `CONFIRME`\n\n**Idempotence** : Cet endpoint est idempotent.\n- Premier appel avec `decision: true` → Envoie les demandes, retourne `200 OK {statut: \"CONFIRME\"}`\n- Appels suivants avec `decision: true` → Retourne `200 OK {statut: \"CONFIRME\"}` (idempotent, ne relance pas)\n- Premier appel avec `decision: false` → Annule, retourne `200 OK {statut: \"ANNULE\"}`\n- Appels suivants avec `decision: false` → Retourne `200 OK {statut: \"ANNULE\"}` (idempotent)\n- `decision: true` après `decision: false` → Retourne `403 Forbidden` (déjà annulé)\n- `decision: false` après `decision: true` → Retourne `403 Forbidden` (déjà confirmé)\n\n**Timeout adaptatif** : Le délai pour confirmer dépend automatiquement du nombre de transactions :\n- **1 à 500 transactions** : 24 heures\n- **501 à 1000 transactions** : 48 heures\n- **Plus de 1000 transactions** : 72 heures\n\nPassé ce délai, la demande expire automatiquement et ne peut plus être confirmée. Le délai exact est indiqué dans le champ `dateExpiration` retourné par `GET /demandes-paiements-groupes/{instructionId}`.\n\n**Changement de décision** : Une fois une décision prise, elle est définitive. Impossible de confirmer après avoir annulé, et vice-versa.\n",
        "operationId": "demandePaiementGroupeConfirmer",
        "requestBody": {
          "description": "Le client envoie oui ou non s'il confirme l'envoi de la demande de paiement en masse.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/DemandePaiementEnMasseConfirmationRequest"
              },
              "examples": {
                "confirme": {
                  "$ref": "#/components/examples/DemandePaiementEnMasseConfirmationRequeteCasOui"
                },
                "annule": {
                  "$ref": "#/components/examples/DemandePaiementEnMasseConfirmationRequeteCasNon"
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Confirmation enregistrée avec succès.\n- Si `decision: true`, le statut passe à `CONFIRME` et les demandes de paiement sont envoyées\n- Si `decision: false`, le statut passe à `ANNULE`\n",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/DemandePaiementEnMasseStatutReponse"
                },
                "examples": {
                  "confirmation-oui": {
                    "$ref": "#/components/examples/DemandePaiementEnMasseConfirmationReponseCasOui"
                  },
                  "confirmation-non": {
                    "$ref": "#/components/examples/DemandePaiementEnMasseConfirmationReponseCasNon"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "403": {
            "description": "Opération interdite",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem7807"
                },
                "examples": {
                  "validation-en-cours": {
                    "summary": "Validation des transactions toujours en cours",
                    "value": {
                      "type": "about:blank",
                      "title": "Forbidden",
                      "status": 403,
                      "detail": "La validation des transactions est toujours en cours. Veuillez patienter.",
                      "invalid-params": [
                        {
                          "name": "instructionId",
                          "reason": "Vérification en cours : 480/500 transactions vérifiées"
                        }
                      ]
                    }
                  },
                  "decision-true-apres-false": {
                    "summary": "Tentative de confirmation après annulation",
                    "value": {
                      "type": "about:blank",
                      "title": "Forbidden",
                      "status": 403,
                      "detail": "Impossible de confirmer une demande de paiement en masse déjà annulée"
                    }
                  },
                  "decision-false-apres-true": {
                    "summary": "Tentative d'annulation après confirmation",
                    "value": {
                      "type": "about:blank",
                      "title": "Forbidden",
                      "status": 403,
                      "detail": "Impossible d'annuler une demande de paiement en masse déjà confirmée"
                    }
                  },
                  "timeout-depasse": {
                    "summary": "Délai de confirmation dépassé",
                    "value": {
                      "type": "about:blank",
                      "title": "Forbidden",
                      "status": 403,
                      "detail": "Le délai de confirmation a été dépassé"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/RessourceInexistant"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/paiements-envoyes": {
      "post": {
        "tags": [
          "PaiementEnvoye"
        ],
        "summary": "Envoyer un paiement",
        "security": [
          {
            "OAuth2": [
              "paiement.write"
            ]
          }
        ],
        "description": "Ce point de terminaison permet au business d'effectuer des paiements.\n\nLe destinataire du paiement est identifié par son alias de compte.\n\nLe business peut définir le champ `confirmation` à `true` pour demander une validation en deux étapes : le PSP retournera d'abord le résultat de la recherche d'alias (avec le nom et le pays du bénéficiaire), puis attendra une confirmation explicite avant d'exécuter le paiement via l'endpoint `PUT /paiements-envoyes/{txId}/confirmations`.\n\n**Timeout de confirmation** : Si le business demande une confirmation, il dispose de **24 heures** pour confirmer. Passé ce délai, la demande expire automatiquement.\n",
        "operationId": "paiementCreer",
        "requestBody": {
          "description": "Pour effectuer le transfert, le client doit fournir l'alias du destinataire ainsi que le montant du transfert à effectuer.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PaiementImmediatRequest"
              },
              "examples": {
                "sans-confirmation": {
                  "$ref": "#/components/examples/PaiementImmediatRequeteCasSansConfirmation"
                },
                "avec-confirmation": {
                  "$ref": "#/components/examples/PaiementImmediatRequeteCasAvecConfirmation"
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Paiement traité. Le champ `statut` indique le résultat :\n- `INITIE` : En attente de confirmation (si `confirmation: true`)\n- `ENVOYE` : Paiement envoyé avec succès (si `confirmation: false`)\n- `REJETE` : Paiement rejeté. Le champ `statutRaison` contient le code d'erreur :\n  - `DU03` : txId dupliqué (déjà utilisé)\n  - `BE23` : Alias bénéficiaire invalide\n  - Autres codes ISO 20022\n",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaiementImmediatReponse"
                },
                "examples": {
                  "sans-confirmation": {
                    "$ref": "#/components/examples/PaiementImmediatReponseCasSansConfirmation"
                  },
                  "avec-confirmation": {
                    "$ref": "#/components/examples/PaiementImmediatReponseCasAvecConfirmation"
                  },
                  "rejete-txid-duplique": {
                    "$ref": "#/components/examples/PaiementImmediatRejeteDU03"
                  },
                  "rejete-alias-invalide": {
                    "$ref": "#/components/examples/PaiementImmediatRejeteBE23"
                  }
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/FormatInvalide"
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "403": {
            "description": "Interdiction d'effectuer le paiement (erreurs métier non-retriables)",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem7807"
                },
                "examples": {
                  "montant-invalide": {
                    "$ref": "#/components/examples/PaiementImmediatRefuseMontantInvalide"
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      },
      "get": {
        "tags": [
          "PaiementEnvoye"
        ],
        "summary": "Lister les paiements",
        "security": [
          {
            "OAuth2": [
              "paiement.read"
            ]
          }
        ],
        "description": "Ce point de terminaison permet de lister les paiements effectués par le client.",
        "operationId": "paiementEnvoyeLister",
        "parameters": [
          {
            "name": "payeurAlias",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "alias du compte débité",
              "description": "Recherche et retourne les paiement immédiats dont le compte spécifié est débiteur (payeur)"
            }
          },
          {
            "name": "payeurCompte",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "numéro de compte du client payeur"
            }
          },
          {
            "name": "payeAlias",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "alias de compte du client payé / bénéficiaire",
              "description": "Recherche et retourne les paiement immédiats envoyées à un bénéficiaire (client payé)"
            }
          },
          {
            "name": "dateEnvoi",
            "in": "query",
            "required": false,
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "dateIrrevocabilite",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time",
              "title": "Date d'irrévocabilité du paiement"
            }
          },
          {
            "name": "statut",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "INITIE",
                "ANNULE",
                "ENVOYE",
                "IRREVOCABLE",
                "REJETE"
              ],
              "title": "Statut du paiement"
            }
          },
          {
            "name": "categorie",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Catégorie de paiement / Canal de paiement",
              "enum": [
                "631",
                "000",
                "400",
                "733",
                "300",
                "999",
                "500",
                "521",
                "401"
              ],
              "description": "La catégorie du paiement / Canal de paiement\n- `631` Demande de paiement provenant d'un particulier\n- `000` Paiement par QR Code Statique\n- `400` Paiement par QR Code Dynamique\n- `733` Ordre de paiement via l'API Business\n- `300` Via le canal USSD\n- `999` Ordre de transfert bancaire\n- `500` Demande de Paiement sur site\n- `521` Demande de Paiement e-commerce\n- `401` Autres demandes de paiement de facture\n"
            }
          },
          {
            "name": "txId",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "TxId",
              "description": "Identifiant de la transaction"
            }
          },
          {
            "name": "montantAchat",
            "in": "query",
            "schema": {
              "type": "number",
              "title": "Montant de l'achat"
            }
          },
          {
            "name": "montantRetrait",
            "in": "query",
            "schema": {
              "type": "number",
              "title": "Montant du retrait"
            }
          },
          {
            "name": "motif",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Motif du paiement"
            }
          },
          {
            "name": "refDocType",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Type de document justificatif",
              "description": "Recherche les enregistrements en fonction du type de document justificatif."
            }
          },
          {
            "name": "instructionId",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Instruction Id",
              "description": "Identifiant de la demande de paiement en masse"
            }
          },
          {
            "name": "annulationStatut",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Statut de la demande d'annulation"
            }
          },
          {
            "name": "annulationMotif",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Motif de la demande d'annulation",
              "description": "Permet de rechercher les demandes d'annulation"
            }
          },
          {
            "name": "retourStatut",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Statut du retour de fonds",
              "description": "Permet de rechercher les retours de fonds"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Page",
              "description": "Identifiant de la page"
            }
          },
          {
            "name": "size",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Taille de la page",
              "description": "Nombre d'éléments à retourner"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Triage",
              "description": "Trie les éléments selon le champ spécifié"
            }
          },
          {
            "$ref": "#/components/parameters/Champs"
          }
        ],
        "responses": {
          "200": {
            "description": "Succès de l'opération",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaiementListe"
                },
                "examples": {
                  "paiements-envoyes": {
                    "$ref": "#/components/examples/PaiementListeEnvoyes"
                  },
                  "paiements-envoyes-bulk": {
                    "$ref": "#/components/examples/PaiementListeEnvoyesBulk"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/paiements-envoyes/{txId}/confirmations": {
      "parameters": [
        {
          "name": "txId",
          "in": "path",
          "description": "L'identifiant de la transaction dans le SI du payé",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "put": {
        "tags": [
          "PaiementEnvoye"
        ],
        "summary": "Confirmer le paiement",
        "security": [
          {
            "OAuth2": [
              "paiement.write"
            ]
          }
        ],
        "description": "Ce point de terminaison permet d'envoyer la confirmation de l'envoi d'un paiement \naprès vérification du nom et du pays du bénéficiaire.\n\n**Idempotence** : Cet endpoint est idempotent.\n- Premier appel avec `decision: true` → Lance le paiement, retourne `200 OK {statut: \"ENVOYE\"}`\n- Appels suivants avec `decision: true` → Retourne `200 OK` avec l'état actuel (ENVOYE, IRREVOCABLE, ou REJETE) - idempotent\n- Premier appel avec `decision: false` → Annule, retourne `200 OK {statut: \"ANNULE\"}`\n- Appels suivants avec `decision: false` → Retourne `200 OK {statut: \"ANNULE\"}` (idempotent)\n- `decision: true` après `decision: false` → Retourne `403 Forbidden` (déjà annulé)\n- `decision: false` après `decision: true` → Retourne `403 Forbidden` (déjà confirmé)\n\n**Timeout** : La confirmation doit être envoyée dans les **24 heures** suivant la création de la demande. Passé ce délai, la demande expire automatiquement et ne peut plus être confirmée.\n\n**Changement de décision** : Une fois une décision prise, elle est définitive. Impossible de confirmer après avoir annulé, et vice-versa.\n",
        "operationId": "paiementConfirmer",
        "requestBody": {
          "description": "Le client envoie oui ou non s'il confirme l'envoi du paiement.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PaiementImmediatConfirmationRequest"
              },
              "examples": {
                "confirme": {
                  "$ref": "#/components/examples/PaiementImmediatConfirmationRequeteCasConfirmationOui"
                },
                "annule": {
                  "$ref": "#/components/examples/PaiementImmediatConfirmationRequeteCasConfirmationNon"
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Paiement en cours d'envoi",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaiementImmediatConfirmationReponse"
                },
                "examples": {
                  "confirmation-oui": {
                    "$ref": "#/components/examples/PaiementImmediatConfirmationReponseCasOui"
                  },
                  "confirmation-non": {
                    "$ref": "#/components/examples/PaiementImmediatConfirmationReponseCasNon"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "403": {
            "description": "Opération interdite",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem7807"
                },
                "examples": {
                  "decision-true-apres-false": {
                    "summary": "Tentative de confirmation après annulation",
                    "value": {
                      "type": "about:blank",
                      "title": "Forbidden",
                      "status": 403,
                      "detail": "Impossible de confirmer un paiement déjà annulé"
                    }
                  },
                  "decision-false-apres-true": {
                    "summary": "Tentative d'annulation après confirmation",
                    "value": {
                      "type": "about:blank",
                      "title": "Forbidden",
                      "status": 403,
                      "detail": "Impossible d'annuler un paiement déjà confirmé"
                    }
                  },
                  "timeout-depasse": {
                    "summary": "Délai de confirmation dépassé",
                    "value": {
                      "type": "about:blank",
                      "title": "Forbidden",
                      "status": 403,
                      "detail": "Le délai de confirmation de 24 heures a été dépassé"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/RessourceInexistant"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/paiements-envoyes/{txId}": {
      "parameters": [
        {
          "name": "txId",
          "in": "path",
          "description": "L'identifiant de la transaction donné par le client business",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "get": {
        "tags": [
          "PaiementEnvoye"
        ],
        "summary": "Détails d'un paiement",
        "security": [
          {
            "OAuth2": [
              "paiement.read"
            ]
          }
        ],
        "description": "Cet point de terminaison permet de consulter le statut d'un paiement envoyé.\n",
        "operationId": "paiementEnvoyeRecuperer",
        "responses": {
          "200": {
            "description": "Opération effectuée avec succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Paiement"
                },
                "examples": {
                  "paiement-envoye": {
                    "$ref": "#/components/examples/PaiementEnvoye"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "404": {
            "$ref": "#/components/responses/RessourceInexistant"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/paiements-recus": {
      "get": {
        "tags": [
          "PaiementRecu"
        ],
        "summary": "Lister les paiements reçus",
        "security": [
          {
            "OAuth2": [
              "paiement.read"
            ]
          }
        ],
        "description": "Ce point de terminaison permet de lister les paiements reçus par l'entreprise.",
        "operationId": "paiementRecuLister",
        "parameters": [
          {
            "name": "payeAlias",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "alias de compte du client payé / bénéficiaire",
              "description": "Recherche et retourne les paiement immédiats envoyées à un bénéficiaire (client payé)"
            }
          },
          {
            "name": "payeCompte",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "numéro de compte du client payé"
            }
          },
          {
            "name": "payeurAlias",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "alias du compte débité",
              "description": "Recherche et retourne les paiement immédiats dont le compte spécifié est débiteur (payeur)"
            }
          },
          {
            "name": "dateIrrevocabilite",
            "in": "query",
            "schema": {
              "type": "string",
              "format": "date-time",
              "title": "Date d'irrévocabilité du paiement"
            }
          },
          {
            "name": "categorie",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Catégorie de paiement / Canal de paiement",
              "enum": [
                "000",
                "400",
                "733",
                "300",
                "999",
                "500",
                "521",
                "401"
              ],
              "description": "La catégorie du paiement / Canal de paiement\n- `000` Paiement par QR Code Statique\n- `400` Paiement par QR Code Dynamique\n- `733` Ordre de paiement via l'API Business\n- `300` Via le canal USSD\n- `999` Ordre de transfert bancaire\n- `500` Demande de Paiement sur site \n- `521` Demande de Paiement e-commerce \n- `401` Autres demandes de paiement de facture\n"
            }
          },
          {
            "name": "montantAchat",
            "in": "query",
            "schema": {
              "type": "number",
              "title": "Montant de l'achat"
            }
          },
          {
            "name": "montantRetrait",
            "in": "query",
            "schema": {
              "type": "number",
              "title": "Montant du retrait"
            }
          },
          {
            "name": "motif",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Motif du paiement"
            }
          },
          {
            "name": "refDocType",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Type de document justificatif",
              "description": "Recherche les enregistrements en fonction du type de document justificatif."
            }
          },
          {
            "name": "txId",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "TxId",
              "description": "Identifiant de la transaction"
            }
          },
          {
            "name": "annulationStatut",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Statut de la demande d'annulation"
            }
          },
          {
            "name": "annulationMotif",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Motif de la demande d'annulation",
              "description": "Permet de rechercher les demandes d'annulation"
            }
          },
          {
            "name": "retourStatut",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Statut du retour de fonds",
              "description": "Permet de rechercher les retours de fonds"
            }
          },
          {
            "name": "page",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Page",
              "description": "Identifiant de la page"
            }
          },
          {
            "name": "size",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Taille de la page",
              "description": "Nombre d'éléments à retourner"
            }
          },
          {
            "name": "sort",
            "in": "query",
            "schema": {
              "type": "string",
              "title": "Triage",
              "description": "Trie les éléments selon le champ spécifié"
            }
          },
          {
            "$ref": "#/components/parameters/Champs"
          }
        ],
        "responses": {
          "200": {
            "description": "Succès de l'opération",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaiementListe"
                },
                "examples": {
                  "paiements-recus": {
                    "$ref": "#/components/examples/PaiementListeRecus"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/paiements-recus/{txId}": {
      "parameters": [
        {
          "name": "txId",
          "in": "path",
          "description": "txId de la transaction reçue par le business",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "get": {
        "tags": [
          "PaiementRecu"
        ],
        "summary": "Détails d'un paiement",
        "security": [
          {
            "OAuth2": [
              "paiement.read"
            ]
          }
        ],
        "description": "Cet point de terminaison permet de consulter un paiement reçu par le business à partir du txId.\n\nLorsque c'est un paiement reçu par QR Code, le txId correspond au champ `reference label` du QR Code.\nPour un QR Code statique, le dernier paiement reçu est retourné.\n\nLorsque c'est un paiement reçu par demande de paiement, le txId correspond au champ `txId` de la demande de paiement.\n\nPour les autres canaux (999, 300, 733), le txId correspond à l'identifiant du payeur.\n\nSi aucun paiement reçu avec ce txId n'est trouvé, la réponse est 404 Not Found.\n",
        "operationId": "paiementRecuRecuperer",
        "responses": {
          "200": {
            "description": "Opération effectuée avec succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Paiement"
                },
                "examples": {
                  "paiement-recu": {
                    "$ref": "#/components/examples/PaiementRecu"
                  },
                  "retour-de-fonds-rejete": {
                    "$ref": "#/components/examples/PaiementRetourReponseRejete"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "404": {
            "$ref": "#/components/responses/RessourceInexistant"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/paiements/{end2endId}": {
      "parameters": [
        {
          "name": "end2endId",
          "in": "path",
          "description": "L'identifiant de bout en bout de la transaction",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "get": {
        "tags": [
          "PaiementVerification"
        ],
        "summary": "Vérifier un paiement",
        "security": [
          {
            "OAuth2": [
              "paiement.read"
            ]
          }
        ],
        "description": "Ce point de terminaison permet de rechercher un paiement reçu ou envoyé à partir du `end2endId`.\n\nDans certains cas, le **client business** peut ne pas avoir reçu la notification de paiement.  \nLe **client payeur** peut alors lui communiquer l’`end2endId` afin qu’il puisse vérifier manuellement le statut du paiement.\n\nLe **participant** doit, dans ce cas, vérifier dans sa base de données et s'il ne trouve pas le paiement, il doit interroger l’endpoint de PI-SPI permettant de **récupérer le statut d’un paiement**,  puis **retourner ce statut** dans sa réponse.\n\nLe statut retourné doit être soit :\n- `IRREVOCABLE` (paiement irrévocable), ou\n- `REJETE` (paiement rejeté).\n\nUn transfert **ne peut pas** être signalé comme « en cours de traitement » dans ce contexte.\n\n⚠️ **Remarques :**\n- La vérification ne doit concerner que les paiements réalisés depuis **moins de 3 mois (90 jours)** afin de garantir la disponibilité de la réponse.\n- La garantie de réponse n’est assurée qu’à partir de **20 secondes après l’envoi du transfert**.\n",
        "operationId": "paiementVerifier",
        "responses": {
          "200": {
            "description": "Opération effectuée avec succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Paiement"
                },
                "examples": {
                  "paiement-irrevocable": {
                    "$ref": "#/components/examples/PaiementRecu"
                  },
                  "paiement-rejete": {
                    "$ref": "#/components/examples/PaiementRejete"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "404": {
            "description": "Ce paiement n'a pas été trouvé",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem7807"
                },
                "examples": {
                  "exemple": {
                    "$ref": "#/components/examples/Problem7807ExempleNotFoundJSON"
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/paiements-groupes": {
      "post": {
        "tags": [
          "PaiementEnMasse"
        ],
        "summary": "Envoyer un paiement en masse",
        "security": [
          {
            "OAuth2": [
              "paiement_groupe.write"
            ]
          }
        ],
        "description": "Ce point de terminaison permet au client d'envoyer des paiements en masse.\n\n**Traitement asynchrone :** La création d'un paiement en masse retourne immédiatement `202 Accepted`. Le traitement des transactions se fait de manière asynchrone.\n\n**Sans confirmation (`confirmation: false` ou non spécifié) :**\n- Les transactions sont créées et validées (unicité des txId)\n- Les paiements sont exécutés directement\n- Les transactions invalides (txId dupliqué) sont automatiquement rejetées avec le code `DU03`\n- Le business peut suivre la progression via `GET /paiements-groupes/{instructionId}` et `GET /paiements?instructionId={instructionId}`\n\n**Avec confirmation (`confirmation: true`) :**\n- Les transactions sont créées et validées (unicité des txId + recherche d'alias)\n- Les transactions avec alias invalide sont automatiquement rejetées avec le code `BE23`\n- Les transactions avec txId dupliqué sont rejetées avec le code `DU03`\n- Les transactions valides passent à l'état `INITIE` et peuvent être consultées via `GET /paiements?instructionId={instructionId}&statut=INITIE`\n- Le business dispose d'un **délai adaptatif** pour confirmer ou annuler via `PUT /paiements-groupes/{instructionId}/confirmations` :\n  - **1 à 500 transactions** : 24 heures\n  - **501 à 1000 transactions** : 48 heures\n  - **Plus de 1000 transactions** : 72 heures\n- Lors de la confirmation, seules les transactions `INITIE` sont envoyées (les transactions `REJETE` sont automatiquement exclues)\n- Passé le délai, la demande expire automatiquement\n\n**Consultation des détails :**\n- Statut global du bulk : `GET /paiements-groupes/{instructionId}`\n- Liste de toutes les transactions : `GET /paiements?instructionId={instructionId}`\n- Seulement les rejetées (validation) : `GET /paiements?instructionId={instructionId}&statut=REJETE`\n- Seulement les valides (avec noms/pays) : `GET /paiements?instructionId={instructionId}&statut=INITIE`\n\n**Convention de nommage des instructionId (important) :**\n\nL'`instructionId` doit être **unique** pour chaque création de bulk. Pour faciliter le suivi métier, nous recommandons la convention suivante :\n\n```\n<IDENTIFIANT_METIER>-<NUMERO_TENTATIVE>\n```\n\n**Exemples :**\n- Première tentative : `SALAIRES-2025-01-1` (salaires de janvier 2025, tentative 1)\n- Deuxième tentative : `SALAIRES-2025-01-2` (corrections après échecs)\n- Troisième tentative : `SALAIRES-2025-01-3` (nouvelles corrections)\n\n**Avantages :**\n- ✅ Chaque bulk a un statut indépendant (INITIE, CONFIRME, ANNULE)\n- ✅ Traçabilité claire des tentatives successives\n- ✅ Possibilité de filtrer par identifiant métier : `GET /paiements?instructionId[beginsWith]=SALAIRES-2025-01`\n- ✅ Respect de l'unicité de l'instructionId\n",
        "operationId": "paiementGroupeCreer",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PaiementEnMasseRequest"
              },
              "examples": {
                "avec-confirmation": {
                  "summary": "Paiement de salaires avec confirmation",
                  "description": "Vérification des alias des bénéficiaires avant envoi des paiements",
                  "$ref": "#/components/examples/PaiementEnMasseRequeteSalaires"
                },
                "sans-confirmation": {
                  "summary": "Paiement de fournisseurs sans confirmation",
                  "description": "Envoi direct des paiements sans vérification préalable",
                  "$ref": "#/components/examples/PaiementEnMasseRequeteFournisseurs"
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "202": {
            "description": "La demande a été acceptée et est en cours de traitement.\n\nConsultez le statut via `GET /paiements-groupes/{instructionId}`.\n",
            "headers": {
              "Location": {
                "description": "URL pour consulter le statut du paiement en masse",
                "schema": {
                  "type": "string",
                  "example": "/paiements-groupes/SALAIRES-2025-01-1"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/FormatInvalide"
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "409": {
            "description": "Conflit - instructionId déjà utilisé",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem7807"
                },
                "examples": {
                  "instructionId-duplique": {
                    "summary": "instructionId déjà existant",
                    "value": {
                      "type": "about:blank",
                      "title": "Conflict",
                      "status": 409,
                      "detail": "Un paiement en masse avec cet instructionId existe déjà",
                      "invalid-params": [
                        {
                          "name": "instructionId",
                          "reason": "L'instructionId 'SALAIRES-2025-01-1' est déjà utilisé par un autre paiement en masse"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      },
      "get": {
        "tags": [
          "PaiementEnMasse"
        ],
        "summary": "Lister les paiements en masse",
        "security": [
          {
            "OAuth2": [
              "paiement_groupe.read"
            ]
          }
        ],
        "description": "Ce point de terminaison permet de consulter la liste de tous les paiements en masse.\n\nPour chaque paiement en masse, les informations retournées incluent :\n- L'instructionId du paiement\n- Le statut (INITIE, CONFIRME, ANNULE)\n- La date de création du paiement\n\nPour obtenir les détails complets d'un paiement spécifique, utilisez `GET /paiements-groupes/{instructionId}`.\n",
        "operationId": "paiementsGroupeLister",
        "parameters": [
          {
            "name": "statut",
            "in": "query",
            "schema": {
              "type": "string",
              "enum": [
                "INITIE",
                "CONFIRME",
                "ANNULE"
              ],
              "title": "Statut du paiement",
              "description": "Filtre les paiements selon le statut"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Succès de l'opération",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaiementEnMasseListe"
                },
                "examples": {
                  "liste-paiements": {
                    "$ref": "#/components/examples/PaiementEnMasseListe"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/paiements-groupes/{instructionId}": {
      "parameters": [
        {
          "name": "instructionId",
          "in": "path",
          "description": "L'identifiant du paiement en masse dans le SI du client",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "get": {
        "tags": [
          "PaiementEnMasse"
        ],
        "summary": "Détails d'un paiement en masse",
        "security": [
          {
            "OAuth2": [
              "paiement_groupe.read"
            ]
          }
        ],
        "description": "Ce point de terminaison permet de consulter les détails d'un paiement en masse.\n\n**Statut du bulk :**\n- `INITIE` : Créé avec confirmation demandée, en attente de confirmation\n- `CONFIRME` : Confirmé par le business (si confirmation demandée) ou en cours de traitement (si sans confirmation)\n- `ANNULE` : Annulé par le business avant confirmation (seulement si confirmation demandée)\n\n**Note :** \n- Si créé **avec confirmation** (`confirmation: true`) : Le statut évolue de `INITIE` → `CONFIRME` ou `ANNULE`\n- Si créé **sans confirmation** (`confirmation: false`) : Le statut est directement `CONFIRME` (aucune action requise du business)\n\n**Vérification de fin de validation (important pour confirmation) :**\n\nLorsque `confirmation: true`, la validation des transactions se fait de manière asynchrone. \nPour savoir si la validation est terminée et si vous pouvez confirmer, vérifiez que :\n\n```\ntransactionsInitiees + transactionsRejetees = transactionsTotal\n```\n\n- Si égalité → Validation terminée, vous pouvez confirmer ✅\n- Si inégalité → Validation en cours, attendez encore (consultez à nouveau dans quelques secondes) ⏳\n\nLa progression détaillée de chaque transaction se consulte via `GET /paiements?txId={txId}`.\n\n**Consultation des transactions individuelles :**  \nPour obtenir la liste détaillée des transactions (avec noms des bénéficiaires, codes d'erreur, etc.), utilisez :\n- Toutes les transactions : `GET /paiements?instructionId={instructionId}`\n- Seulement les rejetées : `GET /paiements?instructionId={instructionId}&statut=REJETE`\n- Seulement les réussies : `GET /paiements?instructionId={instructionId}&statut=IRREVOCABLE`\n",
        "operationId": "paiementGroupeConsulter",
        "responses": {
          "200": {
            "description": "Opération effectuée avec succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaiementEnMasseReponseStatut"
                },
                "examples": {
                  "statut-initie": {
                    "$ref": "#/components/examples/PaiementEnMasseReponseStatutInitie"
                  },
                  "statut-confirme": {
                    "$ref": "#/components/examples/PaiementEnMasseReponseStatut"
                  },
                  "statut-annule": {
                    "$ref": "#/components/examples/PaiementEnMasseReponseStatutAnnule"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "404": {
            "$ref": "#/components/responses/RessourceInexistant"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/paiements-groupes/{instructionId}/confirmations": {
      "parameters": [
        {
          "name": "instructionId",
          "in": "path",
          "description": "L'identifiant du paiement en masse dans le SI du client",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "put": {
        "tags": [
          "PaiementEnMasse"
        ],
        "summary": "Confirmer le paiement en masse",
        "security": [
          {
            "OAuth2": [
              "paiement_groupe.write"
            ]
          }
        ],
        "description": "Ce point de terminaison permet de confirmer ou d'annuler un paiement en masse créé avec `confirmation: true`.\n\n**Processus de vérification :**\n1. Après la création (`POST /paiements-groupes`), le participant valide asynchronement toutes les transactions (unicité des txId + recherche d'alias)\n2. Les transactions invalides sont automatiquement rejetées (`statut: REJETE`) avec codes `BE23` (alias invalide) ou `DU03` (txId dupliqué)\n3. Les transactions valides passent à l'état `INITIE` avec les noms et pays des bénéficiaires\n4. Le business consulte via `GET /paiements-groupes/{instructionId}` pour vérifier la progression de la validation\n5. **La validation est terminée quand** : `transactionsInitiees + transactionsRejetees = transactionsTotal`\n6. Le business peut alors confirmer ou annuler\n\n**Important :** La confirmation n'est possible que lorsque la validation de toutes les transactions est terminée. \nSi le business tente de confirmer pendant que la validation est en cours, une erreur 403 sera retournée avec la progression actuelle.\n\n**Comportement de la confirmation :**\n- `decision: true` → Le système envoie **automatiquement SEULEMENT** les transactions avec `statut: INITIE`\n- Les transactions `REJETE` (erreurs de validation) sont **automatiquement exclues** (pas besoin de les lister)\n- Le statut du bulk passe de `INITIE` à `CONFIRME`\n\n**Idempotence** : Cet endpoint est idempotent.\n- Premier appel avec `decision: true` → Lance les paiements, retourne `200 OK {statut: \"CONFIRME\"}`\n- Appels suivants avec `decision: true` → Retourne `200 OK {statut: \"CONFIRME\"}` (idempotent, ne relance pas)\n- Premier appel avec `decision: false` → Annule, retourne `200 OK {statut: \"ANNULE\"}`\n- Appels suivants avec `decision: false` → Retourne `200 OK {statut: \"ANNULE\"}` (idempotent)\n- `decision: true` après `decision: false` → Retourne `403 Forbidden` (déjà annulé)\n- `decision: false` après `decision: true` → Retourne `403 Forbidden` (déjà confirmé)\n\n**Timeout adaptatif** : Le délai pour confirmer dépend automatiquement du nombre de transactions :\n- **1 à 500 transactions** : 24 heures\n- **501 à 1000 transactions** : 48 heures\n- **Plus de 1000 transactions** : 72 heures\n\nPassé ce délai, la demande expire automatiquement et ne peut plus être confirmée. Le délai exact est indiqué dans le champ `dateExpiration` retourné par `GET /paiements-groupes/{instructionId}`.\n\n**Changement de décision** : Une fois une décision prise, elle est définitive. Impossible de confirmer après avoir annulé, et vice-versa.\n",
        "operationId": "paiementGroupeConfirmer",
        "requestBody": {
          "description": "Le client envoie oui ou non s'il confirme l'envoi du paiement en masse.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PaiementEnMasseConfirmationRequest"
              },
              "examples": {
                "confirme": {
                  "$ref": "#/components/examples/PaiementEnMasseConfirmationRequeteCasOui"
                },
                "annule": {
                  "$ref": "#/components/examples/PaiementEnMasseConfirmationRequeteCasNon"
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Confirmation enregistrée avec succès.\n- Si `decision: true`, le statut passe à `CONFIRME` et les paiements sont lancés\n- Si `decision: false`, le statut passe à `ANNULE`\n",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/PaiementEnMasseReponseStatut"
                },
                "examples": {
                  "confirmation-oui": {
                    "$ref": "#/components/examples/PaiementEnMasseConfirmationReponseCasOui"
                  },
                  "confirmation-non": {
                    "$ref": "#/components/examples/PaiementEnMasseConfirmationReponseCasNon"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "403": {
            "description": "Opération interdite",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem7807"
                },
                "examples": {
                  "validation-en-cours": {
                    "summary": "Validation des transactions toujours en cours",
                    "value": {
                      "type": "about:blank",
                      "title": "Forbidden",
                      "status": 403,
                      "detail": "La validation des transactions est toujours en cours. Veuillez patienter.",
                      "invalid-params": [
                        {
                          "name": "instructionId",
                          "reason": "Vérification en cours : 4800/5000 transactions vérifiées"
                        }
                      ]
                    }
                  },
                  "decision-true-apres-false": {
                    "summary": "Tentative de confirmation après annulation",
                    "value": {
                      "type": "about:blank",
                      "title": "Forbidden",
                      "status": 403,
                      "detail": "Impossible de confirmer un paiement en masse déjà annulé"
                    }
                  },
                  "decision-false-apres-true": {
                    "summary": "Tentative d'annulation après confirmation",
                    "value": {
                      "type": "about:blank",
                      "title": "Forbidden",
                      "status": 403,
                      "detail": "Impossible d'annuler un paiement en masse déjà confirmé"
                    }
                  },
                  "timeout-depasse": {
                    "summary": "Délai de confirmation dépassé",
                    "value": {
                      "type": "about:blank",
                      "title": "Forbidden",
                      "status": 403,
                      "detail": "Le délai de confirmation a été dépassé"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "$ref": "#/components/responses/RessourceInexistant"
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/paiements/{end2endId}/retours": {
      "parameters": [
        {
          "name": "end2endId",
          "in": "path",
          "description": "L'identifiant unique de bout en bout de la transaction",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "put": {
        "tags": [
          "RetoursdeFonds"
        ],
        "summary": "Retourner les fonds",
        "security": [
          {
            "OAuth2": [
              "retour_fonds.write"
            ]
          }
        ],
        "description": "Ce point de terminaison permet au business de retourner les fonds d'un paiement reçu.\n\n**Idempotence** : Cet endpoint est idempotent. Plusieurs appels avec le même `end2endId` produiront le même résultat.\nSi le retour de fonds a déjà été envoyé et irrévocable, le champ `retourStatut` de la réponse sera `IRREVOCABLE`.\nSi le retour de fonds a été envoyé et rejeté, le retour de fonds sera envoyé à nouveau.\nSi le retour de fonds est en cours d'envoi, le champ `retourStatut` de la réponse sera `INITIE`.\n\n**Notifications webhook** : Après envoi du retour de fonds, si le business a souscrit au service de webhook, il recevra :\n- Une notification `RETOUR_ENVOYE` en cas de succès du retour de fonds\n- Une notification `RETOUR_REJETE` en cas de rejet de la demande\n\n**Vérification du statut** : Pour obtenir le statut d'un retour de fonds envoyé, vous pouvez invoquer l'endpoint `GET /paiements/{end2endId}` et le champ `retourStatut` de la réponse indiquera l'état du retour de fonds.\n",
        "operationId": "retourFondsEnvoyer",
        "responses": {
          "200": {
            "description": "Retour de fonds enregistré avec succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Paiement"
                },
                "examples": {
                  "initie": {
                    "$ref": "#/components/examples/PaiementRetourReponseInitie"
                  },
                  "deja-envoye": {
                    "$ref": "#/components/examples/PaiementRetourReponseIrrevocable"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "403": {
            "description": "Interdiction d'effectuer le retour de fonds",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem7807"
                },
                "examples": {
                  "paiement-inexistant": {
                    "summary": "Délai de retour de fonds dépassé",
                    "value": {
                      "type": "about:blank",
                      "title": "Bad Request",
                      "status": 403,
                      "detail": "Délai de retour de fonds dépassé",
                      "invalid-params": [
                        {
                          "name": "end2endId",
                          "reason": "Un paiement ne peut être retourné plus de 90 jours après la date de paiement"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Paiement non trouvé",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem7807"
                },
                "examples": {
                  "paiement-inexistant": {
                    "summary": "Paiement inexistant ou déjà archivé",
                    "value": {
                      "type": "about:blank",
                      "title": "Not Found",
                      "status": 404,
                      "detail": "Paiement inexistant ou déjà archivé",
                      "invalid-params": [
                        {
                          "name": "end2endId",
                          "reason": "Le paiement avec cet identifiant n'existe pas ou a déjà été archivé"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/paiements/{end2endId}/annulations": {
      "parameters": [
        {
          "name": "end2endId",
          "in": "path",
          "description": "L'identifiant unique de bout en bout de la transaction",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "post": {
        "tags": [
          "DemandeAnnulation"
        ],
        "summary": "Demander l'annulation d'un paiement",
        "security": [
          {
            "OAuth2": [
              "demande_annulation.write"
            ]
          }
        ],
        "description": "Ce point de terminaison permet de demander l'annulation d'un paiement envoyé.\n\nÀ l'acceptation de la demande d'annulation, le payé effectue un retour de fonds et le business recevra une notification `RETOUR_RECU` s'il a souscrit au service de webhook.\n\nSi le payé refuse la demande d'annulation, le business recevra une notification `ANNULATION_REJETE`.\n\n**Note importante sur l'idempotence :**\n\nCet endpoint utilise **POST (pas PUT)** car chaque appel envoie une **nouvelle demande d'annulation** au PSP bénéficiaire. \n\n**Comportement :**\n- Premier appel → Nouvelle demande d'annulation envoyée\n- Deuxième appel → **Nouvelle demande d'annulation envoyée** (pas idempotent)\n- Troisième appel → **Nouvelle demande d'annulation envoyée**\n\n**Cas d'usage :**\n- La première demande a été refusée, vous réessayez\n- Vous voulez relancer une demande en attente\n- Vous avez de nouvelles informations justifiant l'annulation\n",
        "operationId": "demandeAnnulationEnvoyer",
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PaiementAnnulationRequest"
              },
              "examples": {
                "erreur-destinataire": {
                  "$ref": "#/components/examples/PaiementAnnulationRequest"
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Demande d'annulation envoyée",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Paiement"
                },
                "examples": {
                  "envoye": {
                    "$ref": "#/components/examples/PaiementAnnulationReponseEnvoye"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "403": {
            "description": "Interdiction d'effectuer la demande d'annulation",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem7807"
                },
                "examples": {
                  "delai-depasse": {
                    "summary": "Délai de demande d'annulation dépassé",
                    "value": {
                      "type": "about:blank",
                      "title": "Bad Request",
                      "status": 403,
                      "detail": "Délai de demande d'annulation dépassé",
                      "invalid-params": [
                        {
                          "name": "end2endId",
                          "reason": "Une demande d'annulation d'un paiement ne peut être effectuée plus de 90 jours après la date de paiement"
                        }
                      ]
                    }
                  },
                  "retour-de-fonds-deja-effectue": {
                    "summary": "Retour de fonds déjà effectué",
                    "value": {
                      "type": "about:blank",
                      "title": "Bad Request",
                      "status": 403,
                      "detail": "Retour de fonds déjà effectué",
                      "invalid-params": [
                        {
                          "name": "end2endId",
                          "reason": "Le retour de fonds a déjà été effectué pour cette transaction"
                        }
                      ]
                    }
                  },
                  "transaction-non-irrevocable": {
                    "summary": "Transaction non irrévocable",
                    "value": {
                      "type": "about:blank",
                      "title": "Bad Request",
                      "status": 403,
                      "detail": "Transaction non irrévocable",
                      "invalid-params": [
                        {
                          "name": "end2endId",
                          "reason": "L'annulation ne peut pas être demandée pour un transfert qui n'est pas irrévocable"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Paiement non trouvé",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem7807"
                },
                "examples": {
                  "paiement-inexistant": {
                    "summary": "Paiement inexistant ou déjà archivé",
                    "value": {
                      "type": "about:blank",
                      "title": "Not Found",
                      "status": 404,
                      "detail": "Paiement inexistant ou déjà archivé",
                      "invalid-params": [
                        {
                          "name": "end2endId",
                          "reason": "Le paiement avec cet identifiant n'existe pas ou a déjà été archivé"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    },
    "/paiements/{end2endId}/annulations/reponses": {
      "parameters": [
        {
          "name": "end2endId",
          "in": "path",
          "description": "L'identifiant unique de bout en bout de la transaction",
          "required": true,
          "schema": {
            "type": "string"
          }
        }
      ],
      "put": {
        "tags": [
          "DemandeAnnulation"
        ],
        "summary": "Répondre à une demande d'annulation",
        "security": [
          {
            "OAuth2": [
              "demande_annulation_reponse.write"
            ]
          }
        ],
        "description": "Ce point de terminaison permet au business de répondre à une demande d'annulation de paiement.\n\nLe business peut accepter ou refuser la demande d'annulation :\n- `decision: true` : Accepte la demande d'annulation (le business effectuera un retour de fonds)\n- `decision: false` : Refuse la demande d'annulation\n\n**Idempotence** : Cet endpoint est idempotent.\n- Premier appel avec `decision: true` → Accepte la demande, retourne `200 OK {statut: \"ACCEPTE\"}`\n- Appels suivants avec `decision: true` → Retourne `200 OK` avec l'état actuel - idempotent\n- Premier appel avec `decision: false` → Refuse la demande, retourne `200 OK {statut: \"REJETE\"}`\n- Appels suivants avec `decision: false` → Retourne `200 OK {statut: \"REJETE\"}` (idempotent)\n- `decision: true` après `decision: false` → Retourne `403 Forbidden` (déjà refusée)\n- `decision: false` après `decision: true` → Retourne `403 Forbidden` (déjà acceptée)\n",
        "operationId": "demandeAnnulationRepondre",
        "requestBody": {
          "description": "La réponse du business à la demande d'annulation",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/PaiementAnnulationReponseRequest"
              },
              "examples": {
                "accepter": {
                  "$ref": "#/components/examples/PaiementAnnulationReponseRequestAccepter"
                },
                "refuser": {
                  "$ref": "#/components/examples/PaiementAnnulationReponseRequestRejeter"
                }
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Réponse à la demande d'annulation enregistrée.\n\nLa réponse retourne l'objet `Paiement` complet avec les champs mis à jour selon la décision :\n\n**En cas d'acceptation (`decision: true`)** :\n- `annulationStatut` : Mis à jour pour indiquer l'acceptation\n- `annulationDateReponse` : Date et heure de la réponse à la demande d'annulation\n- Un retour de fonds est automatiquement initié par le participant, donc les champs suivants sont également renseignés :\n  - `retourStatut` : Statut du retour de fonds (ex: `INITIE`, `ENVOYE`, `IRREVOCABLE`)\n  - `retourStatutRaison` : Raison du statut du retour de fonds\n  - `retourDateDemande` : Date de création du retour de fonds\n  - `retourDateIrrevocabilite` : Date à laquelle le retour de fonds est irrévocable (si applicable)\n\n**En cas de rejet (`decision: false`)** :\n- `annulationStatut` : Mis à jour pour indiquer le rejet (ex: `REJETE`)\n- `annulationDateReponse` : Date et heure de la réponse à la demande d'annulation\n- Les champs `retour*` ne sont **pas** renseignés car aucun retour de fonds n'est effectué\n",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Paiement"
                },
                "examples": {
                  "acceptee": {
                    "$ref": "#/components/examples/PaiementAnnulationReponseReponseAcceptee"
                  },
                  "refusee": {
                    "$ref": "#/components/examples/PaiementAnnulationReponseReponseRefusee"
                  }
                }
              }
            }
          },
          "401": {
            "$ref": "#/components/responses/AutorisationsManquantes"
          },
          "403": {
            "description": "Opération interdite",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem7807"
                },
                "examples": {
                  "decision-true-apres-false": {
                    "summary": "Tentative d'acceptation après refus",
                    "value": {
                      "type": "about:blank",
                      "title": "Forbidden",
                      "status": 403,
                      "detail": "Impossible d'accepter une demande d'annulation déjà refusée"
                    }
                  },
                  "decision-false-apres-true": {
                    "summary": "Tentative de refus après acceptation",
                    "value": {
                      "type": "about:blank",
                      "title": "Forbidden",
                      "status": 403,
                      "detail": "Impossible de refuser une demande d'annulation déjà acceptée"
                    }
                  },
                  "timeout-depasse": {
                    "summary": "Délai de réponse dépassé",
                    "value": {
                      "type": "about:blank",
                      "title": "Forbidden",
                      "status": 403,
                      "detail": "Le délai de réponse de 7 jours a été dépassé"
                    }
                  }
                }
              }
            }
          },
          "404": {
            "description": "Demande d'annulation non trouvée",
            "content": {
              "application/problem+json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem7807"
                },
                "examples": {
                  "demande-inexistante": {
                    "summary": "Demande d'annulation inexistante",
                    "value": {
                      "type": "about:blank",
                      "title": "Not Found",
                      "status": 404,
                      "detail": "Demande d'annulation inexistante ou déjà traitée",
                      "invalid-params": [
                        {
                          "name": "end2endId",
                          "reason": "La demande d'annulation avec cet identifiant n'existe pas ou a déjà été traitée"
                        }
                      ]
                    }
                  }
                }
              }
            }
          },
          "429": {
            "$ref": "#/components/responses/LimiteUtilisationDepasse"
          },
          "503": {
            "$ref": "#/components/responses/ProblemeServeur"
          }
        }
      }
    }
  },
  "components": {
    "securitySchemes": {
      "api_key": {
        "type": "apiKey",
        "name": "x-api-key",
        "in": "header"
      },
      "OAuth2": {
        "type": "oauth2",
        "flows": {
          "clientCredentials": {
            "tokenUrl": "https://spi.example.com/oauth/token",
            "scopes": {
              "compte_transaction.write": "Autorisation d'effectuer des mouvements de fonds entre ses comptes",
              "compte_transaction.read": "Autorisation pour consulter les transactions intra-comptes",
              "compte.read": "Autorisation pour consulter les comptes",
              "alias.write": "Autorisation de créer les alias",
              "alias.read": "Autorisation de consulter les alias",
              "alias.delete": "Autorisation  de supprimer des alias",
              "enrolement_alias.read": "Autorisation pour vérifier l'existence d'un alias",
              "webhook.read": "Autorisation de consulter le webhook",
              "webhook.write": "Autorisation d'écrire sur le webhook",
              "webhook.delete": "Autorisation de supprimer des webhooks",
              "demande_paiement.write": "Autorisation  de créer une demande de paiement",
              "demande_paiement.read": "Autorisation pour consulter des demandes de paiement",
              "demande_paiement_reponse.write": "Autorisation d'accepter ou de rejeter une demande de paiement",
              "demande_paiement_groupe.write": "Autorisation de créer des demandes de paiement en masse",
              "demande_paiement_groupe.read": "Autorisation pour consulter le statut d'une demande de paiement en masse",
              "paiement.write": "Autorisation  de créer un paiement immédiat",
              "paiement.read": "Autorisation pour consulter des paiements immédiats",
              "paiement_groupe.write": "Autorisation de créer des paiements en masse",
              "paiement_groupe.read": "Autorisation pour consulter le statut d'un paiement en masse",
              "retour_fonds.write": "Autorisation d'effectuer des retours de fonds",
              "demande_annulation.write": "Autorisation d'envoyer des demandes d'annulation de paiement",
              "demande_annulation_reponse.write": "Autorisation de répondre aux demandes d'annulation de paiement"
            }
          }
        }
      }
    },
    "schemas": {
      "CompteItem": {
        "type": "object",
        "properties": {
          "numero": {
            "type": "string",
            "description": "Le numéro de compte"
          },
          "type": {
            "type": "string",
            "enum": [
              "CACC",
              "CARD",
              "CASH",
              "CHAR",
              "CISH",
              "COMM",
              "CPAC",
              "LLSV",
              "LOAN",
              "MGLD",
              "MOMA",
              "NREX",
              "ODFT",
              "ONDP",
              "OTHR",
              "SACC",
              "SLRY",
              "SVGS",
              "TAXE",
              "TRAN",
              "TRAS",
              "VACC"
            ],
            "description": "Le type du compte. Codes possibles :\n- **CACC** : Compte courant utilisé pour enregistrer les débits et crédits lorsqu'aucun compte spécifique n'a été désigné\n- **CARD** : Compte de carte utilisé pour les paiements par carte de crédit\n- **CASH** : Compte de paiement en espèces utilisé pour le paiement d'espèces\n- **CHAR** : Compte de frais utilisé pour les frais si différent du compte de paiement\n- **CISH** : Compte de revenus en espèces utilisé pour le paiement de revenus si différent du compte de trésorerie courant\n- **COMM** : Compte de commission utilisé pour les commissions si différent du compte de paiement\n- **CPAC** : Compte de règlement du participant de compensation utilisé pour enregistrer les entrées de débit et crédit de règlement au nom d'un participant de compensation désigné\n- **LLSV** : Compte d'épargne à liquidité limitée utilisé pour l'épargne avec des conditions d'intérêt et de retrait spéciales\n- **LOAN** : Compte de prêt utilisé pour les prêts\n- **MGLD** : Compte de prêt marginal utilisé pour une facilité de prêt marginal\n- **MOMA** : Compte de marché monétaire utilisé pour les marchés monétaires si différent du compte de trésorerie\n- **NFCA** : Compte en devises étrangères pour non-résidents détenu localement par un individu ou une entité non-résidente\n- **NREX** : Compte externe pour non-résidents utilisé pour les non-résidents externes\n- **ODFT** : Compte de découvert utilisé pour les découverts\n- **ONDP** : Compte de dépôt à vue utilisé pour les dépôts à vue\n- **OTHR** : Autre type de compte non spécifié ailleurs\n- **SACC** : Compte de règlement utilisé pour enregistrer les entrées de débit et crédit résultant de transactions compensées et réglées via un système de compensation et de règlement spécifique\n- **SLRY** : Compte de salaire utilisé pour les paiements de salaires\n- **SVGS** : Compte d'épargne utilisé pour l'épargne\n- **TAXE** : Compte de taxes utilisé pour les taxes si différent du compte de paiement\n- **TRAN** : Compte de transaction, type de compte bancaire le plus basique, généralement sans carnet de chèques ni facilité de découvert\n- **TRAS** : Compte de trading en espèces utilisé pour le trading si différent du compte de trésorerie courant\n- **VACC** : Compte virtuel créé virtuellement pour faciliter la collecte et la réconciliation\n"
          },
          "dateOuverture": {
            "type": "string",
            "format": "date",
            "description": "La date d'ouverture du compte au format YYYY-MM-DD",
            "example": "2023-02-21"
          },
          "statut": {
            "type": "string",
            "enum": [
              "OUVERT",
              "BLOQUE",
              "CLOTURE"
            ],
            "description": "Le statut actuel du compte.\n- **OUVERT** : Le compte est actif et opérationnel\n- **BLOQUE** : Le compte est temporairement bloqué\n- **CLOTURE** : Le compte est fermé définitivement\n"
          }
        },
        "additionalProperties": false
      },
      "CompteListe": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CompteItem"
            }
          },
          "meta": {
            "type": "object",
            "properties": {
              "total": {
                "type": "number",
                "description": "Total d'éléments correspondants à la recherche"
              }
            }
          }
        }
      },
      "Problem7807": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "description": "Référence URI qui identifie le type de problème",
            "example": "about:blank"
          },
          "title": {
            "type": "string",
            "description": "Un bref résumé du problème",
            "example": "Bad Request"
          },
          "status": {
            "type": "integer",
            "description": "Le code d'état HTTP pour cette occurrence du problème",
            "example": 400
          },
          "detail": {
            "type": "string",
            "description": "Explication spécifique à cette occurrence du problème"
          },
          "invalid-params": {
            "type": "array",
            "description": "Liste des paramètres invalides",
            "items": {
              "type": "object",
              "properties": {
                "name": {
                  "type": "string",
                  "description": "Nom du paramètre invalide"
                },
                "reason": {
                  "type": "string",
                  "description": "Raison de l'invalidité du paramètre"
                }
              }
            }
          }
        }
      },
      "CompteSolde": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "CACC",
              "CARD",
              "CASH",
              "CHAR",
              "CISH",
              "COMM",
              "CPAC",
              "LLSV",
              "LOAN",
              "MGLD",
              "MOMA",
              "NREX",
              "ODFT",
              "ONDP",
              "OTHR",
              "SACC",
              "SLRY",
              "SVGS",
              "TAXE",
              "TRAN",
              "TRAS",
              "VACC"
            ],
            "description": "Le type du compte.\nTypes de comptes disponibles :\n- **CACC** (Current Account) : Compte courant utilisé pour enregistrer les débits et crédits lorsqu'aucun compte spécifique n'a été désigné.\n- **CARD** (Card Account) : Compte utilisé pour les paiements par carte de crédit.\n- **CASH** (Cash Payment) : Compte utilisé pour le paiement en espèces.\n- **CHAR** (Charges) : Compte utilisé pour les frais s'il diffère du compte de paiement.\n- **CISH** (Cash Income) : Compte utilisé pour le paiement des revenus s'il diffère du compte courant en espèces.\n- **COMM** (Commission) : Compte utilisé pour les commissions s'il diffère du compte de paiement.\n- **CPAC** (Clearing Participant Settlement Account) : Compte utilisé pour enregistrer les écritures de règlement débit et crédit au nom d'un participant de compensation désigné.\n- **LLSV** (Limited Liquidity Savings Account) : Compte utilisé pour l'épargne avec des conditions spéciales d'intérêt et de retrait.\n- **LOAN** (Loan) : Compte utilisé pour les prêts.\n- **MGLD** (Marginal Lending) : Compte utilisé pour une facilité de prêt marginal.\n- **MOMA** (Money Market) : Compte utilisé pour les marchés monétaires s'il diffère du compte en espèces.\n- **NREX** (Non Resident External) : Compte utilisé pour les non-résidents externes.\n- **ODFT** (Overdraft) : Compte utilisé pour les découverts.\n- **ONDP** (Over Night Deposit) : Compte utilisé pour les dépôts au jour le jour.\n- **SACC** (Settlement Account) : Compte utilisé pour enregistrer les écritures débit et crédit résultant de transactions compensées et réglées via un système spécifique de compensation et de règlement.\n- **SLRY** (Salary) : Comptes utilisés pour les paiements de salaires.\n- **SVGS** (Savings) : Compte utilisé pour l'épargne.\n- **TAXE** (Tax) : Compte utilisé pour les taxes s'il diffère du compte de paiement.\n- **TRAN** (Transacting Account) : Compte de transaction, le type de compte bancaire le plus basique. La principale différence entre les comptes de transaction et les comptes chèques est qu'il n'y a généralement pas de chéquier ni de facilité de découvert.\n- **TRAS** (Cash Trading) : Compte utilisé pour le trading s'il diffère du compte en espèces courant.\n- **VACC** (Virtual Account) : Compte créé virtuellement pour faciliter la collecte et le rapprochement.\n- **OTHR** (Other Account) : Type de compte non spécifié\n"
          },
          "numero": {
            "type": "string",
            "description": "Le numéro de compte"
          },
          "dateOuverture": {
            "type": "string",
            "format": "date",
            "description": "La date d'ouverture du compte au format YYYY-MM-DD",
            "example": "2023-02-21"
          },
          "solde": {
            "type": "number",
            "description": "Le solde du compte"
          },
          "statut": {
            "type": "string",
            "enum": [
              "OUVERT",
              "BLOQUE",
              "CLOTURE"
            ],
            "description": "Le statut actuel du compte.\n\nStatuts disponibles :\n\n- **OUVERT** : Le compte est actif et opérationnel. Toutes les opérations sont autorisées.\n- **BLOQUE** : Le compte est temporairement bloqué. Aucune opération n'est autorisée.\n- **CLOTURE** : Le compte est fermé définitivement. Aucune opération n'est possible.\n"
          },
          "preConfirmation": {
            "type": "boolean",
            "description": "Indique si l'attribut preConfirmation est présent.\nPreConfirmation est un attribut optionnel. \nPar défaut, pour les clients business (entreprises et les gouvernements), PI marque l'irrévocabilité du transfert de fonds sans demander une confirmation au participant payé.\nLa valeur par défaut est false pour indiquer que le compte reçoit des transferts sans préconfirmation.\n"
          }
        }
      },
      "CompteOperation": {
        "type": "object",
        "properties": {
          "txId": {
            "type": "string",
            "description": "Identifiant de la transaction dans le SI du client"
          },
          "montant": {
            "type": "number",
            "description": "Le montant du transfert à effectuer."
          },
          "motif": {
            "type": "string",
            "description": "Le motif du transfert"
          },
          "payeurNumero": {
            "type": "string",
            "description": "Le numéro de compte du payeur. Requis si `payeurAlias` n'est pas fourni."
          },
          "payeNumero": {
            "type": "string",
            "description": "Le numéro de compte du payé. Requis si `payeAlias` n'est pas fourni."
          },
          "statut": {
            "type": "string",
            "enum": [
              "INITIE",
              "IRREVOCABLE",
              "REJETE"
            ],
            "description": "- `INITIE` Le transfert est en cours de traitement\n- `IRREVOCABLE` Le tranfert à été effectué avec succès\n- `REJETE` Le tranfert à été rejeté\n"
          },
          "statutRaison": {
            "type": "string",
            "enum": [
              "SOLDE_INSUFFISANT"
            ],
            "description": "Raisons du rejet d'un tranfert':\n- SOLDE_INSUFFISANT le solde du compte debiteur est insuffisant pour effectuer l'opération.\n- COMPTE_BLOQUE le compte debiteur ou le compte crediteur est bloqué\n- COMPTE_CLOTURE le compte debiteur ou le compte crediteur est cloturé\n"
          },
          "dateEnvoi": {
            "type": "string",
            "format": "date-time",
            "description": "Date d'envoi du transfert de fonds: date et heure à laquelle le transfert à été initié\n"
          },
          "dateIrrevocabilite": {
            "type": "string",
            "format": "date-time",
            "description": "Date d'irrévocabilité du transfert de fonds: date et heure à laquelle le transfert à été irrévocable\n"
          }
        },
        "required": [
          "txId",
          "montant",
          "payeurNumero",
          "payeNumero",
          "statut",
          "dateEnvoi"
        ]
      },
      "CompteOperationListe": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/CompteOperation"
            }
          },
          "meta": {
            "type": "object",
            "properties": {
              "total": {
                "type": "number",
                "description": "total d'éléments correspondants à la recherche"
              },
              "size": {
                "type": "number",
                "description": "nombre d'éléments retournés"
              },
              "page": {
                "type": "string",
                "description": "numéro ou identifiant de la page suivante"
              },
              "next": {
                "type": "string",
                "description": "numéro ou identifiant de la page suivante"
              },
              "prev": {
                "type": "string",
                "description": "numéro ou identifiant de la page précédente"
              }
            }
          }
        }
      },
      "CompteTransfertIntraRequest": {
        "type": "object",
        "properties": {
          "txId": {
            "type": "string",
            "description": "Identifiant de la transaction dans le SI du client"
          },
          "montant": {
            "type": "number",
            "description": "Le montant du transfert à effectuer."
          },
          "motif": {
            "type": "string",
            "description": "Le motif du transfert"
          },
          "payeurNumero": {
            "type": "string",
            "description": "Le numéro de compte du payeur. Requis si `payeurAlias` n'est pas fourni."
          },
          "payeNumero": {
            "type": "string",
            "description": "Le numéro de compte du payé. Requis si `payeAlias` n'est pas fourni."
          }
        },
        "required": [
          "payeurNumero",
          "payeNumero",
          "txId",
          "montant"
        ]
      },
      "CompteTransfertIntraReponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/CompteTransfertIntraRequest"
          },
          {
            "type": "object",
            "properties": {
              "statut": {
                "type": "string",
                "enum": [
                  "INITIE",
                  "IRREVOCABLE",
                  "REJETE"
                ],
                "description": "- `INITIE` Le transfert est en cours de traitement\n- `IRREVOCABLE` Le tranfert à été effectué avec succès\n- `REJETE` Le tranfert à été rejeté\n"
              },
              "statutRaison": {
                "type": "string",
                "enum": [
                  "AG07",
                  "AC06",
                  "FF10"
                ],
                "description": "- AG07 le solde du compte debiteur est insuffisant pour effectuer l'opération.\n- AC06 le compte debiteur ou le compte crediteur est bloqué\n- FF10 Erreur de traitement du système interne du participant\n"
              },
              "dateEnvoi": {
                "type": "string",
                "format": "date-time",
                "description": "Date d'envoi du transfert de fonds: date et heure à laquelle le transfert à été initié\n"
              },
              "dateIrrevocabilite": {
                "type": "string",
                "format": "date-time",
                "description": "Date d'irrévocabilité du transfert de fonds: date et heure à laquelle le transfert à été irrévocable\n"
              }
            }
          }
        ]
      },
      "AliasCreationReponse": {
        "type": "object",
        "properties": {
          "cle": {
            "type": "string",
            "description": "Le valeur de l'alias créé"
          },
          "type": {
            "type": "string",
            "description": "Le type de l'alias",
            "enum": [
              "SHID",
              "MCOD"
            ]
          },
          "compte": {
            "type": "string",
            "description": "Le numéro de compte rattaché à l'alias"
          },
          "dateCreation": {
            "type": "string",
            "format": "date-time",
            "description": "Date au format ISO 8601"
          },
          "dateModification": {
            "type": "string",
            "format": "date-time",
            "description": "Date au format ISO 8601"
          }
        }
      },
      "AliasReponseListe": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/AliasCreationReponse"
            }
          },
          "meta": {
            "type": "object",
            "properties": {
              "total": {
                "type": "number",
                "description": "total d'éléments correspondants à la recherche"
              },
              "size": {
                "type": "number",
                "description": "nombre d'éléments retournés"
              },
              "page": {
                "type": "string",
                "description": "numéro ou identifiant de la page suivante"
              },
              "next": {
                "type": "string",
                "description": "numéro ou identifiant de la page suivante"
              },
              "prev": {
                "type": "string",
                "description": "numéro ou identifiant de la page précédente"
              }
            }
          }
        }
      },
      "AliasCreationRequest": {
        "type": "object",
        "properties": {
          "type": {
            "type": "string",
            "enum": [
              "MCOD",
              "SHID"
            ],
            "description": "Le client doit spécifier le type d'alias qu'il souhaite créer.\nLes types d'alias disponibles sont :\n- MCOD: Identifiant de compte marchand pour le service USSD uniquement\n- SHID: Adresse de paiement\n"
          }
        },
        "additionalProperties": false,
        "required": [
          "type"
        ]
      },
      "WebhooksEvents": {
        "type": "string",
        "title": "Type d'événement",
        "enum": [
          "PAIEMENT_RECU",
          "PAIEMENT_ENVOYE",
          "PAIEMENT_REJETE",
          "RTP_RECU",
          "RTP_REJETE",
          "ANNULATION_DEMANDE",
          "ANNULATION_REJETE",
          "RETOUR_ENVOYE",
          "RETOUR_REJETE",
          "RETOUR_RECU"
        ]
      },
      "WebhookCreationRequest": {
        "type": "object",
        "title": "Webhook",
        "properties": {
          "callbackUrl": {
            "type": "string",
            "title": "URL de callback",
            "format": "uri",
            "example": "https://mybusiness.example.com/api/webhook/"
          },
          "alias": {
            "type": "string",
            "title": "Alias du client",
            "description": "l'alias auquel est rattaché le point de rappel pour recevoir des notifications liées à un alias de compte\n"
          },
          "events": {
            "type": "array",
            "description": "les évènements dont les notifications seront envoyés sur le point de terminaison\n",
            "items": {
              "$ref": "#/components/schemas/WebhooksEvents"
            }
          }
        },
        "required": [
          "callbackUrl"
        ]
      },
      "WebhookData": {
        "type": "object",
        "title": "Webhook",
        "allOf": [
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "title": "identifiant du webhook"
              },
              "dateCreation": {
                "type": "string",
                "format": "date-time",
                "title": "Date de création",
                "description": "Date et heure d'enregistrement du webhook. Conforme à la RFC ISO 8601"
              },
              "dateModification": {
                "type": "string",
                "format": "date-time",
                "title": "Date de modification",
                "description": "Date et heure de la dernière modification du webhook. Conforme à la RFC ISO 8601"
              }
            }
          },
          {
            "$ref": "#/components/schemas/WebhookCreationRequest"
          }
        ]
      },
      "WebhookList": {
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "properties": {
          "data": {
            "type": "array",
            "description": "Liste des webhooks configurés",
            "items": {
              "$ref": "#/components/schemas/WebhookData"
            }
          },
          "meta": {
            "type": "object",
            "required": [
              "total"
            ],
            "properties": {
              "total": {
                "type": "integer",
                "description": "Nombre total de webhooks configurés"
              }
            }
          }
        }
      },
      "WebhookCreationResponse": {
        "type": "object",
        "title": "Webhook",
        "allOf": [
          {
            "$ref": "#/components/schemas/WebhookCreationRequest"
          },
          {
            "type": "object",
            "properties": {
              "id": {
                "type": "string",
                "title": "identifiant du webhook"
              },
              "dateCreation": {
                "type": "string",
                "format": "date-time",
                "title": "Date de création",
                "description": "Date et heure d'enregistrement du webhook. Conforme à la RFC ISO 8601"
              },
              "secret": {
                "type": "string",
                "title": "Secret pour la signature HMAC",
                "description": "Le secret doit être enregistré de façon sécurisée."
              }
            }
          }
        ]
      },
      "WebhookEvent": {
        "type": "object",
        "title": "Evénement",
        "properties": {
          "evCode": {
            "$ref": "#/components/schemas/WebhooksEvents"
          },
          "evDate": {
            "type": "string",
            "format": "date-time",
            "title": "Date de l'événement",
            "description": "Date et heure de l'événement.\nPOur un transfert irrévocable par exemple c'est la date d'irrévocabilité\n"
          },
          "txId": {
            "type": "string",
            "description": "Identifiant de la transaction dans le SI du client"
          },
          "end2endId": {
            "type": "string",
            "description": "Identifiant de l'ordre de transfert ou de la demande de paiement"
          },
          "instructionId": {
            "type": "string",
            "description": "Identifiant de l'instruction de paiement (Pour les paiements en masse)"
          },
          "montant": {
            "type": "number",
            "description": "Le montant du paiement ou demande de paiement ou demande retour"
          },
          "client": {
            "type": "string",
            "maxLength": 35,
            "description": "Le nom du client payeur ou payé en fonction du type d'événement"
          },
          "alias": {
            "type": "string",
            "description": "Alias de compte du client business sur lequel porte l'événement"
          },
          "motif": {
            "type": "string",
            "description": "Le motif d'un paiement reçu ou envoyé est un texte libre renseigné par le client payeur.\n\nLe motif d'une demande de paiement reçue est un texte libre renseigné par le client payé.\n\nEn dehors de ces cas, le motif est l'un des codes suivants en fonction du type d'événement :\n\n**Motifs de rejet des demandes de paiement :**\n\n- **AC04** (Closed Account Number) : Le compte du client payeur est clôturé.\n- **AC06** (Blocked Account) : Le compte du client payeur est bloqué.\n- **AEXR** (Already Expired RTP) : La demande de paiement a déjà expiré.\n- **AG03** (Transaction Not Supported) : Le client n'est pas autorisé à payer en mode débit différé.\n- **AG10** (Agent Suspended) : Le participant payeur est suspendu.\n- **AG11** (Creditor Agent Suspended) : Le participant payé est désactivé.\n- **ALAC** (Already Accepted RTP) : La demande de paiement a déjà été acceptée.\n- **AM02** (Not Allowed Amount) : Le montant spécifique de la transaction dépasse le montant maximum autorisé.\n- **AM09** (Wrong Amount) : Le montant reçu ne correspond pas au montant convenu ou attendu.\n- **AM14** (Amount Exceeds Agreed Limit) : Le montant de la transaction fait dépasser le plafond de débit différé du client.\n- **APAR** (Already Paid RTP) : Le paiement demandé a déjà été effectué par le payeur.\n- **ARFR** (Already Refused RTP) : La demande de paiement a déjà été refusée.\n- **ARJR** (Already Rejected RTP) : La demande de paiement a déjà été rejetée.\n- **BE01** (Inconsistent With End Customer) : L'identification du client final n'est pas liée au numéro de compte associé.\n- **BE05** (Unrecognised Initiating Party) : La partie qui a initié le message n'est pas reconnue par le client final.\n- **FR01** (Fraud) : Rejeté pour suspicion de fraude.\n- **RR07** (Remittance Information Invalid) : Le justificatif de la demande de paiement est invalide (par exemple, le numéro de facture est invalide).\n\n**Motifs de rejet des paiements :**\n\n- **AB03** (Aborted Settlement Timeout) : Message en timeout lors du règlement.\n- **AB04** (Aborted Settlement Fatal Error) : Transaction rejetée à cause d'une erreur fatale.\n- **AB08** (Offline Creditor Agent) : Le système du participant payé n'est pas accessible.\n- **AB09** (Error Creditor Agent) : Transaction rejetée à cause d'une erreur chez le participant payé.\n- **AC03** (Invalid Creditor Account Number) : Le numéro de compte du payé est invalide.\n- **AC06** (Blocked Account) : Le compte spécifié est bloqué.\n- **AC07** (Closed Creditor Account Number) : Le compte du payé est clôturé.\n- **AG01** (Transaction Forbidden) : Transaction interdite sur ce type de compte.\n- **AG10** (Agent Suspended) : Le participant payeur est désactivé.\n- **AG11** (Creditor Agent Suspended) : Le participant payé est désactivé.\n- **AEXR** (Already Expired RTP) : La demande de paiement a déjà expiré.\n- **ALAC** (Already Accepted RTP) : La demande de paiement a déjà été acceptée.\n- **AM02** (Not Allowed Amount) : Le montant de la transaction est supérieur au maximum autorisé.\n- **AM04** (Insufficient Funds) : Le solde de garantie du participant payeur est insuffisant.\n- **AM09** (Wrong Amount) : Le montant du transfert est différent du montant attendu.\n- **AM21** (Limit Exceeded) : Le montant de la transaction dépasse les limites convenues entre le participant et le client.\n- **ARFR** (Already Refused RTP) : La demande de paiement a déjà été refusée.\n- **ARJR** (Already Rejected RTP) : La demande de paiement a déjà été rejetée.\n- **BE01** (Inconsistent With End Customer) : L'identification du client final n'est pas liée au numéro de compte associé.\n- **FR01** (Fraud) : Rejeté pour suspicion de fraude.\n- **IRNR** (Initial RTP Never Received) : La demande de paiement n'a jamais été reçue.\n- **RR04** (Regulatory Reason) : Raison règlementaire, notamment lorsque le bénéficiaire figure dans une liste d'interdiction.\n\n**Motifs d'une demandes d'annulation :**\n\n- **DUPL** (Duplicate Payment) : Déjà payé.\n- **AM09** (Wrong Amount) : Erreur sur le montant.\n- **AC03** (Invalid Creditor Account Number) : Erreur sur le destinataire.\n- **SVNR** (Service Not Rendered) : Le paiement est annulé car le produit n'a pas été livré ou le service n'a pas été rendu.\n- **FRAD** (Fraudulent Origin) : Annulation demandée à la suite d'une transaction dont l'origine est frauduleuse.\n\n**Motifs de rejet d'une demande d'annulation :**\n\n- **ARDT** (Already Returned) : La transaction est déjà retournée.\n- **CUST** (Customer Decision) : Le client payé rejette la demande d'annulation.\n- **AC04** (Closed Account Number) : Le numéro de compte spécifié a été clôturé dans les livres du participant payé.\n\n**Motifs d'un retour de fonds reçu ou envoyé :**\n\n- **AC06** (Blocked Account) : Le compte du payé est bloqué.\n- **AC07** (Closed Creditor Account Number) : Le compte du payé est clôturé.\n- **MD06** (Refund Request By End Customer) : Retour de fonds initié par le client payé.\n- **CUST** (Requested By Customer) : Retour de fonds demandé suite à une demande d'annulation envoyée par le payeur.\n- **FR01** (Fraud) : Retourné à la suite d'une fraude.\n- **RR04** (Regulatory Reason) : Raison règlementaire, notamment lorsque le bénéficiaire figure dans une liste d'interdiction.\n\n\n**Motifs de rejet d'un retour de fonds :**\n\n- **AB03** (Aborted Settlement Timeout) : Timeout.\n- **AB04** (Aborted Settlement Fatal Error) : Transaction rejetée à cause d'une erreur fatale.\n- **AG10** (Agent Suspended) : Le participant payeur est désactivé.\n- **AG11** (Creditor Agent Suspended) : Le participant payé est désactivé.\n- **AM04** (Insufficient Funds) : Le solde de garantie du participant payé est insuffisant.\n- **AC04** (Closed Account Number) : Le compte du payeur est clôturé.\n- **AC06** (Blocked Account) : Le compte du payeur est bloqué.\n- **AG01** (Transaction Forbidden) : Transaction interdite sur ce type de compte.\n- **AM21** (Limit Exceeded) : Le montant de la transaction dépasse les limites convenues entre le participant et le client.\n- **RR04** (Regulatory Reason) : Raison règlementaire, notamment lorsque le bénéficiaire figure dans une liste d'interdiction.\n- **FR01** (Fraud) : Rejeté pour suspicion de fraude.\n",
            "maxLength": 140
          },
          "refDocType": {
            "type": "string",
            "enum": [
              "CINV",
              "CMCN",
              "DISP",
              "PUOR",
              "CONT",
              "HIRI",
              "INVS",
              "MSIN",
              "PROF",
              "QUOT",
              "SPRR",
              "TISH",
              "USAR",
              "BOLD",
              "SOAC",
              "VCHR"
            ],
            "description": "Le type de document justificatif associé à la transaction. Les types de documents disponibles sont :\n- **QUOT** (Quotation) : Devis commercial détaillant les conditions d'offre.\n- **PROF** (Proforma Invoice) : Facture pro forma, engagement préliminaire du vendeur (prix/conditions), sans enregistrement comptable réel.\n- **CINV** (Commercial Invoice) : Facture commerciale standard pour la vente de biens ou services. Utilisée pour les paiements directs d'une facture émise par le vendeur.\n- **CMCN** (Commercial Contract) : Contrat commercial entre les parties, stipulant les termes et conditions de la livraison de biens ou de services.\n- **DISP** (Dispatch Advice) : Avis d'expédition ou bon de livraison.\n- **PUOR** (Purchase Order) : Bon de commande émis par l'acheteur.\n- **CONT** (Contract) : Document contractuel prouvant un accord entre vendeur et acheteur pour biens ou services.\n- **HIRI** (Hire Invoice) : Facture pour location de ressources humaines (ex : intérim) ou biens/équipements.\n- **INVS** (Invoice Signed) : Facture signée, validée électroniquement ou physiquement. Indique une approbation formelle avant paiement.\n- **MSIN** (Metered Service Invoice) : Facture pour services mesurés (ex : gaz, électricité via compteur fixe). Inclut la consommation réelle.\n- **SPRR** (Seller Presentment) : Document de présentation par le vendeur pour supporter l'acquisition (ex : preuve de livraison ou justificatif).\n- **TISH** (Time Sheet) : Feuille de temps enregistrant les heures pour services/prestations ou livraison. Pour paiements basés sur le temps (ex : consulting, freelance).\n- **USAR** (Usage Report) : Rapport d'utilisation indiquant le pattern de consommation (ex : SaaS, télécoms). Similaire à MSIN mais plus large (non forcément mesuré).\n- **BOLD** (Bill Of Lading) : Document de transport maritime ou logistique (connaissement) prouvant l'expédition des marchandises. Spécifique au transport multimodal (ex : maritime, aérien).\n- **SOAC** (Statement Of Account) : Relevé de compte émis par le fournisseur, listant les transactions enregistrées pour le débiteur (ex : factures, paiements, ajustements).\n- **VCHR** (Voucher) : Document électronique de paiement (bon ou coupon) représentant une obligation ou un droit de paiement. Souvent utilisé pour des paiements préautorisés ou des remises spécifiques.\n"
          },
          "refDocNumero": {
            "type": "string",
            "description": "Le numéro du document justificatif",
            "maxLength": 35
          }
        },
        "required": [
          "evCode",
          "evDate",
          "end2endId",
          "montant"
        ]
      },
      "WebhookEventsList": {
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "properties": {
          "data": {
            "type": "array",
            "description": "Liste des événements notifiés",
            "items": {
              "$ref": "#/components/schemas/WebhookEvent"
            }
          },
          "meta": {
            "type": "object",
            "required": [
              "total"
            ],
            "properties": {
              "total": {
                "type": "integer",
                "description": "Nombre total d'événements dans cette notification",
                "example": 1
              }
            }
          }
        }
      },
      "WebhookModificationRequest": {
        "type": "object",
        "properties": {
          "callbackUrl": {
            "type": "string",
            "description": "URL de callback"
          },
          "alias": {
            "type": "string",
            "description": "Alias de compte"
          },
          "events": {
            "type": "array",
            "description": "Événements",
            "items": {
              "type": "string",
              "title": "Type d'événement",
              "enum": [
                "PAIEMENT_RECU",
                "PAIEMENT_ENVOYE",
                "PAIEMENT_REJETE",
                "RTP_RECU",
                "RTP_REJETE",
                "ANNULATION_DEMANDE",
                "ANNULATION_REJETE",
                "RETOUR_ENVOYE",
                "RETOUR_REJETE",
                "RETOUR_RECU"
              ]
            }
          }
        },
        "oneOf": [
          {
            "required": [
              "callbackUrl"
            ]
          },
          {
            "required": [
              "alias"
            ]
          },
          {
            "required": [
              "events"
            ]
          }
        ]
      },
      "WebhookRenouvellementSecretRequest": {
        "type": "object",
        "title": "Renouvellement de secret",
        "properties": {
          "dateExpiration": {
            "type": "string",
            "title": "Date d'expiration du secret",
            "format": "date-time",
            "example": "2025-12-31T23:59:59Z"
          }
        },
        "required": [
          "dateExpiration"
        ]
      },
      "RefDocType": {
        "type": "string",
        "enum": [
          "CINV",
          "CMCN",
          "DISP",
          "PUOR",
          "CONT",
          "HIRI",
          "INVS",
          "MSIN",
          "PROF",
          "QUOT",
          "SPRR",
          "TISH",
          "USAR",
          "BOLD",
          "SOAC",
          "VCHR"
        ],
        "description": "Le type de document justificatif associé à la transaction. Les types de documents disponibles sont :\n- **QUOT** (Quotation) : Devis commercial détaillant les conditions d'offre.\n- **PROF** (Proforma Invoice) : Facture pro forma, engagement préliminaire du vendeur (prix/conditions), sans enregistrement comptable réel.\n- **CINV** (Commercial Invoice) : Facture commerciale standard pour la vente de biens ou services. Utilisée pour les paiements directs d'une facture émise par le vendeur.\n- **CMCN** (Commercial Contract) : Contrat commercial entre les parties, stipulant les termes et conditions de la livraison de biens ou de services.\n- **DISP** (Dispatch Advice) : Avis d'expédition ou bon de livraison.\n- **PUOR** (Purchase Order) : Bon de commande émis par l'acheteur.\n- **CONT** (Contract) : Document contractuel prouvant un accord entre vendeur et acheteur pour biens ou services.\n- **HIRI** (Hire Invoice) : Facture pour location de ressources humaines (ex : intérim) ou biens/équipements.\n- **INVS** (Invoice Signed) : Facture signée, validée électroniquement ou physiquement. Indique une approbation formelle avant paiement.\n- **MSIN** (Metered Service Invoice) : Facture pour services mesurés (ex : gaz, électricité via compteur fixe). Inclut la consommation réelle.\n- **SPRR** (Seller Presentment) : Document de présentation par le vendeur pour supporter l'acquisition (ex : preuve de livraison ou justificatif).\n- **TISH** (Time Sheet) : Feuille de temps enregistrant les heures pour services/prestations ou livraison. Pour paiements basés sur le temps (ex : consulting, freelance).\n- **USAR** (Usage Report) : Rapport d'utilisation indiquant le pattern de consommation (ex : SaaS, télécoms). Similaire à MSIN mais plus large (non forcément mesuré).\n- **BOLD** (Bill Of Lading) : Document de transport maritime ou logistique (connaissement) prouvant l'expédition des marchandises. Spécifique au transport multimodal (ex : maritime, aérien).\n- **SOAC** (Statement Of Account) : Relevé de compte émis par le fournisseur, listant les transactions enregistrées pour le débiteur (ex : factures, paiements, ajustements).\n- **VCHR** (Voucher) : Document électronique de paiement (bon ou coupon) représentant une obligation ou un droit de paiement. Souvent utilisé pour des paiements préautorisés ou des remises spécifiques.\n"
      },
      "DemandePaiementStatut": {
        "type": "string",
        "enum": [
          "INITIE",
          "ANNULE",
          "ENVOYE",
          "IRREVOCABLE",
          "REJETE"
        ],
        "description": "- `INITIE` si la confirmation du client est attendue suite à la recherche d'alias\n- `ANNULE` si lors de la confirmation, le business a annulé l'envoi du paiement\n- `ENVOYE` si les validations sont concluantes et que le PSP a envoyé la demande\n- `IRREVOCABLE` si le payeur a accepté la demande\n- `REJETE` si le payeur rejette la demande\n"
      },
      "DemandePaiementStatutRaison": {
        "type": "string",
        "description": "\n**Raisons de rejet ou d'echec des demandes de paiement :**\n- **BE23** (Alias invalid) : L'alias du payeur n'existe pas ou est invalide.\n- **DU03** (Duplicate Transaction) : Le txId n'est pas unique\n\n- **FF10** (Internal System Error) : Erreur de traitement du système interne du participant\n\n- **AC04** (Closed Account Number) : Le compte du client payeur est clôturé.\n- **AC06** (Blocked Account) : Le compte du client payeur est bloqué.\n- **AEXR** (Already Expired RTP) : La demande de paiement a déjà expiré.\n- **AG03** (Transaction Not Supported) : Le client n'est pas autorisé à payer en mode débit différé.\n- **AG10** (Agent Suspended) : Le participant payeur est suspendu.\n- **AG11** (Creditor Agent Suspended) : Le participant payé est désactivé.\n- **ALAC** (Already Accepted RTP) : La demande de paiement a déjà été acceptée.\n- **AM02** (Not Allowed Amount) : Le montant spécifique de la transaction dépasse le montant maximum autorisé.\n- **AM09** (Wrong Amount) : Le montant reçu ne correspond pas au montant convenu ou attendu.\n- **AM14** (Amount Exceeds Agreed Limit) : Le montant de la transaction fait dépasser le plafond de débit différé du client.\n- **APAR** (Already Paid RTP) : Le paiement demandé a déjà été effectué par le payeur.\n- **ARFR** (Already Refused RTP) : La demande de paiement a déjà été refusée.\n- **ARJR** (Already Rejected RTP) : La demande de paiement a déjà été rejetée.\n- **BE01** (Inconsistent With End Customer) : L'identification du client final n'est pas liée au numéro de compte associé.\n- **BE05** (Unrecognised Initiating Party) : La partie qui a initié le message n'est pas reconnue par le client final.\n- **FR01** (Fraud) : Rejeté pour suspicion de fraude.\n- **RR07** (Remittance Information Invalid) : Le justificatif de la demande de paiement est invalide (par exemple, le numéro de facture est invalide).\n",
        "enum": [
          "BE23",
          "DU03",
          "FF10",
          "AC04",
          "AC06",
          "AEXR",
          "AG03",
          "AG10",
          "AG11",
          "ALAC",
          "AM02",
          "AM09",
          "AM14",
          "APAR",
          "ARFR",
          "ARJR",
          "BE01",
          "BE05",
          "FR01",
          "RR07"
        ]
      },
      "DemandePaiementListeItem": {
        "type": "object",
        "properties": {
          "txId": {
            "type": "string",
            "maxLength": 35,
            "description": "Identifiant de la demande de paiement dans le SI du client"
          },
          "categorie": {
            "type": "string",
            "enum": [
              "631",
              "500",
              "521",
              "401"
            ],
            "description": "Categorie de la demande de paiement"
          },
          "payeAlias": {
            "type": "string",
            "example": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
            "description": "L'alias de compte dans lequel le client payé souhaite recevoir les paiements"
          },
          "logoUrl": {
            "type": "string",
            "description": "L'URL du logo du business ou d'un produit du business qui sera affiché au client payeur"
          },
          "payeurAlias": {
            "type": "string",
            "example": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
            "description": "Alias de compte du client payeur à qui est adressée la demande"
          },
          "confirmation": {
            "type": "boolean",
            "description": "Lorsque le PSP reçoit la demande, il effectue une recherche d'alias en vue d'obtenir les informations de compte du client payeur.\n\nL'attribut `confirmation` permet au client d'indiquer à son PSP si celui-ci doit lui retourner les résultats de la recherche d'alias pour confirmation:\n\n* La valeur `true` de la confirmation indique au PSP qu'il doit retourner le résultat de la recherche d'alias au client et attendre une confirmation\n* La valeur `false` indique qu'une confirmation n'est pas requise pour la demande, de ce fait le PSP transmet directement la demande à PI\n"
          },
          "remise": {
            "type": "object",
            "description": "Remise appliquée sur la demande de paiement",
            "properties": {
              "montant": {
                "type": "number",
                "description": "Le montant de la remise"
              },
              "taux": {
                "type": "number",
                "description": "Le taux de la remise"
              }
            }
          },
          "debitDiffere": {
            "type": "boolean",
            "description": "Indique si le client peut acheter maintenant et payer plus tard."
          },
          "montant": {
            "type": "number",
            "description": "Le montant total du paiement à effectuer"
          },
          "montantAchat": {
            "type": "number",
            "description": "Le montant de l'achat"
          },
          "montantRetrait": {
            "type": "number",
            "description": "Le montant du retrait"
          },
          "montantFrais": {
            "type": "number",
            "description": "Les frais de retrait"
          },
          "motif": {
            "type": "string",
            "description": "Le motif de la demande de paiement",
            "maxLength": 140
          },
          "refDocNumero": {
            "type": "string",
            "description": "Le numéro / la référence du document justificatif",
            "maxLength": 35
          },
          "refDocType": {
            "$ref": "#/components/schemas/RefDocType"
          },
          "statut": {
            "type": "string",
            "$ref": "#/components/schemas/DemandePaiementStatut"
          },
          "statutRaison": {
            "$ref": "#/components/schemas/DemandePaiementStatutRaison"
          },
          "end2endId": {
            "type": "string",
            "description": "Identifiant unique de bout en bout de la transaction"
          },
          "payeurNom": {
            "type": "string",
            "description": "Le nom du payeur"
          },
          "payeurPays": {
            "type": "string",
            "description": "Le pays de residence du payeur"
          },
          "payeNom": {
            "type": "string",
            "description": "Le nom du payé (Retourné dans le cas d'un RTP reçu)"
          },
          "payePays": {
            "type": "string",
            "description": "Le pays de residence du payé (Retourné dans le cas d'un RTP reçu)"
          },
          "dateLimitePaiement": {
            "type": "string",
            "format": "date-time",
            "description": "Date limite de paiement"
          },
          "dateLimiteReponse": {
            "type": "string",
            "format": "date-time",
            "description": "Date limite de réponse"
          },
          "dateDemande": {
            "type": "string",
            "format": "date-time",
            "description": "Date de la demande de paiement\n"
          },
          "dateConfirmation": {
            "type": "string",
            "format": "date-time",
            "description": "Date de confirmation de la demande si le client avait requis la confirmation de la demande de paiement.\nIl s'agit de la date et heure à laquelle le client a confirmé la demande.\n"
          },
          "dateEnvoi": {
            "type": "string",
            "format": "date-time",
            "description": "Date d'envoi de la demande: date et heure à laquelle la demande de paiement est envoyée par le PSP\n"
          },
          "dateReponse": {
            "type": "string",
            "format": "date-time",
            "description": "Date à laquelle le payeur à repondu à la demande de paiement\n"
          },
          "dateIrrevocabilite": {
            "type": "string",
            "format": "date-time",
            "description": "Date à laquelle le paiement accepté est irrévocable\n"
          }
        }
      },
      "DemandePaiementListe": {
        "type": "object",
        "required": [
          "data",
          "meta"
        ],
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DemandePaiementListeItem"
            }
          },
          "meta": {
            "type": "object",
            "properties": {
              "total": {
                "type": "integer",
                "description": "Nombre total de demandes de paiement correspondant aux critères",
                "example": 150
              },
              "size": {
                "type": "integer",
                "description": "Nombre d'éléments par page"
              },
              "page": {
                "type": "string",
                "description": "Identifiant de la page actuelle"
              },
              "next": {
                "type": "string",
                "description": "Identifiant de la page suivante"
              },
              "prev": {
                "type": "string",
                "description": "Identifiant de la page précédente"
              }
            }
          }
        }
      },
      "DemandePaiementRequestBase": {
        "type": "object",
        "properties": {
          "txId": {
            "type": "string",
            "maxLength": 35,
            "description": "Identifiant de la demande de paiement dans le SI du client",
            "minLength": 1
          },
          "payeurAlias": {
            "type": "string",
            "example": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
            "format": "uuid",
            "description": "Alias de compte du client payeur à qui est adressée la demande"
          },
          "payeAlias": {
            "type": "string",
            "example": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
            "format": "uuid",
            "description": "L'alias de compte dans lequel le client payé souhaite recevoir les paiements"
          },
          "logoUrl": {
            "type": "string",
            "description": "L'URL du logo du business ou d'un produit du business qui sera affiché au client payeur",
            "maxLength": 140,
            "minLength": 1
          },
          "confirmation": {
            "type": "boolean",
            "description": "Lorsque le PSP reçoit la demande, il effectue une recherche d'alias en vue d'obtenir les informations de compte du client payeur.\n\nL'attribut `confirmation` permet au client d'indiquer à son PSP si celui-ci doit lui retourner les résultats de la recherche d'alias pour confirmation:\n\n* La valeur `true` de la confirmation indique au PSP qu'il doit retourner le résultat de la recherche d'alias au client et attendre une confirmation\n* La valeur `false` indique qu'une confirmation n'est pas requise pour la demande, de ce fait le PSP transmet directement la demande à PI\n"
          },
          "montant": {
            "type": "number",
            "description": "Le montant total du paiement à effectuer",
            "minimum": 1
          },
          "motif": {
            "type": "string",
            "description": "Le motif de la demande de paiement",
            "maxLength": 140,
            "minLength": 2
          },
          "refDocNumero": {
            "type": "string",
            "description": "Le numéro / la référence du document justificatif",
            "maxLength": 35,
            "minLength": 1
          },
          "refDocType": {
            "$ref": "#/components/schemas/RefDocType"
          }
        },
        "required": [
          "txId",
          "confirmation",
          "payeurAlias",
          "payeAlias",
          "montant"
        ]
      },
      "DemandePaiementRequest": {
        "oneOf": [
          {
            "title": "Paiement immédiat sur site",
            "description": "Demande de paiement immédiat en point de vente physique (categorie=500)",
            "allOf": [
              {
                "type": "object",
                "properties": {
                  "categorie": {
                    "type": "string",
                    "enum": [
                      "500"
                    ]
                  }
                },
                "required": [
                  "categorie"
                ]
              },
              {
                "$ref": "#/components/schemas/DemandePaiementRequestBase"
              }
            ]
          },
          {
            "title": "Paiement sur site PICO (achat avec retrait espèces)",
            "description": "Paiement sur site (categorie=500) avec achat ET retrait d'espèces",
            "allOf": [
              {
                "type": "object",
                "properties": {
                  "categorie": {
                    "type": "string",
                    "enum": [
                      "500"
                    ]
                  },
                  "montantAchat": {
                    "type": "number",
                    "description": "Montant de l'achat"
                  },
                  "montantRetrait": {
                    "type": "number",
                    "description": "Montant du retrait d'espèces (Inclus le montant des frais)"
                  },
                  "montantFrais": {
                    "type": "number",
                    "description": "Frais de retrait"
                  }
                },
                "required": [
                  "categorie",
                  "montantAchat",
                  "montantRetrait"
                ]
              },
              {
                "$ref": "#/components/schemas/DemandePaiementRequestBase"
              }
            ]
          },
          {
            "title": "Paiement sur site PICASH (retrait espèces uniquement)",
            "description": "Retrait d'espèces uniquement (categorie=500) sans achat",
            "allOf": [
              {
                "type": "object",
                "properties": {
                  "categorie": {
                    "type": "string",
                    "enum": [
                      "500"
                    ]
                  },
                  "montantRetrait": {
                    "type": "number",
                    "description": "Montant du retrait d'espèces"
                  },
                  "montantFrais": {
                    "type": "number",
                    "description": "Frais de retrait"
                  }
                },
                "required": [
                  "categorie",
                  "montantRetrait"
                ]
              },
              {
                "$ref": "#/components/schemas/DemandePaiementRequestBase"
              }
            ]
          },
          {
            "title": "Paiement sur site avec débit différé",
            "description": "Achat en magasin avec paiement différé (categorie=500) et remise avec taux max 1%",
            "allOf": [
              {
                "type": "object",
                "properties": {
                  "categorie": {
                    "type": "string",
                    "enum": [
                      "500"
                    ]
                  },
                  "debitDiffere": {
                    "type": "boolean",
                    "enum": [
                      true
                    ],
                    "description": "Indique que le paiement est différé (Acheter maintenant, payer plus tard)"
                  },
                  "remise": {
                    "type": "object",
                    "description": "Remise appliquée sur la facture",
                    "oneOf": [
                      {
                        "title": "Remise par montant",
                        "required": [
                          "montant"
                        ],
                        "properties": {
                          "montant": {
                            "type": "number",
                            "description": "Montant de la remise"
                          }
                        }
                      },
                      {
                        "title": "Remise par taux",
                        "required": [
                          "taux"
                        ],
                        "properties": {
                          "taux": {
                            "type": "number",
                            "enum": [
                              1
                            ],
                            "description": "Taux de remise (1%)"
                          }
                        }
                      }
                    ]
                  }
                },
                "required": [
                  "categorie",
                  "debitDiffere",
                  "remise"
                ]
              },
              {
                "$ref": "#/components/schemas/DemandePaiementRequestBase"
              }
            ]
          },
          {
            "title": "Paiement immédiat e-commerce",
            "description": "Demande de paiement immédiat pour e-commerce (categorie=521), sans date limite fournie ni transmise à PI (décision projet DPE-02). Le délai de 2 minutes annoncé par la source reste à clarifier auprès de la BCEAO.",
            "not": {
              "anyOf": [
                {
                  "required": [
                    "dateLimitePaiement"
                  ]
                },
                {
                  "required": [
                    "dateLimiteReponse"
                  ]
                },
                {
                  "required": [
                    "debitDiffere"
                  ],
                  "properties": {
                    "debitDiffere": {
                      "enum": [
                        true
                      ]
                    }
                  }
                }
              ]
            },
            "allOf": [
              {
                "type": "object",
                "properties": {
                  "categorie": {
                    "type": "string",
                    "enum": [
                      "521"
                    ]
                  }
                },
                "required": [
                  "categorie"
                ]
              },
              {
                "$ref": "#/components/schemas/DemandePaiementRequestBase"
              }
            ]
          },
          {
            "title": "Paiement e-commerce avec débit différé",
            "description": "E-commerce (categorie=521) avec débit différé et remise",
            "not": {
              "anyOf": [
                {
                  "required": [
                    "dateLimitePaiement"
                  ]
                },
                {
                  "required": [
                    "dateLimiteReponse"
                  ]
                }
              ]
            },
            "allOf": [
              {
                "type": "object",
                "properties": {
                  "categorie": {
                    "type": "string",
                    "enum": [
                      "521"
                    ]
                  },
                  "debitDiffere": {
                    "type": "boolean",
                    "enum": [
                      true
                    ],
                    "description": "Indique que le paiement est différé"
                  },
                  "remise": {
                    "type": "object",
                    "description": "Remise appliquée",
                    "properties": {
                      "montant": {
                        "type": "number",
                        "description": "Montant de la remise"
                      },
                      "taux": {
                        "type": "number",
                        "description": "Taux de remise"
                      }
                    },
                    "oneOf": [
                      {
                        "required": [
                          "montant"
                        ]
                      },
                      {
                        "required": [
                          "taux"
                        ]
                      }
                    ]
                  }
                },
                "required": [
                  "categorie",
                  "debitDiffere",
                  "remise"
                ]
              },
              {
                "$ref": "#/components/schemas/DemandePaiementRequestBase"
              }
            ]
          },
          {
            "title": "Paiement de facture sans remise",
            "description": "Demande de paiement de facture (categorie=401) avec dates limites de paiement et de réponse",
            "allOf": [
              {
                "type": "object",
                "properties": {
                  "categorie": {
                    "type": "string",
                    "enum": [
                      "401"
                    ]
                  },
                  "dateLimitePaiement": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Date limite de paiement de la facture (ex \"A payer avant\")"
                  },
                  "dateLimiteReponse": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Date limite de réponse"
                  }
                },
                "required": [
                  "categorie",
                  "dateLimitePaiement"
                ]
              },
              {
                "$ref": "#/components/schemas/DemandePaiementRequestBase"
              }
            ]
          },
          {
            "title": "Paiement de facture avec remise",
            "description": "Paiement de facture (categorie=401) avec remise sur montant",
            "allOf": [
              {
                "type": "object",
                "properties": {
                  "categorie": {
                    "type": "string",
                    "enum": [
                      "401"
                    ]
                  },
                  "dateLimitePaiement": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Date limite de paiement"
                  },
                  "dateLimiteReponse": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Date limite de réponse"
                  },
                  "remise": {
                    "type": "object",
                    "description": "Remise appliquée sur la facture - la remise n'est pas appliquée après la date limite de paiement",
                    "oneOf": [
                      {
                        "title": "Remise par montant",
                        "required": [
                          "montant"
                        ],
                        "properties": {
                          "montant": {
                            "type": "number",
                            "description": "Montant de la remise"
                          }
                        }
                      },
                      {
                        "title": "Remise par taux",
                        "required": [
                          "taux"
                        ],
                        "properties": {
                          "taux": {
                            "type": "number"
                          }
                        }
                      }
                    ]
                  }
                },
                "required": [
                  "categorie",
                  "dateLimitePaiement",
                  "dateLimiteReponse",
                  "remise"
                ]
              },
              {
                "$ref": "#/components/schemas/DemandePaiementRequestBase"
              }
            ]
          }
        ]
      },
      "DemandePaiementRequestCategorie": {
        "type": "string",
        "enum": [
          "500",
          "521",
          "401"
        ],
        "description": "Catégorie de la demande de paiement\n- `500` Demande de Paiement marchand sur site \n- `521` Demande de Paiement e-commerce immédiat\n- `401` Autres demandes de paiement de facture\n"
      },
      "DemandePaiementReponse": {
        "type": "object",
        "properties": {
          "txId": {
            "type": "string",
            "maxLength": 35,
            "description": "Identifiant de la demande de paiement dans le SI du client"
          },
          "payeurAlias": {
            "type": "string",
            "example": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
            "description": "Alias de compte du client payeur à qui est adressé la demande"
          },
          "payeAlias": {
            "type": "string",
            "example": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
            "description": "L'alias de compte dans lequel le client payé souhaite recevoir les paiements"
          },
          "confirmation": {
            "type": "boolean",
            "description": "Lorsque le PSP recoit la demande, il effectue une recherche d'alias en vue d'obtenir les informations de compte du client payeur.\n\nL'attribut `confirmation` permet au client d'indiquer à son PSP si celui-ci doit lui retourner les resultats de la recherche d'alias pour confirmation:\n\n* La valeur `true` de la confirmation indique au PSP qu'il doit retourner le resultat de la recherche d'alias au client et attendre une confirmation\n* La valeur `false` indique qu'une confirmation n'est pas requise pour la demande, de ce fait le PSP transmet directement la demande à PI\n"
          },
          "categorie": {
            "$ref": "#/components/schemas/DemandePaiementRequestCategorie"
          },
          "dateLimitePaiement": {
            "type": "string",
            "format": "date",
            "description": "La date limite à laquelle le payeur doit avoir effectuer le paiement.\nDans le cas d'une demande de paiement de facture, il s'agit en général de la date indiquée avec la mention \"A payer avant\".\n"
          },
          "dateLimiteReponse": {
            "type": "string",
            "format": "date",
            "description": "C'est la date limite avant laquelle une réponse doit être fournie par le payeur.\nLa demande de paiement expire à cette date. Le client payé ne peut ni accepter ni refuser après cette date.\nPar défaut, la date limite de réponse est la date de la demande + 92 jours (3 mois).\n"
          },
          "montant": {
            "type": "number",
            "description": "Le montant du paiement à effectué"
          },
          "montantAchat": {
            "type": "number",
            "description": "Le montant de l'achat dans le cadre d'une demande de paiement PICO"
          },
          "montantRetrait": {
            "type": "number",
            "description": "Le montant du retrait dans le cadre d'une demande de paiement PICO ou PICASH"
          },
          "montantFrais": {
            "type": "number",
            "description": "Les frais de retrait dans le cadre d'une demande de paiement PICO"
          },
          "remise": {
            "type": "object",
            "description": "Remise appliquée pour un paiement immédiat dés réception de la demande\n",
            "properties": {
              "montant": {
                "type": "number",
                "description": "Le montant de la remise"
              },
              "taux": {
                "type": "number",
                "description": "Le taux de la remise"
              }
            },
            "additionalProperties": false,
            "oneOf": [
              {
                "required": [
                  "montant"
                ]
              },
              {
                "required": [
                  "taux"
                ]
              }
            ]
          },
          "debitDiffere": {
            "type": "boolean",
            "description": "Indique si le payeur peut acheter maintenant et payer plus tard.\n\nLa valeur est true pour un paiement immédiat avec débit différé (Acheter maintenant, payer plus tard). \nDans le cas du débit différé, le participant du client payeur paye le montant demandé prenant en compte la remise.\n"
          },
          "motif": {
            "type": "string",
            "description": "Le motif de la demande de paiement",
            "maxLength": 140
          },
          "refDocNumero": {
            "type": "string",
            "description": "Le numéro / la reference du document justificatif",
            "maxLength": 35
          },
          "refDocType": {
            "$ref": "#/components/schemas/RefDocType"
          },
          "statut": {
            "$ref": "#/components/schemas/DemandePaiementStatut"
          },
          "statutRaison": {
            "$ref": "#/components/schemas/DemandePaiementStatutRaison"
          },
          "payeurNom": {
            "type": "string",
            "description": "Le nom du payeur.\n\n**Présence selon le statut :**\n- `INITIE` (avec confirmation) : Présent ✅\n- `ENVOYE` (sans confirmation) : Présent ✅\n- `REJETE` avec BE23 ou DU03 : Absent ❌\n"
          },
          "payeurPays": {
            "type": "string",
            "description": "Le pays de résidence du payeur.\n\n**Présence selon le statut :**\n- `INITIE` (avec confirmation) : Présent ✅\n- `ENVOYE` (sans confirmation) : Présent ✅\n- `REJETE` avec BE23 ou DU03 : Absent ❌\n"
          },
          "end2endId": {
            "type": "string",
            "description": "Identifiant unique de bout en bout de la transaction"
          },
          "dateDemande": {
            "type": "string",
            "format": "date-time",
            "description": "Date d'envoi de la demande de paiement par le business"
          },
          "dateEnvoi": {
            "type": "string",
            "format": "date-time",
            "description": "Date d'envoi de la demande de paiement par le participant"
          },
          "dateConfirmation": {
            "type": "string",
            "format": "date-time",
            "description": "Date de confirmation de la demande si le client avait requis la confirmation de la demande de paiement.\nIl s'agit de la date et heure à laquelle le client a confirmé la demande.\n"
          }
        }
      },
      "DemandePaiementConsultationReponse": {
        "type": "object",
        "properties": {
          "txId": {
            "type": "string",
            "maxLength": 35,
            "description": "Identifiant de la demande de paiement dans le SI du client"
          },
          "categorie": {
            "type": "string",
            "enum": [
              "631",
              "500",
              "521",
              "401"
            ],
            "description": "Categorie de la demande de paiement"
          },
          "payeAlias": {
            "type": "string",
            "example": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
            "description": "L'alias de compte dans lequel le client payé souhaite recevoir les paiements"
          },
          "logoUrl": {
            "type": "string",
            "description": "L'URL du logo du business ou d'un produit du business qui sera affiché au client payeur"
          },
          "payeurAlias": {
            "type": "string",
            "example": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
            "description": "Alias de compte du client payeur à qui est adressée la demande"
          },
          "confirmation": {
            "type": "boolean",
            "description": "Lorsque le PSP reçoit la demande, il effectue une recherche d'alias en vue d'obtenir les informations de compte du client payeur.\n\nL'attribut `confirmation` permet au client d'indiquer à son PSP si celui-ci doit lui retourner les résultats de la recherche d'alias pour confirmation:\n\n* La valeur `true` de la confirmation indique au PSP qu'il doit retourner le résultat de la recherche d'alias au client et attendre une confirmation\n* La valeur `false` indique qu'une confirmation n'est pas requise pour la demande, de ce fait le PSP transmet directement la demande à PI\n"
          },
          "remise": {
            "type": "object",
            "description": "Remise appliquée sur la demande de paiement",
            "properties": {
              "montant": {
                "type": "number",
                "description": "Le montant de la remise"
              },
              "taux": {
                "type": "number",
                "description": "Le taux de la remise"
              }
            }
          },
          "debitDiffere": {
            "type": "boolean",
            "description": "Indique si le client peut acheter maintenant et payer plus tard."
          },
          "montant": {
            "type": "number",
            "description": "Le montant total du paiement à effectuer"
          },
          "montantAchat": {
            "type": "number",
            "description": "Le montant de l'achat"
          },
          "montantRetrait": {
            "type": "number",
            "description": "Le montant du retrait"
          },
          "montantFrais": {
            "type": "number",
            "description": "Les frais de retrait"
          },
          "motif": {
            "type": "string",
            "description": "Le motif de la demande de paiement",
            "maxLength": 140
          },
          "refDocNumero": {
            "type": "string",
            "description": "Le numéro / la référence du document justificatif",
            "maxLength": 35
          },
          "refDocType": {
            "$ref": "#/components/schemas/RefDocType"
          },
          "statut": {
            "type": "string",
            "$ref": "#/components/schemas/DemandePaiementStatut"
          },
          "statutRaison": {
            "$ref": "#/components/schemas/DemandePaiementStatutRaison"
          },
          "payeurNom": {
            "type": "string",
            "description": "Le nom du payeur"
          },
          "payeurPays": {
            "type": "string",
            "description": "Le pays de residence du payeur"
          },
          "dateLimitePaiement": {
            "type": "string",
            "format": "date-time",
            "description": "Date limite de paiement"
          },
          "dateLimiteReponse": {
            "type": "string",
            "format": "date-time",
            "description": "Date limite de réponse"
          },
          "dateDemande": {
            "type": "string",
            "format": "date-time",
            "description": "Date de la demande de paiement\n"
          },
          "dateConfirmation": {
            "type": "string",
            "format": "date-time",
            "description": "Date de confirmation de la demande si le client avait requis la confirmation de la demande de paiement.\nIl s'agit de la date et heure à laquelle le client a confirmé la demande.\n"
          },
          "dateEnvoi": {
            "type": "string",
            "format": "date-time",
            "description": "Date d'envoi de la demande: date et heure à laquelle la demande de paiement est envoyée par le PSP\n"
          },
          "dateReponse": {
            "type": "string",
            "format": "date-time",
            "description": "Date à laquelle le payeur à repondu à la demande de paiement\n"
          },
          "dateIrrevocabilite": {
            "type": "string",
            "format": "date-time",
            "description": "Date à laquelle le paiement accepté est irrévocable\n"
          }
        }
      },
      "DemandePaiementConfirmationRequestAccepter": {
        "type": "object",
        "properties": {
          "decision": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "La décision à `true` indique la confirmation de la demande de paiement."
          }
        },
        "additionalProperties": false,
        "description": "Confirmation de la demande de paiement",
        "required": [
          "decision"
        ]
      },
      "DemandePaiementConfirmationRequestRejeter": {
        "type": "object",
        "properties": {
          "decision": {
            "type": "boolean",
            "enum": [
              false
            ],
            "description": "La décision  à `false`  indique l'annulation de la demande de paiement."
          }
        },
        "additionalProperties": false,
        "description": "Annulation de la demande de paiement",
        "required": [
          "decision"
        ]
      },
      "DemandePaiementConfirmationRequest": {
        "type": "object",
        "oneOf": [
          {
            "$ref": "#/components/schemas/DemandePaiementConfirmationRequestAccepter"
          },
          {
            "$ref": "#/components/schemas/DemandePaiementConfirmationRequestRejeter"
          }
        ]
      },
      "DemandePaiementConfirmationAnnulationRaison": {
        "type": "string",
        "enum": [
          "ERREUR_ALIAS",
          "ERREUR_MONTANT",
          "ERREUR_TXID",
          "PAYEUR_INCONNU"
        ],
        "description": "Raisons de l'annulation ou du rejet de la demande de paiement:\n- ERREUR_ALIAS le client s'est trompé sur l'alias\n- ERREUR_MONTANT le client s'est trompé sur le montant\n- ERREUR_TXID le client s'est trompé sur le txId\n- PAYEUR_INCONNU les informations du client payeur retournées suite à la recherche d'alias ne sont pas ceux attendues par le client.\n"
      },
      "DemandePaiementConfirmationReponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/DemandePaiementRequest"
          },
          {
            "type": "object",
            "properties": {
              "statut": {
                "type": "string",
                "enum": [
                  "ENVOYE",
                  "ANNULE"
                ],
                "description": "- `ENVOYE` si les validations sont concluantes et que le PSP a envoyé la demande\n- `ANNULE` si la demande n'est pas envoye pour une raison\n"
              },
              "statutRaison": {
                "$ref": "#/components/schemas/DemandePaiementConfirmationAnnulationRaison"
              },
              "payeurNom": {
                "type": "string",
                "description": "Le nom du payeur"
              },
              "payeurPays": {
                "type": "string",
                "description": "Le pays de residence du payeur"
              },
              "dateEnvoie": {
                "type": "string",
                "format": "date-time",
                "description": "Date d'envoie de la demande: date et heure à laquelle la demande de paiement est envoyée par le PSP\n"
              },
              "dateConfirmation": {
                "type": "string",
                "format": "date-time",
                "description": "Date de confirmation de la demande si le client avait requis la confirmation de la demande de paiement.\nIl s'agit de la date et heure à laquelle le client a confirmé la demande.\n"
              }
            }
          }
        ]
      },
      "DemandePaiementReponseRequest": {
        "type": "object",
        "oneOf": [
          {
            "title": "Acceptation",
            "type": "object",
            "properties": {
              "decision": {
                "type": "boolean",
                "enum": [
                  true
                ],
                "description": "La décision à `true` indique l'acception de la demande de paiement."
              }
            },
            "required": [
              "decision"
            ]
          },
          {
            "title": "Rejet",
            "type": "object",
            "properties": {
              "decision": {
                "type": "boolean",
                "enum": [
                  false
                ],
                "description": "La décision à `false` indique le rejet de la demande de paiement."
              },
              "raison": {
                "type": "string",
                "enum": [
                  "BE05",
                  "AM09",
                  "APAR",
                  "RR07",
                  "FR01"
                ]
              }
            },
            "required": [
              "decision",
              "raison"
            ]
          }
        ]
      },
      "DemandePaiementEnMasseItem": {
        "type": "object",
        "properties": {
          "instructionId": {
            "type": "string",
            "description": "Identifiant de la demande de paiement en masse"
          },
          "statut": {
            "type": "string",
            "enum": [
              "INITIE",
              "CONFIRME",
              "ANNULE"
            ],
            "description": "Statut global de la demande de paiement en masse:\n- `INITIE`: Créée avec confirmation demandée, en attente de confirmation\n- `CONFIRME`: Confirmée par le business ou en cours de traitement\n- `ANNULE`: Annulée par le business\n"
          },
          "dateDemande": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création de la demande de paiement en masse"
          }
        },
        "additionalProperties": false
      },
      "DemandePaiementEnMasseListe": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/DemandePaiementEnMasseItem"
            }
          },
          "meta": {
            "type": "object",
            "properties": {
              "total": {
                "type": "number",
                "description": "Total d'éléments correspondants à la recherche"
              }
            }
          }
        }
      },
      "DemandePaiementEnMasseRequest": {
        "type": "object",
        "properties": {
          "categorie": {
            "type": "string",
            "enum": [
              "401"
            ],
            "description": "Catégorie des demandes de paiement en masse : 401 (Autres demandes de paiement de facture)."
          },
          "payeAlias": {
            "type": "string",
            "example": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
            "description": "L'alias de compte dans lequel le client souhaite recevoir les paiements\n"
          },
          "confirmation": {
            "type": "boolean",
            "default": false,
            "description": "Indique si une confirmation du business est requise avant d'envoyer les demandes de paiement.\n\n- `true` : Le PSP effectue la recherche d'alias pour tous les payeurs, retourne leurs noms et pays, et attend la confirmation du business avant d'envoyer les demandes de paiement.\n- `false` : Le PSP envoie directement les demandes de paiement sans attendre de confirmation.\n\n**Note :** Si `true`, le business doit confirmer via `PUT /demandes-paiements-groupes/{instructionId}/confirmations` dans un délai adaptatif (24h, 48h ou 72h selon le nombre de transactions).\n"
          },
          "instructionId": {
            "type": "string",
            "example": true,
            "maxLength": 35,
            "description": "Identifiant de la demande de paiement en masse dans le SI du client"
          },
          "motif": {
            "type": "string",
            "description": "Le motif commun à toutes les demandes de paiement du groupe.\nSi toutes les demandes de paiement du groupe ont le même motif, ce champ peut être utilisé pour optimiser la taille du lot.\nDans le cas contraire, chaque demande de paiement doit avoir son propre motif.\n",
            "maxLength": 140
          },
          "transactions": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "txId": {
                  "type": "string",
                  "description": "Identifiant de la transaction dans le SI du client",
                  "maxLength": 35
                },
                "payeurAlias": {
                  "type": "string",
                  "example": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
                  "description": "L'alias du client payeur.",
                  "maxLength": 36
                },
                "montant": {
                  "type": "number",
                  "example": 15000,
                  "description": "Le montant à payer"
                },
                "remise": {
                  "type": "object",
                  "description": "Remise appliquée sur la facture - la remise n'est pas appliquée après la date limite de paiement",
                  "oneOf": [
                    {
                      "title": "Remise par montant",
                      "required": [
                        "montant"
                      ],
                      "properties": {
                        "montant": {
                          "type": "number",
                          "description": "Montant de la remise"
                        }
                      }
                    },
                    {
                      "title": "Remise par taux",
                      "required": [
                        "taux"
                      ],
                      "properties": {
                        "taux": {
                          "type": "number"
                        }
                      }
                    }
                  ]
                },
                "dateLimitePaiement": {
                  "type": "string",
                  "format": "date",
                  "description": "La date limite à laquelle le payeur doit avoir effectué le paiement.\n\nDans le cas d'une demande de paiement de facture, il s'agit en général de la date indiquée avec la mention \"À payer avant\".\n"
                },
                "dateLimiteReponse": {
                  "type": "string",
                  "format": "date",
                  "description": "C'est la date limite avant laquelle une réponse doit être fournie par le payeur.\nLa demande de paiement expire à cette date. Le client payé ne peut pas envoyer\n"
                },
                "motif": {
                  "type": "string",
                  "description": "Le motif de la demande de paiement.\nSi toutes les demandes de paiement du groupe ont le même motif, ce champ doit être omis, et le motif du groupe doit être utilisé.\n",
                  "maxLength": 140
                },
                "refDocNumero": {
                  "type": "string",
                  "description": "Le numéro / la référence du document justificatif",
                  "maxLength": 35
                },
                "refDocType": {
                  "$ref": "#/components/schemas/RefDocType"
                }
              },
              "required": [
                "payeurAlias",
                "txId",
                "montant",
                "dateLimitePaiement"
              ],
              "additionalProperties": false
            }
          }
        },
        "additionalProperties": false,
        "required": [
          "instructionId",
          "categorie",
          "payeAlias",
          "transactions"
        ]
      },
      "DemandePaiementEnMasseStatutReponse": {
        "type": "object",
        "properties": {
          "instructionId": {
            "type": "string",
            "description": "Identifiant de la demande de paiement en masse"
          },
          "statut": {
            "type": "string",
            "enum": [
              "INITIE",
              "CONFIRME",
              "ANNULE"
            ],
            "description": "Statut global de la demande de paiement en masse:\n- `INITIE`: Créée avec confirmation demandée, en attente de confirmation\n- `CONFIRME`: Confirmée par le business ( pour savoir si le traitement est terminé, vérifiez que `transactionsIrrevocables + transactionsRejetees = transactionsTotal`)\n- `ANNULE`: Annulée par le business \n\n**Évolution selon le mode de création :**\n- Si créée **avec confirmation** (`confirmation: true`) : `INITIE` → `CONFIRME` (après PUT /confirmations) ou `ANNULE`\n- Si créée **sans confirmation** (`confirmation: false`) : Directement `CONFIRME` (aucune action requise du business)\n"
          },
          "dateExpiration": {
            "type": "string",
            "format": "date-time",
            "description": "Date d'expiration de la confirmation (délai adaptatif selon nombre de transactions).\nPrésent uniquement si statut = INITIE.\n\nDélais :\n- 1 à 500 transactions : 24 heures\n- 501 à 1000 transactions : 48 heures\n- Plus de 1000 transactions : 72 heures\n"
          },
          "transactionsTotal": {
            "type": "integer",
            "description": "Nombre total de transactions dans la demande de paiement en masse"
          },
          "transactionsInitiees": {
            "type": "number",
            "description": "Nombre de transactions à l'état `INITIE` (validées avec succès, prêtes à être envoyées).\n\nSi créée avec `confirmation: true`, ces transactions ont passé toutes les validations :\n- txId unique (pas de duplication)\n- Alias du payeur valide (recherche d'alias réussie)\n- Nom et pays du payeur disponibles\n\nCe sont ces transactions qui seront envoyées lors de la confirmation.\n\n**Vérification de fin de validation :** La validation est terminée quand `transactionsInitiees + transactionsRejetees = transactionsTotal`.\n"
          },
          "transactionsEnvoyees": {
            "type": "number",
            "description": "Nombre de transactions à l'état `ENVOYE` (demandes envoyées au payeur)"
          },
          "transactionsIrrevocables": {
            "type": "number",
            "description": "Nombre de transactions à l'état `IRREVOCABLE` (demandes acceptées et payées par le payeur)"
          },
          "transactionsRejetees": {
            "type": "number",
            "description": "Nombre de transactions à l'état `REJETE` (échecs de validation ou refus du payeur).\n\nComprend :\n- Rejets de validation (avant envoi) : BE23 (alias invalide), DU03 (txId dupliqué)\n- Rejets d'envoi (après confirmation) : Alias du payeur indisponible, etc.\n- Refus du payeur (le payeur a rejeté la demande)\n\n**Note :** Les transactions rejetées à la validation ne sont jamais envoyées, même si le bulk est confirmé.\n"
          },
          "dateDemande": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création de la demande de paiement en masse (date de la demande)"
          },
          "dateConfirmation": {
            "type": "string",
            "format": "date-time",
            "description": "Date de confirmation par le business (date d'acceptation de la demande).\nPrésent uniquement si statut = CONFIRME.\n\n- Si créée avec confirmation: Date du PUT /confirmations avec decision: true\n- Si créée sans confirmation: Correspond à dateDemande (confirmation automatique)\n"
          }
        }
      },
      "DemandePaiementEnMasseConfirmationRequestAccepter": {
        "type": "object",
        "properties": {
          "decision": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "La décision à `true` indique la confirmation de la demande de paiement en masse."
          }
        },
        "additionalProperties": false,
        "description": "Confirmation de la demande de paiement en masse",
        "required": [
          "decision"
        ]
      },
      "DemandePaiementEnMasseConfirmationRequestRejeter": {
        "type": "object",
        "properties": {
          "decision": {
            "type": "boolean",
            "enum": [
              false
            ],
            "description": "La décision à `false` indique l'annulation de la demande de paiement en masse."
          }
        },
        "additionalProperties": false,
        "description": "Annulation de la demande de paiement en masse",
        "required": [
          "decision"
        ]
      },
      "DemandePaiementEnMasseConfirmationRequest": {
        "type": "object",
        "oneOf": [
          {
            "title": "Confirmer l'envoi de la demande de paiement en masse",
            "$ref": "#/components/schemas/DemandePaiementEnMasseConfirmationRequestAccepter"
          },
          {
            "title": "Annuler l'envoi de la demande de paiement en masse",
            "$ref": "#/components/schemas/DemandePaiementEnMasseConfirmationRequestRejeter"
          }
        ]
      },
      "PaiementRequest": {
        "type": "object",
        "properties": {
          "txId": {
            "type": "string",
            "description": "Identifiant de la transaction dans le SI du client"
          },
          "payeurAlias": {
            "type": "string",
            "example": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
            "description": "Le client business a la possibilité de préciser le compte qui sera débité pour le paiement.\n"
          },
          "payeAlias": {
            "type": "string",
            "example": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
            "description": "L'alias du client payé, bénéficiaire de l'ordre de paiement"
          },
          "montant": {
            "type": "number",
            "example": 15000,
            "description": "Le montant du transfert à effectuer"
          },
          "refDocNumero": {
            "type": "string",
            "description": "Le numéro / la référence du document justificatif",
            "maxLength": 35
          },
          "refDocType": {
            "$ref": "#/components/schemas/RefDocType"
          },
          "motif": {
            "type": "string",
            "description": "Le motif du paiement",
            "maxLength": 140
          },
          "programme": {
            "type": "boolean",
            "default": false,
            "description": "Indique si le paiement executé est un paiement programmé"
          }
        },
        "additionalProperties": false,
        "required": [
          "txId",
          "montant",
          "payeAlias",
          "payeurAlias"
        ]
      },
      "PaiementStatut": {
        "type": "string",
        "enum": [
          "INITIE",
          "ANNULE",
          "ENVOYE",
          "IRREVOCABLE",
          "REJETE"
        ],
        "description": "- `INITIE` si la confirmation du client est attendue suite à la recherche d'alias\n- `ANNULE` si lors de la confirmation, le business a annulé l'envoi du paiement\n- `ENVOYE` si les validations sont concluantes et que le PSP a envoyé la demande\n- `IRREVOCABLE` si le payeur a accepté la demande\n- `REJETE` si le payeur rejette la demande\n"
      },
      "PaiementStatutRaison": {
        "type": "string",
        "description": "\n**Raisons de rejet ou d'echec des paiements :**\n- **BE23** (Alias invalid) : L'alias du payeur n'existe pas ou est invalide.\n- **DU03** (Duplicate Transaction) : Le txId n'est pas unique\n- **FF10** (Internal System Error) : Erreur de traitement du système interne du participant\n- **AG07** (Insufficient Funds) : Le solde du compte debiteur est insuffisant pour effectuer l'opération.\n- **AB03** (Aborted Settlement Timeout) : Message en timeout lors du règlement.\n- **AB04** (Aborted Settlement Fatal Error) : Transaction rejetée à cause d'une erreur fatale.\n- **AB08** (Offline Creditor Agent) : Le système du participant payé n'est pas accessible.\n- **AB09** (Error Creditor Agent) : Transaction rejetée à cause d'une erreur chez le participant payé.\n- **AC03** (Invalid Creditor Account Number) : Le numéro de compte du payé est invalide.\n- **AC06** (Blocked Account) : Le compte spécifié est bloqué.\n- **AC07** (Closed Creditor Account Number) : Le compte du payé est clôturé.\n- **AG01** (Transaction Forbidden) : Transaction interdite sur ce type de compte.\n- **AG10** (Agent Suspended) : Le participant payeur est désactivé.\n- **AG11** (Creditor Agent Suspended) : Le participant payé est désactivé.\n- **AEXR** (Already Expired RTP) : La demande de paiement a déjà expiré.\n- **ALAC** (Already Accepted RTP) : La demande de paiement a déjà été acceptée.\n- **AM02** (Not Allowed Amount) : Le montant de la transaction est supérieur au maximum autorisé.\n- **AM04** (Insufficient Funds) : Le solde de garantie du participant payeur est insuffisant.\n- **AM09** (Wrong Amount) : Le montant du transfert est différent du montant attendu.\n- **AM21** (Limit Exceeded) : Le montant de la transaction dépasse les limites convenues entre le participant et le client.\n- **ARFR** (Already Refused RTP) : La demande de paiement a déjà été refusée.\n- **ARJR** (Already Rejected RTP) : La demande de paiement a déjà été rejetée.\n- **BE01** (Inconsistent With End Customer) : L'identification du client final n'est pas liée au numéro de compte associé.\n- **FR01** (Fraud) : Rejeté pour suspicion de fraude.\n- **IRNR** (Initial RTP Never Received) : La demande de paiement n'a jamais été reçue.\n- **RR04** (Regulatory Reason) : Raison règlementaire, notamment lorsque le bénéficiaire figure dans une liste d'interdiction.\n",
        "enum": [
          "BE23",
          "DU03",
          "FF10",
          "AG07",
          "AB03",
          "AB04",
          "AB08",
          "AB09",
          "AC03",
          "AC06",
          "AC07",
          "AG01",
          "AG10",
          "AG11",
          "AEXR",
          "ALAC",
          "AM02",
          "AM04",
          "AM09",
          "AM21",
          "ARFR",
          "ARJR",
          "BE01",
          "FR01",
          "IRNR",
          "RR04"
        ]
      },
      "RetourStatut": {
        "type": "string",
        "enum": [
          "INITIE",
          "ENVOYE",
          "IRREVOCABLE",
          "REJETE"
        ],
        "description": "- `INITIE` si l'envoi du retour de fonds est initié\n- `ENVOYE` si le participant a envoyé le retour de fonds\n- `IRREVOCABLE` lorsque le retour de fonds est irrévocable\n- `REJETE` Lorsque le retour de fonds est rejeté\n"
      },
      "RetourStatutRaison": {
        "type": "string",
        "description": "\n**Raisons de rejet ou d'echec des retours de fonds :**\n- **FF10** (Internal System Error) : Erreur de traitement du système interne du participant\n- **AG07** (Insufficient Funds) : Le solde du compte debiteur est insuffisant pour effectuer l'opération.\n- **AB03** (Aborted Settlement Timeout) : Message en timeout lors du règlement.\n- **AB04** (Aborted Settlement Fatal Error) : Transaction rejetée à cause d'une erreur fatale.\n- **AC06** (Blocked Account) : Le compte spécifié est bloqué.\n- **AG10** (Agent Suspended) : Le participant payeur est désactivé.\n- **AG11** (Creditor Agent Suspended) : Le participant payé est désactivé.\n- **AM04** (Insufficient Funds) : Le solde de garantie du participant payé est insuffisant.\n- **AM09** (Wrong Amount) : Le montant du transfert est différent du montant attendu.\n- **FR01** (Fraud) : Rejeté pour suspicion de fraude.\n- **RR04** (Regulatory Reason) : Raison règlementaire, notamment lorsque le bénéficiaire figure dans une liste d'interdiction.\n",
        "enum": [
          "FF10",
          "AG07",
          "AB03",
          "AB04",
          "AC06",
          "AG10",
          "AG11",
          "AM04",
          "AM09",
          "FR01",
          "RR04"
        ]
      },
      "AnnulationStatut": {
        "type": "string",
        "enum": [
          "INITIE",
          "ENVOYE",
          "ACCEPTE",
          "REJETE"
        ],
        "description": "- `INITIE` si la demande d'annulation est initiée\n- `ENVOYE` si la demande d'annulation est envoyée\n- `ACCEPTE` lorsque la demande d'annulation est acceptée\n- `REJETE` lorsque la demande d'annulation est rejetée\n"
      },
      "PaiementAnnulationMotif": {
        "type": "string",
        "description": "\n**Motifs d'annulation d'un paiement:**\n- **AC03** Erreur sur le destinataire\n- **AM09** Erreur sur le montant\n- **SVNR** Service non rendu\n- **DUPL** Transaction déjà payée\n- **FRAD** Suspicion de fraude\n",
        "enum": [
          "AC03",
          "AM09",
          "SVNR",
          "DUPL",
          "FRAD"
        ]
      },
      "PaiementAnnulationStatutRaison": {
        "type": "string",
        "description": "\n**Raisons de rejet ou d'echec des demandes d'annulation :**\n# Rejets de PI\n- **AG01** (Transaction Forbidden) : L'annulation ne peut pas être demandée pour un transfert qui n'est pas irrévocable`\n- **AG08** (InvalidAccessRights) : Les règles ne vous permettent pas de demander l'annulation d'un transfert dont vous n'êtes pas le payeur\n# Rejeys du payé\n- **CUST** (Customer Decision) : Lorsque la demande d'annulation (camt.056) est rejetée par le client payé.\n- **AC04** (Closed Account Number) : Le numéro de compte spécifié a été clôturé dans les livres du participant payé\n- **ARDT** (Already Returned) : La transaction a déjà été annulée\n- **AG10** (Agent Suspended) : Le participant payeur est désactivé.\n- **AG11** (Creditor Agent Suspended) : Le participant payé est désactivé.\n- **FR01** (Fraud) : Rejeté pour suspicion de fraude.\n- **RR04** (Regulatory Reason) : Raison règlementaire, notamment lorsque le bénéficiaire figure dans une liste d'interdiction.\n",
        "enum": [
          "AG01",
          "AG08",
          "CUST",
          "AC04",
          "ARDT",
          "AG10",
          "AG11",
          "FR01",
          "RR04"
        ]
      },
      "Paiement": {
        "allOf": [
          {
            "$ref": "#/components/schemas/PaiementRequest"
          },
          {
            "type": "object",
            "properties": {
              "confirmation": {
                "type": "boolean",
                "enum": [
                  true
                ],
                "description": "Lorsque le PSP recoit la demande, il effectue une recherche d'alias en vue d'obtenir les informations de compte du client payé. \n\nL'attribut `confirmation` permet au client d'indiquer à son PSP si celui-ci doit lui retourner les resultats de la recherche d'alias pour confirmation:\n\n- La valeur `true` de la validation indique au PSP qu'il doit retourner le resultat de la recherche d'alias au client et attendre une validation avant d'effectuer le paiement.\n- La valeur `false` indique qu'une validation n'est pas requise pour la demande, de ce fait, le PSP transmet la demande à PI sans attendre la validation du client business.\n"
              },
              "payeNom": {
                "type": "string",
                "description": "Le nom du payé (Retourné dans le cas d'un paiement envoyé)"
              },
              "payePays": {
                "type": "string",
                "description": "Le pays de residence du payé (Retourné dans le cas d'un paiement envoyé)"
              },
              "payeurNom": {
                "type": "string",
                "description": "Le nom du payeur (Retourné dans le cas d'un paiement reçu)"
              },
              "payeurPays": {
                "type": "string",
                "description": "Le pays de residence du payeur (Retourné dans le cas d'un paiement reçu)"
              },
              "payeurCompte": {
                "type": "string",
                "description": "Le numéro de compte du payeur"
              },
              "payeCompte": {
                "type": "string",
                "description": "Le numéro de compte du payé"
              },
              "categorie": {
                "type": "string",
                "enum": [
                  "631",
                  "000",
                  "400",
                  "733",
                  "300",
                  "999",
                  "500",
                  "521",
                  "401"
                ],
                "description": "La catégorie du paiement / Canal de paiement\n- `631` Demande de paiement provenant d'un particulier\n- `000` Paiement par QR Code Statique\n- `400` Paiement par QR Code Dynamique\n- `733` Ordre de paiement via l'API Business\n- `300` Via le canal USSD\n- `999` Ordre de transfert bancaire\n- `500` Demande de Paiement sur site \n- `521` Demande de Paiement e-commerce \n- `401` Autres demandes de paiement de facture\n"
              },
              "statut": {
                "$ref": "#/components/schemas/PaiementStatut"
              },
              "statutRaison": {
                "$ref": "#/components/schemas/PaiementStatutRaison"
              },
              "end2endId": {
                "type": "string",
                "description": "Identifiant unique de bout en bout de la transaction"
              },
              "instructionId": {
                "type": "string",
                "description": "Identifiant du paiement en masse dans le SI du client"
              },
              "montantFrais": {
                "type": "number",
                "description": "Les frais appliqués par le participant (Optionnel - dépend du modèle de facturation utilisé par le participant)"
              },
              "dateDemande": {
                "type": "string",
                "format": "date-time",
                "description": "Date de création du paiement: date et heure à laquelle le paiement a été initié par le client business.\n"
              },
              "dateConfirmation": {
                "type": "string",
                "format": "date-time",
                "description": "Date de confirmation de la demande si le client payé avait requis la confirmation du paiement.\nIl s'agit de la date et heure à laquelle le client a confirmé la transaction.\n\nPour un paiement reçu, cette date correspond à la date de confirmation du paiement par le payeur.\n"
              },
              "dateEnvoi": {
                "type": "string",
                "format": "date-time",
                "description": "Date d'envoi de la demande: date et heure à laquelle le paiement est envoyé par le participant (PSP)\n"
              },
              "dateIrrevocabilite": {
                "type": "string",
                "format": "date-time",
                "description": "Date à laquelle le paiement est irrévocable\n"
              },
              "dateReponse": {
                "type": "string",
                "format": "date-time",
                "description": "Date à laquelle la réponse du paiement a été reçue\n"
              },
              "retourStatut": {
                "$ref": "#/components/schemas/RetourStatut"
              },
              "retourStatutRaison": {
                "$ref": "#/components/schemas/RetourStatutRaison"
              },
              "retourDateDemande": {
                "type": "string",
                "format": "date-time",
                "description": "Date de création du paiement: date et heure à laquelle le retour de fonds a été initié par le client business.\n"
              },
              "retourDateIrrevocabilite": {
                "type": "string",
                "format": "date-time",
                "description": "Date à laquelle le retour de fonds est irrévocable\n"
              },
              "retourDateReponse": {
                "type": "string",
                "format": "date-time",
                "description": "Date à laquelle la réponse au retour de fonds a été reçue\n"
              },
              "annulationStatut": {
                "$ref": "#/components/schemas/AnnulationStatut"
              },
              "annulationMotif": {
                "$ref": "#/components/schemas/PaiementAnnulationMotif"
              },
              "annulationStatutRaison": {
                "$ref": "#/components/schemas/PaiementAnnulationStatutRaison"
              },
              "annulationDateDemande": {
                "type": "string",
                "format": "date-time",
                "description": "Date de reception de la demande d'annulation par le participant\n"
              },
              "annulationDateReponse": {
                "type": "string",
                "format": "date-time",
                "description": "Date à laquelle la réponse à la demande d'annulation a été reçue (Date de rejet de la demande)\n"
              }
            }
          }
        ]
      },
      "ListeMeta": {
        "type": "object",
        "properties": {
          "total": {
            "type": "number",
            "description": "total d'éléments correspondants à la recherche"
          },
          "size": {
            "type": "number",
            "description": "nombre d'éléments retournés"
          },
          "page": {
            "type": "string",
            "description": "numéro ou identifiant de la page suivante"
          },
          "next": {
            "type": "string",
            "description": "numéro ou identifiant de la page suivante"
          },
          "prev": {
            "type": "string",
            "description": "numéro ou identifiant de la page précédente"
          }
        }
      },
      "PaiementListe": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Paiement"
            }
          },
          "meta": {
            "$ref": "#/components/schemas/ListeMeta"
          }
        }
      },
      "PaiementImmediatRequest": {
        "oneOf": [
          {
            "title": "Paiement initiée - confirmation demandée",
            "description": "Paiement avec confirmation demandée",
            "allOf": [
              {
                "$ref": "#/components/schemas/PaiementRequest"
              },
              {
                "type": "object",
                "properties": {
                  "confirmation": {
                    "type": "boolean",
                    "enum": [
                      true
                    ],
                    "description": "Lorsque le PSP recoit la demande, il effectue une recherche d'alias en vue d'obtenir les informations de compte du client payé. \n\nL'attribut `confirmation` permet au client d'indiquer à son PSP si celui-ci doit lui retourner les resultats de la recherche d'alias pour confirmation:\n\n- La valeur `true` de la validation indique au PSP qu'il doit retourner le resultat de la recherche d'alias au client et attendre une validation avant d'effectuer le paiement.\n- La valeur `false` indique qu'une validation n'est pas requise pour la demande, de ce fait, le PSP transmet la demande à PI sans attendre la validation du client business.\n"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "confirmation"
                ]
              }
            ]
          },
          {
            "title": "Paiement envoyée sans confirmation",
            "description": "Paiement envoyé sans confirmation",
            "allOf": [
              {
                "$ref": "#/components/schemas/PaiementRequest"
              },
              {
                "type": "object",
                "properties": {
                  "confirmation": {
                    "type": "boolean",
                    "enum": [
                      false
                    ],
                    "description": "Lorsque le PSP recoit la demande, il effectue une recherche d'alias en vue d'obtenir les informations de compte du client payé. \n\nL'attribut `confirmation` permet au client d'indiquer à son PSP si celui-ci doit lui retourner les resultats de la recherche d'alias pour confirmation:\n\n- La valeur `true` de la validation indique au PSP qu'il doit retourner le resultat de la recherche d'alias au client et attendre une validation avant d'effectuer le paiement.\n- La valeur `false` indique qu'une validation n'est pas requise pour la demande, de ce fait, le PSP transmet la demande à PI sans attendre la validation du client business.\n"
                  }
                },
                "additionalProperties": false,
                "required": [
                  "confirmation"
                ]
              }
            ]
          }
        ]
      },
      "PaiementImmediatReponse": {
        "oneOf": [
          {
            "title": "Paiement initiée (txId valide et Alias trouvé - confirmation demandée)",
            "description": "Paiement avec confirmation demandée",
            "allOf": [
              {
                "$ref": "#/components/schemas/PaiementRequest"
              },
              {
                "type": "object",
                "properties": {
                  "statut": {
                    "type": "string",
                    "enum": [
                      "INITIE"
                    ],
                    "default": "INITIE"
                  },
                  "confirmation": {
                    "type": "boolean",
                    "enum": [
                      true
                    ]
                  },
                  "payeNom": {
                    "type": "string",
                    "description": "Le nom du payé"
                  },
                  "payePays": {
                    "type": "string",
                    "description": "Le pays de residence du payé"
                  },
                  "end2endId": {
                    "type": "string",
                    "description": "Identifiant unique de bout en bout de la transaction"
                  },
                  "dateDemande": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Date de création du paiement: date et heure à laquelle le paiement a été initié par le client business.\n"
                  },
                  "montantFrais": {
                    "type": "number",
                    "description": "Les frais appliqués par le participant (Optionnel - dépend du modèle de facturation utilisé par le participant)"
                  }
                },
                "required": [
                  "statut",
                  "confirmation",
                  "payeNom",
                  "payePays",
                  "end2endId",
                  "dateDemande"
                ]
              }
            ]
          },
          {
            "title": "Paiement envoyée (txId valide et Alias trouvé - confirmation non demandée)",
            "description": "Paiement envoyé sans confirmation",
            "allOf": [
              {
                "$ref": "#/components/schemas/PaiementRequest"
              },
              {
                "type": "object",
                "properties": {
                  "statut": {
                    "type": "string",
                    "enum": [
                      "ENVOYE"
                    ],
                    "default": "ENVOYE"
                  },
                  "confirmation": {
                    "type": "boolean",
                    "enum": [
                      false
                    ]
                  },
                  "payeNom": {
                    "type": "string",
                    "description": "Le nom du bénéficiaire"
                  },
                  "payePays": {
                    "type": "string",
                    "description": "Le pays de résidence du bénéficiaire"
                  },
                  "end2endId": {
                    "type": "string",
                    "description": "Identifiant unique de bout en bout de la transaction"
                  },
                  "dateDemande": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Date de création du paiement: date et heure à laquelle le paiement a été initié par le client business.\n"
                  },
                  "dateConfirmation": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Date d'acceptation de la demande:  date et heure à laquelle l'ordre de transfert du client business est reçu par le participant.\n\nDans le cas d'un paiement sans confirmation, elle correspond également à `dateDemande`.\n"
                  },
                  "dateEnvoi": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Date d'envoi du paiement"
                  },
                  "montantFrais": {
                    "type": "number",
                    "description": "Les frais appliqués par le participant (Optionnel - dépend du modèle de facturation utilisé par le participant)"
                  }
                },
                "required": [
                  "statut",
                  "confirmation",
                  "payeNom",
                  "payePays",
                  "end2endId",
                  "dateDemande",
                  "dateConfirmation"
                ]
              }
            ]
          },
          {
            "title": "Paiement rejeté",
            "description": "Paiement rejeté (alias invalide, txId dupliqué, etc.)",
            "allOf": [
              {
                "$ref": "#/components/schemas/PaiementRequest"
              },
              {
                "type": "object",
                "properties": {
                  "statut": {
                    "type": "string",
                    "enum": [
                      "REJETE"
                    ],
                    "default": "REJETE"
                  },
                  "statutRaison": {
                    "$ref": "#/components/schemas/PaiementStatutRaison"
                  },
                  "payeNom": {
                    "type": "string",
                    "description": "Le nom du bénéficiaire (présent seulement si la recherche d'alias a réussi).\n\nAbsent si statutRaison = BE23 (alias invalide).\nPrésent si statutRaison = DU03 (txId dupliqué) ou autres codes.\n"
                  },
                  "payePays": {
                    "type": "string",
                    "description": "Le pays de résidence du bénéficiaire (présent seulement si la recherche d'alias a réussi).\n\nAbsent si statutRaison = BE23 (alias invalide).\nPrésent si statutRaison = DU03 (txId dupliqué) ou autres codes.\n"
                  },
                  "end2endId": {
                    "type": "string",
                    "description": "Identifiant unique de bout en bout de la transaction"
                  },
                  "dateDemande": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Date de création du paiement"
                  },
                  "dateReponse": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Date à laquelle le paiement a été rejeté"
                  }
                },
                "required": [
                  "statut",
                  "statutRaison",
                  "confirmation",
                  "end2endId",
                  "dateDemande"
                ]
              }
            ]
          }
        ]
      },
      "PaiementImmediatConfirmationRequestAccepter": {
        "type": "object",
        "properties": {
          "decision": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "La décision à `true` indique la confirmation du paiement."
          }
        },
        "additionalProperties": false,
        "description": "Confirmation du paiement immédiat",
        "required": [
          "decision"
        ]
      },
      "PaiementImmediatConfirmationRequestRejeter": {
        "type": "object",
        "properties": {
          "decision": {
            "type": "boolean",
            "enum": [
              false
            ],
            "description": "La décision  à `false`  indique l'annulation du paiement."
          }
        },
        "additionalProperties": false,
        "description": "Annulation du paiement",
        "required": [
          "decision"
        ]
      },
      "PaiementImmediatConfirmationRequest": {
        "type": "object",
        "oneOf": [
          {
            "title": "Confirmer l'envoi du paiement",
            "$ref": "#/components/schemas/PaiementImmediatConfirmationRequestAccepter"
          },
          {
            "title": "Annuler l'envoi du paiement",
            "$ref": "#/components/schemas/PaiementImmediatConfirmationRequestRejeter"
          }
        ]
      },
      "PaiementImmediatConfirmationReponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/PaiementRequest"
          },
          {
            "type": "object",
            "properties": {
              "confirmation": {
                "type": "boolean",
                "enum": [
                  true
                ],
                "description": "Lorsque le PSP recoit la demande, il effectue une recherche d'alias en vue d'obtenir les informations de compte du client payé. \n\nL'attribut `confirmation` permet au client d'indiquer à son PSP si celui-ci doit lui retourner les resultats de la recherche d'alias pour confirmation:\n\n- La valeur `true` de la validation indique au PSP qu'il doit retourner le resultat de la recherche d'alias au client et attendre une validation avant d'effectuer le paiement.\n- La valeur `false` indique qu'une validation n'est pas requise pour la demande, de ce fait, le PSP transmet la demande à PI sans attendre la validation du client business.\n"
              },
              "statut": {
                "type": "string",
                "enum": [
                  "ENVOYE",
                  "ANNULE"
                ],
                "description": "- `ENVOYE` si le business a confirmé l'envoi du paiement\n- `ANNULE` si le business a annulé l'envoi du paiement\n"
              },
              "end2endId": {
                "type": "string",
                "description": "Identifiant unique de bout en bout de la transaction"
              },
              "payeNom": {
                "type": "string",
                "description": "Le nom du payé"
              },
              "payePays": {
                "type": "string",
                "description": "Le pays de residence du payé"
              },
              "dateDemande": {
                "type": "string",
                "format": "date-time",
                "description": "Date de création du paiement"
              },
              "dateConfirmation": {
                "type": "string",
                "format": "date-time",
                "description": "Date de confirmation de la demande si le client payé avait requis la confirmation du paiement.\nIl s'agit de la date et heure à laquelle le business a confirmé l'envoi du paiement.\n"
              }
            }
          }
        ]
      },
      "PaiementEnMasseItem": {
        "type": "object",
        "properties": {
          "instructionId": {
            "type": "string",
            "description": "Identifiant du paiement en masse"
          },
          "statut": {
            "type": "string",
            "enum": [
              "INITIE",
              "CONFIRME",
              "ANNULE"
            ],
            "description": "Statut global du paiement en masse:\n- `INITIE`: Créé avec confirmation demandée, en attente de confirmation\n- `CONFIRME`: Confirmé par le business ou en cours de traitement\n- `ANNULE`: Annulé par le business\n"
          },
          "dateDemande": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création du paiement en masse"
          }
        },
        "additionalProperties": false
      },
      "PaiementEnMasseListe": {
        "type": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/PaiementEnMasseItem"
            }
          },
          "meta": {
            "type": "object",
            "properties": {
              "total": {
                "type": "number",
                "description": "Total d'éléments correspondants à la recherche"
              }
            }
          }
        }
      },
      "PaiementEnMasseRequest": {
        "type": "object",
        "properties": {
          "instructionId": {
            "type": "string",
            "example": true,
            "maxLength": 35,
            "description": "Identifiant du paiement en masse dans le SI du client"
          },
          "payeurAlias": {
            "type": "string",
            "example": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
            "description": "L'alias du compte du client business qui sera débité pour le paiement.\n"
          },
          "confirmation": {
            "type": "boolean",
            "default": false,
            "description": "Indique si une confirmation du business est requise avant d'exécuter les paiements.\n\n- `true` : Le PSP effectue la recherche d'alias pour tous les bénéficiaires, retourne leurs noms et pays, et attend la confirmation du business avant d'exécuter les paiements.\n- `false` : Le PSP exécute directement les paiements sans attendre de confirmation.\n\n**Note :** Si `true`, le business doit confirmer via `PUT /paiements-groupes/{instructionId}/confirmations` dans un délai adaptatif (24h, 48h ou 72h selon le nombre de transactions).\n"
          },
          "motif": {
            "type": "string",
            "description": "Le motif commun à tous les paiements du groupe.\nSi tous les paiements du groupe ont le même motif, ce champ peut être utilisé pour optimiser la taille du lot.\nDans le cas contraire, chaque transaction doit avoir son propre motif.\n",
            "maxLength": 140
          },
          "transactions": {
            "type": "array",
            "items": {
              "type": "object",
              "properties": {
                "txId": {
                  "type": "string",
                  "description": "Identifiant de la transaction dans le SI du client",
                  "maxLength": 35
                },
                "payeAlias": {
                  "type": "string",
                  "example": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
                  "description": "L'alias du client payé, bénéficiaire de l'ordre de paiement",
                  "maxLength": 36
                },
                "montant": {
                  "type": "number",
                  "example": 15000,
                  "description": "Le montant du transfert de fonds à effectuer"
                },
                "motif": {
                  "type": "string",
                  "description": "Le motif du paiement.\nSi tous les paiements du groupe ont le même motif, ce champ doit être omis, et le motif du groupe doit être utilisé.\n",
                  "maxLength": 140
                },
                "refDocNumero": {
                  "type": "string",
                  "description": "Le numéro / la référence du document justificatif",
                  "maxLength": 35
                },
                "refDocType": {
                  "$ref": "#/components/schemas/RefDocType"
                }
              },
              "required": [
                "payeAlias",
                "txId",
                "montant"
              ],
              "additionalProperties": false
            }
          }
        },
        "additionalProperties": false,
        "required": [
          "instructionId",
          "payeurAlias",
          "transactions"
        ]
      },
      "PaiementEnMasseReponseStatut": {
        "type": "object",
        "properties": {
          "instructionId": {
            "type": "string",
            "description": "Identifiant du paiement en masse"
          },
          "statut": {
            "type": "string",
            "enum": [
              "INITIE",
              "CONFIRME",
              "ANNULE"
            ],
            "description": "Statut global du paiement en masse:\n- `INITIE`: Créé avec confirmation demandée, en attente de confirmation\n- `CONFIRME`: Confirmé et en cours de traitement (ou traitement terminé)\n- `ANNULE`: Annulé par le business avant confirmation\n\n**Évolution selon le mode de création :**\n- Si créé **avec confirmation** (`confirmation: true`) : `INITIE` → `CONFIRME` (après PUT /confirmations) ou `ANNULE`\n- Si créé **sans confirmation** (`confirmation: false`) : Directement `CONFIRME` (aucune action requise du business)\n"
          },
          "dateExpiration": {
            "type": "string",
            "format": "date-time",
            "description": "Date d'expiration de la confirmation (délai adaptatif selon nombre de transactions).\nPrésent uniquement si statut = INITIE.\n\nDélais :\n- 1 à 500 transactions : 24 heures\n- 501 à 1000 transactions : 48 heures\n- Plus de 1000 transactions : 72 heures\n"
          },
          "transactionsTotal": {
            "type": "integer",
            "description": "Nombre total de transactions dans le paiement en masse"
          },
          "transactionsInitiees": {
            "type": "number",
            "description": "Nombre de transactions à l'état `INITIE` (validées avec succès, prêtes à être envoyées).\n\nSi créé avec `confirmation: true`, ces transactions ont passé toutes les validations :\n- txId unique (pas de duplication)\n- Alias valide (recherche d'alias réussie)\n- Nom et pays du bénéficiaire disponibles\n\nCe sont ces transactions qui seront envoyées lors de la confirmation.\n\n**Vérification de fin de validation :** La validation est terminée quand `transactionsInitiees + transactionsRejetees = transactionsTotal`.\n"
          },
          "transactionsEnvoyees": {
            "type": "number",
            "description": "Nombre de transactions à l'état `ENVOYE` (en cours d'envoi vers le système bancaire)"
          },
          "transactionsIrrevocables": {
            "type": "number",
            "description": "Nombre de transactions à l'état `IRREVOCABLE` (paiements réussis et finalisés)"
          },
          "transactionsRejetees": {
            "type": "number",
            "description": "Nombre de transactions à l'état `REJETE` (échecs de validation ou d'envoi).\n\nComprend :\n- Rejets de validation (avant envoi) : BE23 (alias invalide), DU03 (txId dupliqué)\n- Rejets d'envoi (après confirmation) : AM04 (solde insuffisant), AGNT (PSP indisponible), etc.\n\n**Note :** Les transactions rejetées à la validation ne sont jamais envoyées, même si le bulk est confirmé.\n"
          },
          "dateDemande": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création du paiement en masse (date de la demande)"
          },
          "dateConfirmation": {
            "type": "string",
            "format": "date-time",
            "description": "Date de confirmation par le business (date d'acceptation de la demande).\nPrésent uniquement si statut = CONFIRME.\n\n- Si créé avec confirmation: Date du PUT /confirmations avec decision: true\n- Si créé sans confirmation: Correspond à dateDemande (confirmation automatique)\n"
          }
        }
      },
      "PaiementEnMasseConfirmationRequestAccepter": {
        "type": "object",
        "properties": {
          "decision": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "La décision à `true` indique la confirmation du paiement en masse."
          }
        },
        "additionalProperties": false,
        "description": "Confirmation du paiement en masse",
        "required": [
          "decision"
        ]
      },
      "PaiementEnMasseConfirmationRequestRejeter": {
        "type": "object",
        "properties": {
          "decision": {
            "type": "boolean",
            "enum": [
              false
            ],
            "description": "La décision à `false` indique l'annulation du paiement en masse."
          }
        },
        "additionalProperties": false,
        "description": "Annulation du paiement en masse",
        "required": [
          "decision"
        ]
      },
      "PaiementEnMasseConfirmationRequest": {
        "type": "object",
        "oneOf": [
          {
            "title": "Confirmer l'envoi du paiement en masse",
            "$ref": "#/components/schemas/PaiementEnMasseConfirmationRequestAccepter"
          },
          {
            "title": "Annuler l'envoi du paiement en masse",
            "$ref": "#/components/schemas/PaiementEnMasseConfirmationRequestRejeter"
          }
        ]
      },
      "PaiementAnnulationRequest": {
        "type": "object",
        "properties": {
          "raison": {
            "$ref": "#/components/schemas/PaiementAnnulationMotif"
          }
        },
        "required": [
          "raison"
        ]
      },
      "PaiementAnnulationReponseRequestAccepter": {
        "type": "object",
        "properties": {
          "decision": {
            "type": "boolean",
            "enum": [
              true
            ],
            "description": "La décision à `true` indique l'acceptation de la demande d'annulation."
          }
        },
        "additionalProperties": false,
        "description": "Acceptation de la demande d'annulation",
        "required": [
          "decision"
        ]
      },
      "PaiementAnnulationReponseRequestRejeter": {
        "type": "object",
        "properties": {
          "decision": {
            "type": "boolean",
            "enum": [
              false
            ],
            "description": "La décision à `false` indique le refus de la demande d'annulation."
          }
        },
        "additionalProperties": false,
        "description": "Refus de la demande d'annulation",
        "required": [
          "decision"
        ]
      },
      "PaiementAnnulationReponseRequest": {
        "oneOf": [
          {
            "$ref": "#/components/schemas/PaiementAnnulationReponseRequestAccepter"
          },
          {
            "$ref": "#/components/schemas/PaiementAnnulationReponseRequestRejeter"
          }
        ],
        "description": "Réponse à une demande d'annulation de paiement.\n\nLe business peut accepter ou refuser la demande d'annulation :\n- `decision: true` : Accepte la demande d'annulation\n- `decision: false` : Refuse la demande d'annulation\n"
      }
    },
    "examples": {
      "CompteListe": {
        "summary": "Liste de comptes",
        "value": {
          "data": [
            {
              "numero": "CIC2344256727788288822",
              "type": "CACC",
              "dateOuverture": "2023-02-21",
              "statut": "OUVERT"
            },
            {
              "numero": "CIC2344256727788288833",
              "type": "SVGS",
              "dateOuverture": "2023-03-15",
              "statut": "OUVERT"
            },
            {
              "numero": "CIC2344256727788288844",
              "type": "CACC",
              "dateOuverture": "2023-01-10",
              "statut": "BLOQUE"
            }
          ],
          "meta": {
            "total": 3
          }
        }
      },
      "Problem7807ExempleUnauthorizedJSON": {
        "summary": "Problème autorisations insuffisantes",
        "value": {
          "type": "about:blank",
          "title": "Unauthorized",
          "status": 401,
          "detail": "Autorisations insuffisantes"
        }
      },
      "Problem7807Exemple429JSON": {
        "summary": "Problème format invalide",
        "value": {
          "type": "about:blank",
          "title": "Too Many Requests",
          "status": 429,
          "detail": "Dépassement du quota d’appels API: envoie de trop de requêtes en un temps donné."
        }
      },
      "Problem7807ExempleInternalServerErrorJSON": {
        "summary": "Problème erreur interne serveur",
        "value": {
          "type": "about:blank",
          "title": "Internal Server Error",
          "status": 500,
          "detail": "Une erreur inattendue a empêché le serveur de traiter la requête."
        }
      },
      "CompteSolde": {
        "summary": "Details d'un compte",
        "value": {
          "type": "CACC",
          "numero": "CIC2344256727788288822",
          "solde": 150000000,
          "statut": "OUVERT",
          "dateOuverture": "2023-02-21"
        }
      },
      "Problem7807ExempleNotFoundJSON": {
        "summary": "Problème ressource inexistant",
        "value": {
          "type": "about:blank",
          "title": "NotFound",
          "status": 404,
          "detail": "La ressource n'existe pas dans le système"
        }
      },
      "CompteTransfertListeReponse": {
        "summary": "Liste des transferts intra-comptes",
        "value": {
          "data": [
            {
              "txId": "23511722",
              "payeurNumero": "ac7a83d8aa7f",
              "payeNumero": "jdko7588578",
              "montant": 150000,
              "statut": "INITIE",
              "dateEnvoi": "2023-02-21T15:30:01.250Z"
            },
            {
              "txId": "23511722",
              "payeurNumero": "ac7a83d8aa7f",
              "payeNumero": "jdko7588578",
              "montant": 150000,
              "statut": "IRREVOCABLE",
              "dateEnvoi": "2023-02-21T15:30:01.250Z",
              "dateIrrevocabilite": "2023-02-21T15:30:01.500Z"
            }
          ],
          "meta": {
            "page": 1,
            "limit": 10,
            "size": 2
          }
        }
      },
      "CompteTransfertRequestNumero": {
        "summary": "Transfert de fonds - avec les numéros de compte",
        "value": {
          "txId": "123511722",
          "payeurNumero": "ac7a83d8aa7f",
          "payeNumero": "jdko7588578",
          "montant": 150000
        }
      },
      "CompteTransfertReponseInitie": {
        "summary": "Transfert initié avec succès",
        "value": {
          "txId": "23511722",
          "payeurNumero": "ac7a83d8aa7f",
          "payeNumero": "jdko7588578",
          "montant": 150000,
          "statut": "INITIE",
          "dateEnvoi": "2023-02-21T15:30:01.250Z"
        }
      },
      "CompteTransfertReponseIrrevocable": {
        "summary": "Transfert effectué avec succès",
        "value": {
          "txId": "23511722",
          "payeurNumero": "ac7a83d8aa7f",
          "payeNumero": "jdko7588578",
          "montant": 150000,
          "statut": "IRREVOCABLE",
          "dateEnvoi": "2023-02-21T15:30:01.250Z",
          "dateIrrevocabilite": "2023-02-21T15:30:01.500Z"
        }
      },
      "CompteTransfertReponseRejete": {
        "summary": "Transfert rejeté",
        "value": {
          "txId": "23511722",
          "payeurNumero": "ac7a83d8aa7f",
          "payeNumero": "jdko7588578",
          "montant": 150000,
          "statut": "REJETE",
          "statutRaison": "AG07",
          "dateEnvoi": "2023-02-21T15:30:01.250Z"
        }
      },
      "Problem7807ExempleBadRequestJSON": {
        "summary": "Problème format invalide",
        "value": {
          "type": "about:blank",
          "title": "Bad Request",
          "status": 400,
          "detail": "Format du message invalide"
        }
      },
      "CompteTransfertReponseSoldeInsuffisant": {
        "summary": "Transfert refusé - Solde insuffisant",
        "value": {
          "type": "about:blank",
          "title": "Forbidden",
          "status": 403,
          "detail": "Le solde du compte est insuffisant pour effectuer ce transfert.",
          "instance": "/comptes/transactions/23511722",
          "invalid-params": [
            {
              "name": "montant",
              "reason": "Le montant est supérieur au solde disponible."
            }
          ]
        }
      },
      "CompteTransfertReponsePayeBloque": {
        "summary": "Transfert refusé - Compte bloqué du payé",
        "value": {
          "type": "about:blank",
          "title": "Forbidden",
          "status": 403,
          "detail": "Le compte du payé est bloqué",
          "instance": "/comptes/transactions/23511722",
          "invalid-params": [
            {
              "name": "payeNumero",
              "reason": "Le compte du payé est bloqué."
            }
          ]
        }
      },
      "AliasReponseListe": {
        "summary": "Liste des alias d'un compte",
        "value": {
          "data": [
            {
              "cle": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "type": "SHID",
              "compte": "CIC2344256727788288822",
              "dateCreation": "2023-02-21T15:30:01.250Z",
              "dateModification": "2023-02-21T15:30:01.250Z"
            },
            {
              "cle": "MERCH001",
              "type": "MCOD",
              "compte": "CIC2344256727788288822",
              "dateCreation": "2023-04-10T08:45:12.500Z",
              "dateModification": "2023-04-10T08:45:12.500Z"
            }
          ],
          "meta": {
            "total": 2,
            "size": 2,
            "page": "1",
            "next": null,
            "prev": null
          }
        }
      },
      "AliasCreationRequestSHID": {
        "summary": "Creation d'alias de type SHID",
        "value": {
          "type": "SHID"
        }
      },
      "AliasCreationRequestMCOD": {
        "summary": "Creation d'alias de type MCOD",
        "value": {
          "type": "MCOD"
        }
      },
      "AliasCreationReponseSHID": {
        "summary": "Reponse Creation d'alias de type SHID",
        "value": {
          "cle": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
          "type": "SHID",
          "compte": "CIC2344256727788288822",
          "dateCreation": "2023-02-21T15:30:01.250Z"
        }
      },
      "AliasCreationReponseMCOD": {
        "summary": "Reponse Creation d'alias de type MCOD",
        "value": {
          "cle": "SNF00_2E4TY",
          "type": "MCOD",
          "compte": "SNC2344256727788288822",
          "dateCreation": "2023-02-21T15:30:01.250Z"
        }
      },
      "AliasCreationReponseDepassementLimit": {
        "summary": "Création alias refusé - limite depassé",
        "value": {
          "type": "about:blank",
          "title": "Bad Request",
          "status": 403,
          "detail": "Depassement de limite de création d'alias",
          "invalid-params": [
            {
              "name": "cle",
              "reason": "Vous avez atteint la limite de création d'alias autorisé"
            }
          ]
        }
      },
      "WebhookListReponse": {
        "summary": "Liste des webhooks configurés",
        "value": {
          "data": [
            {
              "id": "webhook-001",
              "callbackUrl": "https://business.example.com/api/notifications",
              "events": [
                "PAIEMENT_RECU",
                "PAIEMENT_ENVOYE"
              ],
              "dateCreation": "2025-01-15T08:00:00.000Z"
            },
            {
              "id": "webhook-002",
              "callbackUrl": "https://business.example.com/api/notifications",
              "events": [
                "RTP_RECU",
                "RTP_REJETE"
              ],
              "dateCreation": "2025-01-15T08:05:00.000Z"
            },
            {
              "id": "webhook-003",
              "callbackUrl": "https://business.example.com/api/notifications/retours",
              "events": [
                "RETOUR_ENVOYE",
                "RETOUR_REJETE",
                "RETOUR_RECU"
              ],
              "alias": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
              "dateCreation": "2025-01-16T09:00:00.000Z"
            }
          ],
          "meta": {
            "total": 3
          }
        }
      },
      "WebhookCreationRequestUnSeul": {
        "summary": "Un webhook pour recevoir toutes les notifications",
        "value": {
          "callbackUrl": "https://businessmerchant.com/api/piz/webhooks/"
        }
      },
      "NotificationCreationWebhookAlias": {
        "summary": "Un webhook pour recevoir les notifications concernant un alias de compte",
        "value": {
          "callbackUrl": "https://businessmerchant.com/api/piz/webhooks/",
          "alias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c"
        }
      },
      "NotificationCreationWebhookRTP": {
        "summary": "Un webhook pour recevoir les notifications sur les demandes de paiement",
        "value": {
          "callbackUrl": "https://businessmerchant.com/api/piz/webhooks/",
          "events": [
            "RTP_RECU",
            "RTP_REJETE"
          ]
        }
      },
      "NotificationCreationWebhookPaiementRecu": {
        "summary": "Un webhook pour recevoir les notifications de paiement reçus pour un alias de compte",
        "value": {
          "callbackUrl": "https://businessmerchant.com/api/piz/webhooks/",
          "alias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "events": [
            "PAIEMENT_RECUE"
          ]
        }
      },
      "NotificationCreationWebhookReponsePaiementRecu": {
        "summary": "Un webhook pour recevoir les notifications de paiement reçus",
        "value": {
          "id": "12345-7785-zrr5r5v-rf5v5f-r5ffc55a",
          "callbackUrl": "https://businessmerchant.com/api/piz/webhooks/",
          "events": [
            "PAIEMENT_RECUE"
          ],
          "dateCreation": "2023-02-21T15:30:01.250Z",
          "secret": "xsk_9jETWMz1g1b37gCONjNp84t2KSSIU6rG"
        }
      },
      "WebhookEventPAIEMENT_RECU": {
        "summary": "Notification de paiement reçu",
        "value": {
          "data": [
            {
              "evCode": "PAIEMENT_RECU",
              "evDate": "2023-02-21T15:35:54.550Z",
              "txId": "23552722",
              "montant": 400,
              "client": "Khadidja DIOP",
              "alias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "end2endId": "ESNB00120230221153554KXvozkpNvhUk9e"
            }
          ],
          "meta": {
            "total": 1
          }
        }
      },
      "WebhookEventPAIEMENT_REJETE": {
        "summary": "Notification de paiement rejeté",
        "value": {
          "data": [
            {
              "evCode": "PAIEMENT_REJETE",
              "evDate": "2023-02-21T15:30:01.250Z",
              "txId": "23552722",
              "montant": 15000,
              "client": "Fournisseur ABC",
              "alias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "end2endId": "ESNB00120230221153554KXvozkpNvhUk9e",
              "motif": "AM04"
            }
          ],
          "meta": {
            "total": 1
          }
        }
      },
      "WebhookEventPAIEMENT_ENVOYE": {
        "summary": "Notification de paiement envoyé",
        "value": {
          "data": [
            {
              "evCode": "PAIEMENT_ENVOYE",
              "evDate": "2023-02-21T15:30:01.250Z",
              "txId": "23552722",
              "montant": 15000,
              "client": "Ababacar Ndiaye",
              "alias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "end2endId": "ESNB00120230221153554KXvozkpNvhUk9e",
              "refDocType": "CINV",
              "refDocNumero": "A1234567890"
            }
          ],
          "meta": {
            "total": 1
          }
        }
      },
      "WebhookEventRTP_RECU": {
        "summary": "Notification de demande de paiement reçue",
        "value": {
          "data": [
            {
              "evCode": "RTP_RECU",
              "evDate": "2023-02-21T15:30:01.250Z",
              "txId": "23552722",
              "client": "Serigne Et Freres",
              "montant": 15000,
              "alias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "end2endId": "ESNB00120230221153554KXvozkpNvhUk9e"
            }
          ],
          "meta": {
            "total": 1
          }
        }
      },
      "WebhookEventRTP_REJETE": {
        "summary": "Notification de demande de paiement rejetée",
        "value": {
          "data": [
            {
              "evCode": "RTP_REJETE",
              "evDate": "2023-02-21T15:30:01.250Z",
              "txId": "23552722",
              "montant": 2000000,
              "client": "Soro & Freres",
              "alias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "end2endId": "ESNB00120230221153554KXvozkpNvhUk9e",
              "motif": "AM02"
            }
          ],
          "meta": {
            "total": 1
          }
        }
      },
      "WebhookEventRTP_ENVOYE_ACCEPTE": {
        "summary": "Notification de demande de paiement acceptée / paiement reçu suite à une demande de paiement",
        "value": {
          "data": [
            {
              "evCode": "PAIEMENT_RECU",
              "evDate": "2023-02-21T15:30:01.250Z",
              "txId": "23552722",
              "montant": 15000,
              "client": "Traoré Idrissa",
              "alias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "end2endId": "ESNB00120230221153554KXvozkpNvhUk9e"
            }
          ],
          "meta": {
            "total": 1
          }
        }
      },
      "WebhookEventANNULATION_DEMANDE": {
        "summary": "Notification de demande d'annulation reçue",
        "value": {
          "data": [
            {
              "evCode": "ANNULATION_DEMANDE",
              "evDate": "2023-02-21T15:35:54.550Z",
              "txId": "23552722",
              "montant": 5000,
              "client": "Roméo Ahoue",
              "alias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "end2endId": "ESNB00120230221153554KXvozkpNvhUk9e",
              "motif": "AM09"
            }
          ],
          "meta": {
            "total": 1
          }
        }
      },
      "WebhookEventANNULATION_REJETE": {
        "summary": "Notification de demande d'annulation rejetée",
        "value": {
          "data": [
            {
              "evCode": "ANNULATION_REJETE",
              "evDate": "2023-02-21T15:30:01.250Z",
              "txId": "23552722",
              "montant": 5000,
              "client": "Romeo AHOUE",
              "alias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "end2endId": "ESNB00120230221153554KXvozkpNvhUk9e",
              "motif": "CUST"
            }
          ],
          "meta": {
            "total": 1
          }
        }
      },
      "WebhookEventRETOUR_ENVOYE": {
        "summary": "Notification de retour de fonds envoyé",
        "value": {
          "data": [
            {
              "evCode": "RETOUR_ENVOYE",
              "evDate": "2023-02-21T15:35:54.550Z",
              "txId": "23552722",
              "montant": 12000,
              "client": "Seini DIOUM",
              "alias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "end2endId": "ESNB00120230221153554KXvozkpNvhUk9e",
              "motif": "CUST"
            }
          ],
          "meta": {
            "total": 1
          }
        }
      },
      "WebhookEventRETOUR_REJETE": {
        "summary": "Notification de retour de fonds rejeté",
        "value": {
          "data": [
            {
              "evCode": "RETOUR_REJETE",
              "evDate": "2023-02-21T15:30:01.250Z",
              "txId": "23552722",
              "montant": 12000,
              "alias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "client": "Chris Seini",
              "end2endId": "ESNB00120230221153554KXvozkpNvhUk9e",
              "motif": "AM04"
            }
          ],
          "meta": {
            "total": 1
          }
        }
      },
      "WebhookEventRETOUR_RECU": {
        "summary": "Notification de retour de fonds reçu",
        "value": {
          "data": [
            {
              "evCode": "RETOUR_RECU",
              "evDate": "2023-02-21T15:35:54.550Z",
              "txId": "23552722",
              "montant": 8500,
              "alias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "end2endId": "ESNB00120230221153554KXvozkpNvhUk9e",
              "motif": "AC06"
            }
          ],
          "meta": {
            "total": 1
          }
        }
      },
      "WebhookEventsMultiples": {
        "summary": "Notification de plusieurs événements simultanés",
        "value": {
          "data": [
            {
              "evCode": "PAIEMENT_RECU",
              "evDate": "2023-02-21T15:35:54.550Z",
              "txId": "23552722",
              "montant": 400,
              "client": "Christian POUYE",
              "alias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "end2endId": "ESNB00120230221153554KXvozkpNvhUk9e"
            },
            {
              "evCode": "PAIEMENT_RECU",
              "evDate": "2023-02-21T15:36:12.320Z",
              "txId": "23552723",
              "montant": 1500,
              "client": "Mariam Traore",
              "alias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "end2endId": "ESNB00120230221153612AbCdEfGhIjKl"
            },
            {
              "evCode": "RTP_RECU",
              "evDate": "2023-02-21T15:37:05.890Z",
              "txId": "23552724",
              "montant": 25000,
              "client": "Fournisseur Abc",
              "alias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "end2endId": "ESNB00120230221153705MnOpQrStUvWx"
            }
          ],
          "meta": {
            "total": 3
          }
        }
      },
      "NotificationModificationWebhookCallbackUrl": {
        "summary": "Modifier uniquement l'URL de callback",
        "value": {
          "callbackUrl": "https://businessmerchant.com/api/v2/webhooks/notifications"
        }
      },
      "NotificationModificationWebhookAlias": {
        "summary": "Modifier l'alias associé au webhook",
        "value": {
          "alias": "5d8a2f1c-9b3e-4a7d-8c1f-2e6b9a4d7c3a"
        }
      },
      "NotificationModificationWebhookEvents": {
        "summary": "Modifier la liste des événements",
        "value": {
          "events": [
            "PAIEMENT_RECU",
            "PAIEMENT_ENVOYE",
            "PAIEMENT_REJETE",
            "RTP_RECU",
            "RTP_REJETE"
          ]
        }
      },
      "NotificationModificationReponsePaiementRecu": {
        "summary": "Un webhook modifié",
        "value": {
          "id": "12345-7785-zrr5r5v-rf5v5f-r5ffc55a",
          "callbackUrl": "https://businessmerchant.com/api/piz/webhooks/",
          "events": [
            "PAIEMENT_RECUE"
          ],
          "dateCreation": "2023-02-21T15:30:01.250Z",
          "dateModification": "2023-06-21T15:30:01.250Z"
        }
      },
      "DemandePaiementEnvoyeesListe": {
        "summary": "Liste des demandes de paiement envoyées",
        "value": {
          "data": [
            {
              "txId": "RTP-2023-001",
              "confirmation": false,
              "categorie": "500",
              "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
              "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "montant": 15000,
              "statut": "IRREVOCABLE",
              "end2endId": "ESNB00120230221103000KXvozkpNvhUk9e",
              "payeurNom": "DIOP Mamadou",
              "payeurPays": "SN",
              "dateDemande": "2023-02-21T10:30:00.000Z",
              "dateEnvoi": "2023-02-21T10:30:00.100Z",
              "dateIrrevocabilite": "2023-02-21T10:35:05.000Z"
            },
            {
              "txId": "RTP-2023-002",
              "confirmation": true,
              "categorie": "401",
              "payeurAlias": "8a2c3588-4f61-546c-c868-bd8b94e9bb9d",
              "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "montant": 150000,
              "dateLimitePaiement": "2023-03-31T23:59:59.999Z",
              "dateLimiteReponse": "2023-04-15T23:59:59.999Z",
              "refDocType": "CINV",
              "refDocNumero": "FACT-ELEC-202303",
              "statut": "INITIE",
              "end2endId": "ESNB00120230221103000KXvozkpNvhUk9e",
              "payeurNom": "TRAORE Aminata",
              "payeurPays": "CI",
              "dateDemande": "2023-02-21T11:00:00.000Z"
            },
            {
              "txId": "RTP-2023-005",
              "confirmation": false,
              "categorie": "500",
              "payeurAlias": "7b3d4699-5g72-657d-d979-ce9c05f0cc0e",
              "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "montant": 10000,
              "montantAchat": 8950,
              "montantRetrait": 1050,
              "montantFrais": 50,
              "motif": "Achat avec cashback",
              "statut": "ENVOYE",
              "end2endId": "ESNB00120230221103000KXvozkpNvhUk9e",
              "payeurNom": "KONE Ibrahim",
              "payeurPays": "ML",
              "dateDemande": "2023-02-21T14:20:00.000Z",
              "dateEnvoi": "2023-02-21T14:20:00.100Z"
            },
            {
              "txId": "RTP-2023-005",
              "confirmation": false,
              "categorie": "500",
              "payeurAlias": "7b3d4699-5g72-657d-d979-ce9c05f0cc0e",
              "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "montant": 10000,
              "montantAchat": 8950,
              "montantRetrait": 1050,
              "montantFrais": 50,
              "statut": "REJETE",
              "statutRaison": "AM09",
              "end2endId": "ESNB00120230221103000KXvozkpNvhUk9e",
              "payeurNom": "KONE Ibrahim",
              "payeurPays": "ML",
              "dateDemande": "2023-02-21T14:20:00.000Z",
              "dateEnvoi": "2023-02-21T14:20:00.100Z",
              "dateReponse": "2023-02-21T14:20:10.200Z"
            }
          ],
          "meta": {
            "size": 4,
            "total": 4
          }
        }
      },
      "DemandePaiementRequestCasAvecConfirmation": {
        "summary": "Confirmation requise",
        "description": "Le business vérifiera les informations du client payeur et confirmera le paiement",
        "value": {
          "categorie": "401",
          "txId": "23511722",
          "payeurAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
          "payeAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "montant": 3000000,
          "confirmation": true,
          "dateLimitePaiement": "2023-12-31T23:59:59.999Z"
        }
      },
      "DemandePaiementRequestCasSansConfirmation": {
        "summary": "Confirmation non requise",
        "description": "Demande de paiement immédiat sur site sans confirmation",
        "value": {
          "txId": "23552722",
          "payeurAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
          "payeAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "montant": 150000,
          "categorie": "500",
          "dateLimitePaiement": "2023-02-22T15:32:01.250Z",
          "confirmation": false
        }
      },
      "DemandePaiementImmediatSurSite": {
        "summary": "Paiement immédiat sur site (point de vente physique)",
        "value": {
          "txId": "RTP-2023-001",
          "confirmation": false,
          "categorie": "500",
          "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "montant": 15000,
          "motif": "Achat en magasin"
        }
      },
      "DemandePaiementPICO": {
        "summary": "Paiement PICO (achat + retrait espèces)",
        "value": {
          "txId": "RTP-2023-005",
          "confirmation": false,
          "categorie": "500",
          "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "montant": 10000,
          "montantAchat": 8950,
          "montantRetrait": 1050,
          "montantFrais": 50
        }
      },
      "DemandePaiementPICASH": {
        "summary": "Paiement PICASH (retrait espèces uniquement)",
        "value": {
          "txId": "RTP-2023-006",
          "confirmation": false,
          "categorie": "500",
          "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "montant": 10100,
          "montantRetrait": 10100,
          "montantFrais": 100
        }
      },
      "DemandePaiementSurSiteDebitDiffere": {
        "summary": "Paiement sur site avec débit différé (BNPL)",
        "value": {
          "txId": "RTP-2023-004",
          "confirmation": false,
          "categorie": "500",
          "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "montant": 50000,
          "debitDiffere": true,
          "remise": {
            "taux": 1
          },
          "refDocType": "CONT",
          "refDocNumero": "CONTRAT-2023-045"
        }
      },
      "DemandePaiementImmediatEnLigne": {
        "summary": "Paiement immédiat en ligne (e-commerce)",
        "value": {
          "txId": "RTP-2023-002",
          "confirmation": false,
          "categorie": "521",
          "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "logoUrl": "https://developers.pi-bceao.com/assets/images/logo/Logo_SPI_1.png",
          "montant": 25000,
          "motif": "Paiement du livre Manuel des écritures comptables"
        }
      },
      "DemandePaiementEnLigneDebitDiffere": {
        "summary": "Paiement en ligne avec débit différé (BNPL e-commerce)",
        "value": {
          "txId": "RTP-2023-007",
          "confirmation": false,
          "categorie": "521",
          "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "montant": 100000,
          "debitDiffere": true,
          "remise": {
            "montant": 1000
          },
          "refDocType": "PUOR",
          "refDocNumero": "WEB-2023-789"
        }
      },
      "DemandePaiementFacture": {
        "summary": "Paiement de facture sans remise",
        "value": {
          "txId": "RTP-2023-003",
          "confirmation": true,
          "categorie": "401",
          "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "montant": 150000,
          "dateLimitePaiement": "2023-02-21T15:37:00.000Z",
          "motif": "Facture électricité mars 2023",
          "refDocType": "MSIN",
          "refDocNumero": "FACT-ELEC-202303"
        }
      },
      "DemandePaiementFactureAvecRemise": {
        "summary": "Paiement de facture avec remise",
        "value": {
          "txId": "RTP-2023-008",
          "confirmation": true,
          "categorie": "401",
          "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "montant": 200000,
          "dateLimitePaiement": "2023-04-30T23:59:59.999Z",
          "dateLimiteReponse": "2023-04-15T23:59:59.999Z",
          "remise": {
            "montant": 10000
          },
          "motif": "Facture téléphone avec réduction fidélité",
          "refDocType": "CINV",
          "refDocNumero": "FACT-TEL-202304"
        }
      },
      "DemandePaiementReponseCasSansConfirmation": {
        "summary": "Demande de paiement envoyé sans confirmation",
        "value": {
          "txId": "23511722",
          "payeAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "payeurAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
          "payeurNom": "Nom du client payé",
          "payeurPays": "BJ",
          "montant": 150000,
          "categorie": 500,
          "dateLimitePaiement": "2023-02-22T15:32:01.250Z",
          "end2endId": "ESNB00120230221153001KXvozkpNvhUk9a",
          "dateDemande": "2023-02-21T15:30:01.150Z",
          "dateEnvoi": "2023-02-21T15:30:01.250Z",
          "statut": "ENVOYE",
          "confirmation": false
        }
      },
      "DemandePaiementReponseCasAvecConfirmation": {
        "summary": "Demande de Paiement en attente d'envoi - confirmation attendue",
        "value": {
          "txId": "23552722",
          "payeAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "payeurAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
          "payeurNom": "Nom du client payé",
          "payeurPays": "BJ",
          "montant": 150000,
          "statut": "INITIE",
          "categorie": 401,
          "dateDemande": "2023-11-15T15:30:01.250Z",
          "dateLimitePaiement": "2023-12-31T23:59:59.999Z",
          "confirmation": true
        }
      },
      "DemandePaiementRejeteDU03": {
        "summary": "Demande rejetée - txId dupliqué",
        "description": "Le txId est dupliqué, La recherche d'alias n'a pas pu être effectuée donc payeurNom et payeurPays ne sont pas présents",
        "value": {
          "txId": "RTP-2025-001",
          "payeurAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "payeAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
          "categorie": "401",
          "montant": 50000,
          "motif": "Facture janvier 2025",
          "dateLimitePaiement": "2025-01-31T23:59:59.999Z",
          "statut": "REJETE",
          "statutRaison": "DU03",
          "end2endId": "ESNB00120250117100000RTPTXIDDUP001",
          "dateDemande": "2025-01-17T10:00:00.000Z"
        }
      },
      "DemandePaiementRejeteBE23": {
        "summary": "Demande rejetée - Alias payeur invalide",
        "description": "La recherche d'alias a échoué",
        "value": {
          "txId": "RTP-2025-002",
          "payeurAlias": "ALIAS-INVALIDE-456",
          "payeAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
          "categorie": "401",
          "montant": 75000,
          "motif": "Facture février 2025",
          "dateLimitePaiement": "2025-02-28T23:59:59.999Z",
          "statut": "REJETE",
          "statutRaison": "BE23",
          "end2endId": "ESNB00120250117100500RTPALIASINV002",
          "dateDemande": "2025-01-17T10:05:00.000Z"
        }
      },
      "DemandePaiementReponseAcceptation": {
        "summary": "Demande de paiement envoyée - acceptée",
        "value": {
          "txId": "23552722",
          "end2endId": "ESNC00220230221103000KXvozkpNvhUk9e",
          "categorie": "500",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "payeurAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
          "payeurNom": "Nom du client payé",
          "payeurPays": "BJ",
          "montant": 150000,
          "confirmation": true,
          "dateLimiteReponse": "2023-02-21T15:30:01.250Z",
          "dateLimitePaiement": "2023-02-22T15:30:01.250Z",
          "statut": "IRREVOCABLE",
          "dateDemande": "2023-02-21T15:30:01.150Z",
          "dateEnvoi": "2023-02-21T15:30:01.250Z",
          "dateIrrevocabilite": "2023-02-21T15:30:01.350Z"
        }
      },
      "DemandePaiementReponseRejetDemandeurInconnu": {
        "summary": "Demande de paiement envoyée - rejetée",
        "value": {
          "txId": "23552722",
          "end2endId": "ESNB00120230221103000KXvozkpNvhUk9e",
          "categorie": "521",
          "confirmation": false,
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8",
          "payeurAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
          "payeurNom": "Nom du client payé",
          "payeurPays": "BJ",
          "montant": 150000,
          "dateLimiteReponse": "2023-02-21T15:30:01.250Z",
          "dateLimitePaiement": "2023-02-22T15:30:01.250Z",
          "dateDemande": "2023-02-21T15:30:01.150Z",
          "dateReponse": "2023-02-21T15:30:59.350Z",
          "statut": "REJETE",
          "statutRaison": "BE05"
        }
      },
      "DemandePaiementConfirmationRequeteCasConfirmationOui": {
        "summary": "Confirmation de la demande de paiement - confirmer l'envoi",
        "value": {
          "decision": true
        }
      },
      "DemandePaiementConfirmationRequeteCasConfirmationNon": {
        "summary": "Confirmation de la demande de paiement - annuler l'envoi",
        "value": {
          "decision": false
        }
      },
      "DemandePaiementConfirmationReponseCasOui": {
        "summary": "Demande de paiement envoyée",
        "value": {
          "txId": "23552722",
          "categorie": 521,
          "payeAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "payeurAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
          "montant": 150000,
          "confirmation": true,
          "statut": "ENVOYE",
          "dateLimitePaiement": "2023-02-22T15:32:01.150Z",
          "dateDemande": "2023-02-21T15:30:01.150Z",
          "dateConfirmation": "2023-02-21T15:30:04.250Z",
          "dateEnvoi": "2023-02-21T15:30:05.350Z",
          "payeurNom": "Nom du client payé",
          "payeurPays": "BJ"
        }
      },
      "DemandePaiementConfirmationReponseCasNon": {
        "summary": "Demande de paiement annulée",
        "value": {
          "txId": "23552722",
          "payeurAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
          "payeAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "categorie": 500,
          "montant": 150000,
          "confirmation": true,
          "statut": "ANNULE",
          "dateLimitePaiement": "2023-02-22T15:30:01.250Z",
          "payeurNom": "Nom du client payé",
          "payeurPays": "BJ",
          "dateDemande": "2023-02-21T15:30:01.150Z",
          "dateConfirmation": "2023-02-21T15:30:03.250Z"
        }
      },
      "DemandePaiementRecuesListe": {
        "summary": "Liste des demandes de paiement reçues",
        "value": {
          "data": [
            {
              "txId": "RTP-2023-001",
              "end2endId": "ESNC00220230221103000KXvozkpNvhUk9e",
              "categorie": "631",
              "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
              "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "payeNom": "DIOP Mamadou",
              "payePays": "SN",
              "montant": 15000,
              "statut": "IRREVOCABLE",
              "motif": "Demande de paiement d'allocation sociale",
              "dateDemande": "2023-02-21T10:30:00.000Z",
              "dateIrrevocabilite": "2023-02-21T10:35:05.000Z"
            },
            {
              "txId": "RTP-2023-002",
              "end2endId": "ESNB00120230221103000KXvozkpNvhUk9e",
              "categorie": "401",
              "montant": 150000,
              "payeurAlias": "8a2c3588-4f61-546c-c868-bd8b94e9bb9d",
              "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "payeNom": "Traoré & Freres",
              "payePays": "CI",
              "dateDemande": "2023-02-21T11:00:00.000Z",
              "dateLimitePaiement": "2023-03-31T23:59:59.999Z",
              "dateLimiteReponse": "2023-04-15T23:59:59.999Z",
              "refDocType": "CINV",
              "refDocNumero": "FACT-ELEC-202303",
              "statut": "INITIE"
            }
          ],
          "meta": {
            "size": 2,
            "total": 2
          }
        }
      },
      "DemandePaiementRecueEnAttente": {
        "summary": "Demande de paiement reçue en attente de réponse",
        "value": {
          "txId": "RTP-2023-003",
          "end2endId": "ESNC00320230221153000KXvozkpNvhUk9f",
          "categorie": "401",
          "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "payeNom": "Traoré & Freres",
          "payePays": "CI",
          "montant": 150000,
          "statut": "INITIE",
          "refDocType": "CINV",
          "refDocNumero": "FACT-ELEC-202303",
          "dateDemande": "2023-02-21T15:30:00.000Z",
          "dateLimitePaiement": "2023-03-31T23:59:59.999Z",
          "dateLimiteReponse": "2023-04-15T23:59:59.999Z"
        }
      },
      "DemandePaiementRecueAcceptee": {
        "summary": "Demande de paiement reçue acceptée",
        "value": {
          "txId": "RTP-2023-004",
          "end2endId": "ESNC00420230221153000KXvozkpNvhUk9g",
          "confirmation": false,
          "categorie": "631",
          "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "payeNom": "DIOP Mamadou",
          "payePays": "SN",
          "montant": 15000,
          "statut": "IRREVOCABLE",
          "motif": "Demande de paiement d'allocation sociale",
          "dateDemande": "2023-02-21T10:30:00.000Z",
          "dateReponse": "2023-02-21T10:35:00.000Z",
          "dateIrrevocabilite": "2023-02-21T10:35:05.000Z",
          "dateLimitePaiement": "2023-02-22T15:30:01.250Z"
        }
      },
      "DemandePaiementRecueRejetee": {
        "summary": "Demande de paiement reçue rejetée",
        "value": {
          "txId": "RTP-2023-005",
          "end2endId": "ESNC00520230221153000KXvozkpNvhUk9h",
          "confirmation": true,
          "categorie": "521",
          "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "payeNom": "Nom du client payé",
          "payePays": "BJ",
          "montant": 150000,
          "statut": "REJETE",
          "statutRaison": "BE05",
          "motif": "Paiement de facture",
          "dateDemande": "2023-02-21T15:30:00.000Z",
          "dateEnvoi": "2023-02-21T15:30:01.250Z",
          "dateReponse": "2023-02-21T15:30:59.350Z",
          "dateLimiteReponse": "2023-02-21T15:30:01.250Z",
          "dateLimitePaiement": "2023-02-22T15:30:01.250Z"
        }
      },
      "DemandePaiementReponseRequeteAccepter": {
        "summary": "Accepter la demande de paiement",
        "value": {
          "decision": true
        }
      },
      "DemandePaiementReponseRequeteRejeter": {
        "summary": "rejeter la demande de paiement",
        "value": {
          "decision": false,
          "raison": "AM09"
        }
      },
      "DemandePaiementReponseReponseAcceptation": {
        "summary": "Reponse à la demande de paiement - ACCEPTE",
        "value": {
          "txId": "RTP-2023-001",
          "end2endId": "ESNC00220230221103000KXvozkpNvhUk9e",
          "categorie": "631",
          "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "payeNom": "DIOP Mamadou",
          "payePays": "SN",
          "montant": 15000,
          "statut": "ENVOYE",
          "motif": "Demande de paiement d'allocation sociale",
          "dateDemande": "2023-02-21T10:30:00.000Z",
          "dateReponse": "2023-02-21T15:30:59.350Z"
        }
      },
      "DemandePaiementConfirmationImpossibleDejaEnvoye": {
        "summary": "Réponse à la demande de paiement déjà envoyée",
        "value": {
          "type": "about:blank",
          "title": "Bad Request",
          "status": 403,
          "detail": "la demande de paiement est déjà acceptée. le paiement est envoyé.\n"
        }
      },
      "DemandePaiementConfirmationImpossibleDejaAnnule": {
        "summary": "Réponse - la demande de paiement est déjà rejetée",
        "value": {
          "type": "about:blank",
          "title": "Bad Request",
          "status": 403,
          "detail": "la demande de paiement est déjà rejetée.\n"
        }
      },
      "DemandePaiementEnMasseListe": {
        "summary": "Liste des demandes de paiement en masse",
        "value": {
          "data": [
            {
              "instructionId": "RTP-MASSE-2025-01",
              "statut": "CONFIRME",
              "dateDemande": "2023-12-15T12:00:00.000Z"
            },
            {
              "instructionId": "FACTURES-2025-01-1",
              "statut": "INITIE",
              "dateDemande": "2023-12-16T10:30:00.000Z"
            },
            {
              "instructionId": "FACTURES-2025-01-2",
              "statut": "ANNULE",
              "dateDemande": "2023-12-17T14:20:00.000Z"
            }
          ],
          "meta": {
            "total": 3
          }
        }
      },
      "DemandePaiementEnMasseRequete": {
        "summary": "Demande de paiement en masse (sans confirmation)",
        "value": {
          "instructionId": "FACTURES-2025-01-1",
          "payeAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
          "confirmation": false,
          "transactions": [
            {
              "txId": "123-456-789",
              "payeurAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "montant": 150000000,
              "dateLimitePaiement": "2023-12-31T23:59:59.999Z"
            },
            {
              "txId": "987-000-234",
              "payeurAlias": "s03b2499-3e50-435b-b757-ac7a83d8aa8c",
              "refDocNumero": "FAC-2023-001",
              "refDocType": "CINV",
              "montant": 3000000,
              "dateLimitePaiement": "2023-12-31T23:59:59.999Z"
            }
          ]
        }
      },
      "DemandePaiementEnMasseRequeteAvecConfirmation": {
        "summary": "Demande de paiement en masse (avec confirmation)",
        "value": {
          "instructionId": "FACTURES-2025-01-1",
          "payeAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
          "confirmation": true,
          "motif": "Factures mensuelles - Janvier 2025",
          "transactions": [
            {
              "txId": "FAC-2025-001",
              "payeurAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "montant": 50000,
              "dateLimitePaiement": "2025-01-31T23:59:59.999Z",
              "refDocNumero": "INV-2025-001",
              "refDocType": "CINV"
            },
            {
              "txId": "FAC-2025-002",
              "payeurAlias": "s03b2499-3e50-435b-b757-ac7a83d8aa8c",
              "montant": 75000,
              "dateLimitePaiement": "2025-01-31T23:59:59.999Z",
              "refDocNumero": "INV-2025-002",
              "refDocType": "CINV"
            },
            {
              "txId": "FAC-2025-003",
              "payeurAlias": "t03b2499-3e50-435b-b757-ac7a83d8aa8c",
              "montant": 120000,
              "dateLimitePaiement": "2025-01-31T23:59:59.999Z",
              "refDocNumero": "INV-2025-003",
              "refDocType": "CINV"
            }
          ]
        }
      },
      "DemandePaiementEnMasseStatutReponseInitie": {
        "summary": "Demande de paiement en masse en attente de confirmation",
        "value": {
          "instructionId": "RTP-MASSE-2025-01",
          "statut": "INITIE",
          "dateDemande": "2024-10-17T10:00:00.000Z",
          "dateExpiration": "2024-10-18T10:00:00.000Z",
          "transactionsTotal": 50,
          "transactionsInitiees": 48,
          "transactionsEnvoyees": 0,
          "transactionsIrrevocables": 0,
          "transactionsRejetees": 2
        }
      },
      "DemandePaiementEnMasseStatutReponse": {
        "summary": "Demande de paiement en masse confirmée (en cours de traitement)",
        "value": {
          "instructionId": "RTP-MASSE-2025-01",
          "statut": "CONFIRME",
          "dateDemande": "2023-12-15T12:00:00.000Z",
          "dateConfirmation": "2023-12-15T12:05:00.000Z",
          "transactionsTotal": 18,
          "transactionsInitiees": 2,
          "transactionsEnvoyees": 10,
          "transactionsIrrevocables": 5,
          "transactionsRejetees": 1
        }
      },
      "DemandePaiementEnMasseStatutReponseAnnule": {
        "summary": "Demande de paiement en masse annulée par le business",
        "value": {
          "instructionId": "RTP-MASSE-2025-01",
          "statut": "ANNULE",
          "dateDemande": "2024-10-17T10:00:00.000Z",
          "dateAnnulation": "2024-10-17T10:05:00.000Z",
          "transactionsTotal": 50,
          "transactionsInitiees": 48,
          "transactionsEnvoyees": 0,
          "transactionsIrrevocables": 0,
          "transactionsRejetees": 2
        }
      },
      "DemandePaiementEnMasseConfirmationRequeteCasOui": {
        "summary": "Confirmation de la demande de paiement en masse",
        "value": {
          "decision": true
        }
      },
      "DemandePaiementEnMasseConfirmationRequeteCasNon": {
        "summary": "Annulation de la demande de paiement en masse",
        "value": {
          "decision": false
        }
      },
      "DemandePaiementEnMasseConfirmationReponseCasOui": {
        "summary": "Demande de paiement en masse confirmée",
        "value": {
          "instructionId": "RTP-MASSE-2025-01",
          "statut": "CONFIRME",
          "dateDemande": "2024-10-17T10:00:00.000Z",
          "dateConfirmation": "2024-10-17T10:05:00.000Z",
          "transactionsTotal": 50,
          "transactionsInitiees": 0,
          "transactionsEnvoyees": 48,
          "transactionsIrrevocables": 0,
          "transactionsRejetees": 2
        }
      },
      "DemandePaiementEnMasseConfirmationReponseCasNon": {
        "summary": "Demande de paiement en masse annulée",
        "value": {
          "instructionId": "RTP-MASSE-2025-01",
          "statut": "ANNULE",
          "dateDemande": "2024-10-17T10:00:00.000Z",
          "dateAnnulation": "2024-10-17T10:05:00.000Z",
          "transactionsTotal": 50,
          "transactionsInitiees": 48,
          "transactionsEnvoyees": 0,
          "transactionsIrrevocables": 0,
          "transactionsRejetees": 2
        }
      },
      "PaiementListeEnvoyes": {
        "summary": "Liste  de paiements envoyes",
        "description": "Cet exemple montre une liste de paiements envoyés par le client business.\nLe business a filtré avec les champs `payeurCompte` en mettant son numéro de compte.\nLes paiements sont classés par date d'envoi, de la plus récente à la plus ancienne.\n",
        "value": {
          "data": [
            {
              "txId": "a755485465e4d5ddsqddqde",
              "categorie": "733",
              "payeurCompte": "1234567890",
              "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
              "confirmation": false,
              "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "payeNom": "DIOP Mamadou",
              "payePays": "SN",
              "montant": 15000,
              "statut": "IRREVOCABLE",
              "end2endId": "ESNB00120230221103000KXvozkpNvhUk9e",
              "dateDemande": "2023-02-21T10:30:00.000Z",
              "dateConfirmation": "2023-02-21T10:30:00.000Z",
              "dateEnvoi": "2023-02-21T10:30:00.100Z",
              "dateIrrevocabilite": "2023-02-21T10:30:01.000Z",
              "dateReponse": "2023-02-21T10:30:01.100Z"
            },
            {
              "txId": "b755485465e4d5ddsqddqde",
              "categorie": "733",
              "payeurCompte": "1234567890",
              "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
              "confirmation": true,
              "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "payeNom": "DIOP Mamadou",
              "payePays": "SN",
              "montant": 15000,
              "statut": "REJETE",
              "statutRaison": "AG11",
              "end2endId": "ESNB00120230221103000KXvozkpNvhUk9f",
              "dateDemande": "2023-02-21T10:30:00.000Z",
              "dateConfirmation": "2023-02-21T10:30:20.000Z",
              "dateEnvoi": "2023-02-21T10:30:20.100Z",
              "dateReponse": "2023-02-21T10:30:20.900Z"
            }
          ],
          "meta": {
            "size": 2,
            "total": 2
          }
        }
      },
      "PaiementListeEnvoyesBulk": {
        "summary": "Liste de paiements envoyes lors d'un paiement en masse",
        "description": "Cet exemple montre une liste de paiements envoyés par le client business dans le cadre d'un paiement en masse.\nLe business a filtré avec le champ `instructionId` en mettant l'identifiant du paiement en masse.\n",
        "value": {
          "data": [
            {
              "txId": "a755485465e4d5ddsqddqde",
              "instructionId": "123-5678292",
              "categorie": "733",
              "payeurCompte": "1234567890",
              "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
              "confirmation": false,
              "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "payeNom": "DIOP Mamadou",
              "payePays": "SN",
              "montant": 15000,
              "statut": "IRREVOCABLE",
              "end2endId": "ESNB00120230221103000KXvozkpNvhUk9e",
              "dateDemande": "2023-02-21T10:30:00.000Z",
              "dateConfirmation": "2023-02-21T10:30:00.000Z",
              "dateEnvoi": "2023-02-21T10:30:00.100Z",
              "dateIrrevocabilite": "2023-02-21T10:30:01.000Z",
              "dateReponse": "2023-02-21T10:30:01.100Z"
            },
            {
              "txId": "b755485465e4d5ddsqddqde",
              "instructionId": "123-5678292",
              "categorie": "733",
              "payeurCompte": "1234567890",
              "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
              "confirmation": true,
              "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "payeNom": "DIOP Mamadou",
              "payePays": "SN",
              "montant": 15000,
              "statut": "REJETE",
              "statutRaison": "AG11",
              "end2endId": "ESNB00120230221103000KXvozkpNvhUk9f",
              "dateDemande": "2023-02-21T10:30:00.000Z",
              "dateConfirmation": "2023-02-21T10:30:20.000Z",
              "dateEnvoi": "2023-02-21T10:30:20.100Z",
              "dateReponse": "2023-02-21T10:30:20.900Z"
            }
          ],
          "meta": {
            "size": 2,
            "total": 2
          }
        }
      },
      "PaiementImmediatRequeteCasSansConfirmation": {
        "summary": "Paiement immediat - confirmation non requise",
        "value": {
          "txId": "23552722",
          "payeurAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "montant": 150000,
          "confirmation": false
        }
      },
      "PaiementImmediatRequeteCasAvecConfirmation": {
        "summary": "Paiement immediat - confirmation demandée",
        "value": {
          "txId": "123-456-789",
          "payeurAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "montant": 150000000,
          "confirmation": true
        }
      },
      "PaiementImmediatReponseCasSansConfirmation": {
        "summary": "Paiement envoyé",
        "value": {
          "txId": "23552722",
          "payeurAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "montant": 150000,
          "refDocType": "INVS",
          "refDocNumero": "1234567890",
          "statut": "ENVOYE",
          "confirmation": false,
          "payeNom": "Entreprise XYZ",
          "payePays": "GW",
          "dateDemande": "2023-02-21T15:30:01.250Z",
          "dateConfirmation": "2023-02-21T15:30:01.250Z",
          "end2endId": "ESNB00120230221153554KXvozkpNvhUk9e"
        }
      },
      "PaiementImmediatReponseCasAvecConfirmation": {
        "summary": "Paiement initiée - confirmation attendue",
        "value": {
          "txId": "23552722",
          "payeurAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "montant": 150000,
          "statut": "INITIE",
          "confirmation": true,
          "payeNom": "Nom du client payé",
          "payePays": "BF",
          "end2endId": "ESNB00120230221153554KXvozkpNvhUk9e",
          "dateDemande": "2023-02-21T15:35:54.250Z"
        }
      },
      "PaiementImmediatRejeteDU03": {
        "summary": "Paiement rejeté - txId dupliqué",
        "description": "La recherche d'alias a réussi mais le txId est dupliqué, donc payeNom et payePays sont présents",
        "value": {
          "txId": "PAY-2025-001",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "payeurAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
          "montant": 50000,
          "motif": "Paiement facture",
          "statut": "REJETE",
          "statutRaison": "DU03",
          "payeNom": "Jean Dupont",
          "payePays": "SN",
          "end2endId": "ESNB00120250117100000TXIDDUP001",
          "dateDemande": "2025-01-17T10:00:00.000Z",
          "dateReponse": "2025-01-17T10:00:01.000Z"
        }
      },
      "PaiementImmediatRejeteBE23": {
        "summary": "Paiement rejeté - Alias bénéficiaire invalide",
        "description": "La recherche d'alias a échoué, donc payeNom et payePays sont absents",
        "value": {
          "txId": "PAY-2025-002",
          "payeAlias": "ALIAS-INVALIDE-123",
          "payeurAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
          "montant": 75000,
          "motif": "Paiement fournisseur",
          "statut": "REJETE",
          "statutRaison": "BE23",
          "end2endId": "ESNB00120250117100500ALIASINV002",
          "dateDemande": "2025-01-17T10:05:00.000Z",
          "dateReponse": "2025-01-17T10:05:01.000Z"
        }
      },
      "PaiementImmediatRefuseMontantInvalide": {
        "summary": "Paiement immédiat refusé - montant invalide",
        "value": {
          "type": "about:blank",
          "title": "Bad Request",
          "status": 403,
          "detail": "Plafond de paiement dépassé",
          "invalid-params": [
            {
              "name": "montant",
              "reason": "Le montant dépasse le montant maximal autorisé"
            }
          ]
        }
      },
      "PaiementImmediatConfirmationRequeteCasConfirmationOui": {
        "summary": "Confirmation du paiement - effectuer l'envoi",
        "value": {
          "decision": true
        }
      },
      "PaiementImmediatConfirmationRequeteCasConfirmationNon": {
        "summary": "Confirmation du paiement - annuler l'envoi",
        "value": {
          "decision": false
        }
      },
      "PaiementImmediatConfirmationReponseCasOui": {
        "summary": "Confirmation du paiement - Confirmé",
        "value": {
          "txId": "23552722",
          "payeurAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "montant": 150000,
          "confirmation": true,
          "statut": "ENVOYE",
          "dateAcceptation": "2023-02-21T15:30:01.250Z",
          "dateConfirmation": "2023-02-21T15:30:05.250Z",
          "dateEnvoie": "2023-02-21T15:30:05.750Z",
          "end2endId": "ESNB00120230221153554KXvozkpNvhUk9e",
          "payeNom": "Entreprise XYZ",
          "payePays": "GW"
        }
      },
      "PaiementImmediatConfirmationReponseCasNon": {
        "summary": "Confirmation du paiement - Annulé",
        "value": {
          "txId": "23552722",
          "payeurAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "montant": 150000,
          "confirmation": true,
          "statut": "ANNULE",
          "dateAcceptation": "2023-02-21T15:30:01.250Z",
          "dateConfirmation": "2023-02-21T15:30:05.250Z",
          "payeNom": "Entreprise XYZ",
          "payePays": "GW"
        }
      },
      "PaiementEnvoye": {
        "summary": "Paiement envoyé",
        "description": "Cet exemple montre un paiement envoyé par le client business.\n",
        "value": {
          "txId": "b755485465e4d5ddsqddqde",
          "categorie": "733",
          "payeurCompte": "1234567890",
          "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
          "confirmation": true,
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "payeNom": "DIOP Mamadou",
          "payePays": "SN",
          "montant": 15000,
          "statut": "REJETE",
          "statutRaison": "AG11",
          "end2endId": "ESNB00120230221103000KXvozkpNvhUk9f",
          "dateDemande": "2023-02-21T10:30:00.000Z",
          "dateConfirmation": "2023-02-21T10:30:20.000Z",
          "dateEnvoi": "2023-02-21T10:30:20.100Z",
          "dateReponse": "2023-02-21T10:30:20.900Z"
        }
      },
      "PaiementListeRecus": {
        "summary": "Liste  de paiements reçus",
        "description": "Cet exemple montre une liste de paiements reçus par le client business.\nLe business a filtré avec les champs `payeAlias` en mettant l'alias de son compte.\n",
        "value": {
          "data": [
            {
              "txId": "a755485465e4d5ddsqddqde",
              "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "payeCompte": "1234567890",
              "categorie": "401",
              "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa91",
              "payeurNom": "MBodji Alioune",
              "payeurPays": "SN",
              "programme": true,
              "montant": 15000,
              "statut": "IRREVOCABLE",
              "end2endId": "ESNB00120230221103000KXvozkpNvhUk9e",
              "dateIrrevocabilite": "2023-02-21T10:30:01.000Z",
              "motif": "Paiement d'un abonnement"
            },
            {
              "txId": "a7d96dfdsdf965dfdsdf",
              "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "payeCompte": "1234567890",
              "categorie": "400",
              "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
              "payeurNom": "DIOP Khady",
              "payeurPays": "SN",
              "montant": 20000,
              "statut": "IRREVOCABLE",
              "end2endId": "ESNB00120230221103000KXvozkpNvhUk9e",
              "dateIrrevocabilite": "2023-02-21T10:30:01.000Z",
              "motif": "Paiement par QR Code Dynamique"
            },
            {
              "txId": "Caisse-1",
              "payeAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "payeCompte": "1234567890",
              "categorie": "000",
              "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
              "payeurNom": "DIOP Khady",
              "payeurPays": "SN",
              "montant": 20000,
              "statut": "IRREVOCABLE",
              "end2endId": "ESNB00120230221103000KXvozkpNvhUk9e",
              "dateIrrevocabilite": "2023-02-21T10:30:01.000Z",
              "motif": "Paiement par QR Code Statique"
            },
            {
              "txId": "Tag-a7d96dfdsdf965dfdsdf",
              "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "payeCompte": "1234567890",
              "categorie": "500",
              "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
              "payeurNom": "DIOP Khady",
              "payeurPays": "SN",
              "montant": 20000,
              "statut": "IRREVOCABLE",
              "end2endId": "ESNB00120230221103000KXvozkpNvhUk9e",
              "dateIrrevocabilite": "2023-02-21T10:30:01.000Z",
              "motif": "Demande de paiement sur site acceptée"
            }
          ],
          "meta": {
            "size": 4,
            "total": 4
          }
        }
      },
      "PaiementRecu": {
        "summary": "Paiement reçu",
        "description": "Cet exemple montre un paiement reçu par le client business.\n",
        "value": {
          "txId": "Tag-a7d96dfdsdf965dfdsdf",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "payeCompte": "1234567890",
          "categorie": "500",
          "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
          "payeurNom": "DIOP Khady",
          "payeurPays": "SN",
          "montant": 20000,
          "statut": "IRREVOCABLE",
          "end2endId": "ESNB00120230221103000KXvozkpNvhUk9e",
          "dateIrrevocabilite": "2023-02-21T10:30:01.000Z",
          "motif": "Demande de paiement sur site acceptée"
        }
      },
      "PaiementRetourReponseRejete": {
        "summary": "Retour de fonds rejeté",
        "value": {
          "txId": "Tag-a7d96dfdsdf965dfdsdf",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "payeCompte": "1234567890",
          "categorie": "500",
          "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
          "payeurNom": "DIOP Khady",
          "payeurPays": "SN",
          "montant": 200000,
          "statut": "IRREVOCABLE",
          "end2endId": "ESNB00120230221103000KXvozkpNvhUk9e",
          "dateIrrevocabilite": "2023-02-21T10:30:01.000Z",
          "motif": "Demande de paiement sur site acceptée",
          "retourStatut": "REJETE",
          "retourStatutRaison": "AG10",
          "retourDateDemande": "2023-02-21T11:10:20.125Z",
          "retourDateReponse": "2023-02-21T11:10:22.326Z"
        }
      },
      "PaiementRejete": {
        "summary": "Paiement rejeté",
        "description": "Cet exemple montre un paiement rejeté\n",
        "value": {
          "txId": "Tag-a7d96dfdsdf965dfdsdf",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "payeCompte": "1234567890",
          "categorie": "500",
          "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
          "payeurNom": "DIOP Khady",
          "payeurPays": "SN",
          "montant": 20000,
          "statut": "REJETE",
          "statutRaison": "AM04",
          "end2endId": "ESNB00120230221103000KXvozkpNvhUk9e"
        }
      },
      "PaiementEnMasseListe": {
        "summary": "Liste des paiements en masse",
        "value": {
          "data": [
            {
              "instructionId": "SALAIRES-2025-01-1",
              "statut": "CONFIRME",
              "dateDemande": "2023-12-15T08:00:00.000Z"
            },
            {
              "instructionId": "FOURNISSEURS-2025-01",
              "statut": "INITIE",
              "dateDemande": "2023-12-16T09:15:00.000Z"
            },
            {
              "instructionId": "PRIMES-2025-01",
              "statut": "ANNULE",
              "dateDemande": "2023-12-17T11:30:00.000Z"
            }
          ],
          "meta": {
            "total": 3
          }
        }
      },
      "PaiementEnMasseRequeteSalaires": {
        "summary": "Paiement en masse de salaires (avec confirmation)",
        "value": {
          "instructionId": "SALAIRES-2025-01-1",
          "payeurAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
          "confirmation": true,
          "motif": "Salaire de janvier 2025",
          "transactions": [
            {
              "txId": "SAL-202501-C06946-1",
              "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "montant": 1500000
            },
            {
              "txId": "SAL-202501-C06947-2",
              "payeAlias": "s03b2499-3e50-635b-b757-ac7a83d8aa8c",
              "montant": 1000000
            },
            {
              "txId": "SAL-202501-C06948-3",
              "payeAlias": "s03b2499-3e50-535b-b757-ac7a83d8aa8c",
              "montant": 2000000
            },
            {
              "txId": "SAL-202501-C06949-4",
              "payeAlias": "s03b2499-3e50-735b-b757-ac7a83d8aa8c",
              "montant": 1000000
            },
            {
              "txId": "SAL-202501-P06950-5",
              "payeAlias": "s03b2499-3e50-835b-b757-ac7a83d8aa8c",
              "montant": 900000
            },
            {
              "txId": "SAL-202501-C06951-6",
              "payeAlias": "s03b2499-3e50-935b-b757-ac7a83d8aa8c",
              "montant": 1200000
            },
            {
              "txId": "SAL-202501-C06952-7",
              "payeAlias": "s03b2499-3e50-1035b-b757-ac7a83d8aa8c",
              "montant": 1400000
            }
          ]
        }
      },
      "PaiementEnMasseRequeteFournisseurs": {
        "summary": "Paiement en masse de fournisseurs (sans confirmation)",
        "value": {
          "instructionId": "FOURNISSEURS-2025-01-1",
          "payeurAlias": "8b1b2499-3e50-435b-b757-ac7a83d8aa7f",
          "confirmation": false,
          "transactions": [
            {
              "txId": "FOURN-202501-C06946-1",
              "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
              "montant": 1500000,
              "refDocNumero": "FAC-FOURNISSEUR-1-2025-001",
              "refDocType": "CINV"
            },
            {
              "txId": "FOURN-202501-C06947-2",
              "payeAlias": "s03b2499-3e50-635b-b757-ac7a83d8aa8c",
              "montant": 1000000,
              "refDocNumero": "FAC-FOURNISSEUR-2-2025-002",
              "refDocType": "CINV"
            },
            {
              "txId": "FOURN-202501-C06948-3",
              "payeAlias": "s03b2499-3e50-535b-b757-ac7a83d8aa8c",
              "montant": 2000000,
              "refDocNumero": "FAC-FOURNISSEUR-3-2025-003",
              "refDocType": "CINV"
            },
            {
              "txId": "FOURN-202501-C06949-4",
              "payeAlias": "s03b2499-3e50-735b-b757-ac7a83d8aa8c",
              "montant": 1000000,
              "refDocNumero": "FAC-FOURNISSEUR-4-2025-004",
              "refDocType": "CINV"
            },
            {
              "txId": "FOURN-202501-P06950-5",
              "payeAlias": "s03b2499-3e50-835b-b757-ac7a83d8aa8c",
              "montant": 900000,
              "motif": "Paiement de XXXXXX"
            },
            {
              "txId": "FOURN-202501-C06951-6",
              "payeAlias": "s03b2499-3e50-935b-b757-ac7a83d8aa8c",
              "montant": 1200000
            },
            {
              "txId": "FOURN-202501-C06952-7",
              "payeAlias": "s03b2499-3e50-1035b-b757-ac7a83d8aa8c",
              "montant": 1400000
            }
          ]
        }
      },
      "PaiementEnMasseReponseStatutInitie": {
        "summary": "Paiement en masse en attente de confirmation",
        "value": {
          "instructionId": "SALAIRES-2025-01",
          "statut": "INITIE",
          "dateDemande": "2024-10-17T10:00:00.000Z",
          "dateExpiration": "2024-10-18T10:00:00.000Z",
          "transactionsTotal": 500,
          "transactionsInitiees": 498,
          "transactionsEnvoyees": 0,
          "transactionsIrrevocables": 0,
          "transactionsRejetees": 2
        }
      },
      "PaiementEnMasseReponseStatut": {
        "summary": "Paiement en masse confirmé (en cours de traitement)",
        "value": {
          "instructionId": "123-5678292",
          "statut": "CONFIRME",
          "dateDemande": "2023-12-15T12:00:00.000Z",
          "dateConfirmation": "2023-12-15T12:05:00.000Z",
          "transactionsTotal": 18,
          "transactionsInitiees": 2,
          "transactionsEnvoyees": 10,
          "transactionsIrrevocables": 5,
          "transactionsRejetees": 1
        }
      },
      "PaiementEnMasseReponseStatutAnnule": {
        "summary": "Paiement en masse annulé par le business",
        "value": {
          "instructionId": "SALAIRES-2025-01",
          "statut": "ANNULE",
          "dateDemande": "2024-10-17T10:00:00.000Z",
          "dateAnnulation": "2024-10-17T10:05:00.000Z",
          "transactionsTotal": 500,
          "transactionsInitiees": 498,
          "transactionsEnvoyees": 0,
          "transactionsIrrevocables": 0,
          "transactionsRejetees": 2
        }
      },
      "PaiementEnMasseConfirmationRequeteCasOui": {
        "summary": "Confirmation du paiement en masse",
        "value": {
          "decision": true
        }
      },
      "PaiementEnMasseConfirmationRequeteCasNon": {
        "summary": "Annulation du paiement en masse",
        "value": {
          "decision": false
        }
      },
      "PaiementEnMasseConfirmationReponseCasOui": {
        "summary": "Paiement en masse confirmé",
        "value": {
          "instructionId": "123-5678292",
          "statut": "CONFIRME",
          "dateDemande": "2024-10-17T10:00:00.000Z",
          "dateConfirmation": "2024-10-17T10:05:00.000Z",
          "transactionsTotal": 7,
          "transactionsInitiees": 0,
          "transactionsEnvoyees": 7,
          "transactionsIrrevocables": 0,
          "transactionsRejetees": 0
        }
      },
      "PaiementEnMasseConfirmationReponseCasNon": {
        "summary": "Paiement en masse annulé",
        "value": {
          "instructionId": "123-5678292",
          "statut": "ANNULE",
          "dateDemande": "2024-10-17T10:00:00.000Z",
          "dateAnnulation": "2024-10-17T10:05:00.000Z",
          "transactionsTotal": 7,
          "transactionsInitiees": 5,
          "transactionsEnvoyees": 0,
          "transactionsIrrevocables": 0,
          "transactionsRejetees": 2
        }
      },
      "PaiementRetourReponseInitie": {
        "summary": "Retour de fonds en cours d'envoi",
        "value": {
          "txId": "Tag-a7d96dfdsdf965dfdsdf",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "payeCompte": "1234567890",
          "categorie": "500",
          "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
          "payeurNom": "DIOP Khady",
          "payeurPays": "SN",
          "montant": 200000,
          "statut": "IRREVOCABLE",
          "end2endId": "ESNB00120230221103000KXvozkpNvhUk9e",
          "dateIrrevocabilite": "2023-02-21T10:30:01.000Z",
          "motif": "Demande de paiement sur site acceptée",
          "retourStatut": "INITIE",
          "retourDateDemande": "2021-01-01T00:00:00.000Z"
        }
      },
      "PaiementRetourReponseIrrevocable": {
        "summary": "Retour de fonds irrévocable - déjà envoyé",
        "value": {
          "txId": "Tag-a7d96dfdsdf965dfdsdf",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "payeCompte": "1234567890",
          "categorie": "500",
          "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
          "payeurNom": "DIOP Khady",
          "payeurPays": "SN",
          "montant": 200000,
          "statut": "IRREVOCABLE",
          "end2endId": "ESNB00120230221103000KXvozkpNvhUk9e",
          "dateIrrevocabilite": "2023-02-21T10:30:01.000Z",
          "motif": "Demande de paiement sur site acceptée",
          "retourStatut": "IRREVOCABLE",
          "retourDateIrrevocabilite": "2023-02-21T11:10:21.632Z",
          "retourDateDemande": "2023-02-21T11:10:20.125Z"
        }
      },
      "PaiementAnnulationRequest": {
        "summary": "Annulation de paiement pour erreur sur le destinataire",
        "value": {
          "raison": "AC03"
        }
      },
      "PaiementAnnulationReponseEnvoye": {
        "summary": "Demande d'annulation envoyée",
        "value": {
          "txId": "Tag-a7d96dfdsdf965dfdsdf",
          "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
          "payeurCompte": "1234567890",
          "categorie": "401",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "payeNom": "Fournisseur Az 582f",
          "payePays": "SN",
          "montant": 2000000,
          "confirmation": false,
          "dateDemande": "2023-02-21T10:30:00.050Z",
          "dateConfirmation": "2023-02-21T10:30:00.050Z",
          "dateEnvoi": "2023-02-21T10:30:00.100Z",
          "statut": "IRREVOCABLE",
          "end2endId": "ESNB00120230221103000KXvozkpNvhUk9e",
          "dateIrrevocabilite": "2023-02-21T10:30:01.000Z",
          "motif": "Demande de paiement sur site acceptée",
          "annulationStatut": "ENVOYE",
          "annulationMotif": "AC03",
          "annulationDateDemande": "2023-02-22T15:30:01.000Z"
        }
      },
      "PaiementAnnulationReponseRequestAccepter": {
        "summary": "Accepter une demande d'annulation",
        "description": "Le business accepte la demande d'annulation et s'engage à effectuer un retour de fonds",
        "value": {
          "decision": true
        }
      },
      "PaiementAnnulationReponseRequestRejeter": {
        "summary": "Refuser une demande d'annulation",
        "description": "Le business refuse la demande d'annulation",
        "value": {
          "decision": false
        }
      },
      "PaiementAnnulationReponseReponseAcceptee": {
        "summary": "Demande d'annulation acceptée - Retour de fonds initié",
        "description": "Le business a accepté la demande d'annulation.\n\nL'objet Paiement retourné contient :\n- Les champs `annulationStatut` et `annulationDateReponse` mis à jour\n- Les champs `retour*` renseignés car un retour de fonds a été automatiquement initié\n",
        "value": {
          "txId": "Tag-a7d96dfdsdf965dfdsdf",
          "payeurAlias": "9b1b3499-3e50-435b-b757-ac7a83d8aa96",
          "payeurNom": "Jean Dupont",
          "payeurPays": "SN",
          "payeurCompte": "1234567890",
          "payeAlias": "9b1b2499-3e50-435b-b757-ac7a83d8aa8c",
          "payeNom": "Fournisseur Az 582f",
          "payePays": "SN",
          "payeCompte": "0987654321",
          "categorie": "733",
          "montant": 2000000,
          "confirmation": false,
          "dateConfirmation": "2024-01-10T10:30:00.050Z",
          "statut": "IRREVOCABLE",
          "end2endId": "ESNB00120240110103000KXvozkpNvhUk9e",
          "dateIrrevocabilite": "2024-01-10T10:30:01.000Z",
          "motif": "Paiement pour service",
          "annulationStatut": "ACCEPTE",
          "annulationMotif": "SVNR",
          "annulationDateDemande": "2024-01-12T15:30:01.000Z",
          "annulationDateReponse": "2024-01-15T10:30:00.000Z",
          "retourStatut": "ENVOYE",
          "retourDateDemande": "2024-01-15T10:30:00.000Z"
        }
      },
      "PaiementAnnulationReponseReponseRefusee": {
        "summary": "Demande d'annulation refusée - Pas de retour de fonds",
        "description": "Le business a refusé la demande d'annulation.\n\nL'objet Paiement retourné contient :\n- Les champs `annulationStatut` et `annulationDateReponse` mis à jour pour indiquer le rejet\n- Les champs `retour*` ne sont PAS renseignés car aucun retour de fonds n'est effectué\n",
        "value": {
          "txId": "Tag-b8e07egdtge076egdtge",
          "payeurAlias": "8c2c4588-4f61-546c-c868-bd8b94e9bb07",
          "payeurNom": "Marie Martin",
          "payeurPays": "CI",
          "payeAlias": "7a0a1377-2d40-324a-a646-9b6a72c7aa7b",
          "payeNom": "Boutique Commerce 123",
          "payePays": "CI",
          "payeCompte": "4321098765",
          "categorie": "500",
          "montant": 1500000,
          "confirmation": false,
          "dateConfirmation": "2024-01-08T14:20:00.050Z",
          "statut": "IRREVOCABLE",
          "end2endId": "ESNB00120240108142000LYwpalpOwjVl0f",
          "dateIrrevocabilite": "2024-01-08T14:20:01.000Z",
          "motif": "Achat de marchandises",
          "annulationStatut": "REJETE",
          "annulationMotif": "SVNR",
          "annulationDateDemande": "2024-01-11T09:15:01.000Z",
          "annulationDateReponse": "2024-01-11T10:10:01.000Z"
        }
      }
    },
    "responses": {
      "AutorisationsManquantes": {
        "description": "Autorisations manquantes",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem7807"
            },
            "examples": {
              "exemple": {
                "$ref": "#/components/examples/Problem7807ExempleUnauthorizedJSON"
              }
            }
          }
        }
      },
      "LimiteUtilisationDepasse": {
        "description": "Erreur inattendue",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem7807"
            },
            "examples": {
              "exemple": {
                "$ref": "#/components/examples/Problem7807Exemple429JSON"
              }
            }
          }
        }
      },
      "ProblemeServeur": {
        "description": "Erreur inattendue du serveur",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem7807"
            },
            "examples": {
              "exemple": {
                "$ref": "#/components/examples/Problem7807ExempleInternalServerErrorJSON"
              }
            }
          }
        }
      },
      "RessourceInexistant": {
        "description": "La ressource n'existe pas dans le système",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem7807"
            },
            "examples": {
              "exemple": {
                "$ref": "#/components/examples/Problem7807ExempleNotFoundJSON"
              }
            }
          }
        }
      },
      "FormatInvalide": {
        "description": "La requête est malformée",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem7807"
            },
            "examples": {
              "exemple": {
                "$ref": "#/components/examples/Problem7807ExempleBadRequestJSON"
              }
            }
          }
        }
      },
      "DejaExistant": {
        "description": "La ressource existe déjà",
        "content": {
          "application/problem+json": {
            "schema": {
              "$ref": "#/components/schemas/Problem7807"
            },
            "examples": {
              "exemple": {
                "summary": "Ressource déjà existante",
                "value": {
                  "type": "about:blank",
                  "title": "Conflict",
                  "status": 409,
                  "detail": "La ressource existe déjà."
                }
              }
            }
          }
        }
      }
    },
    "parameters": {
      "Champs": {
        "in": "query",
        "name": "fields",
        "required": false,
        "schema": {
          "type": "string",
          "title": "Champs des données à retourner",
          "description": "la liste des champs à retourner pour ne consulter que des informations spécifiques",
          "example": "txId,statut,dateEnvoi"
        }
      },
      "Page": {
        "in": "query",
        "name": "page",
        "required": false,
        "schema": {
          "title": "Page demandée",
          "type": "string",
          "description": "Page à retourner par la requête. S'il n'est pas renseigné, le PSP renverra la valeur par défaut.\nLe type string permet de supporter aussi bien les valeurs numériques (\"1\", \"2\") que d'autres formats de pagination (curseurs, tokens)."
        }
      },
      "ItemsParPage": {
        "in": "query",
        "name": "pagination.limit",
        "required": false,
        "schema": {
          "type": "integer",
          "format": "int32",
          "title": "Nombre d'élements maximum à retourner",
          "minimum": 1,
          "maximum": 1000,
          "default": 100,
          "description": "Nombre maximum d'enregistrements renvoyés sur chaque page."
        }
      },
      "SortBy": {
        "in": "query",
        "name": "sort_by",
        "required": false,
        "schema": {
          "title": "Clé de tri et ordre de tri",
          "description": "Clé de tri des données  Si la clé de tri commence par `-` , on trie par ordre décroissant sinon par ordre croissant",
          "example": "-dateDebut"
        }
      }
    }
  }
}
