Create a new customer. Verification stays PENDING until the type-specific verification flow completes.
For type=individual, id_type and id_number are required. After creation, upload identity files via the legacy KYC flow (see Creating your first payout). Only Driver's License, Passport, or Resident Permit are accepted as id_type.
For type=business, business_name + registration_number + incorporation_country are required. The legacy id_type / id_number fields are no longer required (still accepted for back-compat — when supplied, id_type must be certificate_of_incorporation). After creation, follow the Business customer KYB flow: register beneficial owners, upload owner ID files, register KYB documents, then call /submit.
ID cards (National Identity Cards) are not accepted at any stage. All uploaded documents must be clear, legible, and authentic — unclear images will be rejected. Fraudulent or falsified documents will result in the customer being permanently blacklisted from the platform.
Required scope: customer:write.
Authorization
oauth2ClientCredentials customer:writeUse your OAuth client credentials to obtain a short-lived Bearer token from POST /oauth/token.
In: header
Scope: customer:write
Request Body
application/json
TypeScript Definitions
Use the request body type in TypeScript.
Response Body
application/json
application/json
application/json
curl --request POST \ --url 'https://example.com/api/external/customer' \ --header 'Content-Type: application/json' \ --data '{ "type": "individual", "first_name": "John", "last_name": "Doe", "email": "john.doe@company.com", "country": "NG", "id_type": "passport", "id_number": "6733823632872", "phone": "+2348012345678", "dob": "1990-01-15", "street": "123 Main Street", "city": "Lagos", "state": "Lagos", "zip_code": "100001", "id_expiry_date": "2030-01-15", "id_issue_date": "2020-01-15"}'{ "message": "Customer created successfully.", "data": { "id": "9d4c4ec5-59ea-4130-bf8a-6a5edec401ee", "business_id": "9d4c4ec5-572d-49de-a362-f01ed09f2b1b", "first_name": "John", "last_name": "Doe", "business_name": null, "type": "individual", "email": "john.doe@company.com", "country": "NG", "id_type": "passport", "id_number": "6733823632872", "verification_status": "PENDING", "kyb_scope": null }}POSTList transactions
Retrieve a paginated list of completed API transactions for your business. You can filter by date range, status, customer, wallet, and transaction type. Use `type: SWAP` to return only swap transactions. Required scope: `transaction:read`.
GETList all customers
Retrieve customers for your business. Supports optional exact-match filters on `email`, `id_number`, `registration_number`, `verification_status`, and `type`, and opt-in pagination via `paginate=true`. Filters and pagination compose. When `paginate` is omitted or not truthy, the response shape is unchanged (`{message, data: [...]}`). When `paginate=true`, the response is a paginated envelope (`{message, data: [...], links: {...}, meta: {...}}`) with 15 items per page. Use the `?page=N` query string (in addition to `paginate=true`) to fetch subsequent pages. **Ordering:** the paginated path returns results newest-first (by `created_at` descending). The default unpaginated path preserves the legacy database-order semantics for backwards compatibility — if you need a guaranteed order, opt in to `paginate=true`. Required scope: `customer:read`.