{
  "openapi": "3.0.3",
  "info": {
    "title": "PI SPI - Application mobile - OpenAPI 3.0 (1.0.0)",
    "description": "## Exigences minimales de l'interface utilisateur\n\n### Généralités\nAPI du backend de l'application Mobile du projet d'interopérabilité des services financiers numériques.\n\n### Contexte et Objectifs\nConformément au cadre réglementaire de l'interopérabilité dans l'espace UEMOA, chaque institution financière participante doit mettre à disposition de sa clientèle (Particuliers de type P et Commerçants de type C selon PI-RAC) une application mobile conforme aux standards définis par la BCEAO.\n\nCette API standardisée permet l'intégration avec l'application mobile de référence fournie par la BCEAO.\n\n### Options d'Implémentation\nLes participants ont le choix entre :\n\n- Utilisation de l'application mobile — Personnalisation via thèmes (couleurs, logos) tout en conservant l'expérience utilisateur\n- Intégration modulaire — Réutilisation des composants (widgets) dans leurs applications existantes\n\n### Fonctionnalités\n\n- Gestion des alias de comptes\n- QR Code Interopérable\n- Transfert de fonds\n- Demande d'annulation d'un transfert émis\n- Retour de fonds d'un transfert reçu\n- Demandes de paiement\n- Gestion des abonnements\n\n## Gestion des erreurs\n\n### Format standard des erreurs\nL'API utilise le format défini par la RFC 7807 pour les réponses d'erreur, afin de communiquer les informations d'erreur de façon uniforme. Une réponse d'erreur comprend les champs suivants :\n\n- **type** — Une URI qui identifie la catégorie du problème (peut être relative).\n- **title** — Une explication courte et compréhensible du problème, identique pour un même type de problème.\n- **detail** — Une explication spécifique du problème rencontré.\n- **instance** — Référence l'URI de la ressource concernée par le problème (optionnel).\n- **status** — Le code de statut HTTP à l'origine de cette réponse (optionnel).\n\nVoir le schéma `Problem`.\n\n### Extensions\nDes champs additionnels (extensions) peuvent être ajoutés pour préciser le problème. Dans cette API, `invalidParams` (voir `Problem403`) et `object` (voir `Problem403Alias`) en sont deux exemples.\n\n### Exemple de réponse d'erreur\nUne erreur `403` retournée lors d'un transfert, faute de solde suffisant :\n\n```json\n{\n  \"type\": \"solde-insuffisant\",\n  \"title\": \"Interdit\",\n  \"status\": 403,\n  \"detail\": \"Solde insuffisant pour effectuer cette opération\",\n  \"invalidParams\": {\n    \"name\": \"solde\"\n  }\n}\n```\n\n### Types de problème prédéfinis\nLes URI de type de problème devraient idéalement pointer vers une documentation expliquant comment résoudre le problème. Un type prédéfini existe néanmoins : `about:blank`, qui signale que le problème n'a pas d'autre sémantique que celle du code de statut HTTP. Dans ce cas, le champ `title` correspond au libellé standard du code de statut HTTP.\n\n## Notifications push\n\nL'application reçoit directement le message push (Firebase) et lit son payload `data` dans `core/notifications.dart`. Le payload `data` contient toujours `type` (une des valeurs de `NotificationType`), et un\nsous-ensemble des clés suivantes selon ce type (voir le schéma `NotificationPushData`). **Ces clés sont toutes obligatoires pour le type concerné** : en omettre une expose le SDK à un crash au parsing (voir la liste `required` de chaque variante du schéma `NotificationPushData`).\n\n| type | Clés obligatoires dans `data` (en plus de `type`) |\n| --- | --- |\n| `TRANSFERT_EMIS` | montant, idObject |\n| `TRANSFERT_RECU` | montant, idObject |\n| `TRANSFERT_REJETE` | montant, idObject, notificationId |\n| `RTP_INITIEE` | clientCategorie, clientAlias, idObject, notificationId |\n| `RTP_RECUE` | clientCategorie, clientAlias, clientNom, canal, idObject, notificationId |\n| `RTP_ACCEPTEE` | idObject |\n| `RTP_REJETEE` | idObject |\n| `REVENDICATION_INITIEE` | idObject, notificationId |\n| `REVENDICATION_REJETEE` | idObject, notificationId |\n| `REVENDICATION_ACCEPTEE` | idObject, notificationId |\n| `ANNULATION_DEMANDEE` | idObject, notificationId |\n| `ANNULATION_REJETEE` | idObject, notificationId |\n| `ABONNEMENT_TERMINE` | idObject |\n| `ABONNEMENT_REJETE *` | idObject |\n| `AUTH_CONNEXION` | notificationId |\n| `AUTH_DECONNEXION *` | notificationId |\n\n`*` : non fourni explicitement par le métier, déduit par symétrie avec l'entrée équivalente -- à confirmer.\n\nToutes les valeurs sont transmises en chaîne, y compris `montant` (contrainte des fournisseurs push\ntype FCM : le payload `data` est toujours string/string), à parser côté client.\n\n### Exemples\n\nTransfert émis :\n```json\n{\n  \"type\": \"TRANSFERT_EMIS\",\n  \"montant\": \"15000\",\n  \"idObject\": \"TX-2026-000451\"\n}\n```\n\nTransfert rejeté :\n```json\n{\n  \"type\": \"TRANSFERT_REJETE\",\n  \"montant\": \"15000\",\n  \"idObject\": \"TX-2026-000451\",\n  \"notificationId\": \"NOTIF-2026-009812\"\n}\n```\n\nDemande de paiement initiée (confirmation envoyée au demandeur) :\n```json\n{\n  \"type\": \"RTP_INITIEE\",\n  \"clientCategorie\": \"P\",\n  \"clientAlias\": \"92a1027d-3260-4cd5-a1fe-16aefd05a554\",\n  \"idObject\": \"RTP-2026-002214\",\n  \"notificationId\": \"NOTIF-2026-009813\"\n}\n```\n\nDemande de paiement reçue :\n```json\n{\n  \"type\": \"RTP_RECUE\",\n  \"clientCategorie\": \"P\",\n  \"clientAlias\": \"92a1027d-3260-4cd5-a1fe-16aefd05a554\",\n  \"clientNom\": \"Mbore\",\n  \"canal\": \"500\",\n  \"idObject\": \"RTP-2026-002214\",\n  \"notificationId\": \"NOTIF-2026-009814\"\n}\n```\n\nRevendication d'alias initiée :\n```json\n{\n  \"type\": \"REVENDICATION_INITIEE\",\n  \"idObject\": \"CLAIM-2026-000119\",\n  \"notificationId\": \"NOTIF-2026-009815\"\n}\n```\n\nAbonnement terminé :\n```json\n{\n  \"type\": \"ABONNEMENT_TERMINE\",\n  \"idObject\": \"SUB-2026-000042\"\n}\n```\n\nConnexion (nouvel appareil) :\n```json\n{\n  \"type\": \"AUTH_CONNEXION\",\n  \"notificationId\": \"NOTIF-2026-009816\"\n}\n```\n",
    "contact": {
      "email": "pisfn-sandbox@bceao.int"
    },
    "version": "1.0.0",
    "x-logo": {
      "url": "https://developers.pi-bceao.com/assets/images/logo/Logo_SPI_1.png",
      "altText": "PI-SPI"
    }
  },
  "externalDocs": {
    "description": "Plus d'informations sur PI",
    "url": "https://pi-bceao.com"
  },
  "tags": [
    {
      "name": "Alias",
      "description": "Alias de compte"
    },
    {
      "name": "Compte",
      "description": "Solde et détails d'un compte"
    },
    {
      "name": "Notifications",
      "description": "Gestion des notifications"
    },
    {
      "name": "Participants",
      "description": "La gestion des participants"
    },
    {
      "name": "Transferts",
      "description": "La gestion des transferts"
    },
    {
      "name": "Abonnements",
      "description": "La gestion des souscriptions"
    }
  ],
  "security": [
    {
      "oAuth2AuthCode": []
    }
  ],
  "servers": [
    {
      "url": "https://openid.hubitbaobab.com:8443/v1/api",
      "description": "API Mobile du participant MLD000"
    },
    {
      "url": "https://openid.hubitbaobab.com:8192/v1/api",
      "description": "API Mobile du participant SND006"
    },
    {
      "url": "https://openid.hubitbaobab.com:8193/v1/api",
      "description": "API Mobile du participant BFD003"
    }
  ],
  "paths": {
    "/alias": {
      "post": {
        "tags": [
          "Alias"
        ],
        "summary": "Créer un nouvel alias.",
        "description": "Le comportement diffère selon le type d'alias demandé. Pour le type MBNO, un code OTP est envoyé au numéro de téléphone pour valider la création (voir PUT /alias/{phone}). Pour le type SHID, l'alias est créé automatiquement, sans validation OTP.",
        "operationId": "creerAlias",
        "security": [
          {
            "oAuth2AuthCode": [
              "alias.write"
            ]
          }
        ],
        "requestBody": {
          "description": "Une demande de création d'alias contient les informations sur le type d'alias et la valeur de l'alias dans le cas du MBNO",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AliasCreationRequete"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Alias créé avec succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Alias"
                }
              }
            }
          },
          "206": {
            "description": "Un alias existe déjà pour cet utilisateur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Alias"
                }
              }
            }
          },
          "400": {
            "description": "Bad request."
          },
          "401": {
            "description": "Vous n'avez pas les autorisations."
          },
          "403": {
            "description": "Interdit. Deux cas distingués par la présence de `object` dans le corps de la réponse (`problem.object`, RFC 7807-like) :\n\n- `problem.object` renseigné : un alias existe déjà pour ce numéro/compte.\n\n- `problem.object` absent (ou `problem` lui-même absent/invalide) : la limite de création d'alias pour ce compte est atteinte.\n",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem403Alias"
                }
              }
            }
          },
          "405": {
            "description": "Données invalides"
          },
          "500": {
            "description": "Service non disponible"
          }
        }
      }
    },
    "/alias/{cle}": {
      "delete": {
        "tags": [
          "Alias"
        ],
        "summary": "Suppression d'un alias.",
        "description": "Le comportement diffère selon le type de l'alias supprimé. Si l'alias du client est de type SHID, il est entièrement supprimé. S'il est de type MBNO, seul le numéro de téléphone est supprimé, le SHID associé est conservé, l'alias du client redevient donc de type SHID et sa clé prend la valeur de ce SHID.",
        "operationId": "supprimerAlias",
        "security": [
          {
            "oAuth2AuthCode": [
              "alias.write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "cle",
            "in": "path",
            "description": "l'alias à supprimer",
            "required": true,
            "explode": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Alias supprimé avec succès"
          },
          "405": {
            "description": "Données invalides"
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      }
    },
    "/alias/{phone}": {
      "put": {
        "tags": [
          "Alias"
        ],
        "summary": "Confirmer la création d'un alias MBNO.",
        "description": "Cette API permet de confirmer la création d'un alias de type téléphone (MBNO), une fois que le code OTP envoyé au numéro a été validé.",
        "operationId": "confirmerCreationAlias",
        "security": [
          {
            "oAuth2AuthCode": [
              "alias.write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "phone",
            "in": "path",
            "description": "le clé de l'alias ici le numero de telephone",
            "required": true,
            "explode": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "description": "Une demande de création d'alias contient les informations sur le type d'alias et la valeur de l'alias si nécessaire.",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AliasConfirmationRequete"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Alias créé avec succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AliasMBNOConfirmee"
                }
              }
            }
          },
          "206": {
            "description": "Un alias existe déjà pour cet utilisateur",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Alias"
                }
              }
            }
          },
          "400": {
            "description": "Bad request. Le code OTP est invalide."
          },
          "401": {
            "description": "Vous n'avez pas les autorisations."
          },
          "403": {
            "description": "Interdit. Ce numéro de téléphone est déjà utilisé comme alias par quelqu'un d'autre.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Problem"
                }
              }
            }
          },
          "405": {
            "description": "Données invalides"
          },
          "500": {
            "description": "Service non disponible"
          }
        }
      }
    },
    "/alias/{id}": {
      "get": {
        "tags": [
          "Alias"
        ],
        "summary": "Récuperer l'alias d'un compte.",
        "description": "Cette API permet de récupérer l'alias d'un compte du client.",
        "operationId": "recupererAliasParId",
        "security": [
          {
            "oAuth2AuthCode": [
              "alias.read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "Le numéro du compte.",
            "required": true,
            "explode": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Opération réussie",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AliasFetchResponse"
                }
              }
            }
          },
          "400": {
            "description": "Alias introuvable"
          },
          "401": {
            "description": "Vous n'avez pas les autorisations."
          },
          "404": {
            "description": "L'utilisateur n'a pas d'alias"
          }
        }
      }
    },
    "/alias/revendications": {
      "post": {
        "tags": [
          "Alias"
        ],
        "summary": "Initier une demande de revendication d'alias.",
        "operationId": "initierRevendicationsAlias",
        "security": [
          {
            "oAuth2AuthCode": [
              "alias.write"
            ]
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AliasRevendicationRequete"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Alias revendication envoyée avec succès"
          },
          "400": {
            "description": "Bad request."
          },
          "401": {
            "description": "Vous n'avez pas les autorisations."
          },
          "403": {
            "description": "Une revendication est déjà en cours pour cet alias."
          },
          "404": {
            "description": "L'alias n'existe pas (ou plus) dans PI."
          },
          "405": {
            "description": "Données invalides"
          },
          "500": {
            "description": "Service non disponible"
          }
        }
      }
    },
    "/alias/revendications/{id}/reponses": {
      "put": {
        "tags": [
          "Alias"
        ],
        "summary": "Repondre à une demande de revendication d'alias.",
        "operationId": "reponseRevendicationsAlias",
        "security": [
          {
            "oAuth2AuthCode": [
              "alias.write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "ID de la revendication.",
            "required": true,
            "explode": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AliasRevendicationReponse"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Reponse succès",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/AliasRevendicationOtpEnvoye"
                    },
                    {
                      "$ref": "#/components/schemas/AliasRevendicationAcceptee"
                    }
                  ]
                }
              }
            }
          },
          "401": {
            "description": "Vous n'avez pas les autorisations."
          },
          "403": {
            "description": "La revendication est déjà terminée ou clôturée."
          },
          "405": {
            "description": "Données invalides"
          },
          "500": {
            "description": "Service non disponible"
          }
        }
      }
    },
    "/alias/revendications/{id}/rejets": {
      "put": {
        "tags": [
          "Alias"
        ],
        "summary": "Confirmer le rejet d'une demande de revendication d'alias.",
        "operationId": "rejetRevendicationsAlias",
        "security": [
          {
            "oAuth2AuthCode": [
              "alias.write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "ID de la revendication.",
            "required": true,
            "explode": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AliasRevendicationRejet"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Reponse succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AliasRevendicationRejetee"
                }
              }
            }
          },
          "400": {
            "description": "Code OTP invalide."
          },
          "401": {
            "description": "Vous n'avez pas les autorisations."
          },
          "403": {
            "description": "La revendication est déjà terminée ou clôturée."
          },
          "405": {
            "description": "Données invalides"
          },
          "500": {
            "description": "Service non disponible"
          }
        },
        "description": "Cette API permet de confirmer le rejet d'une demande de revendication d'alias."
      }
    },
    "/alias/revendications/{id}": {
      "get": {
        "tags": [
          "Alias"
        ],
        "summary": "Recuperer une demande de revendication d'alias.",
        "operationId": "recupererRevendicationsAlias",
        "security": [
          {
            "oAuth2AuthCode": [
              "alias.read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "ID de la revendication.",
            "required": true,
            "explode": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Reponse succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AliasRevendication"
                }
              }
            }
          },
          "400": {
            "description": "Bad request."
          },
          "401": {
            "description": "Vous n'avez pas les autorisations."
          },
          "405": {
            "description": "Données invalides"
          },
          "500": {
            "description": "Service non disponible"
          }
        }
      }
    },
    "/comptes/{compteId}/soldes": {
      "get": {
        "summary": "Recuperer le solde d'un compte",
        "description": "",
        "operationId": "consulterSolde",
        "security": [
          {
            "oAuth2AuthCode": [
              "compte.solde.read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "compteId",
            "in": "path",
            "description": "ID du compte du client.",
            "required": true,
            "explode": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "tags": [
          "Compte"
        ],
        "responses": {
          "200": {
            "description": "Opération réussie",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompteSoldeReponse"
                }
              }
            }
          },
          "401": {
            "description": "Mauvais format"
          },
          "403": {
            "description": "Interdit"
          },
          "404": {
            "description": "Compte inconnu"
          },
          "500": {
            "description": "Service non disponible"
          }
        }
      }
    },
    "/comptes/{compteId}/details": {
      "get": {
        "summary": "Détails d'un compte",
        "description": "",
        "operationId": "consulterDetails",
        "security": [
          {
            "oAuth2AuthCode": [
              "compte.details.read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "compteId",
            "in": "path",
            "description": "ID du compte du client.",
            "required": true,
            "explode": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "tags": [
          "Compte"
        ],
        "responses": {
          "200": {
            "description": "Opération réussie",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/CompteDetailsReponse"
                }
              }
            }
          },
          "401": {
            "description": "Mauvais format"
          },
          "403": {
            "description": "Interdit"
          },
          "404": {
            "description": "Compte inconnu"
          },
          "500": {
            "description": "Service non disponible"
          }
        }
      }
    },
    "/participants": {
      "get": {
        "tags": [
          "Participants"
        ],
        "summary": "La liste des participants.",
        "description": "Cette API retourne la liste des participants dans PI.",
        "operationId": "listeParticipant",
        "security": [
          {
            "oAuth2AuthCode": [
              "participant.read"
            ]
          }
        ],
        "responses": {
          "200": {
            "description": "Transactions récupérées.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ParticipantListeResponse"
                }
              }
            }
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      }
    },
    "/notifications/{compteId}/non-lues": {
      "get": {
        "tags": [
          "Notifications"
        ],
        "summary": "Compter le nombre de notification non luees",
        "description": "Compter le nombre de notification non luees",
        "operationId": "compterNotification",
        "security": [
          {
            "oAuth2AuthCode": [
              "notification.read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "compteId",
            "in": "path",
            "description": "ID du compte du client.",
            "required": true,
            "explode": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Notifications non luees recuperées avec succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotificationCompteResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request."
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      }
    },
    "/notifications/{compteId}": {
      "get": {
        "tags": [
          "Notifications"
        ],
        "summary": "La liste des notifications",
        "description": "La liste des notifications",
        "operationId": "listerNotification",
        "security": [
          {
            "oAuth2AuthCode": [
              "notification.read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "compteId",
            "in": "path",
            "description": "ID du compte du client.",
            "required": true,
            "explode": true,
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "page",
            "in": "query",
            "description": "Curseur/numéro de page.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "Nombre de résultats par page.",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "sortBy",
            "in": "query",
            "description": "Champ de tri des résultats.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "fields",
            "in": "query",
            "description": "Liste de champs à inclure dans la réponse (projection).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "keyword",
            "in": "query",
            "description": "Recherche texte libre.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "option",
            "in": "query",
            "description": "Filtre prédéfini.",
            "schema": {
              "$ref": "#/components/schemas/NotificationSearchFilterOption"
            }
          },
          {
            "name": "type",
            "in": "query",
            "description": "Filtre par type de notification.",
            "schema": {
              "$ref": "#/components/schemas/NotificationType"
            }
          },
          {
            "name": "dateDebut",
            "in": "query",
            "description": "Date de début (ISO 8601 UTC, précision milliseconde).",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "dateFin",
            "in": "query",
            "description": "Date de fin (ISO 8601 UTC, précision milliseconde).",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Notification liste recupérée avec succès",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotificationListResponse"
                }
              }
            }
          },
          "400": {
            "description": "Bad request."
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      }
    },
    "/notifications/{id}": {
      "put": {
        "tags": [
          "Notifications"
        ],
        "summary": "Modifier une notification",
        "description": "Modifier une notification",
        "operationId": "modifierNotification",
        "security": [
          {
            "oAuth2AuthCode": [
              "notification.write"
            ]
          }
        ],
        "requestBody": {
          "required": true,
          "description": "Data",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NotificationModificationRequest"
              }
            }
          }
        },
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "ID de la notification.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Notification modifiée avec succès",
            "content": {
              "application/json": {
                "schema": {
                  "type": "object"
                }
              }
            }
          },
          "400": {
            "description": "Bad request."
          },
          "404": {
            "description": "Not found."
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      }
    },
    "/transferts": {
      "get": {
        "tags": [
          "Transferts"
        ],
        "summary": "La liste des transactions.",
        "description": "Cette API retourne la liste des transactions validées par le client. Ne retourne que des transactions au statut \"irrevocable\" -- une transaction encore initiee/rejetee n'apparait pas dans cette liste. Selon l'historique de chaque transaction, les champs annulation*/retour* sont présents ou non (voir leurs descriptions respectives sur le schéma Transaction).",
        "operationId": "listerTransfert",
        "security": [
          {
            "oAuth2AuthCode": [
              "transfert.read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "compte",
            "in": "query",
            "description": "Numero de compte.",
            "required": true,
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "page",
            "in": "query",
            "description": "Le numéro de la page",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "La limite à retourner",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "dateDebut",
            "in": "query",
            "description": "Date debut",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "dateFin",
            "in": "query",
            "description": "Date fin",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sens",
            "in": "query",
            "description": "Le sens du transfert",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "alias",
            "in": "query",
            "description": "Alias du client (filtre les transferts impliquant cet alias).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "keyword",
            "in": "query",
            "description": "Recherche texte libre (nom du client, montant...).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "sortBy",
            "in": "query",
            "description": "Champ de tri des résultats.",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "fields",
            "in": "query",
            "description": "Liste de champs à inclure dans la réponse (projection).",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "subscriptionId",
            "in": "query",
            "description": "Filtre les transferts liés à cet abonnement/paiement programmé.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Transactions récupérées.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransfertListeResponse"
                }
              }
            }
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      },
      "post": {
        "tags": [
          "Transferts"
        ],
        "summary": "Initier un transfert.",
        "description": "Cette API permet au client de créer un transfert.",
        "operationId": "enregistrerTransfert",
        "security": [
          {
            "oAuth2AuthCode": [
              "transfert.write"
            ]
          }
        ],
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TransfertInitiationRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Opération réussie",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransfertInitiationResponse"
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/TxBadRequest"
          },
          "401": {
            "description": "Mauvais format"
          },
          "403": {
            "$ref": "#/components/responses/TxBadRequestForbiden",
            "description": "Interdit"
          },
          "404": {
            "description": "Not found"
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      }
    },
    "/transferts/{id}": {
      "put": {
        "tags": [
          "Transferts"
        ],
        "summary": "Confirmer le transfert.",
        "description": "",
        "operationId": "confirmerTransfert",
        "security": [
          {
            "oAuth2AuthCode": [
              "transfert.write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "L'identifiant du transfert.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TransfertConfirmationRequete"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Mise à jour éfféctuée avec succès.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/TransfertConfirmeParAlias"
                    },
                    {
                      "$ref": "#/components/schemas/TransfertConfirmeParCompte"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/TxBadRequest"
          },
          "401": {
            "description": "Mauvais format"
          },
          "403": {
            "$ref": "#/components/responses/TxBadRequestForbiden",
            "description": "Interdit"
          },
          "404": {
            "description": "Transaction Not found."
          },
          "405": {
            "description": "Données invalides."
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      }
    },
    "/transferts/{id}/reponses": {
      "get": {
        "tags": [
          "Transferts"
        ],
        "summary": "Stream de la réponse de confirmation de transfert (SSE)",
        "description": "Endpoint Server-Sent Events qui retourne les mises à jour en temps réel de l'état de la confirmation du transfert.",
        "operationId": "recupererResponsesConfirmationTransfert",
        "security": [
          {
            "oAuth2AuthCode": [
              "transfert.read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "L'identifiant du transfert.",
            "schema": {
              "type": "string",
              "example": "TX987654321"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Stream SSE des mises à jour du transfert",
            "headers": {
              "Cache-Control": {
                "description": "Contrôle de cache pour SSE",
                "schema": {
                  "type": "string",
                  "example": "no-cache"
                }
              },
              "Connection": {
                "description": "Type de connexion",
                "schema": {
                  "type": "string",
                  "example": "keep-alive"
                }
              },
              "Access-Control-Allow-Origin": {
                "description": "CORS header",
                "schema": {
                  "type": "string",
                  "example": "*"
                }
              }
            },
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/TransfertConfirmationResponseSSE"
                }
              }
            }
          }
        }
      }
    },
    "/transferts/{id}/details": {
      "get": {
        "tags": [
          "Transferts"
        ],
        "summary": "Récupérer les details d'un transfert.",
        "description": "Retourne les details d'un transfert.",
        "operationId": "recupererTransaction",
        "security": [
          {
            "oAuth2AuthCode": [
              "transfert.read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "L'identifiant de la transaction.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Opération réussie",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/TransactionDetails"
                }
              }
            }
          },
          "400": {
            "description": "Données invalides."
          },
          "404": {
            "description": "Transaction Not found."
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      }
    },
    "/transferts/{id}/retours": {
      "put": {
        "tags": [
          "Transferts"
        ],
        "summary": "Confirmer un retour de fond.",
        "description": "Confirme un retour de fonds, dans l'un des deux cas suivants :\n\n- retour direct sur une transaction irrévocable (aucune demande d'annulation associée) ;\n\n- acceptation d'une demande d'annulation en attente sur une transaction irrévocable, ce qui déclenche le retour de fonds correspondant.\n\nDans les deux cas, cet appel ne fait qu'initier le retour (retourStatut == \"initie\") ; son règlement se fait de façon asynchrone.",
        "operationId": "confirmerRetourTransfert",
        "security": [
          {
            "oAuth2AuthCode": [
              "transfert.write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "L'identifiant du transfert.",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Mise à jour éfféctuée avec succès.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "title": "Retour de fond direct",
                      "anyOf": [
                        {
                          "$ref": "#/components/schemas/TransfertRetourConfirmeParAlias"
                        },
                        {
                          "$ref": "#/components/schemas/TransfertRetourConfirmeParCompte"
                        }
                      ]
                    },
                    {
                      "title": "Acceptation d'une demande d'annulation",
                      "anyOf": [
                        {
                          "$ref": "#/components/schemas/TransfertAnnulationAccepteeParAlias"
                        },
                        {
                          "$ref": "#/components/schemas/TransfertAnnulationAccepteeParCompte"
                        }
                      ]
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/TxBadRequest"
          },
          "403": {
            "$ref": "#/components/responses/TxBadRequestForbiden",
            "description": "Interdit"
          },
          "404": {
            "description": "Transaction Not found."
          },
          "405": {
            "description": "Données invalides."
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      }
    },
    "/transferts/{id}/retours/reponses": {
      "get": {
        "tags": [
          "Transferts"
        ],
        "summary": "Stream de la réponse de confirmation du retour de fond (SSE).",
        "description": "Endpoint Server-Sent Events qui retourne les mises à jour en temps réel de l'état de la confirmation du transfert retourné.",
        "operationId": "recupererResponsesConfirmationRetourTransfert",
        "security": [
          {
            "oAuth2AuthCode": [
              "transfert.read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "L'identifiant du transfert.",
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Stream SSE des mises à jour du transfert",
            "headers": {
              "Cache-Control": {
                "description": "Contrôle de cache pour SSE",
                "schema": {
                  "type": "string",
                  "example": "no-cache"
                }
              },
              "Connection": {
                "description": "Type de connexion",
                "schema": {
                  "type": "string",
                  "example": "keep-alive"
                }
              },
              "Access-Control-Allow-Origin": {
                "description": "CORS header",
                "schema": {
                  "type": "string",
                  "example": "*"
                }
              }
            },
            "content": {
              "text/event-stream": {
                "schema": {
                  "$ref": "#/components/schemas/TransfertRetourConfirmationResponseSSE"
                }
              }
            }
          }
        }
      }
    },
    "/transferts/{id}/annulations": {
      "put": {
        "tags": [
          "Transferts"
        ],
        "summary": "Initier une demande d'annulation.",
        "description": "Une demande d'annulation ne peut être initiée que sur une transaction irrévocable n'ayant pas déjà fait l'objet d'un retour de fonds.",
        "operationId": "initierAnnulationTransfert",
        "security": [
          {
            "oAuth2AuthCode": [
              "transfert.write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "L'identifiant du transfert.",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TransfertAnnulationRequete"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Mise à jour éfféctuée avec succès.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/TransfertAnnulationInitieeParAlias"
                    },
                    {
                      "$ref": "#/components/schemas/TransfertAnnulationInitieeParCompte"
                    }
                  ]
                }
              }
            }
          },
          "404": {
            "description": "Transaction Not found."
          },
          "405": {
            "description": "Données invalides."
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      }
    },
    "/transferts/{id}/rejets": {
      "put": {
        "tags": [
          "Transferts"
        ],
        "summary": "Rejeter un transfert.",
        "description": "Rejette une demande en attente sur un transfert : une demande d'annulation ou une demande de paiement.\n\nPour une demande d'annulation, la raison (`raison` dans le corps de la requête) est fixe : \"CUST\", aucun choix n'est proposé à l'utilisateur.\n\nPour une demande de paiement, la raison est choisie par l'utilisateur parmi les autres valeurs de l'énumération (voir TransfertRejetRaison).",
        "operationId": "rejeterAnnulationTransfert",
        "security": [
          {
            "oAuth2AuthCode": [
              "transfert.write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "L'identifiant du transfert concerné par la demande à rejeter (demande d'annulation ou demande de paiement).",
            "schema": {
              "type": "string"
            },
            "required": true
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/TransfertRejetRequete"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Mise à jour éfféctuée avec succès.",
            "content": {
              "application/json": {
                "schema": {
                  "anyOf": [
                    {
                      "$ref": "#/components/schemas/DemandeDePaiementRejetee"
                    },
                    {
                      "$ref": "#/components/schemas/TransfertAnnulationRejeteeParAlias"
                    },
                    {
                      "$ref": "#/components/schemas/TransfertAnnulationRejeteeParCompte"
                    }
                  ]
                }
              }
            }
          },
          "400": {
            "$ref": "#/components/responses/TxBadRequest"
          },
          "403": {
            "$ref": "#/components/responses/TxBadRequestForbiden",
            "description": "Interdit"
          },
          "404": {
            "description": "Transaction Not found."
          },
          "405": {
            "description": "Données invalides."
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      }
    },
    "/souscriptions/{compteId}": {
      "get": {
        "tags": [
          "Abonnements"
        ],
        "summary": "La liste des abonnements.",
        "description": "Cette API retourne la liste des abonnements d'un compte du client.",
        "operationId": "listerAbonnement",
        "security": [
          {
            "oAuth2AuthCode": [
              "abonnement.read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "compteId",
            "in": "path",
            "description": "ID du compte du client.",
            "required": true,
            "explode": true,
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "page",
            "in": "query",
            "description": "Le numéro de la page",
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "limit",
            "in": "query",
            "description": "La limite à retourner",
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Abonnements récupérés.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AbonnementListeResponse"
                }
              }
            }
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      }
    },
    "/souscriptions": {
      "post": {
        "tags": [
          "Abonnements"
        ],
        "summary": "Créer un abonnement.",
        "description": "Cette API permet au client de créer un abonnement.",
        "operationId": "enregistrerAbonnement",
        "security": [
          {
            "oAuth2AuthCode": [
              "abonnement.write"
            ]
          }
        ],
        "requestBody": {
          "description": "",
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AbonnementCreationRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Opération réussie",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Abonnement"
                }
              }
            }
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      }
    },
    "/souscriptions/{id}/details": {
      "get": {
        "tags": [
          "Abonnements"
        ],
        "summary": "Recuperer un abonnement.",
        "description": "Cette API permet au client de recuperer un abonnement.",
        "operationId": "recupererAbonnement",
        "security": [
          {
            "oAuth2AuthCode": [
              "abonnement.read"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "ID de l'abonnement.",
            "required": true,
            "explode": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Opération réussie",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Abonnement"
                }
              }
            }
          },
          "404": {
            "description": "Not found"
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      }
    },
    "/souscriptions/{id}/desactivations": {
      "put": {
        "tags": [
          "Abonnements"
        ],
        "summary": "Desactiver un abonnement.",
        "description": "Cette API permet au client de desactiver un abonnement.",
        "operationId": "desactiverAbonnement",
        "security": [
          {
            "oAuth2AuthCode": [
              "abonnement.write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "ID de l'abonnement.",
            "required": true,
            "explode": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Opération réussie",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AbonnementDesactive"
                }
              }
            }
          },
          "404": {
            "description": "Not found"
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      }
    },
    "/souscriptions/{id}/reactivations": {
      "put": {
        "tags": [
          "Abonnements"
        ],
        "summary": "Activer un abonnement.",
        "description": "Cette API permet au client d'activer un abonnement.",
        "operationId": "activerAbonnement",
        "security": [
          {
            "oAuth2AuthCode": [
              "abonnement.write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "ID de l'abonnement.",
            "required": true,
            "explode": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Opération réussie",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/AbonnementReactive"
                }
              }
            }
          },
          "404": {
            "description": "Not found"
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      }
    },
    "/souscriptions/{id}": {
      "delete": {
        "tags": [
          "Abonnements"
        ],
        "summary": "Supprimer un abonnement.",
        "description": "Cette API permet au client de supprimer un abonnement.",
        "operationId": "supprimerAbonnement",
        "security": [
          {
            "oAuth2AuthCode": [
              "abonnement.write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "ID de l'abonnement.",
            "required": true,
            "explode": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Opération réussie"
          },
          "404": {
            "description": "Not found"
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      },
      "put": {
        "tags": [
          "Abonnements"
        ],
        "summary": "Modifier un abonnement.",
        "description": "Cette API permet au client de modifier un abonnement.",
        "operationId": "modifierAbonnement",
        "security": [
          {
            "oAuth2AuthCode": [
              "abonnement.write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "ID de l'abonnement.",
            "required": true,
            "explode": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/AbonnementModificationRequest"
              }
            }
          },
          "required": true
        },
        "responses": {
          "200": {
            "description": "Opération réussie",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Abonnement"
                }
              }
            }
          },
          "404": {
            "description": "Not found"
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      }
    },
    "/comptes/{compteId}": {
      "delete": {
        "tags": [
          "Compte"
        ],
        "summary": "Suppression d'un compte.",
        "description": "Supprime le compte du client. Contrairement au SDK (qui n'expose plus de bouton de suppression de compte), l'application de référence permet au client de fermer son compte.",
        "operationId": "supprimerCompte",
        "security": [
          {
            "oAuth2AuthCode": [
              "compte.details.write"
            ]
          }
        ],
        "parameters": [
          {
            "name": "compteId",
            "in": "path",
            "description": "ID du compte du client.",
            "required": true,
            "explode": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Compte supprimé avec succès"
          },
          "404": {
            "description": "Compte inconnu"
          },
          "405": {
            "description": "Données invalides"
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      }
    },
    "/notifications/tokens": {
      "post": {
        "tags": [
          "Notifications"
        ],
        "summary": "Créer un nouveau token de notification.",
        "description": "Enregistre (ou met à jour) le token de notification push Firebase de l'appareil, pour que le backend puisse notifier le client. Non repris dans le SDK, qui n'implémente pas de push (l'application hôte gère ses propres notifications).",
        "operationId": "creerTokenNotification",
        "security": [
          {
            "oAuth2AuthCode": [
              "notification.write"
            ]
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/NotificationTokenCreationRequest"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Token de notification enregistré avec succès"
          },
          "400": {
            "description": "Bad request."
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      }
    },
    "/applications/versions": {
      "get": {
        "tags": [
          "Notifications"
        ],
        "summary": "Récupérer la dernière version de l'application.",
        "description": "Absent du spec canonique -- reconstruit depuis NotificationOutputRemote.getVersion(), qui l'appelle après le comptage des notifications non lues (uniquement hors Web) pour proposer une mise à jour au client si nécessaire.",
        "operationId": "recupererVersionApplication",
        "security": [
          {
            "oAuth2AuthCode": []
          }
        ],
        "responses": {
          "200": {
            "description": "Opération réussie",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/NotificationAppVersion"
                }
              }
            }
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      }
    },
    "/otps/demandes": {
      "post": {
        "tags": [
          "Sécurité"
        ],
        "summary": "Demander un code OTP pour PIN oublié.",
        "description": "Demande l'envoi d'un code OTP (par email ou téléphone selon le moyen choisi) pour réinitialiser le PIN local oublié du client. Absent du spec canonique et du SDK (qui exclut tout le module security). Reconstruit depuis IdentificationPinOutputRemote (modules/security/infra/indentification_pin_output_remote.dart). Le code client ne déclare aucun scope OAuth2 particulier pour cet appel -- utilisé lorsque le client a oublié son PIN local, alors qu'il dispose déjà d'une session OAuth2 valide.",
        "operationId": "demanderOtpPinOublie",
        "security": [
          {
            "oAuth2AuthCode": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ForgetPinRequete"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Code OTP envoyé avec succès"
          },
          "400": {
            "description": "Bad request."
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      }
    },
    "/otps/verifications": {
      "put": {
        "tags": [
          "Sécurité"
        ],
        "summary": "Vérifier le code OTP pour PIN oublié.",
        "description": "Vérifie le code OTP reçu suite à une demande de réinitialisation de PIN oublié. Absent du spec canonique et du SDK (qui exclut tout le module security). Reconstruit depuis IdentificationPinOutputRemote (modules/security/infra/indentification_pin_output_remote.dart). Le code client ne déclare aucun scope OAuth2 particulier pour cet appel -- utilisé lorsque le client a oublié son PIN local, alors qu'il dispose déjà d'une session OAuth2 valide.",
        "operationId": "verifierOtpPinOublie",
        "security": [
          {
            "oAuth2AuthCode": []
          }
        ],
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": {
                "$ref": "#/components/schemas/ForgetPinVerificationRequete"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Code OTP vérifié avec succès"
          },
          "400": {
            "description": "Bad request. Le code OTP est invalide ou expiré."
          },
          "500": {
            "description": "ressource indisponible."
          }
        }
      }
    }
  },
  "components": {
    "schemas": {
      "CompteDetailsReponse": {
        "type": "object",
        "properties": {
          "alias": {
            "$ref": "#/components/schemas/Alias"
          },
          "compte": {
            "$ref": "#/components/schemas/Compte"
          },
          "dateCreation": {
            "type": "string",
            "format": "date",
            "description": "Date de création de l'alias"
          },
          "dateModification": {
            "type": "string",
            "format": "date",
            "description": "Date de modification de l'alias"
          },
          "client": {
            "$ref": "#/components/schemas/Client",
            "description": "Identité du titulaire du compte."
          }
        },
        "required": [
          "alias",
          "compte",
          "dateCreation",
          "client"
        ]
      },
      "ClientCategorie": {
        "type": "string",
        "enum": [
          "C",
          "B",
          "P",
          "G"
        ],
        "description": "Catégorie du client\nC: Commerçant\nB: Business\np: physique\nG: Gouvernement\n",
        "example": "P"
      },
      "Pays": {
        "type": "string",
        "enum": [
          "CI",
          "SN",
          "ML",
          "GW",
          "BF",
          "NE",
          "BJ",
          "TG"
        ],
        "title": "Pays",
        "description": "Le pays du client\nBJ: Bénin\nBF: Burkina Faso\nCI: Côte d'Ivoire\nGW: Guinée Bissau\nTG: Togo\nSN: Sénégal\nML: Mali\nNE: Niger\n",
        "example": "GW"
      },
      "Alias": {
        "type": "object",
        "properties": {
          "cle": {
            "type": "string",
            "description": "La valeur de l'alias créé"
          },
          "shid": {
            "type": "string",
            "description": "si alias mbno un shid est également généré"
          },
          "type": {
            "type": "string",
            "enum": [
              "MBNO",
              "SHID"
            ],
            "description": "Le type d'alias créé"
          },
          "compte": {
            "type": "string",
            "description": "Le compte auquel est lié l'alias"
          },
          "pays": {
            "type": "string",
            "description": "Le pays du compte auquel est lié l'alias",
            "$ref": "#/components/schemas/Pays"
          },
          "clientType": {
            "$ref": "#/components/schemas/ClientCategorie",
            "description": "Le type de client"
          }
        },
        "required": [
          "type",
          "compte",
          "pays",
          "cle",
          "clientType"
        ]
      },
      "Compte": {
        "type": "object",
        "properties": {
          "participant": {
            "type": "string",
            "description": "Code du participant"
          },
          "type": {
            "$ref": "#/components/schemas/CompteType"
          },
          "numero": {
            "type": "string",
            "description": "Numéro de compte"
          },
          "other": {
            "type": "string",
            "description": ""
          },
          "dateOuverture": {
            "type": "string",
            "format": "date",
            "description": "Date d'ouverture du compte"
          }
        },
        "required": [
          "participant",
          "other",
          "numero",
          "type",
          "dateOuverture"
        ]
      },
      "CompteType": {
        "type": "string",
        "enum": [
          "CACC",
          "SVGS",
          "LLSV",
          "VACC",
          "TRAN",
          "TRAL",
          "TAXE"
        ],
        "description": "Type de compte\n\nCACC: Compte Courant\n\nSVGS: Compte épargne\n\nLLSV: Tirelire\n\nVACC: Tontine\n\nTRAN: Compte de transaction\n\nTRAL: Compte de transaction sans KYC\n\nTAXE: Compte Taxe\n"
      },
      "TransactionDetails": {
        "anyOf": [
          {
            "$ref": "#/components/schemas/TransactionDetailsTransfertParAlias"
          },
          {
            "$ref": "#/components/schemas/TransactionDetailsTransfertParCompte"
          },
          {
            "$ref": "#/components/schemas/DemandeDePaiement"
          }
        ],
        "description": "Détails d’un transfert.  \nPeut être soit un objet de type [Transaction](#/components/schemas/Transaction),  \nsoit un objet de type [DemandeDePaiement](#/components/schemas/DemandeDePaiement).\n"
      },
      "DemandeDePaiement": {
        "type": "object",
        "properties": {
          "endToEndId": {
            "type": "string",
            "description": "Identifiant end-to-end",
            "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
          },
          "sens": {
            "type": "string",
            "enum": [
              "debit",
              "credit"
            ],
            "description": "Sens de l'opération",
            "example": "credit"
          },
          "compte": {
            "type": "string",
            "description": "Compte principal",
            "example": "doucoure"
          },
          "dateOperation": {
            "type": "string",
            "format": "date-time",
            "description": "Date d'irrévocabilité de la demande de paiement.",
            "example": "2025-06-19T09:01:54.969Z"
          },
          "dateCreation": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création",
            "example": "2025-06-19T09:01:40.709Z"
          },
          "clientAlias": {
            "type": "string",
            "format": "uuid",
            "description": "Alias du client",
            "example": "92a1027d-3260-4cd5-a1fe-16aefd05a554"
          },
          "clientNom": {
            "type": "string",
            "description": "Nom du client",
            "example": "Mbore"
          },
          "clientTypeCompte": {
            "$ref": "#/components/schemas/CompteType",
            "description": "Type de compte du client."
          },
          "clientPays": {
            "$ref": "#/components/schemas/Pays"
          },
          "clientPSP": {
            "type": "string",
            "description": "Code membre du participant du client.",
            "example": "CIC004"
          },
          "clientPhoto": {
            "type": "string",
            "nullable": true,
            "description": "Photo du client"
          },
          "montant": {
            "type": "number",
            "minimum": 1,
            "description": "Montant de la demande de paiement",
            "example": 258
          },
          "montantFrais": {
            "type": "number",
            "minimum": 0,
            "description": "Montant des frais",
            "example": 0
          },
          "motif": {
            "type": "string",
            "nullable": true,
            "description": "Motif de la demande de paiement"
          },
          "facture": {
            "type": "string",
            "nullable": true,
            "description": "La facture reglée"
          },
          "statut": {
            "$ref": "#/components/schemas/TransfertStatut"
          },
          "dateDemande": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date demande"
          },
          "dateReponse": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date reponse"
          },
          "remise": {
            "type": "number",
            "minimum": 0,
            "description": "Montant de la remise",
            "example": 0
          },
          "retraitAchat": {
            "type": "number",
            "minimum": 0,
            "description": "Montant retrait achat",
            "example": 0
          },
          "retraitMontant": {
            "type": "number",
            "minimum": 0,
            "description": "Montant retrait",
            "example": 0
          },
          "retraitFrais": {
            "type": "number",
            "minimum": 0,
            "description": "Frais retrait",
            "example": 0
          },
          "differe": {
            "type": "boolean",
            "description": "Débit différé",
            "example": true
          },
          "differeFrequence": {
            "$ref": "#/components/schemas/AbonnementFrequence",
            "description": "Si paiement différé",
            "example": true
          },
          "differeOccurence": {
            "type": "number",
            "description": "Si paiement différé"
          },
          "differeMontant": {
            "type": "number",
            "minimum": 0,
            "description": "Si paiement différé",
            "example": 0
          },
          "dateExpiration": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date d'échéance de la demande de paiement, au-delà de laquelle aucune action n'est possible sur la demande de paiement."
          },
          "signature": {
            "type": "string",
            "nullable": true,
            "description": "Clé de chiffrement du rapport du tirage (tontine)."
          },
          "clientPSPNom": {
            "type": "string",
            "nullable": true,
            "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
          },
          "subscriptionId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant de l'abonnement/programmation, renseigné uniquement lorsque l'utilisateur a programmé la demande de paiement."
          },
          "statutRaison": {
            "$ref": "#/components/schemas/TransfertRejetRaison",
            "nullable": true,
            "description": "Raison du rejet de la demande de paiement, choisie par le payeur. Présent uniquement si statut == \"rejete\"."
          }
        },
        "required": [
          "endToEndId",
          "sens",
          "compte",
          "dateCreation",
          "clientNom",
          "clientAlias",
          "clientPays",
          "montant",
          "statut",
          "dateDemande"
        ]
      },
      "TransfertStatut": {
        "type": "string",
        "enum": [
          "initie",
          "confirme",
          "irrevocable",
          "annule",
          "echoue",
          "rejete"
        ],
        "description": "Statut du transfert\ninitie: Initié\nconfirme: Confirmé\nirrevocable: Irrevocable\nechoue: Echoué\nrejete: Rejeté\n",
        "example": "irrevocable"
      },
      "AbonnementFrequence": {
        "type": "string",
        "enum": [
          "J",
          "S",
          "M",
          "A"
        ],
        "title": "Frequence",
        "description": "La frequence de l'abonnement\nJ: Jour\nS: Semaine\nM: Mois\nA: Année\n"
      },
      "Transaction": {
        "anyOf": [
          {
            "title": "Transfert par alias",
            "type": "object",
            "properties": {
              "endToEndId": {
                "type": "string",
                "description": "Identifiant end-to-end",
                "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
              },
              "sens": {
                "type": "string",
                "enum": [
                  "debit",
                  "credit"
                ],
                "description": "Sens de l'opération",
                "example": "credit"
              },
              "compte": {
                "type": "string",
                "description": "Compte principal",
                "example": "doucoure"
              },
              "dateOperation": {
                "type": "string",
                "format": "date-time",
                "description": "Date d'irrévocabilité de la transaction.",
                "example": "2025-06-19T09:01:54.969Z"
              },
              "dateCreation": {
                "type": "string",
                "format": "date-time",
                "description": "Date de création",
                "example": "2025-06-19T09:01:40.709Z"
              },
              "clientAlias": {
                "type": "string",
                "format": "uuid",
                "description": "Alias du client",
                "example": "92a1027d-3260-4cd5-a1fe-16aefd05a554"
              },
              "clientNom": {
                "type": "string",
                "description": "Nom du client",
                "example": "Mbore"
              },
              "clientTypeCompte": {
                "$ref": "#/components/schemas/CompteType",
                "description": "Type de compte du client."
              },
              "clientPays": {
                "$ref": "#/components/schemas/Pays"
              },
              "clientPSP": {
                "type": "string",
                "description": "Code membre du participant du client.",
                "example": "CIC004"
              },
              "clientPhoto": {
                "type": "string",
                "nullable": true,
                "description": "Photo du client"
              },
              "montant": {
                "type": "number",
                "minimum": 1,
                "description": "Montant du transfert",
                "example": 258
              },
              "montantFrais": {
                "type": "number",
                "minimum": 0,
                "description": "Montant des frais",
                "example": 0
              },
              "motif": {
                "type": "string",
                "nullable": true,
                "description": "Motif du transfert"
              },
              "facture": {
                "type": "string",
                "nullable": true,
                "description": "La facture reglée"
              },
              "statut": {
                "$ref": "#/components/schemas/TransfertStatut"
              },
              "retourId": {
                "type": "string",
                "nullable": true,
                "description": "ID de retour, présent une fois un retour de fonds initié ou effectué sur cette transaction."
              },
              "retourDate": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Date du retour de fonds, présente une fois un retour de fonds initié ou effectué sur cette transaction."
              },
              "retourStatut": {
                "type": "string",
                "nullable": true,
                "enum": [
                  "initie",
                  "irrevocable",
                  "rejete"
                ],
                "description": "Statut du retour de fonds, présent une fois un retour initié sur cette transaction.\n\n\ninitie: retour initié, en cours de traitement\n\n\nirrevocable: retour effectué avec succès\n\n\nrejete: retour rejeté (voir retourStatutRaison)\n"
              },
              "retourStatutRaison": {
                "type": "string",
                "nullable": true,
                "description": "Raison du rejet du retour de fonds. Présent uniquement si retourStatut == \"rejete\"."
              },
              "annulationId": {
                "type": "string",
                "nullable": true,
                "description": "ID de la demande d'annulation, présent une fois une demande initiée sur cette transaction."
              },
              "annulationDate": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Date de la demande d'annulation, présente une fois une demande initiée sur cette transaction."
              },
              "annulationStatut": {
                "type": "string",
                "nullable": true,
                "enum": [
                  "initie",
                  "rejete",
                  "irrevocable"
                ],
                "description": "Statut de la demande d'annulation, présent uniquement si une demande a été initiée sur cette transaction.\n\ninitie: demande envoyée, en attente de réponse\n\nrejete: demande rejetée (voir annulationStatutRaison/annulationRaison)\n\nirrevocable: demande acceptée -- le retour de fonds a été déclenché (voir retourId/retourDate/retourStatut/retourStatutRaison)\n"
              },
              "annulationStatutRaison": {
                "type": "string",
                "nullable": true,
                "description": "Raison du rejet de la demande d'annulation. Présent uniquement si annulationStatut == \"rejete\"."
              },
              "compteAlias": {
                "type": "string",
                "nullable": true,
                "description": "Alias du compte principal (compte payeur)."
              },
              "clientPSPNom": {
                "type": "string",
                "nullable": true,
                "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
              },
              "txId": {
                "type": "string",
                "nullable": true,
                "description": "Identifiant technique de la transaction (référence affichée, distincte de endToEndId)."
              },
              "instructionId": {
                "type": "string",
                "nullable": true,
                "description": "Contient l'échéance de la tontine, le cas échéant."
              },
              "statutRaison": {
                "$ref": "#/components/schemas/TransfertCodeRejet",
                "nullable": true
              },
              "rejetDate": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Date du rejet, utilisée en repli quand dateOperation est absente sur une transaction rejetée."
              },
              "annulationRaison": {
                "$ref": "#/components/schemas/TransfertCodeRejet",
                "nullable": true,
                "description": "Raison de la demande d'annulation, fournie par le demandeur (voir aussi TransfertAnnulationRequete pour les codes envoyés par le client). Présent uniquement si annulationStatut == \"rejete\"."
              },
              "subscriptionId": {
                "type": "string",
                "nullable": true,
                "description": "Identifiant de l'abonnement/programmation, renseigné uniquement lorsque ce transfert a été généré par un abonnement programmé."
              }
            },
            "required": [
              "endToEndId",
              "sens",
              "compte",
              "dateOperation",
              "dateCreation",
              "clientNom",
              "clientAlias",
              "clientPays",
              "montant",
              "statut"
            ]
          },
          {
            "title": "Transfert par compte",
            "type": "object",
            "properties": {
              "endToEndId": {
                "type": "string",
                "description": "Identifiant end-to-end",
                "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
              },
              "sens": {
                "type": "string",
                "enum": [
                  "debit",
                  "credit"
                ],
                "description": "Sens de l'opération",
                "example": "credit"
              },
              "compte": {
                "type": "string",
                "description": "Compte principal",
                "example": "doucoure"
              },
              "dateOperation": {
                "type": "string",
                "format": "date-time",
                "description": "Date d'irrévocabilité de la transaction.",
                "example": "2025-06-19T09:01:54.969Z"
              },
              "dateCreation": {
                "type": "string",
                "format": "date-time",
                "description": "Date de création",
                "example": "2025-06-19T09:01:40.709Z"
              },
              "clientCompte": {
                "type": "string",
                "description": "Compte du client",
                "example": "mseye"
              },
              "clientNom": {
                "type": "string",
                "description": "Nom du client",
                "example": "Mbore"
              },
              "clientTypeCompte": {
                "$ref": "#/components/schemas/CompteType",
                "description": "Type de compte du client."
              },
              "clientPays": {
                "$ref": "#/components/schemas/Pays"
              },
              "clientPSP": {
                "type": "string",
                "description": "Code membre du participant du client.",
                "example": "CIC004"
              },
              "clientPhoto": {
                "type": "string",
                "nullable": true,
                "description": "Photo du client"
              },
              "montant": {
                "type": "number",
                "minimum": 1,
                "description": "Montant du transfert",
                "example": 258
              },
              "montantFrais": {
                "type": "number",
                "minimum": 0,
                "description": "Montant des frais",
                "example": 0
              },
              "motif": {
                "type": "string",
                "nullable": true,
                "description": "Motif du transfert"
              },
              "facture": {
                "type": "string",
                "nullable": true,
                "description": "La facture reglée"
              },
              "statut": {
                "$ref": "#/components/schemas/TransfertStatut"
              },
              "retourId": {
                "type": "string",
                "nullable": true,
                "description": "ID de retour, présent une fois un retour de fonds initié ou effectué sur cette transaction."
              },
              "retourDate": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Date du retour de fonds, présente une fois un retour de fonds initié ou effectué sur cette transaction."
              },
              "retourStatut": {
                "type": "string",
                "nullable": true,
                "enum": [
                  "initie",
                  "irrevocable",
                  "rejete"
                ],
                "description": "Statut du retour de fonds, présent une fois un retour initié sur cette transaction.\n\n\ninitie: retour initié, en cours de traitement\n\n\nirrevocable: retour effectué avec succès\n\n\nrejete: retour rejeté (voir retourStatutRaison)\n"
              },
              "retourStatutRaison": {
                "type": "string",
                "nullable": true,
                "description": "Raison du rejet du retour de fonds. Présent uniquement si retourStatut == \"rejete\"."
              },
              "annulationId": {
                "type": "string",
                "nullable": true,
                "description": "ID de la demande d'annulation, présent une fois une demande initiée sur cette transaction."
              },
              "annulationDate": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Date de la demande d'annulation, présente une fois une demande initiée sur cette transaction."
              },
              "annulationStatut": {
                "type": "string",
                "nullable": true,
                "enum": [
                  "initie",
                  "rejete",
                  "irrevocable"
                ],
                "description": "Statut de la demande d'annulation, présent uniquement si une demande a été initiée sur cette transaction.\n\ninitie: demande envoyée, en attente de réponse\n\nrejete: demande rejetée (voir annulationStatutRaison/annulationRaison)\n\nirrevocable: demande acceptée -- le retour de fonds a été déclenché (voir retourId/retourDate/retourStatut/retourStatutRaison)\n"
              },
              "annulationStatutRaison": {
                "type": "string",
                "nullable": true,
                "description": "Raison du rejet de la demande d'annulation. Présent uniquement si annulationStatut == \"rejete\"."
              },
              "compteAlias": {
                "type": "string",
                "nullable": true,
                "description": "Alias du compte principal (compte payeur)."
              },
              "clientPSPNom": {
                "type": "string",
                "nullable": true,
                "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
              },
              "txId": {
                "type": "string",
                "nullable": true,
                "description": "Identifiant technique de la transaction (référence affichée, distincte de endToEndId)."
              },
              "instructionId": {
                "type": "string",
                "nullable": true,
                "description": "Contient l'échéance de la tontine, le cas échéant."
              },
              "statutRaison": {
                "$ref": "#/components/schemas/TransfertCodeRejet",
                "nullable": true
              },
              "rejetDate": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Date du rejet, utilisée en repli quand dateOperation est absente sur une transaction rejetée."
              },
              "annulationRaison": {
                "$ref": "#/components/schemas/TransfertCodeRejet",
                "nullable": true,
                "description": "Raison de la demande d'annulation, fournie par le demandeur (voir aussi TransfertAnnulationRequete pour les codes envoyés par le client). Présent uniquement si annulationStatut == \"rejete\"."
              },
              "subscriptionId": {
                "type": "string",
                "nullable": true,
                "description": "Identifiant de l'abonnement/programmation, renseigné uniquement lorsque ce transfert a été généré par un abonnement programmé."
              }
            },
            "required": [
              "endToEndId",
              "sens",
              "compte",
              "dateOperation",
              "dateCreation",
              "clientNom",
              "clientCompte",
              "clientPays",
              "montant",
              "statut"
            ]
          }
        ]
      },
      "TransfertAnnulationRequete": {
        "type": "object",
        "properties": {
          "raison": {
            "type": "string",
            "enum": [
              "AC03",
              "AM09",
              "SVNR",
              "DUPL",
              "FRAD"
            ],
            "description": "Raison de l'annulation\nAC03: Erreur sur le destinataire\nAM09: Erreur sur le montant\nSVNR: Service non rendu\nDUPL: Déjà payé\nFRAD: Tantative de fraude\n",
            "example": "SVNR"
          }
        },
        "required": [
          "raison"
        ]
      },
      "TransfertInitiationRequest": {
        "anyOf": [
          {
            "title": "Envoi par alias",
            "type": "object",
            "properties": {
              "action": {
                "$ref": "#/components/schemas/TransfertAction"
              },
              "compte": {
                "type": "string",
                "description": "Le numéro de compte du client payeur"
              },
              "compteAlias": {
                "type": "string",
                "description": "Alias du compte du client payeur",
                "example": "+221773242452"
              },
              "montant": {
                "type": "number",
                "minimum": 1,
                "maximum": 5000000,
                "description": "Montant du transfert",
                "example": 1000
              },
              "canal": {
                "$ref": "#/components/schemas/TransfertCanal"
              },
              "alias": {
                "type": "string",
                "example": "111c3e1b-4312-49ec-b75e-4c8c74c10fd7",
                "description": "L'alias lié au compte du client payé"
              },
              "latitude": {
                "type": "number",
                "description": "La latitude à laquelle se trouve le client payeur pour initier l'envoi"
              },
              "longitude": {
                "type": "number",
                "description": "La longitude à laquelle se trouve le client payeur pour initier l'envoi"
              },
              "motif": {
                "type": "string",
                "title": "motif du transfert"
              },
              "txId": {
                "type": "string",
                "description": "L'identifiant de la transaction"
              }
            },
            "required": [
              "action",
              "compte",
              "compteAlias",
              "alias",
              "montant",
              "canal",
              "latitude",
              "longitude"
            ]
          },
          {
            "title": "Envoi par iban",
            "type": "object",
            "properties": {
              "action": {
                "$ref": "#/components/schemas/TransfertAction"
              },
              "compte": {
                "type": "string",
                "description": "Le numéro de compte du client payeur"
              },
              "compteAlias": {
                "type": "string",
                "description": "Alias du compte du client payeur",
                "example": "+221773242452"
              },
              "montant": {
                "type": "number",
                "minimum": 1,
                "maximum": 5000000,
                "description": "Montant du transfert",
                "example": 1000
              },
              "canal": {
                "$ref": "#/components/schemas/TransfertCanal"
              },
              "iban": {
                "type": "string",
                "description": "L'identifiant du compte du client payé"
              },
              "payePSP": {
                "type": "string",
                "description": "Le code membre du participant payé"
              },
              "latitude": {
                "type": "number",
                "description": "La latitude à laquelle se trouve le client payeur pour initier l'envoi"
              },
              "longitude": {
                "type": "number",
                "description": "La longitude à laquelle se trouve le client payeur pour initier l'envoi"
              },
              "motif": {
                "type": "string",
                "title": "motif du transfert"
              },
              "txId": {
                "type": "string",
                "description": "L'identifiant de la transaction"
              }
            },
            "required": [
              "action",
              "compte",
              "compteAlias",
              "iban",
              "payePSP",
              "montant",
              "canal",
              "latitude",
              "longitude"
            ]
          },
          {
            "title": "Envoi par autre compte",
            "type": "object",
            "properties": {
              "action": {
                "$ref": "#/components/schemas/TransfertAction"
              },
              "compte": {
                "type": "string",
                "description": "Le numéro de compte du client payeur"
              },
              "compteAlias": {
                "type": "string",
                "description": "Alias du compte du client payeur",
                "example": "+221773242452"
              },
              "montant": {
                "type": "number",
                "minimum": 1,
                "maximum": 5000000,
                "description": "Montant du transfert",
                "example": 1000
              },
              "canal": {
                "$ref": "#/components/schemas/TransfertCanal"
              },
              "othr": {
                "type": "string",
                "description": "L'identifiant du compte du client payé"
              },
              "payePSP": {
                "type": "string",
                "description": "Le code membre du participant payé"
              },
              "latitude": {
                "type": "number",
                "description": "La latitude à laquelle se trouve le client payeur pour initier l'envoi"
              },
              "longitude": {
                "type": "number",
                "description": "La longitude à laquelle se trouve le client payeur pour initier l'envoi"
              },
              "motif": {
                "type": "string",
                "title": "motif du transfert"
              },
              "txId": {
                "type": "string",
                "description": "L'identifiant de la transaction"
              }
            },
            "required": [
              "action",
              "compte",
              "compteAlias",
              "othr",
              "payePSP",
              "montant",
              "canal",
              "latitude",
              "longitude"
            ]
          },
          {
            "title": "Demande de paiement",
            "type": "object",
            "properties": {
              "action": {
                "$ref": "#/components/schemas/TransfertAction"
              },
              "compte": {
                "type": "string",
                "description": "Le numéro de compte du client payé"
              },
              "compteAlias": {
                "type": "string",
                "description": "Alias du compte du client payé",
                "example": "+221773242452"
              },
              "montant": {
                "type": "number",
                "minimum": 1,
                "maximum": 5000000,
                "description": "Montant de la demande de paiement",
                "example": 1000
              },
              "canal": {
                "$ref": "#/components/schemas/TransfertCanal"
              },
              "alias": {
                "type": "string",
                "example": "111c3e1b-4312-49ec-b75e-4c8c74c10fd7",
                "description": "L'alias lié au compte du client payeur"
              },
              "latitude": {
                "type": "number",
                "description": "La latitude à laquelle se trouve le client payé pour initier la demande de paiement"
              },
              "longitude": {
                "type": "number",
                "description": "La longitude à laquelle se trouve le client payé pour initier la demande de paiement"
              },
              "motif": {
                "type": "string",
                "title": "motif de la demande de paiement"
              },
              "txId": {
                "type": "string",
                "description": "L'identifiant de la demande de paiement"
              }
            },
            "required": [
              "action",
              "compte",
              "compteAlias",
              "alias",
              "montant",
              "canal",
              "latitude",
              "longitude"
            ]
          }
        ]
      },
      "TransfertCanal": {
        "type": "string",
        "enum": [
          "731",
          "633",
          "999",
          "000",
          "400",
          "631",
          "500",
          "521",
          "520",
          "401"
        ],
        "title": "Action",
        "description": "Les cannaux de communication\n731: Envoi par QR Code\n633: Envoi par Telephone, adresse de paiement ou compte\n999: Ordre de transfert bancaire \n000: Paiement par QR Code Statique\n400: Paiement par QR Code Dynamique\n631: Envoi par demande de paiement\n500: Paiement par Request To Pay sur site\n521: Demande de Paiement e-commerce immédiat\n520: Demande de Paiement e-commerce à la livraison\n401: Autres Demande de Paiement\n",
        "example": "631"
      },
      "TransfertAction": {
        "type": "string",
        "enum": [
          "send_now",
          "send_schedule",
          "receive_now"
        ],
        "title": "Action",
        "description": "Le type d'action\nsend_now: Envoi\nsend_schedule: Paiement programmé ou abonnement\nreceive_now: Demande de paiement\n",
        "example": "send_now"
      },
      "AliasCreationRequete": {
        "type": "object",
        "oneOf": [
          {
            "title": "MBNO",
            "properties": {
              "cle": {
                "type": "string",
                "pattern": "^\\+(?:229|226|225|223|221|220|228|228)\\d{6,10}$",
                "description": "Le numero de téléphone"
              },
              "type": {
                "type": "string",
                "pattern": "MBNO",
                "description": "Le type d'alias à créer (SHID ou MBNO)"
              },
              "compte": {
                "type": "string",
                "description": "Le numéro de compte auquel sera lié l'alias à créer"
              }
            },
            "additionalProperties": false,
            "required": [
              "cle",
              "type",
              "compte"
            ]
          },
          {
            "title": "SHID",
            "properties": {
              "type": {
                "type": "string",
                "pattern": "SHID",
                "description": "Le type d'alias à créer (SHID ou MBNO)"
              },
              "compte": {
                "type": "string",
                "description": "Le numéro de compte auquel sera lié l'alias à créer"
              }
            },
            "additionalProperties": false,
            "required": [
              "type",
              "compte"
            ]
          }
        ]
      },
      "Problem403": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Problem"
          },
          {
            "type": "object",
            "required": [
              "invalidParams"
            ],
            "properties": {
              "invalidParams": {
                "type": "object",
                "required": [
                  "name"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "enum": [
                      "solde",
                      "participantPayeur",
                      "participantPaye",
                      "date",
                      "statut"
                    ],
                    "description": "La porté de l'erreur\n\nsolde: Erreur de reservation de fond car solde insuffisant\n\nparticipantPayeur: Le participant payeur est indisponible\n\nparticipantPaye: Le participant payé est indisponible\n\ndate: Le délai pour cette action (annulation, retour, réponse RTP) est dépassé\n\nstatut: La transaction est déjà dans un état terminal pour cette action (ex. déjà retournée, déjà payée)\n",
                    "example": "solde"
                  }
                }
              }
            }
          }
        ]
      },
      "Problem": {
        "type": "object",
        "required": [
          "type",
          "title",
          "status",
          "detail"
        ],
        "properties": {
          "type": {
            "type": "string"
          },
          "title": {
            "type": "string"
          },
          "status": {
            "type": "number"
          },
          "detail": {
            "type": "string"
          }
        }
      },
      "Abonnement": {
        "anyOf": [
          {
            "title": "Transfert par alias",
            "type": "object",
            "properties": {
              "endToEndId": {
                "type": "string",
                "description": "Identifiant end-to-end",
                "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
              },
              "sens": {
                "type": "string",
                "enum": [
                  "debit"
                ],
                "description": "Sens de l'opération : toujours \"debit\".",
                "example": "debit"
              },
              "compte": {
                "type": "string",
                "description": "Compte principal",
                "example": "doucoure"
              },
              "dateOperation": {
                "type": "string",
                "format": "date-time",
                "description": "Date de l'opération",
                "example": "2025-06-19T09:01:54.969Z"
              },
              "dateCreation": {
                "type": "string",
                "format": "date-time",
                "description": "Date de création",
                "example": "2025-06-19T09:01:40.709Z"
              },
              "clientAlias": {
                "type": "string",
                "format": "uuid",
                "description": "Alias du client",
                "example": "92a1027d-3260-4cd5-a1fe-16aefd05a554"
              },
              "clientNom": {
                "type": "string",
                "description": "Nom du client",
                "example": "Mbore"
              },
              "clientTypeCompte": {
                "$ref": "#/components/schemas/CompteType",
                "description": "Type de compte du client."
              },
              "clientPays": {
                "$ref": "#/components/schemas/Pays"
              },
              "clientPSP": {
                "type": "string",
                "description": "Code membre du participant du client.",
                "example": "CIC004"
              },
              "clientPhoto": {
                "type": "string",
                "nullable": true,
                "description": "Photo du client"
              },
              "montant": {
                "type": "number",
                "minimum": 1,
                "description": "Montant de l'abonnement",
                "example": 258
              },
              "motif": {
                "type": "string",
                "nullable": true,
                "description": "Motif de l'abonnement"
              },
              "statut": {
                "type": "string",
                "enum": [
                  "irrevocable",
                  "rejete",
                  "initie",
                  "desactive"
                ],
                "description": "Statut de l'abonnement/paiement programmé (mêmes valeurs que Transaction.statut)\n\ninitie: Programmé, pas encore exécuté\n\nirrevocable: Dernière échéance exécutée avec succès\n\nrejete: Dernière échéance rejetée\n\ndesactive: Abonnement désactivé par le client\n",
                "example": "initie"
              },
              "dateDebut": {
                "type": "string",
                "format": "date-time",
                "description": "Date de debut de l'abonnement",
                "example": "2025-06-19T09:01:40.709Z"
              },
              "dateFin": {
                "type": "string",
                "format": "date-time",
                "description": "Date de fin de l'abonnement",
                "example": "2025-06-19T09:01:40.709Z"
              },
              "frequence": {
                "$ref": "#/components/schemas/AbonnementFrequence",
                "description": "Optionnelle : si renseignée, il s'agit d'un abonnement récurrent ; si absente, il s'agit d'un paiement programmé (exécution unique différée)."
              },
              "periodicite": {
                "type": "number",
                "minimun": 2,
                "description": "Renseignée dans le cas d'une fréquence sur mesure, pour exprimer un multiple de la fréquence choisie (ex. periodicite=5 avec frequence=J -> tous les 5 jours ; periodicite=2 avec frequence=M -> tous les 2 mois).",
                "example": 3
              },
              "compteAlias": {
                "type": "string",
                "nullable": true,
                "description": "Alias du compte principal (compte payeur)."
              },
              "clientPSPNom": {
                "type": "string",
                "nullable": true,
                "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
              },
              "txId": {
                "type": "string",
                "nullable": true,
                "description": "Identifiant technique de la transaction (référence affichée, distincte de endToEndId)."
              },
              "instructionId": {
                "type": "string",
                "nullable": true,
                "description": "Contient l'échéance de la tontine, le cas échéant."
              },
              "statutRaison": {
                "$ref": "#/components/schemas/TransfertCodeRejet",
                "nullable": true
              },
              "rejetDate": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Date du rejet, utilisée en repli quand dateOperation est absente sur une transaction rejetée."
              }
            },
            "required": [
              "endToEndId",
              "sens",
              "compte",
              "dateCreation",
              "clientNom",
              "clientAlias",
              "clientPays",
              "montant",
              "statut",
              "dateDebut"
            ]
          },
          {
            "title": "Transfert par compte",
            "type": "object",
            "properties": {
              "endToEndId": {
                "type": "string",
                "description": "Identifiant end-to-end",
                "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
              },
              "sens": {
                "type": "string",
                "enum": [
                  "debit"
                ],
                "description": "Sens de l'opération : toujours \"debit\".",
                "example": "debit"
              },
              "compte": {
                "type": "string",
                "description": "Compte principal",
                "example": "doucoure"
              },
              "dateOperation": {
                "type": "string",
                "format": "date-time",
                "description": "Date de l'opération",
                "example": "2025-06-19T09:01:54.969Z"
              },
              "dateCreation": {
                "type": "string",
                "format": "date-time",
                "description": "Date de création",
                "example": "2025-06-19T09:01:40.709Z"
              },
              "clientCompte": {
                "type": "string",
                "description": "Compte du client",
                "example": "mseye"
              },
              "clientNom": {
                "type": "string",
                "description": "Nom du client",
                "example": "Mbore"
              },
              "clientTypeCompte": {
                "$ref": "#/components/schemas/CompteType",
                "description": "Type de compte du client."
              },
              "clientPays": {
                "$ref": "#/components/schemas/Pays"
              },
              "clientPSP": {
                "type": "string",
                "description": "Code membre du participant du client.",
                "example": "CIC004"
              },
              "clientPhoto": {
                "type": "string",
                "nullable": true,
                "description": "Photo du client"
              },
              "montant": {
                "type": "number",
                "minimum": 1,
                "description": "Montant de l'abonnement",
                "example": 258
              },
              "motif": {
                "type": "string",
                "nullable": true,
                "description": "Motif de l'abonnement"
              },
              "statut": {
                "type": "string",
                "enum": [
                  "irrevocable",
                  "rejete",
                  "initie",
                  "desactive"
                ],
                "description": "Statut de l'abonnement/paiement programmé (mêmes valeurs que Transaction.statut)\n\ninitie: Programmé, pas encore exécuté\n\nirrevocable: Dernière échéance exécutée avec succès\n\nrejete: Dernière échéance rejetée\n\ndesactive: Abonnement désactivé par le client\n",
                "example": "initie"
              },
              "dateDebut": {
                "type": "string",
                "format": "date-time",
                "description": "Date de debut de l'abonnement",
                "example": "2025-06-19T09:01:40.709Z"
              },
              "dateFin": {
                "type": "string",
                "format": "date-time",
                "description": "Date de fin de l'abonnement",
                "example": "2025-06-19T09:01:40.709Z"
              },
              "frequence": {
                "$ref": "#/components/schemas/AbonnementFrequence",
                "description": "Optionnelle : si renseignée, il s'agit d'un abonnement récurrent ; si absente, il s'agit d'un paiement programmé (exécution unique différée)."
              },
              "periodicite": {
                "type": "number",
                "minimun": 2,
                "description": "Renseignée dans le cas d'une fréquence sur mesure, pour exprimer un multiple de la fréquence choisie (ex. periodicite=5 avec frequence=J -> tous les 5 jours ; periodicite=2 avec frequence=M -> tous les 2 mois).",
                "example": 3
              },
              "compteAlias": {
                "type": "string",
                "nullable": true,
                "description": "Alias du compte principal (compte payeur)."
              },
              "clientPSPNom": {
                "type": "string",
                "nullable": true,
                "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
              },
              "txId": {
                "type": "string",
                "nullable": true,
                "description": "Identifiant technique de la transaction (référence affichée, distincte de endToEndId)."
              },
              "instructionId": {
                "type": "string",
                "nullable": true,
                "description": "Contient l'échéance de la tontine, le cas échéant."
              },
              "statutRaison": {
                "$ref": "#/components/schemas/TransfertCodeRejet",
                "nullable": true
              },
              "rejetDate": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Date du rejet, utilisée en repli quand dateOperation est absente sur une transaction rejetée."
              }
            },
            "required": [
              "endToEndId",
              "sens",
              "compte",
              "dateCreation",
              "clientNom",
              "clientCompte",
              "clientPays",
              "montant",
              "statut",
              "dateDebut"
            ]
          }
        ]
      },
      "AliasFetchResponse": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Alias"
          }
        ]
      },
      "Problem400": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Problem"
          },
          {
            "type": "object",
            "required": [
              "invalidParams"
            ],
            "properties": {
              "invalidParams": {
                "type": "object",
                "required": [
                  "name"
                ],
                "properties": {
                  "name": {
                    "type": "string",
                    "enum": [
                      "client"
                    ],
                    "description": "La porté de l'erreur\nclient: Erreur destinataire car vous ne pouvez pas vous faire un transfert\n",
                    "example": "client"
                  }
                }
              }
            }
          }
        ]
      },
      "TransfertInitiationResponse": {
        "anyOf": [
          {
            "$ref": "#/components/schemas/TransfertInitieParAlias"
          },
          {
            "$ref": "#/components/schemas/TransfertInitieParCompte"
          },
          {
            "$ref": "#/components/schemas/DemandeDePaiementInitiee"
          }
        ]
      },
      "AliasRevendication": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "identifiant de la revendication"
          },
          "alias": {
            "type": "string",
            "description": "numero de telephone revendiqué"
          },
          "statut": {
            "type": "string",
            "enum": [
              "INITIEE",
              "REJETEE",
              "ACCEPTEE"
            ],
            "description": "statut de la demande de revendication\nINITIEE: Initié\nREJETEE: Réjété\nACCEPTEE: Accepté\n"
          },
          "dateDemande": {
            "type": "string",
            "format": "date-time",
            "example": "2025-06-19T09:01:40.709Z",
            "description": "date à laquelle la demande a été initiée"
          },
          "dateVerrouillage": {
            "type": "string",
            "format": "date-time",
            "example": "2025-06-19T09:01:40.709Z",
            "description": "date à laquelle le client ne peut plus utiliser l'alias ne rejete pas la demande de revendication (une semaine après date demande)"
          },
          "dateCloture": {
            "type": "string",
            "format": "date-time",
            "example": "2025-06-19T09:01:40.709Z",
            "description": "date à laquelle la revendication est automatiquement accépté si le client ne rejete pas (une semaine après date de verouillage)"
          },
          "dateAction": {
            "type": "string",
            "format": "date-time",
            "example": "2025-06-19T09:01:40.709Z",
            "description": "date à laquelle le client accepte ou rejete la demande de revendication"
          },
          "shid": {
            "$ref": "#/components/schemas/AliasSHID",
            "description": "L'alias SHID associé au numéro de téléphone revendiqué (celui qui deviendrait le nouvel alias du client en cas d'acceptation de la revendication)."
          }
        },
        "required": [
          "id",
          "alias",
          "statut",
          "dateDemande",
          "dateVerrouillage",
          "dateCloture",
          "shid"
        ]
      },
      "AbonnementCreationRequest": {
        "type": "object",
        "description": "Corps réellement envoyé par TransactionOutputRemote.schedule() : la transaction sous-jacente (bénéficiaire, montant, canal...) a déjà été créée par un appel préalable à POST /transferts (avec action=send_schedule) ; cet appel-ci ne fait que fournir la planification et référencer cette transaction via endToEndId. Diffère volontairement de la forme complète type transfert.",
        "properties": {
          "endToEndId": {
            "type": "string",
            "description": "Identifiant end-to-end de la transaction déjà créée via POST /transferts.",
            "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
          },
          "dateDebut": {
            "type": "string",
            "format": "date-time",
            "description": "Date de la première exécution du paiement programmé.",
            "example": "2025-06-19T09:01:40.709Z"
          },
          "dateFin": {
            "type": "string",
            "format": "date-time",
            "description": "Date de la dernière exécution du paiement programmé.",
            "example": "2025-06-19T09:01:40.709Z"
          },
          "frequence": {
            "$ref": "#/components/schemas/AbonnementFrequence",
            "description": "Renseignée à la création : il s'agit d'un abonnement récurrent. Absente : il s'agit d'un paiement programmé pour une seule fois (exécution unique différée)."
          },
          "periodicite": {
            "type": "integer",
            "description": "Renseignée dans le cas d'une fréquence sur mesure, pour exprimer un multiple de la fréquence choisie (ex. periodicite=5 avec frequence=J -> tous les 5 jours ; periodicite=2 avec frequence=M -> tous les 2 mois).",
            "example": 2
          }
        },
        "required": [
          "endToEndId",
          "dateDebut"
        ]
      },
      "TransfertConfirmationRequete": {
        "type": "object",
        "properties": {
          "montant": {
            "type": "number",
            "format": "double"
          },
          "motif": {
            "type": "string"
          },
          "confirmationDate": {
            "type": "string",
            "format": "date-time"
          },
          "confirmationMethode": {
            "type": "string"
          },
          "latitude": {
            "type": "number",
            "description": "La latitude à laquelle se trouve le client payeur pour initier l'envoi"
          },
          "longitude": {
            "type": "number",
            "description": "La longitude à laquelle se trouve le client payeur pour initier l'envoi"
          }
        },
        "required": [
          "confirmationDate",
          "confirmationMethode",
          "montant"
        ]
      },
      "AbonnementListeResponse": {
        "type": "object",
        "description": "Réponse de GET /souscriptions/{compteId}.",
        "properties": {
          "data": {
            "type": "array",
            "description": "La liste des abonnements du compte, une entrée par abonnement (voir le schéma Abonnement pour le détail de chaque champ).",
            "items": {
              "$ref": "#/components/schemas/Abonnement"
            }
          }
        },
        "required": [
          "data"
        ]
      },
      "AliasRevendicationRejet": {
        "type": "object",
        "properties": {
          "otp": {
            "type": "string",
            "description": "Code otp de verification"
          }
        },
        "required": [
          "otp"
        ]
      },
      "AliasConfirmationRequete": {
        "type": "object",
        "properties": {
          "cle": {
            "type": "string",
            "pattern": "^\\+(?:229|226|225|223|221|220|228|228)\\d{6,10}$",
            "description": "Le numero de téléphone"
          },
          "type": {
            "type": "string",
            "pattern": "MBNO",
            "description": "Le type d'alias à créer (SHID ou MBNO)"
          },
          "compte": {
            "type": "string",
            "description": "Le numéro de compte auquel sera lié l'alias à créer"
          },
          "otp": {
            "type": "string",
            "pattern": "^\\d{6}$",
            "description": "Le code OTP à 6 chiffres envoyé au numéro de téléphone."
          }
        },
        "required": [
          "cle",
          "type",
          "compte",
          "otp"
        ]
      },
      "AliasRevendicationReponse": {
        "type": "object",
        "properties": {
          "decision": {
            "type": "boolean",
            "description": "true dans la cas de l'acceptation et false dans la cas de rejet (dans la cas du rejet un code otp de verification à 6 chiffres est envoyé sur le numero revendiquer)"
          }
        },
        "required": [
          "decision"
        ]
      },
      "CompteSoldeReponse": {
        "type": "object",
        "properties": {
          "solde": {
            "type": "number",
            "example": 1000
          }
        },
        "required": [
          "solde"
        ]
      },
      "ParticipantListeResponse": {
        "xtype": "object",
        "properties": {
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Participant"
            }
          },
          "meta": {
            "$ref": "#/components/schemas/ListeMeta"
          }
        },
        "required": [
          "data",
          "meta"
        ]
      },
      "ListeMeta": {
        "type": "object",
        "required": [
          "total",
          "limit"
        ],
        "properties": {
          "total": {
            "type": "integer",
            "description": "Nombre total d'éléments",
            "example": 1
          },
          "previous": {
            "oneOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "nullable": true,
            "description": "Curseur/numéro de la page précédente. Entier (numéro de page) si le backend est adossé à une base SQL, chaîne (curseur opaque) si NoSQL, ou `null` s'il n'y a pas de page précédente."
          },
          "next": {
            "oneOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "nullable": true,
            "description": "Curseur/numéro de la page suivante. Entier (numéro de page) si le backend est adossé à une base SQL, chaîne (curseur opaque) si NoSQL, ou `null` s'il n'y a pas de page suivante."
          },
          "current": {
            "oneOf": [
              {
                "type": "integer"
              },
              {
                "type": "string"
              }
            ],
            "nullable": true,
            "description": "Curseur/numéro de la page courante. Entier (numéro de page) si le backend est adossé à une base SQL, chaîne (curseur opaque) si NoSQL, ou `null` s'il n'y a pas de page courante."
          },
          "limit": {
            "type": "integer",
            "description": "Limite par page",
            "example": 3
          }
        }
      },
      "Participant": {
        "type": "object",
        "required": [
          "nomMembre",
          "codeMembre",
          "codeBanque",
          "statut",
          "pays"
        ],
        "properties": {
          "nomMembre": {
            "type": "string",
            "description": "Nom du membre dans PI-SPI",
            "example": "PSP Virtuel EME CIB000"
          },
          "codeMembre": {
            "type": "string",
            "description": "Code du membre dans PI-SPI",
            "example": "CIB000"
          },
          "codeBanque": {
            "type": "string",
            "nullable": true,
            "description": "Code de la banque, tel que trouvé dans l'IBAN",
            "example": "CI008"
          },
          "statut": {
            "type": "string",
            "enum": [
              "active",
              "desactive"
            ],
            "description": "Statut du participant\nactive: Activé\ndesactive: Desactivé\n",
            "example": "desactive"
          },
          "pays": {
            "$ref": "#/components/schemas/Pays"
          }
        }
      },
      "NotificationListResponse": {
        "type": "object",
        "required": [
          "meta",
          "data"
        ],
        "properties": {
          "meta": {
            "$ref": "#/components/schemas/ListeMeta"
          },
          "data": {
            "type": "array",
            "items": {
              "$ref": "#/components/schemas/Notification"
            }
          }
        }
      },
      "Notification": {
        "type": "object",
        "required": [
          "id",
          "type",
          "dateAction"
        ],
        "properties": {
          "id": {
            "type": "string",
            "description": "Identifiant de la notification"
          },
          "compte": {
            "type": "string",
            "description": "Compte concerné par la notification."
          },
          "idObject": {
            "type": "string",
            "description": "L'objet qui est à l'origine de la demande qui à induit cette notification"
          },
          "type": {
            "type": "string",
            "enum": [
              "REVENDICATION_INITIEE",
              "REVENDICATION_REJETEE",
              "REVENDICATION_ACCEPTEE",
              "ANNULATION_DEMANDEE",
              "ANNULATION_REJETEE",
              "RTP_INITIEE",
              "RTP_RECUE",
              "RTP_REJETEE",
              "RTP_ACCEPTEE",
              "TRANSFERT_RECU",
              "TRANSFERT_EMIS",
              "ABONNEMENT_REJETE",
              "ABONNEMENT_TERMINE",
              "TRANSFERT_REJETE",
              "AUTH_CONNEXION",
              "AUTH_DECONNEXION"
            ],
            "description": "Type de notification",
            "example": "REVENDICATION_INITIEE"
          },
          "dateAction": {
            "type": "string",
            "format": "date-time",
            "description": "Date action",
            "example": "2025-06-19T09:01:54.969Z"
          },
          "dateLecture": {
            "type": "string",
            "description": "Date action",
            "example": "2025-06-19T09:01:54.969Z"
          },
          "details": {
            "$ref": "#/components/schemas/NotificationDetails"
          }
        }
      },
      "NotificationDetails": {
        "anyOf": [
          {
            "title": "Revendication d'alias",
            "type": "object",
            "properties": {
              "alias": {
                "type": "string",
                "pattern": "^\\+(?:229|226|225|223|221|220|228|228)\\d{6,10}$",
                "description": "L'alias reclamé"
              }
            },
            "required": [
              "alias"
            ]
          },
          {
            "title": "Demande d'annulation",
            "type": "object",
            "properties": {
              "clientNom": {
                "type": "string",
                "description": "Le nom du client à l'origine de la demande"
              },
              "montant": {
                "type": "number",
                "minimum": 1,
                "description": "Montant"
              }
            },
            "required": [
              "clientNom",
              "montant"
            ]
          },
          {
            "title": "Demande de paiement",
            "type": "object",
            "properties": {
              "clientAlias": {
                "type": "string",
                "description": "L'alias du client à l'origine de la demande"
              },
              "clientCategorie": {
                "$ref": "#/components/schemas/ClientCategorie",
                "description": "La catégorie du client à l'origine de la demande"
              },
              "clientNom": {
                "type": "string",
                "description": "Le nom du client à l'origine de la demande"
              },
              "montant": {
                "type": "number",
                "minimum": 1,
                "description": "Montant"
              }
            },
            "required": [
              "clientNom",
              "clientAlias",
              "clientCategorie",
              "montant"
            ]
          },
          {
            "title": "Transfert ou abonnement rejeté",
            "description": "Utilisé pour TRANSFERT_REJETE, ABONNEMENT_REJETE et ANNULATION_REJETEE (voir NotificationPageListeItem._buildSubtitle).",
            "type": "object",
            "properties": {
              "clientNom": {
                "type": "string",
                "description": "Le nom du client concerné par le rejet."
              },
              "montant": {
                "type": "number",
                "minimum": 1,
                "description": "Montant (affiché si présent, quel que soit le type de notification)."
              },
              "endToEndId": {
                "type": "string",
                "description": "Identifiant end-to-end de la transaction concernée, si applicable."
              }
            },
            "required": [
              "clientNom"
            ]
          }
        ]
      },
      "TransfertConfirmationResponseSSE": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/TransfertConfirmationResponse"
          }
        }
      },
      "TransfertConfirmationResponse": {
        "description": "Flux SSE dont chaque `data:` contient un JSON sérialisé  \nconforme au schéma [TransfertConfirmationResponse](#/components/schemas/TransfertConfirmationResponse).\ndata: \"{\\\"endToEndId\\\":\\\"ESND00620240101153554Destinataire9e\\\",\\\"statut\\\":\\\"irrevocable\\\",\\\"dateIrrevocabilite\\\":\\\"2025-06-26T12:00:00Z\\\"}\"\ndata: \"{\\\"endToEndId\\\":\\\"ESND00620240101153554Destinataire9e\\\",\\\"statut\\\":\\\"rejete\\\",\\\"codeRejet\\\":\\\"AG07\\\"}\"\n",
        "anyOf": [
          {
            "title": "Envoi accepté",
            "type": "object",
            "properties": {
              "endToEndId": {
                "type": "string",
                "description": "Identifiant unique de la transaction",
                "example": "ESND00620240101153554Destinataire9e"
              },
              "statut": {
                "$ref": "#/components/schemas/TransfertStatut"
              },
              "dateIrrevocabilite": {
                "type": "string",
                "format": "date-time",
                "description": "Date d'irrévocabilité de la transaction",
                "example": "2025-06-26T12:00:00Z"
              }
            },
            "required": [
              "endToEndId",
              "statut",
              "dateIrrevocabilite"
            ]
          },
          {
            "title": "Envoi rejeté",
            "type": "object",
            "properties": {
              "endToEndId": {
                "type": "string",
                "description": "Identifiant unique de la transaction",
                "example": "ESND00620240101153554Destinataire9e"
              },
              "statut": {
                "$ref": "#/components/schemas/TransfertStatut"
              },
              "codeRejet": {
                "$ref": "#/components/schemas/TransfertCodeRejet"
              }
            },
            "required": [
              "endToEndId",
              "statut",
              "codeRejet"
            ]
          }
        ]
      },
      "TransfertCodeRejet": {
        "type": "string",
        "enum": [
          "AG11",
          "AB09",
          "AG07",
          "AB03",
          "AG10",
          "AM04",
          "AB11",
          "FF10",
          "AG12",
          "AC03",
          "AC04",
          "AC07",
          "AC06",
          "AM21",
          "RR04",
          "AG01"
        ],
        "description": "Code de rejet du transfert\n\nAG11: L'agent créancier du message est suspendu du système de paiement en temps réel\n\nAB09: Transaction rejetée à cause d'une erreur chez le participant payé\n\nAG07: Transaction rejetée à cause d'une erreur de reservation de fond\n\nAB03: Message en Timeout\n\nAG10: L'agent du message est suspendu du système de paiement en temps réel. Utilisation générique s'il est impossible de déterminer qui est suspendu\n\nAM04: Le solde de garantie du participant est insuffisant\n\nAB11: Transaction rejetée à cause d'un Timeout au niveau du participant\n\nFF10: Transaction rejetée à cause d'une erreur au niveau du participant\n\nAG12: Transaction rejetée car vous ne pouvez pas faire un transfert à vous même\n\nAC03: Le numéro de compte du bénéficiaire est invalide\n\nAC04: Le numéro de compte de l'expéditeur est clôturé\n\nAC07: Le numéro de compte du bénéficiaire est clôturé\n\nAC06: Le numéro de compte du bénéficiaire est bloqué\n\nAM21: Le montant dépasse la limite que ce bénéficiaire peut recevoir\n\nRR04: Ce bénéficiaire ne peut pas recevoir de fonds (restrictions réglementaires)\n\nAG01: Transaction interdite sur ce type de compte\n\n",
        "example": "AB09"
      },
      "NotificationModificationRequest": {
        "type": "object",
        "properties": {
          "dateLecture": {
            "type": "string",
            "format": "date-time",
            "description": "Date de l'opération"
          }
        }
      },
      "NotificationCompteResponse": {
        "type": "object",
        "properties": {
          "total": {
            "type": "number"
          }
        }
      },
      "AliasRevendicationRequete": {
        "type": "object",
        "properties": {
          "compte": {
            "type": "integer",
            "description": "numero de compte de client"
          },
          "alias": {
            "type": "string",
            "pattern": "^\\+(?:229|226|225|223|221|220|228|228)\\d{6,10}$",
            "description": "le nméro de télephone revendiquer"
          }
        },
        "required": [
          "compte",
          "alias"
        ]
      },
      "TransfertListeResponse": {
        "type": "object",
        "description": "Réponse de GET /transferts.",
        "properties": {
          "data": {
            "type": "array",
            "description": "La liste des transactions correspondant aux filtres de la requête, une entrée par transaction (voir le schéma Transaction pour le détail de chaque champ).",
            "items": {
              "$ref": "#/components/schemas/Transaction"
            }
          },
          "meta": {
            "$ref": "#/components/schemas/ListeMeta",
            "description": "Métadonnées de pagination de la liste retournée dans data."
          }
        },
        "required": [
          "data",
          "meta"
        ]
      },
      "AbonnementModificationRequest": {
        "anyOf": [
          {
            "title": "Le motif",
            "properties": {
              "motif": {
                "type": "string"
              }
            }
          },
          {
            "title": "La catégorie (locale au SDK, non transmise au backend)",
            "type": "object",
            "properties": {
              "categorie": {
                "type": "string",
                "description": "Champ géré uniquement côté client (SubscriptionCommand -- voir Transaction.categorie, commenté \"Local only\" dans le SDK) : quand seul ce champ est fourni, le SDK ne fait AUCUN appel réseau, il patche uniquement son cache local."
              }
            },
            "required": [
              "categorie"
            ]
          },
          {
            "title": "La fréquence",
            "type": "object",
            "properties": {
              "dateDebut": {
                "type": "string",
                "format": "date-time",
                "description": "Date de debut de l'abonnement",
                "example": "2025-06-19T09:01:40.709Z"
              },
              "dateFin": {
                "type": "string",
                "format": "date-time",
                "description": "Date de fin de l'abonnement",
                "example": "2025-06-19T09:01:40.709Z"
              },
              "frequence": {
                "$ref": "#/components/schemas/AbonnementFrequence"
              },
              "periodicite": {
                "type": "number",
                "minimun": 2,
                "description": "La périodicite de la frequence",
                "example": 3
              }
            },
            "required": [
              "dateDebut",
              "frequence"
            ]
          }
        ]
      },
      "NotificationSearchFilterOption": {
        "type": "string",
        "enum": [
          "TOUT",
          "NON_LUE",
          "RTP",
          "TRANSFERT",
          "ANNULATION",
          "ABONNEMENT",
          "REVENDICATION",
          "AUTH"
        ],
        "description": "Filtre prédéfini de la liste des notifications (SDK: NotificationSearchFilterOption).",
        "example": "NON_LUE"
      },
      "NotificationType": {
        "type": "string",
        "enum": [
          "REVENDICATION_INITIEE",
          "REVENDICATION_REJETEE",
          "REVENDICATION_ACCEPTEE",
          "ANNULATION_DEMANDEE",
          "ANNULATION_REJETEE",
          "RTP_INITIEE",
          "RTP_RECUE",
          "RTP_REJETEE",
          "RTP_ACCEPTEE",
          "TRANSFERT_RECU",
          "TRANSFERT_EMIS",
          "ABONNEMENT_REJETE",
          "ABONNEMENT_TERMINE",
          "TRANSFERT_REJETE",
          "AUTH_CONNEXION",
          "AUTH_DECONNEXION"
        ],
        "description": "Type de notification",
        "example": "TRANSFERT_RECU"
      },
      "TransfertRejetRequete": {
        "type": "object",
        "properties": {
          "raison": {
            "$ref": "#/components/schemas/TransfertRejetRaison"
          }
        },
        "required": [
          "raison"
        ]
      },
      "TransfertInitieParAlias": {
        "title": "Transfert par alias",
        "type": "object",
        "properties": {
          "endToEndId": {
            "type": "string",
            "description": "Identifiant end-to-end",
            "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
          },
          "sens": {
            "type": "string",
            "enum": [
              "debit",
              "credit"
            ],
            "description": "Sens de l'opération",
            "example": "credit"
          },
          "compte": {
            "type": "string",
            "description": "Compte principal",
            "example": "doucoure"
          },
          "dateCreation": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création",
            "example": "2025-06-19T09:01:40.709Z"
          },
          "clientAlias": {
            "type": "string",
            "format": "uuid",
            "description": "Alias du client",
            "example": "92a1027d-3260-4cd5-a1fe-16aefd05a554"
          },
          "clientNom": {
            "type": "string",
            "description": "Nom du client",
            "example": "Mbore"
          },
          "clientTypeCompte": {
            "$ref": "#/components/schemas/CompteType",
            "description": "Type de compte du client."
          },
          "clientPays": {
            "$ref": "#/components/schemas/Pays"
          },
          "clientPSP": {
            "type": "string",
            "description": "Code membre du participant du client.",
            "example": "CIC004"
          },
          "clientPhoto": {
            "type": "string",
            "nullable": true,
            "description": "Photo du client"
          },
          "montant": {
            "type": "number",
            "minimum": 1,
            "description": "Montant du transfert",
            "example": 258
          },
          "montantFrais": {
            "type": "number",
            "minimum": 0,
            "description": "Montant des frais",
            "example": 0
          },
          "motif": {
            "type": "string",
            "nullable": true,
            "description": "Motif du transfert"
          },
          "facture": {
            "type": "string",
            "nullable": true,
            "description": "La facture reglée"
          },
          "statut": {
            "type": "string",
            "enum": [
              "initie"
            ],
            "description": "Statut de la transaction à l'initiation : toujours \"initie\" (pas encore irrévocable).",
            "example": "initie"
          },
          "compteAlias": {
            "type": "string",
            "nullable": true,
            "description": "Alias du compte principal (compte payeur)."
          },
          "clientPSPNom": {
            "type": "string",
            "nullable": true,
            "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
          },
          "txId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant technique de la transaction (référence affichée, distincte de endToEndId)."
          },
          "instructionId": {
            "type": "string",
            "nullable": true,
            "description": "Contient l'échéance de la tontine, le cas échéant."
          }
        },
        "required": [
          "endToEndId",
          "sens",
          "compte",
          "dateCreation",
          "clientNom",
          "clientAlias",
          "clientPays",
          "montant",
          "statut"
        ]
      },
      "TransfertInitieParCompte": {
        "title": "Transfert par compte",
        "type": "object",
        "properties": {
          "endToEndId": {
            "type": "string",
            "description": "Identifiant end-to-end",
            "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
          },
          "sens": {
            "type": "string",
            "enum": [
              "debit",
              "credit"
            ],
            "description": "Sens de l'opération",
            "example": "credit"
          },
          "compte": {
            "type": "string",
            "description": "Compte principal",
            "example": "doucoure"
          },
          "dateCreation": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création",
            "example": "2025-06-19T09:01:40.709Z"
          },
          "clientCompte": {
            "type": "string",
            "description": "Compte du client",
            "example": "mseye"
          },
          "clientNom": {
            "type": "string",
            "description": "Nom du client",
            "example": "Mbore"
          },
          "clientTypeCompte": {
            "$ref": "#/components/schemas/CompteType",
            "description": "Type de compte du client."
          },
          "clientPays": {
            "$ref": "#/components/schemas/Pays"
          },
          "clientPSP": {
            "type": "string",
            "description": "Code membre du participant du client.",
            "example": "CIC004"
          },
          "clientPhoto": {
            "type": "string",
            "nullable": true,
            "description": "Photo du client"
          },
          "montant": {
            "type": "number",
            "minimum": 1,
            "description": "Montant du transfert",
            "example": 258
          },
          "montantFrais": {
            "type": "number",
            "minimum": 0,
            "description": "Montant des frais",
            "example": 0
          },
          "motif": {
            "type": "string",
            "nullable": true,
            "description": "Motif du transfert"
          },
          "facture": {
            "type": "string",
            "nullable": true,
            "description": "La facture reglée"
          },
          "statut": {
            "type": "string",
            "enum": [
              "initie"
            ],
            "description": "Statut de la transaction à l'initiation : toujours \"initie\" (pas encore irrévocable).",
            "example": "initie"
          },
          "compteAlias": {
            "type": "string",
            "nullable": true,
            "description": "Alias du compte principal (compte payeur)."
          },
          "clientPSPNom": {
            "type": "string",
            "nullable": true,
            "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
          },
          "txId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant technique de la transaction (référence affichée, distincte de endToEndId)."
          },
          "instructionId": {
            "type": "string",
            "nullable": true,
            "description": "Contient l'échéance de la tontine, le cas échéant."
          }
        },
        "required": [
          "endToEndId",
          "sens",
          "compte",
          "dateCreation",
          "clientNom",
          "clientCompte",
          "clientPays",
          "montant",
          "statut"
        ]
      },
      "DemandeDePaiementInitiee": {
        "type": "object",
        "properties": {
          "endToEndId": {
            "type": "string",
            "description": "Identifiant end-to-end",
            "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
          },
          "sens": {
            "type": "string",
            "enum": [
              "debit",
              "credit"
            ],
            "description": "Sens de l'opération",
            "example": "credit"
          },
          "compte": {
            "type": "string",
            "description": "Compte principal",
            "example": "doucoure"
          },
          "dateCreation": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création",
            "example": "2025-06-19T09:01:40.709Z"
          },
          "clientAlias": {
            "type": "string",
            "format": "uuid",
            "description": "Alias du client",
            "example": "92a1027d-3260-4cd5-a1fe-16aefd05a554"
          },
          "clientNom": {
            "type": "string",
            "description": "Nom du client",
            "example": "Mbore"
          },
          "clientTypeCompte": {
            "$ref": "#/components/schemas/CompteType",
            "description": "Type de compte du client."
          },
          "clientPays": {
            "$ref": "#/components/schemas/Pays"
          },
          "clientPSP": {
            "type": "string",
            "description": "Code membre du participant du client.",
            "example": "CIC004"
          },
          "clientPhoto": {
            "type": "string",
            "nullable": true,
            "description": "Photo du client"
          },
          "montant": {
            "type": "number",
            "minimum": 1,
            "description": "Montant de la demande de paiement",
            "example": 258
          },
          "montantFrais": {
            "type": "number",
            "minimum": 0,
            "description": "Montant des frais",
            "example": 0
          },
          "motif": {
            "type": "string",
            "nullable": true,
            "description": "Motif de la demande de paiement"
          },
          "facture": {
            "type": "string",
            "nullable": true,
            "description": "La facture reglée"
          },
          "statut": {
            "type": "string",
            "enum": [
              "initie"
            ],
            "description": "Statut de la transaction à l'initiation : toujours \"initie\" (pas encore irrévocable).",
            "example": "initie"
          },
          "dateDemande": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date demande"
          },
          "dateReponse": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date reponse"
          },
          "remise": {
            "type": "number",
            "minimum": 0,
            "description": "Montant de la remise",
            "example": 0
          },
          "retraitAchat": {
            "type": "number",
            "minimum": 0,
            "description": "Montant retrait achat",
            "example": 0
          },
          "retraitMontant": {
            "type": "number",
            "minimum": 0,
            "description": "Montant retrait",
            "example": 0
          },
          "retraitFrais": {
            "type": "number",
            "minimum": 0,
            "description": "Frais retrait",
            "example": 0
          },
          "differe": {
            "type": "boolean",
            "description": "Débit différé",
            "example": true
          },
          "differeFrequence": {
            "$ref": "#/components/schemas/AbonnementFrequence",
            "description": "Si paiement différé",
            "example": true
          },
          "differeOccurence": {
            "type": "number",
            "description": "Si paiement différé"
          },
          "differeMontant": {
            "type": "number",
            "minimum": 0,
            "description": "Si paiement différé",
            "example": 0
          },
          "dateExpiration": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date d'échéance de la demande de paiement, au-delà de laquelle aucune action n'est possible sur la demande de paiement."
          },
          "signature": {
            "type": "string",
            "nullable": true,
            "description": "Clé de chiffrement du rapport du tirage (tontine)."
          },
          "clientPSPNom": {
            "type": "string",
            "nullable": true,
            "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
          }
        },
        "required": [
          "endToEndId",
          "sens",
          "compte",
          "dateCreation",
          "clientNom",
          "clientAlias",
          "clientPays",
          "montant",
          "statut",
          "dateDemande"
        ],
        "title": "Demande de paiement"
      },
      "TransfertConfirmeParAlias": {
        "title": "Transfert par alias",
        "type": "object",
        "properties": {
          "endToEndId": {
            "type": "string",
            "description": "Identifiant end-to-end",
            "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
          },
          "sens": {
            "type": "string",
            "enum": [
              "debit"
            ],
            "description": "Sens de l'opération : toujours \"debit\", confirmer un transfert se fait toujours du point de vue du payeur.",
            "example": "debit"
          },
          "compte": {
            "type": "string",
            "description": "Compte principal",
            "example": "doucoure"
          },
          "dateCreation": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création",
            "example": "2025-06-19T09:01:40.709Z"
          },
          "clientAlias": {
            "type": "string",
            "format": "uuid",
            "description": "Alias du client",
            "example": "92a1027d-3260-4cd5-a1fe-16aefd05a554"
          },
          "clientNom": {
            "type": "string",
            "description": "Nom du client",
            "example": "Mbore"
          },
          "clientTypeCompte": {
            "$ref": "#/components/schemas/CompteType",
            "description": "Type de compte du client."
          },
          "clientPays": {
            "$ref": "#/components/schemas/Pays"
          },
          "clientPSP": {
            "type": "string",
            "description": "Code membre du participant du client.",
            "example": "CIC004"
          },
          "clientPhoto": {
            "type": "string",
            "nullable": true,
            "description": "Photo du client"
          },
          "montant": {
            "type": "number",
            "minimum": 1,
            "description": "Montant du transfert",
            "example": 258
          },
          "montantFrais": {
            "type": "number",
            "minimum": 0,
            "description": "Montant des frais",
            "example": 0
          },
          "motif": {
            "type": "string",
            "nullable": true,
            "description": "Motif du transfert"
          },
          "facture": {
            "type": "string",
            "nullable": true,
            "description": "La facture reglée"
          },
          "statut": {
            "type": "string",
            "enum": [
              "initie"
            ],
            "description": "Statut de la transaction : toujours \"initie\" -- confirmer un transfert ne fait qu'initier son règlement (voir GET /transferts/{id}/reponses pour le statut final, réglé de façon asynchrone).",
            "example": "initie"
          },
          "compteAlias": {
            "type": "string",
            "nullable": true,
            "description": "Alias du compte principal (compte payeur)."
          },
          "clientPSPNom": {
            "type": "string",
            "nullable": true,
            "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
          },
          "txId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant technique de la transaction (référence affichée, distincte de endToEndId)."
          },
          "instructionId": {
            "type": "string",
            "nullable": true,
            "description": "Contient l'échéance de la tontine, le cas échéant."
          }
        },
        "required": [
          "endToEndId",
          "sens",
          "compte",
          "dateCreation",
          "clientNom",
          "clientAlias",
          "clientPays",
          "montant",
          "statut"
        ]
      },
      "TransfertConfirmeParCompte": {
        "title": "Transfert par compte",
        "type": "object",
        "properties": {
          "endToEndId": {
            "type": "string",
            "description": "Identifiant end-to-end",
            "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
          },
          "sens": {
            "type": "string",
            "enum": [
              "debit"
            ],
            "description": "Sens de l'opération : toujours \"debit\", confirmer un transfert se fait toujours du point de vue du payeur.",
            "example": "debit"
          },
          "compte": {
            "type": "string",
            "description": "Compte principal",
            "example": "doucoure"
          },
          "dateCreation": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création",
            "example": "2025-06-19T09:01:40.709Z"
          },
          "clientCompte": {
            "type": "string",
            "description": "Compte du client",
            "example": "mseye"
          },
          "clientNom": {
            "type": "string",
            "description": "Nom du client",
            "example": "Mbore"
          },
          "clientTypeCompte": {
            "$ref": "#/components/schemas/CompteType",
            "description": "Type de compte du client."
          },
          "clientPays": {
            "$ref": "#/components/schemas/Pays"
          },
          "clientPSP": {
            "type": "string",
            "description": "Code membre du participant du client.",
            "example": "CIC004"
          },
          "clientPhoto": {
            "type": "string",
            "nullable": true,
            "description": "Photo du client"
          },
          "montant": {
            "type": "number",
            "minimum": 1,
            "description": "Montant du transfert",
            "example": 258
          },
          "montantFrais": {
            "type": "number",
            "minimum": 0,
            "description": "Montant des frais",
            "example": 0
          },
          "motif": {
            "type": "string",
            "nullable": true,
            "description": "Motif du transfert"
          },
          "facture": {
            "type": "string",
            "nullable": true,
            "description": "La facture reglée"
          },
          "statut": {
            "type": "string",
            "enum": [
              "initie"
            ],
            "description": "Statut de la transaction : toujours \"initie\" -- confirmer un transfert ne fait qu'initier son règlement (voir GET /transferts/{id}/reponses pour le statut final, réglé de façon asynchrone).",
            "example": "initie"
          },
          "compteAlias": {
            "type": "string",
            "nullable": true,
            "description": "Alias du compte principal (compte payeur)."
          },
          "clientPSPNom": {
            "type": "string",
            "nullable": true,
            "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
          },
          "txId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant technique de la transaction (référence affichée, distincte de endToEndId)."
          },
          "instructionId": {
            "type": "string",
            "nullable": true,
            "description": "Contient l'échéance de la tontine, le cas échéant."
          }
        },
        "required": [
          "endToEndId",
          "sens",
          "compte",
          "dateCreation",
          "clientNom",
          "clientCompte",
          "clientPays",
          "montant",
          "statut"
        ]
      },
      "TransfertRejetRaison": {
        "type": "string",
        "enum": [
          "BE05",
          "AM09",
          "APAR",
          "RR07",
          "FR01",
          "CUST"
        ],
        "description": "Raison du rejet\n\nBE05: Erreur sur le destinataire\n\nAM09: Erreur sur le montant\n\nAPAR: Déjà payé\n\nRR07: Facture\n\nFR01: Fraude\n\nCUST: Autre raison (valeur utilisée par le SDK pour le rejet d'une demande d'annulation, où aucun choix de raison n'est proposé à l'utilisateur)\n",
        "example": "CUST"
      },
      "DemandeDePaiementRejetee": {
        "type": "object",
        "properties": {
          "endToEndId": {
            "type": "string",
            "description": "Identifiant end-to-end",
            "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
          },
          "sens": {
            "type": "string",
            "enum": [
              "debit"
            ],
            "description": "Sens de l'opération : toujours \"debit\" du point de vue du payeur pour une demande de paiement rejetée.",
            "example": "debit"
          },
          "compte": {
            "type": "string",
            "description": "Compte principal",
            "example": "doucoure"
          },
          "dateCreation": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création",
            "example": "2025-06-19T09:01:40.709Z"
          },
          "clientAlias": {
            "type": "string",
            "format": "uuid",
            "description": "Alias du client",
            "example": "92a1027d-3260-4cd5-a1fe-16aefd05a554"
          },
          "clientNom": {
            "type": "string",
            "description": "Nom du client",
            "example": "Mbore"
          },
          "clientTypeCompte": {
            "$ref": "#/components/schemas/CompteType",
            "description": "Type de compte du client."
          },
          "clientPays": {
            "$ref": "#/components/schemas/Pays"
          },
          "clientPSP": {
            "type": "string",
            "description": "Code membre du participant du client.",
            "example": "CIC004"
          },
          "clientPhoto": {
            "type": "string",
            "nullable": true,
            "description": "Photo du client"
          },
          "montant": {
            "type": "number",
            "minimum": 1,
            "description": "Montant de la demande de paiement",
            "example": 258
          },
          "montantFrais": {
            "type": "number",
            "minimum": 0,
            "description": "Montant des frais",
            "example": 0
          },
          "motif": {
            "type": "string",
            "nullable": true,
            "description": "Motif de la demande de paiement"
          },
          "facture": {
            "type": "string",
            "nullable": true,
            "description": "La facture reglée"
          },
          "statut": {
            "type": "string",
            "enum": [
              "rejete"
            ],
            "description": "Statut de la demande de paiement : toujours \"rejete\" dans cette réponse.",
            "example": "rejete"
          },
          "dateDemande": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date demande"
          },
          "dateReponse": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date reponse"
          },
          "remise": {
            "type": "number",
            "minimum": 0,
            "description": "Montant de la remise",
            "example": 0
          },
          "retraitAchat": {
            "type": "number",
            "minimum": 0,
            "description": "Montant retrait achat",
            "example": 0
          },
          "retraitMontant": {
            "type": "number",
            "minimum": 0,
            "description": "Montant retrait",
            "example": 0
          },
          "retraitFrais": {
            "type": "number",
            "minimum": 0,
            "description": "Frais retrait",
            "example": 0
          },
          "differe": {
            "type": "boolean",
            "description": "Débit différé",
            "example": true
          },
          "differeFrequence": {
            "$ref": "#/components/schemas/AbonnementFrequence",
            "description": "Si paiement différé",
            "example": true
          },
          "differeOccurence": {
            "type": "number",
            "description": "Si paiement différé"
          },
          "differeMontant": {
            "type": "number",
            "minimum": 0,
            "description": "Si paiement différé",
            "example": 0
          },
          "dateExpiration": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date d'échéance de la demande de paiement, au-delà de laquelle aucune action n'est possible sur la demande de paiement."
          },
          "signature": {
            "type": "string",
            "nullable": true,
            "description": "Clé de chiffrement du rapport du tirage (tontine)."
          },
          "clientPSPNom": {
            "type": "string",
            "nullable": true,
            "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
          },
          "subscriptionId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant de l'abonnement/programmation, renseigné uniquement lorsque l'utilisateur a programmé la demande de paiement."
          },
          "statutRaison": {
            "$ref": "#/components/schemas/TransfertRejetRaison",
            "description": "Raison du rejet de la demande de paiement, choisie par le payeur."
          }
        },
        "required": [
          "endToEndId",
          "sens",
          "compte",
          "dateCreation",
          "clientNom",
          "clientAlias",
          "clientPays",
          "montant",
          "statut",
          "dateDemande",
          "statutRaison"
        ],
        "title": "Demande de paiement"
      },
      "TransfertAnnulationRejeteeParAlias": {
        "title": "Transfert par alias",
        "type": "object",
        "properties": {
          "endToEndId": {
            "type": "string",
            "description": "Identifiant end-to-end",
            "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
          },
          "sens": {
            "type": "string",
            "enum": [
              "debit",
              "credit"
            ],
            "description": "Sens de l'opération",
            "example": "credit"
          },
          "compte": {
            "type": "string",
            "description": "Compte principal",
            "example": "doucoure"
          },
          "dateOperation": {
            "type": "string",
            "format": "date-time",
            "description": "Date d'irrévocabilité de la transaction.",
            "example": "2025-06-19T09:01:54.969Z"
          },
          "dateCreation": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création",
            "example": "2025-06-19T09:01:40.709Z"
          },
          "clientAlias": {
            "type": "string",
            "format": "uuid",
            "description": "Alias du client",
            "example": "92a1027d-3260-4cd5-a1fe-16aefd05a554"
          },
          "clientNom": {
            "type": "string",
            "description": "Nom du client",
            "example": "Mbore"
          },
          "clientTypeCompte": {
            "$ref": "#/components/schemas/CompteType",
            "description": "Type de compte du client."
          },
          "clientPays": {
            "$ref": "#/components/schemas/Pays"
          },
          "clientPSP": {
            "type": "string",
            "description": "Code membre du participant du client.",
            "example": "CIC004"
          },
          "clientPhoto": {
            "type": "string",
            "nullable": true,
            "description": "Photo du client"
          },
          "montant": {
            "type": "number",
            "minimum": 1,
            "description": "Montant du transfert",
            "example": 258
          },
          "montantFrais": {
            "type": "number",
            "minimum": 0,
            "description": "Montant des frais",
            "example": 0
          },
          "motif": {
            "type": "string",
            "nullable": true,
            "description": "Motif du transfert"
          },
          "facture": {
            "type": "string",
            "nullable": true,
            "description": "La facture reglée"
          },
          "statut": {
            "type": "string",
            "enum": [
              "irrevocable"
            ],
            "description": "Statut du transfert sous-jacent : reste \"irrevocable\", seule la demande d'annulation a été rejetée.",
            "example": "irrevocable"
          },
          "annulationId": {
            "type": "string",
            "nullable": true,
            "description": "ID de la demande d'annulation, présent une fois une demande initiée sur cette transaction."
          },
          "annulationDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de la demande d'annulation, présente une fois une demande initiée sur cette transaction."
          },
          "annulationStatut": {
            "type": "string",
            "enum": [
              "rejete"
            ],
            "description": "Statut de la demande d'annulation : toujours \"rejete\" dans cette réponse.",
            "example": "rejete"
          },
          "annulationStatutRaison": {
            "type": "string",
            "enum": [
              "CUST"
            ],
            "description": "Raison du rejet de la demande d'annulation : toujours \"CUST\", le rejet d'une demande d'annulation ne propose aucun choix de raison à l'utilisateur (voir TransfertRejetRequete).",
            "example": "CUST"
          },
          "compteAlias": {
            "type": "string",
            "nullable": true,
            "description": "Alias du compte principal (compte payeur)."
          },
          "clientPSPNom": {
            "type": "string",
            "nullable": true,
            "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
          },
          "txId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant technique de la transaction (référence affichée, distincte de endToEndId)."
          },
          "instructionId": {
            "type": "string",
            "nullable": true,
            "description": "Contient l'échéance de la tontine, le cas échéant."
          },
          "annulationRaison": {
            "$ref": "#/components/schemas/TransfertCodeRejet",
            "nullable": true,
            "description": "Raison de la demande d'annulation, fournie par le demandeur (voir aussi TransfertAnnulationRequete pour les codes envoyés par le client). Présent uniquement si annulationStatut == \"rejete\"."
          }
        },
        "required": [
          "endToEndId",
          "sens",
          "compte",
          "dateOperation",
          "dateCreation",
          "clientNom",
          "clientAlias",
          "clientPays",
          "montant",
          "statut",
          "annulationId",
          "annulationDate",
          "annulationRaison",
          "annulationStatut",
          "annulationStatutRaison"
        ]
      },
      "TransfertAnnulationRejeteeParCompte": {
        "title": "Transfert par compte",
        "type": "object",
        "properties": {
          "endToEndId": {
            "type": "string",
            "description": "Identifiant end-to-end",
            "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
          },
          "sens": {
            "type": "string",
            "enum": [
              "debit",
              "credit"
            ],
            "description": "Sens de l'opération",
            "example": "credit"
          },
          "compte": {
            "type": "string",
            "description": "Compte principal",
            "example": "doucoure"
          },
          "dateOperation": {
            "type": "string",
            "format": "date-time",
            "description": "Date d'irrévocabilité de la transaction.",
            "example": "2025-06-19T09:01:54.969Z"
          },
          "dateCreation": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création",
            "example": "2025-06-19T09:01:40.709Z"
          },
          "clientCompte": {
            "type": "string",
            "description": "Compte du client",
            "example": "mseye"
          },
          "clientNom": {
            "type": "string",
            "description": "Nom du client",
            "example": "Mbore"
          },
          "clientTypeCompte": {
            "$ref": "#/components/schemas/CompteType",
            "description": "Type de compte du client."
          },
          "clientPays": {
            "$ref": "#/components/schemas/Pays"
          },
          "clientPSP": {
            "type": "string",
            "description": "Code membre du participant du client.",
            "example": "CIC004"
          },
          "clientPhoto": {
            "type": "string",
            "nullable": true,
            "description": "Photo du client"
          },
          "montant": {
            "type": "number",
            "minimum": 1,
            "description": "Montant du transfert",
            "example": 258
          },
          "montantFrais": {
            "type": "number",
            "minimum": 0,
            "description": "Montant des frais",
            "example": 0
          },
          "motif": {
            "type": "string",
            "nullable": true,
            "description": "Motif du transfert"
          },
          "facture": {
            "type": "string",
            "nullable": true,
            "description": "La facture reglée"
          },
          "statut": {
            "type": "string",
            "enum": [
              "irrevocable"
            ],
            "description": "Statut du transfert sous-jacent : reste \"irrevocable\", seule la demande d'annulation a été rejetée.",
            "example": "irrevocable"
          },
          "annulationId": {
            "type": "string",
            "nullable": true,
            "description": "ID de la demande d'annulation, présent une fois une demande initiée sur cette transaction."
          },
          "annulationDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de la demande d'annulation, présente une fois une demande initiée sur cette transaction."
          },
          "annulationStatut": {
            "type": "string",
            "enum": [
              "rejete"
            ],
            "description": "Statut de la demande d'annulation : toujours \"rejete\" dans cette réponse.",
            "example": "rejete"
          },
          "annulationStatutRaison": {
            "type": "string",
            "enum": [
              "CUST"
            ],
            "description": "Raison du rejet de la demande d'annulation : toujours \"CUST\", le rejet d'une demande d'annulation ne propose aucun choix de raison à l'utilisateur (voir TransfertRejetRequete).",
            "example": "CUST"
          },
          "compteAlias": {
            "type": "string",
            "nullable": true,
            "description": "Alias du compte principal (compte payeur)."
          },
          "clientPSPNom": {
            "type": "string",
            "nullable": true,
            "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
          },
          "txId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant technique de la transaction (référence affichée, distincte de endToEndId)."
          },
          "instructionId": {
            "type": "string",
            "nullable": true,
            "description": "Contient l'échéance de la tontine, le cas échéant."
          },
          "annulationRaison": {
            "$ref": "#/components/schemas/TransfertCodeRejet",
            "nullable": true,
            "description": "Raison de la demande d'annulation, fournie par le demandeur (voir aussi TransfertAnnulationRequete pour les codes envoyés par le client). Présent uniquement si annulationStatut == \"rejete\"."
          }
        },
        "required": [
          "endToEndId",
          "sens",
          "compte",
          "dateOperation",
          "dateCreation",
          "clientNom",
          "clientCompte",
          "clientPays",
          "montant",
          "statut",
          "annulationId",
          "annulationDate",
          "annulationRaison",
          "annulationStatut",
          "annulationStatutRaison"
        ]
      },
      "TransfertAnnulationInitieeParAlias": {
        "title": "Transfert par alias",
        "type": "object",
        "properties": {
          "endToEndId": {
            "type": "string",
            "description": "Identifiant end-to-end",
            "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
          },
          "sens": {
            "type": "string",
            "enum": [
              "debit",
              "credit"
            ],
            "description": "Sens de l'opération",
            "example": "credit"
          },
          "compte": {
            "type": "string",
            "description": "Compte principal",
            "example": "doucoure"
          },
          "dateOperation": {
            "type": "string",
            "format": "date-time",
            "description": "Date d'irrévocabilité de la transaction.",
            "example": "2025-06-19T09:01:54.969Z"
          },
          "dateCreation": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création",
            "example": "2025-06-19T09:01:40.709Z"
          },
          "clientAlias": {
            "type": "string",
            "format": "uuid",
            "description": "Alias du client",
            "example": "92a1027d-3260-4cd5-a1fe-16aefd05a554"
          },
          "clientNom": {
            "type": "string",
            "description": "Nom du client",
            "example": "Mbore"
          },
          "clientTypeCompte": {
            "$ref": "#/components/schemas/CompteType",
            "description": "Type de compte du client."
          },
          "clientPays": {
            "$ref": "#/components/schemas/Pays"
          },
          "clientPSP": {
            "type": "string",
            "description": "Code membre du participant du client.",
            "example": "CIC004"
          },
          "clientPhoto": {
            "type": "string",
            "nullable": true,
            "description": "Photo du client"
          },
          "montant": {
            "type": "number",
            "minimum": 1,
            "description": "Montant du transfert",
            "example": 258
          },
          "montantFrais": {
            "type": "number",
            "minimum": 0,
            "description": "Montant des frais",
            "example": 0
          },
          "motif": {
            "type": "string",
            "nullable": true,
            "description": "Motif du transfert"
          },
          "facture": {
            "type": "string",
            "nullable": true,
            "description": "La facture reglée"
          },
          "statut": {
            "type": "string",
            "enum": [
              "irrevocable"
            ],
            "description": "Statut du transfert : toujours \"irrevocable\" -- une demande d'annulation ne peut être initiée que sur une transaction irrévocable n'ayant pas déjà fait l'objet d'un retour de fonds.",
            "example": "irrevocable"
          },
          "annulationId": {
            "type": "string",
            "nullable": true,
            "description": "ID de la demande d'annulation, présent une fois une demande initiée sur cette transaction."
          },
          "annulationDate": {
            "type": "string",
            "format": "date-time",
            "description": "Date de la demande d'annulation.",
            "example": "2019-08-24T14:15:22Z"
          },
          "annulationStatut": {
            "type": "string",
            "enum": [
              "initie"
            ],
            "description": "Statut de la demande d'annulation : toujours \"initie\" dans cette réponse.",
            "example": "initie"
          },
          "compteAlias": {
            "type": "string",
            "nullable": true,
            "description": "Alias du compte principal (compte payeur)."
          },
          "clientPSPNom": {
            "type": "string",
            "nullable": true,
            "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
          },
          "txId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant technique de la transaction (référence affichée, distincte de endToEndId)."
          },
          "instructionId": {
            "type": "string",
            "nullable": true,
            "description": "Contient l'échéance de la tontine, le cas échéant."
          },
          "annulationRaison": {
            "$ref": "#/components/schemas/TransfertCodeRejet",
            "nullable": true,
            "description": "Raison de la demande d'annulation, fournie par le demandeur (voir aussi TransfertAnnulationRequete pour les codes envoyés par le client). Présent uniquement si annulationStatut == \"rejete\"."
          }
        },
        "required": [
          "endToEndId",
          "sens",
          "compte",
          "dateOperation",
          "dateCreation",
          "clientNom",
          "clientAlias",
          "clientPays",
          "montant",
          "statut",
          "annulationId",
          "annulationDate",
          "annulationRaison",
          "annulationStatut"
        ]
      },
      "TransfertAnnulationInitieeParCompte": {
        "title": "Transfert par compte",
        "type": "object",
        "properties": {
          "endToEndId": {
            "type": "string",
            "description": "Identifiant end-to-end",
            "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
          },
          "sens": {
            "type": "string",
            "enum": [
              "debit",
              "credit"
            ],
            "description": "Sens de l'opération",
            "example": "credit"
          },
          "compte": {
            "type": "string",
            "description": "Compte principal",
            "example": "doucoure"
          },
          "dateOperation": {
            "type": "string",
            "format": "date-time",
            "description": "Date d'irrévocabilité de la transaction.",
            "example": "2025-06-19T09:01:54.969Z"
          },
          "dateCreation": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création",
            "example": "2025-06-19T09:01:40.709Z"
          },
          "clientCompte": {
            "type": "string",
            "description": "Compte du client",
            "example": "mseye"
          },
          "clientNom": {
            "type": "string",
            "description": "Nom du client",
            "example": "Mbore"
          },
          "clientTypeCompte": {
            "$ref": "#/components/schemas/CompteType",
            "description": "Type de compte du client."
          },
          "clientPays": {
            "$ref": "#/components/schemas/Pays"
          },
          "clientPSP": {
            "type": "string",
            "description": "Code membre du participant du client.",
            "example": "CIC004"
          },
          "clientPhoto": {
            "type": "string",
            "nullable": true,
            "description": "Photo du client"
          },
          "montant": {
            "type": "number",
            "minimum": 1,
            "description": "Montant du transfert",
            "example": 258
          },
          "montantFrais": {
            "type": "number",
            "minimum": 0,
            "description": "Montant des frais",
            "example": 0
          },
          "motif": {
            "type": "string",
            "nullable": true,
            "description": "Motif du transfert"
          },
          "facture": {
            "type": "string",
            "nullable": true,
            "description": "La facture reglée"
          },
          "statut": {
            "type": "string",
            "enum": [
              "irrevocable"
            ],
            "description": "Statut du transfert : toujours \"irrevocable\" -- une demande d'annulation ne peut être initiée que sur une transaction irrévocable n'ayant pas déjà fait l'objet d'un retour de fonds.",
            "example": "irrevocable"
          },
          "annulationId": {
            "type": "string",
            "nullable": true,
            "description": "ID de la demande d'annulation, présent une fois une demande initiée sur cette transaction."
          },
          "annulationDate": {
            "type": "string",
            "format": "date-time",
            "description": "Date de la demande d'annulation.",
            "example": "2019-08-24T14:15:22Z"
          },
          "annulationStatut": {
            "type": "string",
            "enum": [
              "initie"
            ],
            "description": "Statut de la demande d'annulation : toujours \"initie\" dans cette réponse.",
            "example": "initie"
          },
          "compteAlias": {
            "type": "string",
            "nullable": true,
            "description": "Alias du compte principal (compte payeur)."
          },
          "clientPSPNom": {
            "type": "string",
            "nullable": true,
            "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
          },
          "txId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant technique de la transaction (référence affichée, distincte de endToEndId)."
          },
          "instructionId": {
            "type": "string",
            "nullable": true,
            "description": "Contient l'échéance de la tontine, le cas échéant."
          },
          "annulationRaison": {
            "$ref": "#/components/schemas/TransfertCodeRejet",
            "nullable": true,
            "description": "Raison de la demande d'annulation, fournie par le demandeur (voir aussi TransfertAnnulationRequete pour les codes envoyés par le client). Présent uniquement si annulationStatut == \"rejete\"."
          }
        },
        "required": [
          "endToEndId",
          "sens",
          "compte",
          "dateOperation",
          "dateCreation",
          "clientNom",
          "clientCompte",
          "clientPays",
          "montant",
          "statut",
          "annulationId",
          "annulationDate",
          "annulationRaison",
          "annulationStatut"
        ]
      },
      "TransfertRetourConfirmeParAlias": {
        "title": "Transfert par alias",
        "type": "object",
        "properties": {
          "endToEndId": {
            "type": "string",
            "description": "Identifiant end-to-end",
            "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
          },
          "sens": {
            "type": "string",
            "enum": [
              "debit",
              "credit"
            ],
            "description": "Sens de l'opération",
            "example": "credit"
          },
          "compte": {
            "type": "string",
            "description": "Compte principal",
            "example": "doucoure"
          },
          "dateOperation": {
            "type": "string",
            "format": "date-time",
            "description": "Date d'irrévocabilité de la transaction.",
            "example": "2025-06-19T09:01:54.969Z"
          },
          "dateCreation": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création",
            "example": "2025-06-19T09:01:40.709Z"
          },
          "clientAlias": {
            "type": "string",
            "format": "uuid",
            "description": "Alias du client",
            "example": "92a1027d-3260-4cd5-a1fe-16aefd05a554"
          },
          "clientNom": {
            "type": "string",
            "description": "Nom du client",
            "example": "Mbore"
          },
          "clientTypeCompte": {
            "$ref": "#/components/schemas/CompteType",
            "description": "Type de compte du client."
          },
          "clientPays": {
            "$ref": "#/components/schemas/Pays"
          },
          "clientPSP": {
            "type": "string",
            "description": "Code membre du participant du client.",
            "example": "CIC004"
          },
          "clientPhoto": {
            "type": "string",
            "nullable": true,
            "description": "Photo du client"
          },
          "montant": {
            "type": "number",
            "minimum": 1,
            "description": "Montant du transfert",
            "example": 258
          },
          "montantFrais": {
            "type": "number",
            "minimum": 0,
            "description": "Montant des frais",
            "example": 0
          },
          "motif": {
            "type": "string",
            "nullable": true,
            "description": "Motif du transfert"
          },
          "facture": {
            "type": "string",
            "nullable": true,
            "description": "La facture reglée"
          },
          "statut": {
            "type": "string",
            "enum": [
              "irrevocable"
            ],
            "description": "Statut du transfert : toujours \"irrevocable\".",
            "example": "irrevocable"
          },
          "retourId": {
            "type": "string",
            "nullable": true,
            "description": "ID de retour, présent une fois un retour de fonds initié ou effectué sur cette transaction."
          },
          "retourDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date du retour de fonds, présente une fois un retour de fonds initié ou effectué sur cette transaction."
          },
          "retourStatut": {
            "type": "string",
            "enum": [
              "initie"
            ],
            "description": "Statut du retour de fonds : toujours \"initie\" -- cette réponse ne fait qu'initier le retour, son règlement se fait de façon asynchrone.",
            "example": "initie"
          },
          "compteAlias": {
            "type": "string",
            "nullable": true,
            "description": "Alias du compte principal (compte payeur)."
          },
          "clientPSPNom": {
            "type": "string",
            "nullable": true,
            "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
          },
          "txId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant technique de la transaction (référence affichée, distincte de endToEndId)."
          },
          "instructionId": {
            "type": "string",
            "nullable": true,
            "description": "Contient l'échéance de la tontine, le cas échéant."
          }
        },
        "required": [
          "endToEndId",
          "sens",
          "compte",
          "dateOperation",
          "dateCreation",
          "clientNom",
          "clientAlias",
          "clientPays",
          "montant",
          "statut",
          "retourId",
          "retourDate",
          "retourStatut"
        ]
      },
      "TransfertRetourConfirmeParCompte": {
        "title": "Transfert par compte",
        "type": "object",
        "properties": {
          "endToEndId": {
            "type": "string",
            "description": "Identifiant end-to-end",
            "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
          },
          "sens": {
            "type": "string",
            "enum": [
              "debit",
              "credit"
            ],
            "description": "Sens de l'opération",
            "example": "credit"
          },
          "compte": {
            "type": "string",
            "description": "Compte principal",
            "example": "doucoure"
          },
          "dateOperation": {
            "type": "string",
            "format": "date-time",
            "description": "Date d'irrévocabilité de la transaction.",
            "example": "2025-06-19T09:01:54.969Z"
          },
          "dateCreation": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création",
            "example": "2025-06-19T09:01:40.709Z"
          },
          "clientCompte": {
            "type": "string",
            "description": "Compte du client",
            "example": "mseye"
          },
          "clientNom": {
            "type": "string",
            "description": "Nom du client",
            "example": "Mbore"
          },
          "clientTypeCompte": {
            "$ref": "#/components/schemas/CompteType",
            "description": "Type de compte du client."
          },
          "clientPays": {
            "$ref": "#/components/schemas/Pays"
          },
          "clientPSP": {
            "type": "string",
            "description": "Code membre du participant du client.",
            "example": "CIC004"
          },
          "clientPhoto": {
            "type": "string",
            "nullable": true,
            "description": "Photo du client"
          },
          "montant": {
            "type": "number",
            "minimum": 1,
            "description": "Montant du transfert",
            "example": 258
          },
          "montantFrais": {
            "type": "number",
            "minimum": 0,
            "description": "Montant des frais",
            "example": 0
          },
          "motif": {
            "type": "string",
            "nullable": true,
            "description": "Motif du transfert"
          },
          "facture": {
            "type": "string",
            "nullable": true,
            "description": "La facture reglée"
          },
          "statut": {
            "type": "string",
            "enum": [
              "irrevocable"
            ],
            "description": "Statut du transfert : toujours \"irrevocable\".",
            "example": "irrevocable"
          },
          "retourId": {
            "type": "string",
            "nullable": true,
            "description": "ID de retour, présent une fois un retour de fonds initié ou effectué sur cette transaction."
          },
          "retourDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date du retour de fonds, présente une fois un retour de fonds initié ou effectué sur cette transaction."
          },
          "retourStatut": {
            "type": "string",
            "enum": [
              "initie"
            ],
            "description": "Statut du retour de fonds : toujours \"initie\" -- cette réponse ne fait qu'initier le retour, son règlement se fait de façon asynchrone.",
            "example": "initie"
          },
          "compteAlias": {
            "type": "string",
            "nullable": true,
            "description": "Alias du compte principal (compte payeur)."
          },
          "clientPSPNom": {
            "type": "string",
            "nullable": true,
            "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
          },
          "txId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant technique de la transaction (référence affichée, distincte de endToEndId)."
          },
          "instructionId": {
            "type": "string",
            "nullable": true,
            "description": "Contient l'échéance de la tontine, le cas échéant."
          }
        },
        "required": [
          "endToEndId",
          "sens",
          "compte",
          "dateOperation",
          "dateCreation",
          "clientNom",
          "clientCompte",
          "clientPays",
          "montant",
          "statut",
          "retourId",
          "retourDate",
          "retourStatut"
        ]
      },
      "TransfertAnnulationAccepteeParAlias": {
        "title": "Transfert par alias",
        "type": "object",
        "properties": {
          "endToEndId": {
            "type": "string",
            "description": "Identifiant end-to-end",
            "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
          },
          "sens": {
            "type": "string",
            "enum": [
              "debit",
              "credit"
            ],
            "description": "Sens de l'opération",
            "example": "credit"
          },
          "compte": {
            "type": "string",
            "description": "Compte principal",
            "example": "doucoure"
          },
          "dateOperation": {
            "type": "string",
            "format": "date-time",
            "description": "Date d'irrévocabilité de la transaction.",
            "example": "2025-06-19T09:01:54.969Z"
          },
          "dateCreation": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création",
            "example": "2025-06-19T09:01:40.709Z"
          },
          "clientAlias": {
            "type": "string",
            "format": "uuid",
            "description": "Alias du client",
            "example": "92a1027d-3260-4cd5-a1fe-16aefd05a554"
          },
          "clientNom": {
            "type": "string",
            "description": "Nom du client",
            "example": "Mbore"
          },
          "clientTypeCompte": {
            "$ref": "#/components/schemas/CompteType",
            "description": "Type de compte du client."
          },
          "clientPays": {
            "$ref": "#/components/schemas/Pays"
          },
          "clientPSP": {
            "type": "string",
            "description": "Code membre du participant du client.",
            "example": "CIC004"
          },
          "clientPhoto": {
            "type": "string",
            "nullable": true,
            "description": "Photo du client"
          },
          "montant": {
            "type": "number",
            "minimum": 1,
            "description": "Montant du transfert",
            "example": 258
          },
          "montantFrais": {
            "type": "number",
            "minimum": 0,
            "description": "Montant des frais",
            "example": 0
          },
          "motif": {
            "type": "string",
            "nullable": true,
            "description": "Motif du transfert"
          },
          "facture": {
            "type": "string",
            "nullable": true,
            "description": "La facture reglée"
          },
          "statut": {
            "type": "string",
            "enum": [
              "irrevocable"
            ],
            "description": "Statut du transfert : toujours \"irrevocable\".",
            "example": "irrevocable"
          },
          "retourId": {
            "type": "string",
            "nullable": true,
            "description": "ID de retour, présent une fois un retour de fonds initié ou effectué sur cette transaction."
          },
          "retourDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date du retour de fonds, présente une fois un retour de fonds initié ou effectué sur cette transaction."
          },
          "retourStatut": {
            "type": "string",
            "enum": [
              "initie"
            ],
            "description": "Statut du retour de fonds : toujours \"initie\" -- cette réponse ne fait qu'initier le retour, son règlement se fait de façon asynchrone.",
            "example": "initie"
          },
          "annulationId": {
            "type": "string",
            "nullable": true,
            "description": "ID de la demande d'annulation, présent une fois une demande initiée sur cette transaction."
          },
          "annulationDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de la demande d'annulation, présente une fois une demande initiée sur cette transaction."
          },
          "annulationStatut": {
            "type": "string",
            "enum": [
              "initie"
            ],
            "description": "Statut de la demande d'annulation : reste \"initie\" -- c'est retourStatut qui reflète désormais la progression du retour de fonds déclenché par l'acceptation.",
            "example": "initie"
          },
          "compteAlias": {
            "type": "string",
            "nullable": true,
            "description": "Alias du compte principal (compte payeur)."
          },
          "clientPSPNom": {
            "type": "string",
            "nullable": true,
            "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
          },
          "txId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant technique de la transaction (référence affichée, distincte de endToEndId)."
          },
          "instructionId": {
            "type": "string",
            "nullable": true,
            "description": "Contient l'échéance de la tontine, le cas échéant."
          },
          "annulationRaison": {
            "$ref": "#/components/schemas/TransfertCodeRejet",
            "nullable": true,
            "description": "Raison de la demande d'annulation, fournie par le demandeur (voir aussi TransfertAnnulationRequete pour les codes envoyés par le client). Présent uniquement si annulationStatut == \"rejete\"."
          }
        },
        "required": [
          "endToEndId",
          "sens",
          "compte",
          "dateOperation",
          "dateCreation",
          "clientNom",
          "clientAlias",
          "clientPays",
          "montant",
          "statut",
          "retourId",
          "retourDate",
          "retourStatut",
          "annulationId",
          "annulationDate",
          "annulationRaison",
          "annulationStatut"
        ]
      },
      "TransfertAnnulationAccepteeParCompte": {
        "title": "Transfert par compte",
        "type": "object",
        "properties": {
          "endToEndId": {
            "type": "string",
            "description": "Identifiant end-to-end",
            "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
          },
          "sens": {
            "type": "string",
            "enum": [
              "debit",
              "credit"
            ],
            "description": "Sens de l'opération",
            "example": "credit"
          },
          "compte": {
            "type": "string",
            "description": "Compte principal",
            "example": "doucoure"
          },
          "dateOperation": {
            "type": "string",
            "format": "date-time",
            "description": "Date d'irrévocabilité de la transaction.",
            "example": "2025-06-19T09:01:54.969Z"
          },
          "dateCreation": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création",
            "example": "2025-06-19T09:01:40.709Z"
          },
          "clientCompte": {
            "type": "string",
            "description": "Compte du client",
            "example": "mseye"
          },
          "clientNom": {
            "type": "string",
            "description": "Nom du client",
            "example": "Mbore"
          },
          "clientTypeCompte": {
            "$ref": "#/components/schemas/CompteType",
            "description": "Type de compte du client."
          },
          "clientPays": {
            "$ref": "#/components/schemas/Pays"
          },
          "clientPSP": {
            "type": "string",
            "description": "Code membre du participant du client.",
            "example": "CIC004"
          },
          "clientPhoto": {
            "type": "string",
            "nullable": true,
            "description": "Photo du client"
          },
          "montant": {
            "type": "number",
            "minimum": 1,
            "description": "Montant du transfert",
            "example": 258
          },
          "montantFrais": {
            "type": "number",
            "minimum": 0,
            "description": "Montant des frais",
            "example": 0
          },
          "motif": {
            "type": "string",
            "nullable": true,
            "description": "Motif du transfert"
          },
          "facture": {
            "type": "string",
            "nullable": true,
            "description": "La facture reglée"
          },
          "statut": {
            "type": "string",
            "enum": [
              "irrevocable"
            ],
            "description": "Statut du transfert : toujours \"irrevocable\".",
            "example": "irrevocable"
          },
          "retourId": {
            "type": "string",
            "nullable": true,
            "description": "ID de retour, présent une fois un retour de fonds initié ou effectué sur cette transaction."
          },
          "retourDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date du retour de fonds, présente une fois un retour de fonds initié ou effectué sur cette transaction."
          },
          "retourStatut": {
            "type": "string",
            "enum": [
              "initie"
            ],
            "description": "Statut du retour de fonds : toujours \"initie\" -- cette réponse ne fait qu'initier le retour, son règlement se fait de façon asynchrone.",
            "example": "initie"
          },
          "annulationId": {
            "type": "string",
            "nullable": true,
            "description": "ID de la demande d'annulation, présent une fois une demande initiée sur cette transaction."
          },
          "annulationDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de la demande d'annulation, présente une fois une demande initiée sur cette transaction."
          },
          "annulationStatut": {
            "type": "string",
            "enum": [
              "initie"
            ],
            "description": "Statut de la demande d'annulation : reste \"initie\" -- c'est retourStatut qui reflète désormais la progression du retour de fonds déclenché par l'acceptation.",
            "example": "initie"
          },
          "compteAlias": {
            "type": "string",
            "nullable": true,
            "description": "Alias du compte principal (compte payeur)."
          },
          "clientPSPNom": {
            "type": "string",
            "nullable": true,
            "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
          },
          "txId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant technique de la transaction (référence affichée, distincte de endToEndId)."
          },
          "instructionId": {
            "type": "string",
            "nullable": true,
            "description": "Contient l'échéance de la tontine, le cas échéant."
          },
          "annulationRaison": {
            "$ref": "#/components/schemas/TransfertCodeRejet",
            "nullable": true,
            "description": "Raison de la demande d'annulation, fournie par le demandeur (voir aussi TransfertAnnulationRequete pour les codes envoyés par le client). Présent uniquement si annulationStatut == \"rejete\"."
          }
        },
        "required": [
          "endToEndId",
          "sens",
          "compte",
          "dateOperation",
          "dateCreation",
          "clientNom",
          "clientCompte",
          "clientPays",
          "montant",
          "statut",
          "retourId",
          "retourDate",
          "retourStatut",
          "annulationId",
          "annulationDate",
          "annulationRaison",
          "annulationStatut"
        ]
      },
      "TransfertRetourConfirmationResponse": {
        "description": "Flux SSE dont chaque `data:` contient un JSON sérialisé conforme au schéma [TransfertRetourConfirmationResponse](#/components/schemas/TransfertRetourConfirmationResponse).\ndata: \"{\\\"endToEndId\\\":\\\"ESND00620240101153554Destinataire9e\\\",\\\"statut\\\":\\\"irrevocable\\\",\\\"dateIrrevocabilite\\\":\\\"2025-06-26T12:00:00Z\\\",\\\"retourStatut\\\":\\\"irrevocable\\\"}\"\ndata: \"{\\\"endToEndId\\\":\\\"ESND00620240101153554Destinataire9e\\\",\\\"statut\\\":\\\"rejete\\\",\\\"codeRejet\\\":\\\"AG07\\\",\\\"retourStatut\\\":\\\"rejete\\\",\\\"retourStatutRaison\\\":\\\"AG07\\\"}\"\n",
        "anyOf": [
          {
            "title": "Envoi irrévocable",
            "anyOf": [
              {
                "title": "Retour de fond direct",
                "type": "object",
                "properties": {
                  "endToEndId": {
                    "type": "string",
                    "description": "Identifiant unique de la transaction",
                    "example": "ESND00620240101153554Destinataire9e"
                  },
                  "statut": {
                    "type": "string",
                    "enum": [
                      "irrevocable"
                    ],
                    "description": "Statut de la nouvelle transaction créée à partir du retour de fonds.",
                    "example": "irrevocable"
                  },
                  "dateIrrevocabilite": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Date d'irrévocabilité de la nouvelle transaction créée à partir du retour de fonds.",
                    "example": "2025-06-26T12:00:00Z"
                  },
                  "retourStatut": {
                    "type": "string",
                    "enum": [
                      "irrevocable"
                    ],
                    "description": "Statut du retour de fonds sur le transfert (même valeur que statut).",
                    "example": "irrevocable"
                  }
                },
                "required": [
                  "endToEndId",
                  "statut",
                  "dateIrrevocabilite",
                  "retourStatut"
                ]
              },
              {
                "title": "Acceptation d'une demande d'annulation",
                "type": "object",
                "properties": {
                  "endToEndId": {
                    "type": "string",
                    "description": "Identifiant unique de la transaction",
                    "example": "ESND00620240101153554Destinataire9e"
                  },
                  "statut": {
                    "type": "string",
                    "enum": [
                      "irrevocable"
                    ],
                    "description": "Statut de la nouvelle transaction créée à partir du retour de fonds.",
                    "example": "irrevocable"
                  },
                  "dateIrrevocabilite": {
                    "type": "string",
                    "format": "date-time",
                    "description": "Date d'irrévocabilité de la nouvelle transaction créée à partir du retour de fonds.",
                    "example": "2025-06-26T12:00:00Z"
                  },
                  "retourStatut": {
                    "type": "string",
                    "enum": [
                      "irrevocable"
                    ],
                    "description": "Statut du retour de fonds sur le transfert (même valeur que statut).",
                    "example": "irrevocable"
                  },
                  "annulationStatut": {
                    "type": "string",
                    "enum": [
                      "irrevocable"
                    ],
                    "description": "Statut de la demande d'annulation à l'origine du retour de fonds (même valeur que statut/retourStatut).",
                    "example": "irrevocable"
                  }
                },
                "required": [
                  "endToEndId",
                  "statut",
                  "dateIrrevocabilite",
                  "retourStatut",
                  "annulationStatut"
                ]
              }
            ]
          },
          {
            "title": "Envoi rejeté",
            "anyOf": [
              {
                "title": "Retour de fond direct",
                "type": "object",
                "properties": {
                  "endToEndId": {
                    "type": "string",
                    "description": "Identifiant unique de la transaction",
                    "example": "ESND00620240101153554Destinataire9e"
                  },
                  "statut": {
                    "type": "string",
                    "enum": [
                      "rejete"
                    ],
                    "description": "Statut de la nouvelle transaction créée à partir du retour de fonds.",
                    "example": "rejete"
                  },
                  "codeRejet": {
                    "$ref": "#/components/schemas/TransfertCodeRejet",
                    "description": "Code de rejet de la nouvelle transaction créée à partir du retour de fonds."
                  },
                  "retourStatut": {
                    "type": "string",
                    "enum": [
                      "rejete"
                    ],
                    "description": "Statut du retour de fonds sur le transfert (même valeur que statut).",
                    "example": "rejete"
                  },
                  "retourStatutRaison": {
                    "$ref": "#/components/schemas/TransfertCodeRejet",
                    "description": "Code de rejet du retour de fonds sur le transfert (même valeur que codeRejet)."
                  }
                },
                "required": [
                  "endToEndId",
                  "statut",
                  "codeRejet",
                  "retourStatut",
                  "retourStatutRaison"
                ]
              },
              {
                "title": "Acceptation d'une demande d'annulation",
                "type": "object",
                "properties": {
                  "endToEndId": {
                    "type": "string",
                    "description": "Identifiant unique de la transaction",
                    "example": "ESND00620240101153554Destinataire9e"
                  },
                  "statut": {
                    "type": "string",
                    "enum": [
                      "rejete"
                    ],
                    "description": "Statut de la nouvelle transaction créée à partir du retour de fonds.",
                    "example": "rejete"
                  },
                  "codeRejet": {
                    "$ref": "#/components/schemas/TransfertCodeRejet",
                    "description": "Code de rejet de la nouvelle transaction créée à partir du retour de fonds."
                  },
                  "retourStatut": {
                    "type": "string",
                    "enum": [
                      "rejete"
                    ],
                    "description": "Statut du retour de fonds sur le transfert (même valeur que statut).",
                    "example": "rejete"
                  },
                  "annulationStatut": {
                    "type": "string",
                    "enum": [
                      "rejete"
                    ],
                    "description": "Statut de la demande d'annulation à l'origine du retour de fonds (même valeur que statut/retourStatut).",
                    "example": "rejete"
                  },
                  "retourStatutRaison": {
                    "$ref": "#/components/schemas/TransfertCodeRejet",
                    "description": "Code de rejet du retour de fonds sur le transfert (même valeur que codeRejet)."
                  }
                },
                "required": [
                  "endToEndId",
                  "statut",
                  "codeRejet",
                  "retourStatut",
                  "annulationStatut",
                  "retourStatutRaison"
                ]
              }
            ]
          }
        ]
      },
      "TransfertRetourConfirmationResponseSSE": {
        "type": "object",
        "properties": {
          "data": {
            "$ref": "#/components/schemas/TransfertRetourConfirmationResponse"
          }
        }
      },
      "TransactionDetailsTransfertParAlias": {
        "title": "Transfert par alias",
        "type": "object",
        "properties": {
          "endToEndId": {
            "type": "string",
            "description": "Identifiant end-to-end",
            "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
          },
          "sens": {
            "type": "string",
            "enum": [
              "debit",
              "credit"
            ],
            "description": "Sens de l'opération",
            "example": "credit"
          },
          "compte": {
            "type": "string",
            "description": "Compte principal",
            "example": "doucoure"
          },
          "dateOperation": {
            "type": "string",
            "format": "date-time",
            "description": "Date d'irrévocabilité de la transaction.",
            "example": "2025-06-19T09:01:54.969Z"
          },
          "dateCreation": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création",
            "example": "2025-06-19T09:01:40.709Z"
          },
          "clientAlias": {
            "type": "string",
            "format": "uuid",
            "description": "Alias du client",
            "example": "92a1027d-3260-4cd5-a1fe-16aefd05a554"
          },
          "clientNom": {
            "type": "string",
            "description": "Nom du client",
            "example": "Mbore"
          },
          "clientTypeCompte": {
            "$ref": "#/components/schemas/CompteType",
            "description": "Type de compte du client."
          },
          "clientPays": {
            "$ref": "#/components/schemas/Pays"
          },
          "clientPSP": {
            "type": "string",
            "description": "Code membre du participant du client.",
            "example": "CIC004"
          },
          "clientPhoto": {
            "type": "string",
            "nullable": true,
            "description": "Photo du client"
          },
          "montant": {
            "type": "number",
            "minimum": 1,
            "description": "Montant du transfert",
            "example": 258
          },
          "montantFrais": {
            "type": "number",
            "minimum": 0,
            "description": "Montant des frais",
            "example": 0
          },
          "motif": {
            "type": "string",
            "nullable": true,
            "description": "Motif du transfert"
          },
          "facture": {
            "type": "string",
            "nullable": true,
            "description": "La facture reglée"
          },
          "statut": {
            "$ref": "#/components/schemas/TransfertStatut"
          },
          "retourId": {
            "type": "string",
            "nullable": true,
            "description": "ID de retour, présent une fois un retour de fonds initié ou effectué sur cette transaction."
          },
          "retourDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date du retour de fonds, présente une fois un retour de fonds initié ou effectué sur cette transaction."
          },
          "retourStatut": {
            "type": "string",
            "nullable": true,
            "enum": [
              "initie",
              "irrevocable",
              "rejete"
            ],
            "description": "Statut du retour de fonds, présent une fois un retour initié sur cette transaction.\n\n\ninitie: retour initié, en cours de traitement\n\n\nirrevocable: retour effectué avec succès\n\n\nrejete: retour rejeté (voir retourStatutRaison)\n"
          },
          "retourStatutRaison": {
            "type": "string",
            "nullable": true,
            "description": "Raison du rejet du retour de fonds. Présent uniquement si retourStatut == \"rejete\"."
          },
          "annulationId": {
            "type": "string",
            "nullable": true,
            "description": "ID de la demande d'annulation, présent une fois une demande initiée sur cette transaction."
          },
          "annulationDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de la demande d'annulation, présente une fois une demande initiée sur cette transaction."
          },
          "annulationStatut": {
            "type": "string",
            "nullable": true,
            "enum": [
              "initie",
              "rejete",
              "irrevocable"
            ],
            "description": "Statut de la demande d'annulation, présent uniquement si une demande a été initiée sur cette transaction.\n\ninitie: demande envoyée, en attente de réponse\n\nrejete: demande rejetée (voir annulationStatutRaison/annulationRaison)\n\nirrevocable: demande acceptée -- le retour de fonds a été déclenché (voir retourId/retourDate/retourStatut/retourStatutRaison)\n"
          },
          "annulationStatutRaison": {
            "type": "string",
            "nullable": true,
            "description": "Raison du rejet de la demande d'annulation. Présent uniquement si annulationStatut == \"rejete\"."
          },
          "compteAlias": {
            "type": "string",
            "nullable": true,
            "description": "Alias du compte principal (compte payeur)."
          },
          "clientPSPNom": {
            "type": "string",
            "nullable": true,
            "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
          },
          "txId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant technique de la transaction (référence affichée, distincte de endToEndId)."
          },
          "instructionId": {
            "type": "string",
            "nullable": true,
            "description": "Contient l'échéance de la tontine, le cas échéant."
          },
          "statutRaison": {
            "$ref": "#/components/schemas/TransfertCodeRejet",
            "nullable": true
          },
          "rejetDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date du rejet, utilisée en repli quand dateOperation est absente sur une transaction rejetée."
          },
          "annulationRaison": {
            "$ref": "#/components/schemas/TransfertCodeRejet",
            "nullable": true,
            "description": "Raison de la demande d'annulation, fournie par le demandeur (voir aussi TransfertAnnulationRequete pour les codes envoyés par le client). Présent uniquement si annulationStatut == \"rejete\"."
          },
          "subscriptionId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant de l'abonnement/programmation, renseigné uniquement lorsque ce transfert a été généré par un abonnement programmé."
          }
        },
        "required": [
          "endToEndId",
          "sens",
          "compte",
          "dateCreation",
          "clientNom",
          "clientAlias",
          "clientPays",
          "montant",
          "statut"
        ]
      },
      "TransactionDetailsTransfertParCompte": {
        "title": "Transfert par compte",
        "type": "object",
        "properties": {
          "endToEndId": {
            "type": "string",
            "description": "Identifiant end-to-end",
            "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
          },
          "sens": {
            "type": "string",
            "enum": [
              "debit",
              "credit"
            ],
            "description": "Sens de l'opération",
            "example": "credit"
          },
          "compte": {
            "type": "string",
            "description": "Compte principal",
            "example": "doucoure"
          },
          "dateOperation": {
            "type": "string",
            "format": "date-time",
            "description": "Date d'irrévocabilité de la transaction.",
            "example": "2025-06-19T09:01:54.969Z"
          },
          "dateCreation": {
            "type": "string",
            "format": "date-time",
            "description": "Date de création",
            "example": "2025-06-19T09:01:40.709Z"
          },
          "clientCompte": {
            "type": "string",
            "description": "Compte du client",
            "example": "mseye"
          },
          "clientNom": {
            "type": "string",
            "description": "Nom du client",
            "example": "Mbore"
          },
          "clientTypeCompte": {
            "$ref": "#/components/schemas/CompteType",
            "description": "Type de compte du client."
          },
          "clientPays": {
            "$ref": "#/components/schemas/Pays"
          },
          "clientPSP": {
            "type": "string",
            "description": "Code membre du participant du client.",
            "example": "CIC004"
          },
          "clientPhoto": {
            "type": "string",
            "nullable": true,
            "description": "Photo du client"
          },
          "montant": {
            "type": "number",
            "minimum": 1,
            "description": "Montant du transfert",
            "example": 258
          },
          "montantFrais": {
            "type": "number",
            "minimum": 0,
            "description": "Montant des frais",
            "example": 0
          },
          "motif": {
            "type": "string",
            "nullable": true,
            "description": "Motif du transfert"
          },
          "facture": {
            "type": "string",
            "nullable": true,
            "description": "La facture reglée"
          },
          "statut": {
            "$ref": "#/components/schemas/TransfertStatut"
          },
          "retourId": {
            "type": "string",
            "nullable": true,
            "description": "ID de retour, présent une fois un retour de fonds initié ou effectué sur cette transaction."
          },
          "retourDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date du retour de fonds, présente une fois un retour de fonds initié ou effectué sur cette transaction."
          },
          "retourStatut": {
            "type": "string",
            "nullable": true,
            "enum": [
              "initie",
              "irrevocable",
              "rejete"
            ],
            "description": "Statut du retour de fonds, présent une fois un retour initié sur cette transaction.\n\n\ninitie: retour initié, en cours de traitement\n\n\nirrevocable: retour effectué avec succès\n\n\nrejete: retour rejeté (voir retourStatutRaison)\n"
          },
          "retourStatutRaison": {
            "type": "string",
            "nullable": true,
            "description": "Raison du rejet du retour de fonds. Présent uniquement si retourStatut == \"rejete\"."
          },
          "annulationId": {
            "type": "string",
            "nullable": true,
            "description": "ID de la demande d'annulation, présent une fois une demande initiée sur cette transaction."
          },
          "annulationDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de la demande d'annulation, présente une fois une demande initiée sur cette transaction."
          },
          "annulationStatut": {
            "type": "string",
            "nullable": true,
            "enum": [
              "initie",
              "rejete",
              "irrevocable"
            ],
            "description": "Statut de la demande d'annulation, présent uniquement si une demande a été initiée sur cette transaction.\n\ninitie: demande envoyée, en attente de réponse\n\nrejete: demande rejetée (voir annulationStatutRaison/annulationRaison)\n\nirrevocable: demande acceptée -- le retour de fonds a été déclenché (voir retourId/retourDate/retourStatut/retourStatutRaison)\n"
          },
          "annulationStatutRaison": {
            "type": "string",
            "nullable": true,
            "description": "Raison du rejet de la demande d'annulation. Présent uniquement si annulationStatut == \"rejete\"."
          },
          "compteAlias": {
            "type": "string",
            "nullable": true,
            "description": "Alias du compte principal (compte payeur)."
          },
          "clientPSPNom": {
            "type": "string",
            "nullable": true,
            "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
          },
          "txId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant technique de la transaction (référence affichée, distincte de endToEndId)."
          },
          "instructionId": {
            "type": "string",
            "nullable": true,
            "description": "Contient l'échéance de la tontine, le cas échéant."
          },
          "statutRaison": {
            "$ref": "#/components/schemas/TransfertCodeRejet",
            "nullable": true
          },
          "rejetDate": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date du rejet, utilisée en repli quand dateOperation est absente sur une transaction rejetée."
          },
          "annulationRaison": {
            "$ref": "#/components/schemas/TransfertCodeRejet",
            "nullable": true,
            "description": "Raison de la demande d'annulation, fournie par le demandeur (voir aussi TransfertAnnulationRequete pour les codes envoyés par le client). Présent uniquement si annulationStatut == \"rejete\"."
          },
          "subscriptionId": {
            "type": "string",
            "nullable": true,
            "description": "Identifiant de l'abonnement/programmation, renseigné uniquement lorsque ce transfert a été généré par un abonnement programmé."
          }
        },
        "required": [
          "endToEndId",
          "sens",
          "compte",
          "dateCreation",
          "clientNom",
          "clientCompte",
          "clientPays",
          "montant",
          "statut"
        ]
      },
      "Problem403Alias": {
        "allOf": [
          {
            "$ref": "#/components/schemas/Problem"
          },
          {
            "type": "object",
            "properties": {
              "object": {
                "type": "object",
                "nullable": true,
                "description": "Présent uniquement si un alias existe déjà pour ce numéro/compte (voir description de l'endpoint)."
              }
            }
          }
        ]
      },
      "AliasMBNOConfirmee": {
        "type": "object",
        "properties": {
          "cle": {
            "type": "string",
            "description": "Le numéro de téléphone."
          },
          "shid": {
            "type": "string",
            "description": "La valeur du SHID associé, généré automatiquement lors de la création de l'alias MBNO."
          },
          "type": {
            "type": "string",
            "enum": [
              "MBNO"
            ],
            "description": "Le type d'alias créé : toujours \"MBNO\".",
            "example": "MBNO"
          },
          "compte": {
            "type": "string",
            "description": "Le compte auquel est lié l'alias"
          },
          "pays": {
            "type": "string",
            "description": "Le pays du compte auquel est lié l'alias",
            "$ref": "#/components/schemas/Pays"
          },
          "clientType": {
            "$ref": "#/components/schemas/ClientCategorie",
            "description": "Le type de client"
          }
        },
        "required": [
          "cle",
          "shid",
          "type",
          "compte",
          "pays",
          "clientType"
        ]
      },
      "AliasSHID": {
        "type": "object",
        "properties": {
          "cle": {
            "type": "string",
            "description": "La valeur du SHID associé."
          },
          "type": {
            "type": "string",
            "enum": [
              "SHID"
            ],
            "description": "Le type d'alias : toujours \"SHID\".",
            "example": "SHID"
          },
          "compte": {
            "type": "string",
            "description": "Le compte auquel est lié l'alias"
          },
          "pays": {
            "type": "string",
            "description": "Le pays du compte auquel est lié l'alias",
            "$ref": "#/components/schemas/Pays"
          },
          "clientType": {
            "$ref": "#/components/schemas/ClientCategorie",
            "description": "Le type de client"
          }
        },
        "required": [
          "cle",
          "type",
          "compte",
          "pays",
          "clientType"
        ]
      },
      "AliasRevendicationOtpEnvoye": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "identifiant de la revendication"
          },
          "alias": {
            "type": "string",
            "description": "numero de telephone revendiqué"
          },
          "statut": {
            "type": "string",
            "enum": [
              "INITIEE"
            ],
            "description": "Statut de la revendication : reste \"INITIEE\" -- le rejet doit être confirmé par le code OTP envoyé au numéro revendiqué (voir PUT /alias/revendications/{id}/rejets).",
            "example": "INITIEE"
          },
          "dateDemande": {
            "type": "string",
            "format": "date-time",
            "example": "2025-06-19T09:01:40.709Z",
            "description": "date à laquelle la demande a été initiée"
          },
          "dateVerrouillage": {
            "type": "string",
            "format": "date-time",
            "example": "2025-06-19T09:01:40.709Z",
            "description": "date à laquelle le client ne peut plus utiliser l'alias ne rejete pas la demande de revendication (une semaine après date demande)"
          },
          "dateCloture": {
            "type": "string",
            "format": "date-time",
            "example": "2025-06-19T09:01:40.709Z",
            "description": "date à laquelle la revendication est automatiquement accépté si le client ne rejete pas (une semaine après date de verouillage)"
          },
          "dateAction": {
            "type": "string",
            "format": "date-time",
            "example": "2025-06-19T09:01:40.709Z",
            "description": "date à laquelle le client accepte ou rejete la demande de revendication"
          }
        },
        "required": [
          "id",
          "alias",
          "statut",
          "dateDemande",
          "dateVerrouillage",
          "dateCloture",
          "dateAction"
        ]
      },
      "AliasRevendicationAcceptee": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "identifiant de la revendication"
          },
          "alias": {
            "type": "string",
            "description": "numero de telephone revendiqué"
          },
          "statut": {
            "type": "string",
            "enum": [
              "ACCEPTEE"
            ],
            "description": "Statut de la revendication : toujours \"ACCEPTEE\" dans cette réponse.",
            "example": "ACCEPTEE"
          },
          "dateDemande": {
            "type": "string",
            "format": "date-time",
            "example": "2025-06-19T09:01:40.709Z",
            "description": "date à laquelle la demande a été initiée"
          },
          "dateVerrouillage": {
            "type": "string",
            "format": "date-time",
            "example": "2025-06-19T09:01:40.709Z",
            "description": "date à laquelle le client ne peut plus utiliser l'alias ne rejete pas la demande de revendication (une semaine après date demande)"
          },
          "dateCloture": {
            "type": "string",
            "format": "date-time",
            "example": "2025-06-19T09:01:40.709Z",
            "description": "date à laquelle la revendication est automatiquement accépté si le client ne rejete pas (une semaine après date de verouillage)"
          },
          "dateAction": {
            "type": "string",
            "format": "date-time",
            "example": "2025-06-19T09:01:40.709Z",
            "description": "date à laquelle le client accepte ou rejete la demande de revendication"
          },
          "shid": {
            "$ref": "#/components/schemas/AliasSHID",
            "description": "L'alias SHID du client, qui devient son nouvel alias : on ne supprime que le numéro de téléphone revendiqué, le SHID associé est conservé (comme lors de la suppression volontaire d'un alias MBNO, voir DELETE /alias/{cle})."
          }
        },
        "required": [
          "id",
          "alias",
          "statut",
          "dateDemande",
          "dateVerrouillage",
          "dateCloture",
          "dateAction",
          "shid"
        ]
      },
      "AliasRevendicationRejetee": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "identifiant de la revendication"
          },
          "alias": {
            "type": "string",
            "description": "numero de telephone revendiqué"
          },
          "statut": {
            "type": "string",
            "enum": [
              "REJETEE"
            ],
            "description": "Statut de la revendication : toujours \"REJETEE\" dans cette réponse.",
            "example": "REJETEE"
          },
          "dateDemande": {
            "type": "string",
            "format": "date-time",
            "example": "2025-06-19T09:01:40.709Z",
            "description": "date à laquelle la demande a été initiée"
          },
          "dateVerrouillage": {
            "type": "string",
            "format": "date-time",
            "example": "2025-06-19T09:01:40.709Z",
            "description": "date à laquelle le client ne peut plus utiliser l'alias ne rejete pas la demande de revendication (une semaine après date demande)"
          },
          "dateCloture": {
            "type": "string",
            "format": "date-time",
            "example": "2025-06-19T09:01:40.709Z",
            "description": "date à laquelle la revendication est automatiquement accépté si le client ne rejete pas (une semaine après date de verouillage)"
          },
          "dateAction": {
            "type": "string",
            "format": "date-time",
            "example": "2025-06-19T09:01:40.709Z",
            "description": "date à laquelle le client accepte ou rejete la demande de revendication"
          }
        },
        "required": [
          "id",
          "alias",
          "statut",
          "dateDemande",
          "dateVerrouillage",
          "dateCloture",
          "dateAction"
        ]
      },
      "AbonnementDesactive": {
        "anyOf": [
          {
            "title": "Transfert par alias",
            "type": "object",
            "properties": {
              "endToEndId": {
                "type": "string",
                "description": "Identifiant end-to-end",
                "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
              },
              "sens": {
                "type": "string",
                "enum": [
                  "debit"
                ],
                "description": "Sens de l'opération : toujours \"debit\".",
                "example": "debit"
              },
              "compte": {
                "type": "string",
                "description": "Compte principal",
                "example": "doucoure"
              },
              "dateOperation": {
                "type": "string",
                "format": "date-time",
                "description": "Date de l'opération",
                "example": "2025-06-19T09:01:54.969Z"
              },
              "dateCreation": {
                "type": "string",
                "format": "date-time",
                "description": "Date de création",
                "example": "2025-06-19T09:01:40.709Z"
              },
              "clientAlias": {
                "type": "string",
                "format": "uuid",
                "description": "Alias du client",
                "example": "92a1027d-3260-4cd5-a1fe-16aefd05a554"
              },
              "clientNom": {
                "type": "string",
                "description": "Nom du client",
                "example": "Mbore"
              },
              "clientTypeCompte": {
                "$ref": "#/components/schemas/CompteType",
                "description": "Type de compte du client."
              },
              "clientPays": {
                "$ref": "#/components/schemas/Pays"
              },
              "clientPSP": {
                "type": "string",
                "description": "Code membre du participant du client.",
                "example": "CIC004"
              },
              "clientPhoto": {
                "type": "string",
                "nullable": true,
                "description": "Photo du client"
              },
              "montant": {
                "type": "number",
                "minimum": 1,
                "description": "Montant de l'abonnement",
                "example": 258
              },
              "motif": {
                "type": "string",
                "nullable": true,
                "description": "Motif de l'abonnement"
              },
              "statut": {
                "type": "string",
                "enum": [
                  "desactive"
                ],
                "description": "Statut de l'abonnement : toujours \"desactive\" dans cette réponse.",
                "example": "desactive"
              },
              "dateDebut": {
                "type": "string",
                "format": "date-time",
                "description": "Date de debut de l'abonnement",
                "example": "2025-06-19T09:01:40.709Z"
              },
              "dateFin": {
                "type": "string",
                "format": "date-time",
                "description": "Date de fin de l'abonnement",
                "example": "2025-06-19T09:01:40.709Z"
              },
              "frequence": {
                "$ref": "#/components/schemas/AbonnementFrequence",
                "description": "Optionnelle : si renseignée, il s'agit d'un abonnement récurrent ; si absente, il s'agit d'un paiement programmé (exécution unique différée)."
              },
              "periodicite": {
                "type": "number",
                "minimun": 2,
                "description": "La périodicite de la frequence",
                "example": 3
              },
              "compteAlias": {
                "type": "string",
                "nullable": true,
                "description": "Alias du compte principal (compte payeur)."
              },
              "clientPSPNom": {
                "type": "string",
                "nullable": true,
                "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
              },
              "txId": {
                "type": "string",
                "nullable": true,
                "description": "Identifiant technique de la transaction (référence affichée, distincte de endToEndId)."
              },
              "instructionId": {
                "type": "string",
                "nullable": true,
                "description": "Contient l'échéance de la tontine, le cas échéant."
              },
              "statutRaison": {
                "$ref": "#/components/schemas/TransfertCodeRejet",
                "nullable": true
              },
              "rejetDate": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Date du rejet, utilisée en repli quand dateOperation est absente sur une transaction rejetée."
              }
            },
            "required": [
              "endToEndId",
              "sens",
              "compte",
              "dateCreation",
              "clientNom",
              "clientAlias",
              "clientPays",
              "montant",
              "statut",
              "dateDebut"
            ]
          },
          {
            "title": "Transfert par compte",
            "type": "object",
            "properties": {
              "endToEndId": {
                "type": "string",
                "description": "Identifiant end-to-end",
                "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
              },
              "sens": {
                "type": "string",
                "enum": [
                  "debit"
                ],
                "description": "Sens de l'opération : toujours \"debit\".",
                "example": "debit"
              },
              "compte": {
                "type": "string",
                "description": "Compte principal",
                "example": "doucoure"
              },
              "dateOperation": {
                "type": "string",
                "format": "date-time",
                "description": "Date de l'opération",
                "example": "2025-06-19T09:01:54.969Z"
              },
              "dateCreation": {
                "type": "string",
                "format": "date-time",
                "description": "Date de création",
                "example": "2025-06-19T09:01:40.709Z"
              },
              "clientCompte": {
                "type": "string",
                "description": "Compte du client",
                "example": "mseye"
              },
              "clientNom": {
                "type": "string",
                "description": "Nom du client",
                "example": "Mbore"
              },
              "clientTypeCompte": {
                "$ref": "#/components/schemas/CompteType",
                "description": "Type de compte du client."
              },
              "clientPays": {
                "$ref": "#/components/schemas/Pays"
              },
              "clientPSP": {
                "type": "string",
                "description": "Code membre du participant du client.",
                "example": "CIC004"
              },
              "clientPhoto": {
                "type": "string",
                "nullable": true,
                "description": "Photo du client"
              },
              "montant": {
                "type": "number",
                "minimum": 1,
                "description": "Montant de l'abonnement",
                "example": 258
              },
              "motif": {
                "type": "string",
                "nullable": true,
                "description": "Motif de l'abonnement"
              },
              "statut": {
                "type": "string",
                "enum": [
                  "desactive"
                ],
                "description": "Statut de l'abonnement : toujours \"desactive\" dans cette réponse.",
                "example": "desactive"
              },
              "dateDebut": {
                "type": "string",
                "format": "date-time",
                "description": "Date de debut de l'abonnement",
                "example": "2025-06-19T09:01:40.709Z"
              },
              "dateFin": {
                "type": "string",
                "format": "date-time",
                "description": "Date de fin de l'abonnement",
                "example": "2025-06-19T09:01:40.709Z"
              },
              "frequence": {
                "$ref": "#/components/schemas/AbonnementFrequence",
                "description": "Optionnelle : si renseignée, il s'agit d'un abonnement récurrent ; si absente, il s'agit d'un paiement programmé (exécution unique différée)."
              },
              "periodicite": {
                "type": "number",
                "minimun": 2,
                "description": "La périodicite de la frequence",
                "example": 3
              },
              "compteAlias": {
                "type": "string",
                "nullable": true,
                "description": "Alias du compte principal (compte payeur)."
              },
              "clientPSPNom": {
                "type": "string",
                "nullable": true,
                "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
              },
              "txId": {
                "type": "string",
                "nullable": true,
                "description": "Identifiant technique de la transaction (référence affichée, distincte de endToEndId)."
              },
              "instructionId": {
                "type": "string",
                "nullable": true,
                "description": "Contient l'échéance de la tontine, le cas échéant."
              },
              "statutRaison": {
                "$ref": "#/components/schemas/TransfertCodeRejet",
                "nullable": true
              },
              "rejetDate": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Date du rejet, utilisée en repli quand dateOperation est absente sur une transaction rejetée."
              }
            },
            "required": [
              "endToEndId",
              "sens",
              "compte",
              "dateCreation",
              "clientNom",
              "clientCompte",
              "clientPays",
              "montant",
              "statut",
              "dateDebut"
            ]
          }
        ]
      },
      "AbonnementReactive": {
        "anyOf": [
          {
            "title": "Transfert par alias",
            "type": "object",
            "properties": {
              "endToEndId": {
                "type": "string",
                "description": "Identifiant end-to-end",
                "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
              },
              "sens": {
                "type": "string",
                "enum": [
                  "debit"
                ],
                "description": "Sens de l'opération : toujours \"debit\".",
                "example": "debit"
              },
              "compte": {
                "type": "string",
                "description": "Compte principal",
                "example": "doucoure"
              },
              "dateOperation": {
                "type": "string",
                "format": "date-time",
                "description": "Date de l'opération",
                "example": "2025-06-19T09:01:54.969Z"
              },
              "dateCreation": {
                "type": "string",
                "format": "date-time",
                "description": "Date de création",
                "example": "2025-06-19T09:01:40.709Z"
              },
              "clientAlias": {
                "type": "string",
                "format": "uuid",
                "description": "Alias du client",
                "example": "92a1027d-3260-4cd5-a1fe-16aefd05a554"
              },
              "clientNom": {
                "type": "string",
                "description": "Nom du client",
                "example": "Mbore"
              },
              "clientTypeCompte": {
                "$ref": "#/components/schemas/CompteType",
                "description": "Type de compte du client."
              },
              "clientPays": {
                "$ref": "#/components/schemas/Pays"
              },
              "clientPSP": {
                "type": "string",
                "description": "Code membre du participant du client.",
                "example": "CIC004"
              },
              "clientPhoto": {
                "type": "string",
                "nullable": true,
                "description": "Photo du client"
              },
              "montant": {
                "type": "number",
                "minimum": 1,
                "description": "Montant de l'abonnement",
                "example": 258
              },
              "motif": {
                "type": "string",
                "nullable": true,
                "description": "Motif de l'abonnement"
              },
              "statut": {
                "type": "string",
                "enum": [
                  "initie"
                ],
                "description": "Statut de l'abonnement : toujours \"initie\" dans cette réponse -- la réactivation reprogramme l'abonnement, il repart comme un abonnement fraîchement créé.",
                "example": "initie"
              },
              "dateDebut": {
                "type": "string",
                "format": "date-time",
                "description": "Date de debut de l'abonnement",
                "example": "2025-06-19T09:01:40.709Z"
              },
              "dateFin": {
                "type": "string",
                "format": "date-time",
                "description": "Date de fin de l'abonnement",
                "example": "2025-06-19T09:01:40.709Z"
              },
              "frequence": {
                "$ref": "#/components/schemas/AbonnementFrequence",
                "description": "Optionnelle : si renseignée, il s'agit d'un abonnement récurrent ; si absente, il s'agit d'un paiement programmé (exécution unique différée)."
              },
              "periodicite": {
                "type": "number",
                "minimun": 2,
                "description": "La périodicite de la frequence",
                "example": 3
              },
              "compteAlias": {
                "type": "string",
                "nullable": true,
                "description": "Alias du compte principal (compte payeur)."
              },
              "clientPSPNom": {
                "type": "string",
                "nullable": true,
                "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
              },
              "txId": {
                "type": "string",
                "nullable": true,
                "description": "Identifiant technique de la transaction (référence affichée, distincte de endToEndId)."
              },
              "instructionId": {
                "type": "string",
                "nullable": true,
                "description": "Contient l'échéance de la tontine, le cas échéant."
              },
              "statutRaison": {
                "$ref": "#/components/schemas/TransfertCodeRejet",
                "nullable": true
              },
              "rejetDate": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Date du rejet, utilisée en repli quand dateOperation est absente sur une transaction rejetée."
              }
            },
            "required": [
              "endToEndId",
              "sens",
              "compte",
              "dateCreation",
              "clientNom",
              "clientAlias",
              "clientPays",
              "montant",
              "statut",
              "dateDebut"
            ]
          },
          {
            "title": "Transfert par compte",
            "type": "object",
            "properties": {
              "endToEndId": {
                "type": "string",
                "description": "Identifiant end-to-end",
                "example": "ECIB00020250619090140JkEhEOaoWr3CGx"
              },
              "sens": {
                "type": "string",
                "enum": [
                  "debit"
                ],
                "description": "Sens de l'opération : toujours \"debit\".",
                "example": "debit"
              },
              "compte": {
                "type": "string",
                "description": "Compte principal",
                "example": "doucoure"
              },
              "dateOperation": {
                "type": "string",
                "format": "date-time",
                "description": "Date de l'opération",
                "example": "2025-06-19T09:01:54.969Z"
              },
              "dateCreation": {
                "type": "string",
                "format": "date-time",
                "description": "Date de création",
                "example": "2025-06-19T09:01:40.709Z"
              },
              "clientCompte": {
                "type": "string",
                "description": "Compte du client",
                "example": "mseye"
              },
              "clientNom": {
                "type": "string",
                "description": "Nom du client",
                "example": "Mbore"
              },
              "clientTypeCompte": {
                "$ref": "#/components/schemas/CompteType",
                "description": "Type de compte du client."
              },
              "clientPays": {
                "$ref": "#/components/schemas/Pays"
              },
              "clientPSP": {
                "type": "string",
                "description": "Code membre du participant du client.",
                "example": "CIC004"
              },
              "clientPhoto": {
                "type": "string",
                "nullable": true,
                "description": "Photo du client"
              },
              "montant": {
                "type": "number",
                "minimum": 1,
                "description": "Montant de l'abonnement",
                "example": 258
              },
              "motif": {
                "type": "string",
                "nullable": true,
                "description": "Motif de l'abonnement"
              },
              "statut": {
                "type": "string",
                "enum": [
                  "initie"
                ],
                "description": "Statut de l'abonnement : toujours \"initie\" dans cette réponse -- la réactivation reprogramme l'abonnement, il repart comme un abonnement fraîchement créé.",
                "example": "initie"
              },
              "dateDebut": {
                "type": "string",
                "format": "date-time",
                "description": "Date de debut de l'abonnement",
                "example": "2025-06-19T09:01:40.709Z"
              },
              "dateFin": {
                "type": "string",
                "format": "date-time",
                "description": "Date de fin de l'abonnement",
                "example": "2025-06-19T09:01:40.709Z"
              },
              "frequence": {
                "$ref": "#/components/schemas/AbonnementFrequence",
                "description": "Optionnelle : si renseignée, il s'agit d'un abonnement récurrent ; si absente, il s'agit d'un paiement programmé (exécution unique différée)."
              },
              "periodicite": {
                "type": "number",
                "minimun": 2,
                "description": "La périodicite de la frequence",
                "example": 3
              },
              "compteAlias": {
                "type": "string",
                "nullable": true,
                "description": "Alias du compte principal (compte payeur)."
              },
              "clientPSPNom": {
                "type": "string",
                "nullable": true,
                "description": "Nom membre du participant du client (à défaut, résoudre clientPSP via GET /participants)."
              },
              "txId": {
                "type": "string",
                "nullable": true,
                "description": "Identifiant technique de la transaction (référence affichée, distincte de endToEndId)."
              },
              "instructionId": {
                "type": "string",
                "nullable": true,
                "description": "Contient l'échéance de la tontine, le cas échéant."
              },
              "statutRaison": {
                "$ref": "#/components/schemas/TransfertCodeRejet",
                "nullable": true
              },
              "rejetDate": {
                "type": "string",
                "format": "date-time",
                "nullable": true,
                "description": "Date du rejet, utilisée en repli quand dateOperation est absente sur une transaction rejetée."
              }
            },
            "required": [
              "endToEndId",
              "sens",
              "compte",
              "dateCreation",
              "clientNom",
              "clientCompte",
              "clientPays",
              "montant",
              "statut",
              "dateDebut"
            ]
          }
        ]
      },
      "Client": {
        "type": "object",
        "description": "Identité du titulaire du compte (voir modules/compte/domain/models/client.dart). Champs volontairement alignés sur PiSpiUserIdentity côté SDK, qui reçoit ces mêmes données directement de l'application hôte plutôt que de cet endpoint.",
        "properties": {
          "nom": {
            "type": "string",
            "description": "Nom complet du client."
          },
          "categorie": {
            "$ref": "#/components/schemas/ClientCategorie",
            "description": "Catégorie du client."
          },
          "nationalite": {
            "$ref": "#/components/schemas/Pays",
            "description": "Nationalité du client."
          },
          "paysResidence": {
            "$ref": "#/components/schemas/Pays",
            "description": "Pays de résidence du client."
          },
          "telephone": {
            "type": "string",
            "description": "Numéro de téléphone du client."
          },
          "genre": {
            "type": "string",
            "enum": [
              "1",
              "2"
            ],
            "description": "Genre du client. 1: masculin, 2: féminin.",
            "example": "1"
          },
          "identificationNationale": {
            "type": "string",
            "nullable": true,
            "description": "Numéro d'identification nationale du client."
          },
          "email": {
            "type": "string",
            "format": "email",
            "nullable": true
          },
          "adresse": {
            "type": "string",
            "nullable": true
          },
          "codePostale": {
            "type": "string",
            "nullable": true
          },
          "dateNaissance": {
            "type": "string",
            "nullable": true,
            "description": "Date de naissance du client."
          },
          "paysNaissance": {
            "$ref": "#/components/schemas/Pays",
            "nullable": true,
            "description": "Pays de naissance du client."
          },
          "villeNaissance": {
            "type": "string",
            "nullable": true
          },
          "nomMere": {
            "type": "string",
            "nullable": true,
            "description": "Nom de la mère du client."
          },
          "photo": {
            "type": "string",
            "nullable": true
          },
          "numeroPasseport": {
            "type": "string",
            "nullable": true
          }
        },
        "required": [
          "nom",
          "categorie",
          "nationalite",
          "paysResidence",
          "telephone",
          "genre"
        ]
      },
      "NotificationTokenCreationRequest": {
        "type": "object",
        "description": "Corps envoyé par _saveFirebaseToken() (core/notifications.dart) à chaque récupération ou changement du token FCM de l'appareil.",
        "properties": {
          "deviceId": {
            "type": "string",
            "description": "Identifiant de l'appareil (dérivé du hardware+fingerprint Android, de l'identifierForVendor iOS, ou d'un hash des infos navigateur sur le Web)."
          },
          "token": {
            "type": "string",
            "description": "Token de notification push Firebase (FCM) de l'appareil."
          }
        },
        "required": [
          "deviceId",
          "token"
        ]
      },
      "NotificationAppVersion": {
        "type": "object",
        "description": "Dernières versions publiées de l'application, utilisées pour proposer une mise à jour au client (voir notification_bloc.dart : appelé après le comptage des notifications non lues, uniquement hors Web).",
        "properties": {
          "android": {
            "type": "string",
            "description": "Dernière version publiée sur Android.",
            "example": "1.4.0"
          },
          "ios": {
            "type": "string",
            "description": "Dernière version publiée sur iOS.",
            "example": "1.4.0"
          },
          "changelog": {
            "type": "string",
            "description": "Notes de version affichées au client."
          },
          "date": {
            "type": "string",
            "format": "date-time",
            "nullable": true,
            "description": "Date de publication de cette version."
          }
        },
        "required": [
          "android",
          "ios",
          "changelog"
        ]
      },
      "ForgetPinRequete": {
        "description": "Moyen de récupération choisi par le client pour recevoir le code OTP -- email ou téléphone, jamais les deux (voir ForgetPinCommand.toJson()).",
        "oneOf": [
          {
            "title": "Par email",
            "type": "object",
            "properties": {
              "email": {
                "type": "string",
                "format": "email",
                "description": "Email du client."
              }
            },
            "required": [
              "email"
            ]
          },
          {
            "title": "Par téléphone",
            "type": "object",
            "properties": {
              "phone": {
                "type": "string",
                "description": "Numéro de téléphone du client."
              }
            },
            "required": [
              "phone"
            ]
          }
        ]
      },
      "ForgetPinVerificationRequete": {
        "description": "Même moyen de récupération que la demande initiale (POST /otps/demandes), accompagné du code OTP reçu.",
        "oneOf": [
          {
            "title": "Par email",
            "type": "object",
            "properties": {
              "email": {
                "type": "string",
                "format": "email",
                "description": "Email du client."
              },
              "otp": {
                "type": "string",
                "description": "Code OTP reçu par email."
              }
            },
            "required": [
              "email",
              "otp"
            ]
          },
          {
            "title": "Par téléphone",
            "type": "object",
            "properties": {
              "phone": {
                "type": "string",
                "description": "Numéro de téléphone du client."
              },
              "otp": {
                "type": "string",
                "description": "Code OTP reçu par SMS."
              }
            },
            "required": [
              "phone",
              "otp"
            ]
          }
        ]
      },
      "NotificationPushData": {
        "description": "Contenu du payload `data` d'une notification push envoyée par le backend PI-SPI, en plus du titre et du corps affichés nativement par la plateforme. Toujours string/string sur le fil (contrainte des fournisseurs push type FCM), y compris pour les champs sémantiquement numériques comme `montant`. La forme exacte dépend de `type`, voir les variantes ci-dessous.",
        "oneOf": [
          {
            "title": "TRANSFERT_EMIS",
            "type": "object",
            "description": "Un transfert émis par le client a été traité.",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "TRANSFERT_EMIS"
                ],
                "description": "Toujours \"TRANSFERT_EMIS\".",
                "example": "TRANSFERT_EMIS"
              },
              "montant": {
                "type": "string",
                "description": "Montant envoyé, transmis en chaîne (contrainte des payloads push : toujours string/string) -- à parser côté client (ex. double.tryParse).",
                "example": "15000"
              },
              "idObject": {
                "type": "string",
                "description": "Identifiant permettant de récupérer la transaction en base."
              }
            },
            "required": [
              "type",
              "montant",
              "idObject"
            ]
          },
          {
            "title": "TRANSFERT_RECU",
            "type": "object",
            "description": "Le client a reçu un transfert.",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "TRANSFERT_RECU"
                ],
                "description": "Toujours \"TRANSFERT_RECU\".",
                "example": "TRANSFERT_RECU"
              },
              "montant": {
                "type": "string",
                "description": "Montant reçu, transmis en chaîne (contrainte des payloads push : toujours string/string) -- à parser côté client (ex. double.tryParse).",
                "example": "15000"
              },
              "idObject": {
                "type": "string",
                "description": "Identifiant permettant de récupérer la transaction en base."
              }
            },
            "required": [
              "type",
              "montant",
              "idObject"
            ]
          },
          {
            "title": "TRANSFERT_REJETE",
            "type": "object",
            "description": "Un transfert émis par le client a été rejeté.",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "TRANSFERT_REJETE"
                ],
                "description": "Toujours \"TRANSFERT_REJETE\".",
                "example": "TRANSFERT_REJETE"
              },
              "montant": {
                "type": "string",
                "description": "Montant envoyé, transmis en chaîne (contrainte des payloads push : toujours string/string) -- à parser côté client (ex. double.tryParse).",
                "example": "15000"
              },
              "idObject": {
                "type": "string",
                "description": "Identifiant permettant de récupérer la transaction en base."
              },
              "notificationId": {
                "type": "string",
                "description": "Identifiant permettant de récupérer la notification en base (elle est persistée dans l'application)."
              }
            },
            "required": [
              "type",
              "montant",
              "idObject",
              "notificationId"
            ]
          },
          {
            "title": "RTP_INITIEE",
            "type": "object",
            "description": "Une demande de paiement émise par le client a été initiée avec succès.",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "RTP_INITIEE"
                ],
                "description": "Toujours \"RTP_INITIEE\".",
                "example": "RTP_INITIEE"
              },
              "clientCategorie": {
                "$ref": "#/components/schemas/ClientCategorie",
                "description": "Catégorie du client payeur sollicité."
              },
              "clientAlias": {
                "type": "string",
                "description": "Alias du client payeur sollicité."
              },
              "idObject": {
                "type": "string",
                "description": "Identifiant permettant de récupérer la demande de paiement en base."
              },
              "notificationId": {
                "type": "string",
                "description": "Identifiant permettant de récupérer la notification en base (elle est persistée dans l'application)."
              }
            },
            "required": [
              "type",
              "clientCategorie",
              "clientAlias",
              "idObject",
              "notificationId"
            ]
          },
          {
            "title": "RTP_RECUE",
            "type": "object",
            "description": "Le client a reçu une demande de paiement.",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "RTP_RECUE"
                ],
                "description": "Toujours \"RTP_RECUE\".",
                "example": "RTP_RECUE"
              },
              "clientCategorie": {
                "$ref": "#/components/schemas/ClientCategorie",
                "description": "Catégorie du client payé (demandeur)."
              },
              "clientAlias": {
                "type": "string",
                "description": "Alias du client payé (demandeur)."
              },
              "clientNom": {
                "type": "string",
                "description": "Nom du client. Absent du tableau fourni par le métier mais confirmé présent dans le code (PiSpiPush.handleIncoming / NotificationExternalEvent -- transmis systématiquement aux côtés de clientAlias/clientCategorie)."
              },
              "canal": {
                "$ref": "#/components/schemas/TransfertCanal"
              },
              "idObject": {
                "type": "string",
                "description": "Identifiant permettant de récupérer la demande de paiement en base."
              },
              "notificationId": {
                "type": "string",
                "description": "Identifiant permettant de récupérer la notification en base (elle est persistée dans l'application)."
              }
            },
            "required": [
              "type",
              "clientCategorie",
              "clientAlias",
              "canal",
              "idObject",
              "notificationId"
            ]
          },
          {
            "title": "RTP_ACCEPTEE",
            "type": "object",
            "description": "Une demande de paiement émise par le client a été acceptée par le payeur.",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "RTP_ACCEPTEE"
                ],
                "description": "Toujours \"RTP_ACCEPTEE\".",
                "example": "RTP_ACCEPTEE"
              },
              "idObject": {
                "type": "string",
                "description": "Identifiant permettant de récupérer la demande de paiement en base."
              }
            },
            "required": [
              "type",
              "idObject"
            ]
          },
          {
            "title": "RTP_REJETEE",
            "type": "object",
            "description": "Une demande de paiement émise par le client a été rejetée par le payeur.",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "RTP_REJETEE"
                ],
                "description": "Toujours \"RTP_REJETEE\".",
                "example": "RTP_REJETEE"
              },
              "idObject": {
                "type": "string",
                "description": "Identifiant permettant de récupérer la demande de paiement en base."
              }
            },
            "required": [
              "type",
              "idObject"
            ]
          },
          {
            "title": "REVENDICATION_INITIEE",
            "type": "object",
            "description": "Une revendication a été initiée sur un alias du client.",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "REVENDICATION_INITIEE"
                ],
                "description": "Toujours \"REVENDICATION_INITIEE\".",
                "example": "REVENDICATION_INITIEE"
              },
              "idObject": {
                "type": "string",
                "description": "Identifiant permettant de récupérer la demande de revendication d'alias en base."
              },
              "notificationId": {
                "type": "string",
                "description": "Identifiant permettant de récupérer la notification en base (elle est persistée dans l'application)."
              }
            },
            "required": [
              "type",
              "idObject",
              "notificationId"
            ]
          },
          {
            "title": "REVENDICATION_REJETEE",
            "type": "object",
            "description": "La revendication d'un alias du client a été rejetée.",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "REVENDICATION_REJETEE"
                ],
                "description": "Toujours \"REVENDICATION_REJETEE\".",
                "example": "REVENDICATION_REJETEE"
              },
              "idObject": {
                "type": "string",
                "description": "Identifiant permettant de récupérer la demande de revendication d'alias en base."
              },
              "notificationId": {
                "type": "string",
                "description": "Identifiant permettant de récupérer la notification en base (elle est persistée dans l'application)."
              }
            },
            "required": [
              "type",
              "idObject",
              "notificationId"
            ]
          },
          {
            "title": "REVENDICATION_ACCEPTEE",
            "type": "object",
            "description": "La revendication d'un alias du client a été acceptée.",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "REVENDICATION_ACCEPTEE"
                ],
                "description": "Toujours \"REVENDICATION_ACCEPTEE\".",
                "example": "REVENDICATION_ACCEPTEE"
              },
              "idObject": {
                "type": "string",
                "description": "Identifiant permettant de récupérer la demande de revendication d'alias en base."
              },
              "notificationId": {
                "type": "string",
                "description": "Identifiant permettant de récupérer la notification en base (elle est persistée dans l'application)."
              }
            },
            "required": [
              "type",
              "idObject",
              "notificationId"
            ]
          },
          {
            "title": "ANNULATION_DEMANDEE",
            "type": "object",
            "description": "Une demande d'annulation a été initiée sur un transfert du client.",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "ANNULATION_DEMANDEE"
                ],
                "description": "Toujours \"ANNULATION_DEMANDEE\".",
                "example": "ANNULATION_DEMANDEE"
              },
              "idObject": {
                "type": "string",
                "description": "Identifiant permettant de récupérer la demande d'annulation en base."
              },
              "notificationId": {
                "type": "string",
                "description": "Identifiant permettant de récupérer la notification en base (elle est persistée dans l'application)."
              }
            },
            "required": [
              "type",
              "idObject",
              "notificationId"
            ]
          },
          {
            "title": "ANNULATION_REJETEE",
            "type": "object",
            "description": "Une demande d'annulation sur un transfert du client a été rejetée.",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "ANNULATION_REJETEE"
                ],
                "description": "Toujours \"ANNULATION_REJETEE\".",
                "example": "ANNULATION_REJETEE"
              },
              "idObject": {
                "type": "string",
                "description": "Identifiant permettant de récupérer la demande d'annulation en base."
              },
              "notificationId": {
                "type": "string",
                "description": "Identifiant permettant de récupérer la notification en base (elle est persistée dans l'application)."
              }
            },
            "required": [
              "type",
              "idObject",
              "notificationId"
            ]
          },
          {
            "title": "ABONNEMENT_TERMINE",
            "type": "object",
            "description": "Un abonnement du client est arrivé à son terme.",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "ABONNEMENT_TERMINE"
                ],
                "description": "Toujours \"ABONNEMENT_TERMINE\".",
                "example": "ABONNEMENT_TERMINE"
              },
              "idObject": {
                "type": "string",
                "description": "Identifiant permettant de récupérer l'abonnement en base."
              }
            },
            "required": [
              "type",
              "idObject"
            ]
          },
          {
            "title": "ABONNEMENT_REJETE",
            "type": "object",
            "description": "Une échéance d'un abonnement du client a été rejetée.\n\nNon fourni explicitement par le métier -- déduit par symétrie avec ABONNEMENT_TERMINE. À confirmer.",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "ABONNEMENT_REJETE"
                ],
                "description": "Toujours \"ABONNEMENT_REJETE\".",
                "example": "ABONNEMENT_REJETE"
              },
              "idObject": {
                "type": "string",
                "description": "Identifiant permettant de récupérer l'abonnement en base."
              }
            },
            "required": [
              "type",
              "idObject"
            ]
          },
          {
            "title": "AUTH_CONNEXION",
            "type": "object",
            "description": "Une nouvelle connexion a été détectée sur le compte du client.",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "AUTH_CONNEXION"
                ],
                "description": "Toujours \"AUTH_CONNEXION\".",
                "example": "AUTH_CONNEXION"
              },
              "notificationId": {
                "type": "string",
                "description": "Identifiant permettant de récupérer la notification en base (elle est persistée dans l'application)."
              }
            },
            "required": [
              "type",
              "notificationId"
            ]
          },
          {
            "title": "AUTH_DECONNEXION",
            "type": "object",
            "description": "Une déconnexion a été détectée sur le compte du client.\n\nNon fourni explicitement par le métier -- déduit par symétrie avec AUTH_CONNEXION. À confirmer.",
            "properties": {
              "type": {
                "type": "string",
                "enum": [
                  "AUTH_DECONNEXION"
                ],
                "description": "Toujours \"AUTH_DECONNEXION\".",
                "example": "AUTH_DECONNEXION"
              },
              "notificationId": {
                "type": "string",
                "description": "Identifiant permettant de récupérer la notification en base (elle est persistée dans l'application)."
              }
            },
            "required": [
              "type",
              "notificationId"
            ]
          }
        ],
        "discriminator": {
          "propertyName": "type"
        }
      }
    },
    "responses": {
      "TxBadRequestForbiden": {
        "description": "Interdit",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Problem403"
            }
          }
        }
      },
      "TxBadRequest": {
        "description": "Requête invalide",
        "content": {
          "application/json": {
            "schema": {
              "$ref": "#/components/schemas/Problem400"
            }
          }
        }
      }
    },
    "securitySchemes": {
      "oAuth2AuthCode": {
        "type": "oauth2",
        "description": "Cette API utilise OAuth2 pour la gestion de la sécurité des APIs",
        "flows": {
          "authorizationCode": {
            "authorizationUrl": "https://pi-bceao.int/oauth/authorize",
            "tokenUrl": "https://pi-bceao.int/api/oauth.token",
            "scopes": {
              "alias.read": "Accès en lecture à l'alias",
              "alias.write": "Accès à la création de l'alias",
              "transfert.read": "Accès en lecture aux transactions",
              "transfert.write": "Accès en écriture aux transferts",
              "notification.read": "Accès en lecture aux notifications",
              "notification.write": "Accès en écriture aux notifications",
              "participant.read": "Accès en lecture aux participants",
              "participant.write": "Accès en écriture aux participants",
              "abonnement.read": "Accès en lecture aux abonnements",
              "abonnement.write": "Accès à la création des abonnements",
              "compte.read": "Accès à la consultation du compte",
              "compte.write": "Accès à l'écriture du du compte"
            }
          }
        }
      }
    }
  }
}
