# v1.0 : document de pratique de marché ISO 20022 Mojaloop

# 2. Introduction

En combinant les principes d’inclusion financière et les capacités d’ISO 20022, Mojaloop permet aux DFSP et autres parties prenantes de proposer des paiements en temps réel, économiques, sécurisés et évolutifs pour les écosystèmes financiers inclusifs. Ce document est la version 1.0 de la pratique de marché Mojaloop ISO 20022.

# 2.1 Comment utiliser ce document ?

Ce document constitue une référence de base pour mettre en œuvre la messagerie ISO 20022 pour les SIIP dans les schémas basés sur Mojaloop. Il décrit des lignes directrices et pratiques générales communes à tous les schémas Mojaloop, centrées sur les exigences de base. Il doit toutefois être complété par des documents de règles propres au schéma, pouvant définir des champs de message, validations et règles supplémentaires pour répondre aux réglementations et besoins spécifiques. Cette approche par couches permet d’adapter les détails d’implémentation tout en restant aligné sur le cadre Mojaloop.

# 2.1.1 Lien avec les documents de règles propres au schéma

Ce document pose les fondations de l’application d’ISO 20022 dans Mojaloop (principes et pratiques cœur). Il ne prescrit pas les exigences métier détaillées, validations et cadres de gouvernance propres à chaque schéma. Les règles de schéma couvrent ces aspects : champs obligatoires et facultatifs, protocoles de conformité sur mesure, procédures de gestion des erreurs, règles métier sur les flux de messages, rôles et responsabilités des participants. La flexibilité du présent document permet aux administrateurs de schéma d’adapter et d’étendre les orientations selon leurs besoins opérationnels.

# 2.1.2 Distinction entre pratiques génériques et exigences propres au schéma

Le document sépare clairement pratiques génériques et exigences de schéma pour concilier cohérence et adaptabilité des implémentations ISO 20022 dans Mojaloop. Les pratiques génériques établissent les principes fondateurs : attentes sur les structures de messages, champs requis pour le switch, champs supportés et flux transactionnels, ainsi qu’une vue d’ensemble du cycle de vie d’un transfert P2P avec change Mojaloop.

Les exigences propres au schéma, documentées séparément, détaillent mappages de champs supplémentaires, validations renforcées et règles précises de règlement, rapprochement et résolution de litiges, ainsi que politiques de gouvernance et obligations de conformité.

Cette distinction permet aux DFSP d’implémenter un noyau de messagerie cohérent tout en laissant aux administrateurs de schéma la flexibilité sur les détails opérationnels. Les pratiques génériques sont conçues pour être extensibles et s’intégrer aux règles de schéma, conformément aux standards Mojaloop ISO 20022 pour les SIIP.

# 3 Attentes, obligations et règles applicables aux messages

Le processus de transfert Mojaloop comporte trois phases clés pour des transactions sûres et efficaces. Chaque phase s’appuie sur des ressources spécifiques pour les interactions entre participants, assurant communication, accord et exécution. Certaines phases et ressources sont facultatives ; l’objectif reste que chaque transfert soit exact, sécurisé et conforme aux conditions convenues.

  1. Découverte
  2. Accord
  3. Transfert

# 3.1 Conversion de devises

La conversion de devises prend en charge les transactions multi-devises. Comme elle n’est pas toujours nécessaire, les messages et flux associés ne sont utilisés qu’en cas de besoin, pour la flexibilité mono- ou multi-devises.

# 3.2 Messages JSON

Mojaloop adopte une variante JSON des messages ISO 20022 plutôt que le XML traditionnel, pour l’efficacité et la compatibilité avec les API modernes. L’organisation ISO 20022 développe une représentation JSON canonique ; Mojaloop entend s’y aligner à mesure de son évolution.

# 3.3 API

Les messages ISO 20022 sont échangés dans Mojaloop via des appels de type REST. Cela favorise l’interopérabilité, réduit le volume de données grâce au JSON léger et soutient des implémentations modulaires et évolutives. L’intégration d’ISO 20022 avec des API REST offre un cadre robuste et adaptable, entre normes mondiales et contraintes de mise en œuvre.

# 3.3.1 Détails des en-têtes

L’en-tête du message API doit contenir les éléments suivants. Les en-têtes obligatoires sont marqués d’un astérisque *.

Nom                                 Description
Content-Length
integer
(header)
The Content-Length header field indicates the anticipated size of the payload body. Only sent if there is a body.Note: The API supports a maximum size of 5242880 bytes (5 Megabytes).
* Type
string
(path)
The type of the party identifier. For example, MSISDN, PERSONAL_ID.
* ID
string
(path)
The identifier value.
* Content-Type
string
(header)
The Content-Type header indicates the specific version of the API used to send the payload body.
* Date
string
(header)
The Date header field indicates the date when the request was sent.
X-Forwarded-For
string
(header)
The X-Forwarded-For header field is an unofficially accepted standard used for informational purposes of the originating client IP address, as a request might pass multiple proxies, firewalls, and so on. Multiple X-Forwarded-For values should be expected and supported by implementers of the API.Note: An alternative to X-Forwarded-For is defined in RFC 7239 (opens new window). However, to this point RFC 7239 is less-used and supported than X-Forwarded-For.
* FSPIOP-Source
string
(header)
The FSPIOP-Source header field is a non-HTTP standard field used by the API for identifying the sender of the HTTP request. The field should be set by the original sender of the request. Required for routing and signature verification (see header field FSPIOP-Signature).
FSPIOP-Destination
string
(header)
The FSPIOP-Destination header field is a non-HTTP standard field used by the API for HTTP header based routing of requests and responses to the destination. The field must be set by the original sender of the request if the destination is known (valid for all services except GET /parties) so that any entities between the client and the server do not need to parse the payload for routing purposes. If the destination is not known (valid for service GET /parties), the field should be left empty.
FSPIOP-Encryption
string
(header)
The FSPIOP-Encryption header field is a non-HTTP standard field used by the API for applying end-to-end encryption of the request.
FSPIOP-Signature
string
(header)
The FSPIOP-Signature header field is a non-HTTP standard field used by the API for applying an end-to-end request signature.
FSPIOP-URI
string
(header)
The FSPIOP-URI header field is a non-HTTP standard field used by the API for signature verification, should contain the service URI. Required if signature verification is used, for more information, see the API Signature document (opens new window).
FSPIOP-HTTP-Method
string
(header)
The FSPIOP-HTTP-Method header field is a non-HTTP standard field used by the API for signature verification, should contain the service HTTP method. Required if signature verification is used, for more information, see the API Signature document (opens new window).

# 3.3.2 Réponses HTTP prises en charge

Code d’erreur HTTP Description et causes fréquentes
400 Bad Request Description : le serveur n’a pas pu interpréter la requête (syntaxe invalide). La requête est mal formée ou contient des paramètres invalides.
Causes fréquentes : champs obligatoires manquants, valeurs invalides, format incorrect.
401 Unauthorized Description : le client doit s’authentifier. La requête ne comporte pas d’identifiants valides.
Causes fréquentes : jeton d’authentification manquant ou invalide.
403 Forbidden Description : le client n’a pas les droits d’accès. Le serveur a compris la requête mais refuse de l’autoriser.
Causes fréquentes : permissions insuffisantes sur la ressource.
404 Not Found Description : la ressource demandée est introuvable.
Causes fréquentes : identifiant incorrect ou ressource supprimée.
405 Method Not Allowed Description : la méthode HTTP n’est pas autorisée pour cette ressource.
Causes fréquentes : méthode non supportée (ex. POST au lieu de PUT).
406 Not Acceptable Description : le serveur ne peut pas produire une réponse acceptable selon les en-têtes de négociation (Accept, etc.).
Causes fréquentes : type ou format média non supporté dans Accept.
501 Not Implemented Description : le serveur ne prend pas en charge la fonctionnalité requise.
Causes fréquentes : fonctionnalité non implémentée.
503 Service Unavailable Description : le serveur ne peut pas traiter la requête temporairement (maintenance ou surcharge).
Causes fréquentes : maintenance, surcharge ou indisponibilité.

# 3.3.3 Charge utile d’erreur commune

Toutes les réponses d’erreur renvoient une structure commune incluant un message explicite. La charge contient en général :

  • errorCode : code de l’erreur.
  • errorDescription : description de l’erreur.
  • extensionList : liste facultative de paires clé-valeur avec des informations complémentaires.

Cette charge aide les clients à comprendre l’erreur et à réagir de façon appropriée.

# 3.4 ULID comme identifiants uniques

Mojaloop utilise des identifiants uniques lexicographiquement triables (ULID) comme standard d’identifiants dans sa messagerie. Les ULID constituent une alternative solide aux UUID, avec unicité globale et ordre naturel par date de création, ce qui facilite traçabilité, diagnostic et analyses opérationnelles.

# 3.5 Protocole Interledger (v4) pour les termes cryptographiques

Mojaloop s’appuie sur ILP version 4 pour définir et représenter les termes cryptographiques dans les transferts. ILP v4 offre un cadre normalisé pour l’échange sécurisé et interopérable d’instructions de paiement, avec intégrité et non-répudiation. L’intégration des capacités cryptographiques d’ILP permet des accords précis et inviolables entre participants et l’exécution sécurisée de transferts de bout en bout, tout en restant compatible avec les écosystèmes de paiement mondiaux.

# 3.6 Champs de données supplémentaires ISO 20022

Aucun message utilisé ne devrait exiger de champs de données supplémentaires ISO 20022. Si des données supplémentaires sont fournies, le switch ne rejette pas le message mais ignore leur contenu, comme si elles étaient absentes.

# 4. Phase de découverte

La phase de découverte est une étape facultative du transfert, nécessaire uniquement lorsque le bénéficiaire (partie finale) doit être identifié et confirmé avant d’engager un accord. Elle s’appuie sur la ressource parties, qui permet d’obtenir et de valider les informations du bénéficiaire pour vérifier son éligibilité au transfert. Les contrôles clés incluent : compte actif, devises pouvant être créditées sur le compte, détails du titulaire. Le payeur peut ainsi vérifier les informations du bénéficiaire, limiter les erreurs et sécuriser les phases suivantes.

# 4.1 Flux de messages

Le diagramme de séquence illustre des messages d’exemple de découverte pour un transfert P2P initié par le payeur. Discovery Flow

# 4.2 Ressource Parties

La ressource Parties regroupe les fonctions nécessaires à la phase de découverte. Le flux démarre toujours par un appel GET /parties ; les réponses sont renvoyées à l’initiateur via le rappel PUT /parties. Les erreurs passent par PUT /parties/.../error. Ces points de terminaition prennent en charge un type de sous-identifiant facultatif.

Point de terminaison Message
GET /parties/{type}/{partyIdentifier}[/{subId}]
PUT /parties/{type}/{partyIdentifier}[/{subId}] acmt.024.001.04
PUT /parties/{type}/{partyIdentifier}[/{subId}]/error acmt.024.001.04

# 5. Phase d’accord

La phase d’accord est une étape critique : toutes les parties doivent partager la même compréhension des conditions du transfert avant tout engagement de fonds. Elle remplit notamment les objectifs suivants :

  1. Calcul et accord sur les frais
    Permet de calculer et d’accepter mutuellement les frais applicables, pour la transparence et pour limiter les litiges après le lancement du transfert.
  2. Validation avant engagement
    Chaque organisation vérifie si le transfert peut avoir lieu, ce qui permet de détecter tôt les problèmes et de réduire erreurs et écarts de rapprochement.
  3. Signature cryptographique des conditions
    Les conditions du transfert sont signées cryptographiquement, assurant la non-répudiation. Le protocole Interledger est utilisé ; la production de paquets ILP est décrite dans la documentation API FSPIOP Mojaloop (opens new window).
  4. Soutien à l’inclusion financière
    En exposant clairement l’ensemble des conditions en amont, la phase d’accord garantit que les participants décident en connaissance de cause, pour des choix équitables et éclairés.

La phase d’accord renforce fiabilité et efficacité des transferts Mojaloop et la confiance dans les écosystèmes financiers numériques inclusifs.

Elle se subdivise en deux sous-phases.

# 5.1 Sous-phase d’accord sur la conversion de devises

Cette sous-phase est facultative ; elle s’active seulement si le transfert implique une conversion de devises. Le DFSP payeur coordonne alors un fournisseur de change pour sécuriser la liquidité inter-devises nécessaire. Les taux de change et frais associés sont fixés de façon transparente et acceptée par le DFSP et le FXP. Traiter la conversion avant l’engagement du transfert limite retards et écarts, notamment pour les opérations transfrontalières.

# 5.1.1 Flux de messages

Le diagramme de séquence illustre des messages d’exemple pour un transfert P2P initié par le payeur. Agreement Conversion Flow

# 5.1.2 Ressource fxQuotes

Point de terminaison Message
POST /fxQuotes/{ID} pacs.091.001
PUT /fxQuotes/{ID} pacs.092.001
PUT /fxQuotes/{ID}/error pacs.002.001.15

# 5.2 Sous-phase d’accord sur les conditions de transfert

Cette sous-phase établit de concert les conditions du transfert entre le DFSP payeur et le DFSP bénéficiaire : montant, frais, délais, etc. Elle permet aussi la signature cryptographique de ces conditions pour la non-répudiation et la responsabilité. Finaliser les conditions de façon transparente limite erreurs et litiges et renforce l’efficacité et la confiance dans le processus Mojaloop.

# 5.2.1 Flux de messages

Le diagramme de séquence illustre des messages d’exemple pour un transfert P2P initié par le payeur. Agreement Flow

# 5.2.2 Ressource Quotes

Point de terminaison Message
POST /quotes/{ID} pacs.081.001
PUT /quotes/{ID} pacs.082.001
PUT /quotes/{ID}/error pacs.002.001.15

# 6. Phase de transfert

Une fois les accords conclus pendant la phase d’accord, leur acceptation déclenche la phase de transfert, où intervient le mouvement effectif des fonds. Elle est exécutée avec précision pour respecter les conditions convenues et les engagements de chaque participant. Elle comporte deux sous-phases : exécution de la conversion de devises et compensation du transfert, en miroir des sous-phases d’accord correspondantes.

# 6.1 Acceptation des conditions de conversion de devises

Cette sous-phase a lieu si le transfert comporte un change. Le fournisseur de change convenu pendant la phase d’accord exécute la conversion ; la liquidité inter-devises est fournie et les fonds convertis sont préparés pour la suite vers le DFSP bénéficiaire. Le FXP vérifie le respect des taux et frais convenus, pour l’intégrité financière et la transparence.

# 6.1.1 Flux de messages

Le diagramme de séquence illustre des messages d’exemple de transfert pour un P2P initié par le payeur. Conversion Transfer Flow

# 6.1.2 Ressource fxTransfers

Point de terminaison Message
POST /fxTransfers/{ID} pacs.009.001
PUT /fxTransfers/{ID} pacs.002.001.15
PUT /fxTransfers/{ID}/error pacs.002.001.15
PATCH /fxTransfers/{ID}/error pacs.002.001.15

# 6.2 Exécution et compensation du transfert

Cette sous-phase couvre le transfert effectif des fonds entre le DFSP payeur et le DFSP bénéficiaire : le montant convenu, y compris les frais, est compensé sur les comptes appropriés. Elle achève l’opération financière et honore les engagements de la phase d’accord, via des mécanismes de mouvement de fonds sécurisés et efficaces.

# 6.2.1 Flux de messages

Le diagramme de séquence illustre des messages d’exemple pour un transfert P2P initié par le payeur. Transfer Flow

# 6.2.2 Ressource Transfers

Point de terminaison Message
POST /transfers/{ID} pacs.008.001
PUT /transfers/{ID} pacs.002.001.15
PUT /transfers/{ID}/error pacs.002.001.15
PATCH /transfers/{ID}/error pacs.002.001.15