Docs
ENFR
Dashboard
API reference

Cardholders

A cardholder is the person a card is issued to: a member of your team or one of your customers. The card issuer verifies their identity before any card is issued.

The cardholder object

Attributes
idstring

Unique identifier (UUID).

livemodeboolean

true for live objects, false for test objects.

objectstring

Always cardholder.

typestring

team for your own staff, customer for your customers.

teamcustomer
first_namestring
last_namestring
emailstring
phonestring | null

International format.

countrystring

ISO 3166-1 alpha-2.

citystring | null
birth_datestring | null

YYYY-MM-DD.

id_documentstring

Identity document type.

national_idpassportdriver_licensevoters_card
id_number_last4string | null

Last 4 characters of the document number. The full number is never returned.

verificationobject

Identity verification by the card issuer. A card can only be issued once status is verified.

Show child attributes
statusstring
pendingin_reviewverifiedrejected
reasonstring | null

Why it was rejected.

verified_atstring | null

When it was verified.

created_atstring

Creation time, ISO 8601 (UTC).

updated_atstring

Last change, ISO 8601 (UTC).

The cardholder object
{
  "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
  },
  "created_at": "2026-10-30T13:47:06.394Z",
  "updated_at": "2026-10-30T13:47:06.394Z"
}

Create a cardholder

POST/v1/cardholders

Creates the cardholder with verification.status pending. Then submit the identity verification.

Key roles: Owner or Finance

Body
first_namestringRequired

Up to 60 characters.

last_namestringRequired

Up to 60 characters.

emailstringRequired

Unique per business.

countrystringRequired

ISO 3166-1 alpha-2.

typestringOptionalDefault team
teamcustomer
phonestringOptional

International format. Required before verification.

citystringOptional
birth_datestringOptional

YYYY-MM-DD.

id_documentstringOptionalDefault national_id

Document used for verification.

national_idpassportdriver_licensevoters_card
id_numberstringOptional

Document number. Only its last 4 characters are returned.

addressobjectOptional

Home address, kept with the cardholder: line1, line2, city, state, postal_code. The verification asks for it again.

Returns

Returns the new cardholder object with 201.

Errors worth handling
HTTPCodeDescription
400parameter_invalidA parameter has the wrong type or value. See param.
403permission_deniedThe key’s creator does not have the role required for this operation.
409cardholder_existsA cardholder already uses this email.
429rate_limitedA rate limit was reached. Wait for Retry-After seconds. See Rate limits.
curl https://api.monerail.com/v1/cardholders \
  -H "Authorization: Bearer $MONERAIL_KEY" \
  -H "Content-Type: application/json" \
  -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"
  }'
Response201
{
  "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
  },
  "created_at": "2026-10-30T13:47:06.394Z",
  "updated_at": "2026-10-30T13:47:06.394Z"
}

Submit identity verification

POST/v1/cardholders/{id}/verification

Sends the identity details and document images to the card issuer. Returns 202 with verification.status in_review. The decision arrives with the cardholder.kyc_updated event. After a rejection, call it again with corrected details. If the cardholder is already verified, returns 200 with no change; while a review is in progress, documents are not sent again. The first name, last name and birth date must match the document exactly. Verification is per business: a person already verified by another business is verified again for yours. Limited to 5 calls per cardholder per 24 hours.

Key roles: Owner or Finance

Path parameters
idstringRequired

ID of the cardholder.

Body
id_numberstringRequired

Document number.

birth_datestringRequired

YYYY-MM-DD.

addressobjectRequired

Home address.

Show child attributes
line1stringRequired
citystringRequired
line2stringOptional
statestringOptional

Region. Defaults to the city.

postal_codestringOptional

Optional.

documentsobjectRequired

Photos of the document, as base64 or data:image/…;base64, URIs. JPEG or PNG, 4 MB each at most. Sharp, uncropped, without glare, with the whole document visible.

Show child attributes
frontstringRequired

Front side.

backstringOptional

Back side. Required, except for a passport (front only).

place_of_birthstringRequired

City of birth, up to 80 characters.

phonestringOptional

International format, if not set on the cardholder.

Returns

Returns the cardholder object with 202: the outcome follows by webhook.

Errors worth handling
HTTPCodeDescription
400parameter_missingA required parameter is missing. See param.
400parameter_invalidA parameter has the wrong type or value. See param.
400phone_invalidThe number cannot be read as an international number.
403permission_deniedThe key’s creator does not have the role required for this operation.
429rate_limitedA rate limit was reached. Wait for Retry-After seconds. See Rate limits.
curl https://api.monerail.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…"
    }
  }'
Response202
{
  "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
  },
  "created_at": "2026-10-30T13:47:06.394Z",
  "updated_at": "2026-10-30T13:47:09.807Z"
}

Retrieve a cardholder

GET/v1/cardholders/{id}

Key roles: Every role

Path parameters
idstringRequired

ID of the cardholder.

Returns

Returns the cardholder object.

curl https://api.monerail.com/v1/cardholders/5df6acd9-4bac-4e19-869c-fcde6b79f389 \
  -H "Authorization: Bearer $MONERAIL_KEY"
Response200
{
  "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"
}

List cardholders

GET/v1/cardholders

Newest first.

Key roles: Every role

Query parameters
limitintegerOptionalDefault 20

Number of objects to return, 1 to 100.

starting_afterstringOptional

Cursor: the ID of the last object of the previous page.

Returns

Returns a list object: data holds up to limit cardholder objects, and has_more tells whether more follow.

curl "https://api.monerail.com/v1/cardholders?limit=10" \
  -H "Authorization: Bearer $MONERAIL_KEY"
Response200
{
  "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
      },
      "created_at": "2026-10-30T13:47:06.394Z",
      "updated_at": "2026-10-30T13:47:06.394Z"
    }
  ],
  "has_more": false
}