Create a cardholder
Cardholders
Create Cardholder
Create a cardholder profile for one of your end users. POST /cardholders. Requires cardholders:write scope.
POST
Create a cardholder
Overview
Create a cardholder profile for an end user. KYC is triggered automatically and runs asynchronously — subscribe toCARDHOLDER_KYC_APPROVED or CARDHOLDER_KYC_REJECTED to be notified when it completes.
Cards can only be issued once kycStatus is APPROVED.
Required Fields
| Field | Type | Constraint |
|---|---|---|
firstName | string | Legal first name |
lastName | string | Legal last name |
email | string | Valid email, unique within your environment |
dateOfBirth | string | YYYY-MM-DD format, cardholder must be 18+ |
nationality | string | ISO 3166-1 alpha-2 (e.g. US) |
address.address | string | Full street address (line 1 and optional line 2 combined) |
address.city | string | City |
address.country | string | ISO 3166-1 alpha-2 |
KYC-Locked Fields
After KYC approval, these fields become immutable:firstName, lastName, email, dateOfBirth, nationality, address. Attempting to change them returns 409 KYC_FIELD_LOCKED.
KYC Document
The optionalkycDocument object lets you supply identity document details alongside the cardholder creation. It is not KYC-locked and can be updated via PATCH at any time.
| Field | Type | Description |
|---|---|---|
documentType | string | PASSPORT, NATIONAL_ID, DRIVERS_LICENSE, or RESIDENCE_PERMIT |
documentNumber | string | Document number as printed |
issuingCountry | string | ISO 3166-1 alpha-2 |
frontUrl | string | URL of the document front image |
backUrl | string | URL of the document back image (not required for passports) |
selfieUrl | string | URL of the cardholder selfie |
Example
Success Response (201)
| Field | Condition |
|---|---|
kycRejectionReason | Only when kycStatus is REJECTED |
terminatedAt | Only when status is TERMINATED |
Webhook
ACARDHOLDER_CREATED event fires after successful creation. A few seconds later in SANDBOX (async in LIVE), one of these fires:
Error Codes
| Code | HTTP | Cause |
|---|---|---|
INVALID_BODY | 400 | Request body is not valid JSON |
VALIDATION_ERROR | 422 | Missing or invalid fields (e.g. bad email, missing address.city) |
CARDHOLDER_UNDER_AGE | 422 | dateOfBirth indicates cardholder is under 18 |
CARDHOLDER_EMAIL_EXISTS | 409 | Email already registered in this environment |
PROGRAM_NOT_FOUND | 404 | No active program found for your account |
PROGRAM_CLOSED | 409 | Program is closed and cannot accept new cardholders |
INSUFFICIENT_SCOPE | 403 | Key lacks cardholders:write scope |
INTERNAL_ERROR | 500 | Server error |
Authorizations
API key from the FYATU CaaS portal. Pass as Authorization: Bearer <key>.
Body
application/json
Example:
"John"
Example:
"Smith"
Example:
"john.smith@example.com"
YYYY-MM-DD — must be 18+
Example:
"1990-05-15"
ISO 3166-1 alpha-2
Example:
"US"
Example:
"+12025551234"
Identity document details for KYC verification. Optional on create; patchable via PATCH. Not locked after KYC approval.
Example:
"usr_123456"
Example:
{ "plan": "premium" }
