Register new customer
Create Customer
Register a new customer with KYC documents uploaded as files. After approval, the customer can be issued cards.
POST
Register new customer
Overview
POST /customers registers a new customer in your company and submits their KYC documents to Cartevo’s verification provider. This endpoint accepts the documents as uploaded files (multipart/form-data). For URL-based document submission, use POST /customers/enroll instead.
After creation, the customer’s kyc_status starts as PENDING and transitions to APPROVED (or REJECTED) once the upstream verification completes — typically within minutes for automated checks.
When to use it
- You hold the customer’s KYC documents locally as image/PDF files (e.g. uploaded by the customer through your app).
- You want a single round-trip rather than uploading documents to your own storage first.
| Use this endpoint when… | Use POST /customers/enroll when… |
|---|---|
| Documents are local files in your server’s memory or disk. | Documents are already hosted at public HTTPS URLs. |
| You want one HTTP call. | You want JSON-only requests for easier auditing/logging. |
Prerequisites
- Your company has completed KYB and is in
APPROVEDstatus. - You have a government-issued ID document for the customer (front; back required for some types).
Request
Headers
| Name | Required | Description |
|---|---|---|
Authorization | Yes | Bearer <access_token> |
Content-Type | Yes | multipart/form-data |
Query parameters
| Name | Type | Default | Description |
|---|---|---|---|
enroll | boolean | false | If true, also enroll the customer on the upstream card-issuer immediately after creation. Otherwise enrollment happens lazily before the first card is issued. |
Body fields
| Field | Type | Required | Constraints |
|---|---|---|---|
first_name | string | Yes | 3–255 chars |
last_name | string | Yes | 3–255 chars |
email | string | Yes | Valid email |
country | string | Yes | 2–255 chars. Full country name, e.g. "Cameroon" |
street | string | Yes | 2–255 chars |
city | string | Yes | 2–255 chars |
state | string | Yes | 2–255 chars |
postal_code | string | Yes | 3–255 chars |
country_iso_code | string | Yes | ISO 3166-1 alpha-2, e.g. CM, NG |
country_phone_code | string | Yes | Dial code with +, e.g. +237 |
phone_number | string | Yes | Local subscriber number (no country code), 3–255 chars |
identification_number | string | Yes | 1–255 chars. Format depends on id_document_type |
id_document_type | string | Yes | Enum: NIN, PASSPORT, VOTERS_CARD, DRIVERS_LICENSE |
date_of_birth | string (date) | Yes | YYYY-MM-DD. Customer must be 18+ |
id_document_front | file | Yes | Image (JPG/PNG) or PDF of the front of the ID document |
id_document_back | file | No | Image or PDF of the back. Required for DRIVERS_LICENSE and NIN; not used for PASSPORT |
File constraints
- Accepted MIME types:
image/jpeg,image/png,application/pdf. - Recommended resolution: ≥ 200 DPI; the entire document edge-to-edge visible; no glare; legible text.
- Max file size: 10 MB per file (operational guidance — the upstream verifier may reject larger or lower-quality files).
Example
Response
201 — Customer created
| Field | Description |
|---|---|
id | Cartevo customer ID (UUID). Use for all future calls — POST /cards, etc. |
type | The id_document_type you submitted. |
number | The identification_number you submitted (preserved as-is). |
image / photo | Cartevo-hosted URLs for the front and back of the ID, available for your records. |
is_active | true for newly created customers. |
Note on KYC status: This response does not include akyc_statusfield. KYC verification runs asynchronously after creation. Listen for the relevant webhook (customer.createdis fired immediately; KYC outcome events will be added separately) or pollGET /customers/{id}to check the status.
Error responses
| Status | message example | Trigger | Recommended action |
|---|---|---|---|
400 | "first_name must be at least 3 characters" | Field validation failure. | Fix the request. |
400 | "Customer must be 18 or older" | date_of_birth is less than 18 years ago. | The customer cannot be onboarded. |
409 | "Customer with this email already exists" | A customer with the same email exists in your company. | Fetch the existing customer instead of creating new. |
409 | "Customer with this identification_number already exists" | Duplicate ID number in your company. | Fetch the existing customer instead of creating new. |
413 | "File too large" | A document file exceeds the size limit. | Compress the file and retry. |
415 | "Unsupported file type" | A document is not JPG/PNG/PDF. | Convert and retry. |
422 | "KYC document unreadable" | The upstream verifier rejected the document quality. | Resubmit with a clearer scan. |
Webhooks fired
customer.created— emitted immediately after the customer record is persisted.
Related
POST /customers/enroll— JSON variant with hosted document URLs.GET /customers— list your customers.POST /cards— issue a card to an approved customer.
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Query Parameters
Enroll customer on Provider
Example:
"true"
Body
multipart/form-data
Example:
"john.doe@example.com"
Required string length:
3 - 255Example:
"John"
Required string length:
3 - 255Example:
"Doe"
Required string length:
2 - 255Example:
"Nigeria"
Required string length:
2 - 255Example:
"123 Main Street"
Required string length:
2 - 255Example:
"Lagos"
Required string length:
2 - 255Example:
"Lagos State"
Required string length:
3 - 255Example:
"100001"
Required string length:
1 - 255Example:
"CM"
Required string length:
1 - 255Example:
"+234"
Required string length:
3 - 255Example:
"8012345678"
Required string length:
1 - 255Example:
"12345678901"
Available options:
NIN, PASSPORT, VOTERS_CARD, DRIVERS_LICENSE Example:
"NIN"
Example:
"1990-01-15"