Docs
ENFR
Tableau de bord
Référence de l’API

Titulaires

Un titulaire est la personne à qui une carte est émise : un membre de votre équipe ou l’un de vos clients. L’émetteur vérifie son identité avant toute émission.

Un titulaire est la personne à qui une carte est émise : un membre de votre équipe ou l’un de vos clients. L’émetteur vérifie son identité avant toute émission.

L’objet titulaire

Attributs
idstring

Identifiant unique (UUID).

livemodeboolean

true en production, false en mode test.

objectstring

Toujours cardholder.

typestring

team pour votre équipe, customer pour vos clients.

teamcustomer
first_namestring
last_namestring
emailstring
phonestring | null

Format international.

countrystring

ISO 3166-1 alpha-2.

citystring | null
birth_datestring | null

AAAA-MM-JJ.

id_documentstring

Type de pièce d’identité.

national_idpassportdriver_licensevoters_card
id_number_last4string | null

4 derniers caractères du numéro de pièce. Le numéro complet n’est jamais renvoyé.

verificationobject

Vérification d’identité par l’émetteur. Une carte ne peut être émise qu’une fois status à verified.

Voir les attributs
statusstring
pendingin_reviewverifiedrejected
reasonstring | null

Motif du refus.

verified_atstring | null

Date de vérification.

documents_on_fileboolean

true si les photos de la pièce envoyées à la création sont enregistrées : la vérification peut être envoyée sans les renvoyer.

created_atstring

Date de création, ISO 8601 (UTC).

updated_atstring

Dernière modification, ISO 8601 (UTC).

L’objet titulaire
{
  "id": "5df6acd9-4bac-4e19-869c-fcde6b79f389",
  "object": "cardholder",
  "livemode": false,
  "type": "customer",
  "first_name": "Awa",
  "last_name": "Ndiaye",
  "email": "awa@example.com",
  "phone": "+237670000999",
  "country": "CM",
  "city": "Douala",
  "birth_date": "1991-02-03",
  "id_document": "national_id",
  "id_number_last4": "3408",
  "verification": {
    "status": "pending",
    "reason": null,
    "verified_at": null,
    "documents_on_file": true
  },
  "created_at": "2026-10-30T13:47:06.394Z",
  "updated_at": "2026-10-30T13:47:06.394Z"
}

Créer un titulaire

POST/v1/cardholders

Crée le titulaire avec verification.status à pending. La photo de la pièce d’identité est obligatoire (documents) : elle est contrôlée avant toute création et reprise par la vérification d’identité. Envoyez ensuite la vérification d’identité.

Rôles de la clé : Propriétaire ou Finance

Corps
first_namestringRequis

Exactement comme sur la pièce d’identité. 1 à 50 caractères : lettres (accents acceptés), espaces, apostrophes, points et traits d’union.

last_namestringRequis

Mêmes règles que first_name.

emailstringRequis

Adresse valide, 200 caractères au plus. Unique pour votre entreprise.

countrystringRequis

Pays de résidence, ISO 3166-1 alpha-2, parmi : CM, GA, TD, CG, CF, CD, CI, SN, BJ, TG, BF, ML, NE, GN, NG, GH, KE, UG, TZ, RW, ZM, ZA. Sinon country_unsupported.

typestringFacultatifPar défaut team
teamcustomer
phonestringRequis

Numéro mobile au format international E.164 (+237670000999). Un numéro national prend l’indicatif de country. La partie nationale doit avoir la longueur en usage dans ce pays, sinon phone_invalid. Renvoyé normalisé.

birth_datestringRequis

AAAA-MM-JJ, date réelle, exactement comme sur la pièce. Le titulaire doit avoir au moins 18 ans (cardholder_underage).

id_documentstringFacultatifPar défaut national_id

Pièce utilisée pour la vérification. Au Ghana, national_id désigne la Ghana Card. Un passeport ne demande que la page avec la photo ; les autres pièces, le recto et le verso.

national_idpassportdriver_licensevoters_card
id_numberstringFacultatif

Numéro de la pièce, tel qu’imprimé (mis en majuscules). Passeport : 6 à 9 lettres ou chiffres, sans espace. Autres pièces : 4 à 30 caractères parmi lettres, chiffres, espaces, / et -. Facultatif ici, requis par la vérification. Seuls ses 4 derniers caractères sont renvoyés.

citystringFacultatif

Facultatif. 2 à 60 caractères, sans chiffres.

addressobjectFacultatif

Adresse du domicile, gardée avec le titulaire : line1, line2, city, state, postal_code. La vérification la redemande.

documentsobjectRequis

Photos de la pièce d’identité, en base64 ou en URI data:image/…;base64,. JPEG ou PNG, 4 Mo chacune au plus, au moins 600 × 400 px. Absente : parameter_missing ; illisible, trop lourde ou trop petite : document_invalid. param indique la face.

Voir les attributs
frontstringRequis

Recto (page avec la photo pour un passeport).

backstringFacultatif

Verso. Requis, sauf pour un passeport.

Retour

Renvoie le nouvel objet titulaire avec 201.

Erreurs à prévoir
HTTPCodeDescription
400parameter_missingUn paramètre requis manque. Voir param.
400parameter_invalidUn paramètre a un type ou une valeur incorrects. Voir param.
400document_invalidUne photo de pièce n’est pas acceptée : JPEG ou PNG uniquement, 4 Mo au plus, au moins 600 × 400 px. param indique la face.
400phone_invalidLe numéro ne peut pas être lu comme un numéro international.
400country_unsupportedCe pays n’est pas ouvert pour cette devise. Voir Couverture.
400cardholder_underageLe titulaire doit avoir au moins 18 ans.
400id_document_unsupportedType de pièce d’identité non pris en charge.
403permission_deniedLe créateur de la clé n’a pas le rôle requis pour cette opération.
409cardholder_existsUn titulaire utilise déjà cet e-mail.
429rate_limitedUne limite de débit est atteinte. Attendez Retry-After secondes. Voir Limites de débit.
curl https://api.monerails.com/v1/cardholders \
  -H "Authorization: Bearer $MONERAIL_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: a1f3c9e2-5b7d-4c21-9f80-3e6b2d1c7a45" \
  -d '{
    "type": "customer",
    "first_name": "Awa",
    "last_name": "Ndiaye",
    "email": "awa@example.com",
    "phone": "+237670000999",
    "country": "CM",
    "city": "Douala",
    "birth_date": "1991-02-03",
    "id_document": "national_id",
    "documents": {
      "front": "data:image/jpeg;base64,/9j/4AAQ…",
      "back": "data:image/jpeg;base64,/9j/4AAQ…"
    }
  }'
Réponse201
{
  "id": "5df6acd9-4bac-4e19-869c-fcde6b79f389",
  "object": "cardholder",
  "livemode": false,
  "type": "customer",
  "first_name": "Awa",
  "last_name": "Ndiaye",
  "email": "awa@example.com",
  "phone": "+237670000999",
  "country": "CM",
  "city": "Douala",
  "birth_date": "1991-02-03",
  "id_document": "national_id",
  "id_number_last4": "3408",
  "verification": {
    "status": "pending",
    "reason": null,
    "verified_at": null,
    "documents_on_file": true
  },
  "created_at": "2026-10-30T13:47:06.394Z",
  "updated_at": "2026-10-30T13:47:06.394Z"
}

Envoyer la vérification d’identité

POST/v1/cardholders/{id}/verification

Transmet l’identité et les photos de la pièce à l’émetteur. Renvoie 202 avec verification.status à in_review. La décision arrive avec l’événement cardholder.kyc_updated. Après un refus, rappelez-le avec des informations corrigées. Si le titulaire est déjà vérifié, renvoie 200 sans rien changer ; pendant un examen en cours, les pièces ne sont pas renvoyées. Le prénom, le nom et la date de naissance doivent correspondre exactement à la pièce. La vérification est propre à chaque entreprise : une personne déjà vérifiée par une autre entreprise est vérifiée à nouveau pour la vôtre. Limité à 5 appels par titulaire et par 24 heures.

Rôles de la clé : Propriétaire ou Finance

Paramètres de chemin
idstringRequis

Identifiant du titulaire.

Corps
id_numberstringRequis

Numéro de la pièce, mêmes règles qu’à la création (passeport : 6 à 9 lettres ou chiffres ; autres pièces : 4 à 30 caractères).

birth_datestringFacultatif

AAAA-MM-JJ, 18 ans ou plus. Par défaut, la birth_date du titulaire.

place_of_birthstringRequis

Ville de naissance, comme sur la pièce. 2 à 60 caractères, sans chiffres.

addressobjectRequis

Adresse du domicile. Les accents sont acceptés et transmis sans accent.

Voir les attributs
line1stringRequis

3 à 100 caractères : lettres, chiffres, espaces et , . - uniquement.

line2stringFacultatif

Facultatif. Mêmes caractères que line1, 100 au plus.

citystringRequis

2 à 60 caractères, sans chiffres.

statestringRequis

Région, province ou État. 2 à 60 caractères, sans chiffres.

postal_codestringFacultatif

Facultatif. 1 à 10 lettres, chiffres, espaces ou traits d’union. À omettre s’il n’en existe pas.

documentsobjectFacultatif

Photos de la pièce, en base64 ou en URI data:image/…;base64,. JPEG ou PNG, 4 Mo chacune au plus, au moins 600 × 400 px (sinon document_invalid). Nettes, non recadrées, sans reflet, pièce entière visible. Facultatives si les photos ont été envoyées à la création (verification.documents_on_file) ; envoyées, elles les remplacent.

Voir les attributs
frontstringRequis

Recto (page avec la photo pour un passeport).

backstringFacultatif

Verso. Requis, sauf pour un passeport.

phonestringFacultatif

Seulement si le titulaire n’en a pas. Mêmes règles qu’à la création.

Retour

Renvoie l’objet titulaire avec 202 : le résultat suit par webhook.

Erreurs à prévoir
HTTPCodeDescription
400parameter_missingUn paramètre requis manque. Voir param.
400parameter_invalidUn paramètre a un type ou une valeur incorrects. Voir param.
400phone_invalidLe numéro ne peut pas être lu comme un numéro international.
400document_invalidUne photo de pièce n’est pas acceptée : JPEG ou PNG uniquement, 4 Mo au plus, au moins 600 × 400 px. param indique la face.
400cardholder_underageLe titulaire doit avoir au moins 18 ans.
402identity_already_registeredL’émetteur de cartes détient déjà cette identité pour une vérification en cours ou terminée. Contactez le support.
402verification_declinedL’émetteur de cartes a refusé l’envoi de la vérification. Vérifiez les informations et les photos de la pièce, puis renvoyez-la.
403permission_deniedLe créateur de la clé n’a pas le rôle requis pour cette opération.
429rate_limitedUne limite de débit est atteinte. Attendez Retry-After secondes. Voir Limites de débit.
curl https://api.monerails.com/v1/cardholders/5df6acd9-4bac-4e19-869c-fcde6b79f389/verification \
  -H "Authorization: Bearer $MONERAIL_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "id_number": "CM12345678",
    "birth_date": "1991-02-03",
    "place_of_birth": "Douala",
    "address": {
      "line1": "12 rue Joss",
      "city": "Douala",
      "state": "Littoral"
    },
    "documents": {
      "front": "data:image/jpeg;base64,/9j/4AAQ…",
      "back": "data:image/jpeg;base64,/9j/4AAQ…"
    }
  }'
Réponse202
{
  "id": "5df6acd9-4bac-4e19-869c-fcde6b79f389",
  "object": "cardholder",
  "livemode": false,
  "type": "customer",
  "first_name": "Awa",
  "last_name": "Ndiaye",
  "email": "awa@example.com",
  "phone": "+237670000999",
  "country": "CM",
  "city": "Douala",
  "birth_date": "1991-02-03",
  "id_document": "national_id",
  "id_number_last4": "3408",
  "verification": {
    "status": "in_review",
    "reason": null,
    "verified_at": null,
    "documents_on_file": true
  },
  "created_at": "2026-10-30T13:47:06.394Z",
  "updated_at": "2026-10-30T13:47:09.807Z"
}

Consulter un titulaire

GET/v1/cardholders/{id}

Rôles de la clé : Tous les rôles

Paramètres de chemin
idstringRequis

Identifiant du titulaire.

Retour

Renvoie l’objet titulaire.

curl https://api.monerails.com/v1/cardholders/5df6acd9-4bac-4e19-869c-fcde6b79f389 \
  -H "Authorization: Bearer $MONERAIL_KEY"
Réponse200
{
  "id": "5df6acd9-4bac-4e19-869c-fcde6b79f389",
  "object": "cardholder",
  "livemode": false,
  "type": "customer",
  "first_name": "Awa",
  "last_name": "Ndiaye",
  "email": "awa@example.com",
  "phone": "+237670000999",
  "country": "CM",
  "city": "Douala",
  "birth_date": "1991-02-03",
  "id_document": "national_id",
  "id_number_last4": "3408",
  "verification": {
    "status": "verified",
    "reason": null,
    "verified_at": "2026-10-30T13:47:09.807Z"
  },
  "created_at": "2026-10-30T13:47:06.394Z",
  "updated_at": "2026-10-30T13:47:06.394Z"
}

Lister les titulaires

GET/v1/cardholders

Du plus récent au plus ancien.

Rôles de la clé : Tous les rôles

Paramètres de requête
limitintegerFacultatifPar défaut 20

Nombre d’objets à renvoyer, de 1 à 100.

starting_afterstringFacultatif

Curseur : l’identifiant du dernier objet de la page précédente.

Retour

Renvoie un objet liste : data contient jusqu’à limit objets cardholder, et has_more indique s’il en reste.

curl "https://api.monerails.com/v1/cardholders?limit=10" \
  -H "Authorization: Bearer $MONERAIL_KEY"
Réponse200
{
  "object": "list",
  "url": "/v1/cardholders",
  "data": [
    {
      "id": "5df6acd9-4bac-4e19-869c-fcde6b79f389",
      "object": "cardholder",
      "livemode": false,
      "type": "customer",
      "first_name": "Awa",
      "last_name": "Ndiaye",
      "email": "awa@example.com",
      "phone": "+237670000999",
      "country": "CM",
      "city": "Douala",
      "birth_date": "1991-02-03",
      "id_document": "national_id",
      "id_number_last4": "3408",
      "verification": {
        "status": "pending",
        "reason": null,
        "verified_at": null,
        "documents_on_file": true
      },
      "created_at": "2026-10-30T13:47:06.394Z",
      "updated_at": "2026-10-30T13:47:06.394Z"
    }
  ],
  "has_more": false
}