Create a card
Cards
Create Card
Issue a new virtual USD card to an enrolled customer, optionally with an initial funding amount.
POST
Create a card
Overview
POST /cards issues a new virtual USD card to one of your customers. The card is usable immediately for online payments wherever Visa or Mastercard is accepted. If you provide an amount, the card is funded from your USD wallet in the same call.
When to use it
- A customer needs a card for the first time.
- An existing customer needs an additional card (you can issue more than one card per customer).
Prerequisites
- Customer must already exist via
POST /customersand haveKYCstatusAPPROVED. - Your company USD wallet must have a balance covering the issuance fee plus the optional initial
amount. - The customer’s country must be supported for card issuance (most African and many other countries — contact support for the current list).
Request
Headers
| Name | Required | Description |
|---|---|---|
Authorization | Yes | Bearer <access_token> |
Content-Type | Yes | application/json |
Body
| Field | Type | Required | Constraints | Description |
|---|---|---|---|---|
customer_id | string | Yes | UUID of a customer in your company | The customer who will own the card. |
brand | string | Yes | One of VISA, MASTERCARD (case-insensitive) | The card network. Both work globally; choose based on customer/merchant preference. |
name_on_card | string | No | Max 50 characters. Letters, spaces, ., - recommended. | Cardholder name as it should be encoded. Defaults to the customer’s full name if omitted. |
amount | number | No | ≥ 0. USD. | Initial funding amount in USD, deducted from the company USD wallet. Omit or set 0 for an unfunded card. |
Idempotency: This endpoint does not currently accept an idempotency key. To avoid duplicate cards on network retries, store the resulting card.id in your own database before retrying.
Response
201 — Card created (and funded if amount > 0)
| Field | Type | Description |
|---|---|---|
card.id | string | Cartevo card identifier (UUID). Use this in all future card calls. |
card.status | string | PENDING while the upstream issuer processes; flips to ACTIVE on success. |
card.balance | number | Current card balance in USD. |
card.masked_pan | string | First 4 + masked + last 4 digits. |
card.expiry_month / card.expiry_year | integer | Card expiry. Cards are valid for 3 years. |
auto_filled_fields | array | Fields Cartevo defaulted (e.g. name_on_card from customer profile). Empty if you supplied everything. |
Error responses
| Status | message example | Trigger | Recommended action |
|---|---|---|---|
400 | "Insufficient balance" | Company USD wallet has less than (issuance fee + amount). | Top up the USD wallet. |
400 | "Customer KYC not approved" | Customer exists but kyc_status is PENDING or REJECTED. | Wait for KYC, or re-submit documents. |
400 | "Invalid brand" | brand is not VISA or MASTERCARD. | Fix the request. |
404 | "Customer not found" | customer_id does not exist or belongs to another company. | Verify the customer ID. |
422 | "Card issuer rejected: ..." | The upstream card issuer refused (rare — usually KYC- or BIN-related). | Inspect the message. May need support intervention. |
5xx | "Issuance temporarily unavailable" | Transient upstream issue. | Retry with exponential backoff. Card may still issue eventually — check via GET /cards. |
Webhooks fired
After a successful create call, you will receive (in order):card.created— once the upstream issuer confirms the card.transaction.funding.completed— only ifamount > 0.
Code examples
cURL
Node.js (axios)
Python (requests)
Related
- Cards Overview — limits, statuses, and PCI DSS notes.
POST /cards/{id}/fund— add funds later.GET /cards/{id}— retrieve full (or revealed) card details.- Webhooks — payloads emitted after creation.
Authorizations
Bearer authentication header of the form Bearer <token>, where <token> is your auth token.
Body
application/json