Issue a card
Cards
Issue Card
Issue a new virtual card to a cardholder. POST /cards. Requires cards:write scope.
POST
Issue a card
Overview
Issue a virtual prepaid card to a cardholder under one of your programs. PassproductId — the program, card type, and spend limits are all derived from the product automatically.
JIT vs pre-funded cards:
- JIT-enabled products (
features.hasJIT: true): The card is funded on-demand at the point of each transaction.amountis optional. - Standard products (
features.hasJIT: false): The card requires an initial balance at issuance.amountis required.
Request Body
Example
Success Response (201)
Response Fields
Provisioning is asynchronous
The card provider provisions cards asynchronously. When you callPOST /cards, the card may come back with status: "CREATING" and empty maskedPan, last4, and expirationDate — provisioning can take anywhere from a few seconds up to ~1 hour. The 201 response is an acknowledgement that the card was accepted, not a guarantee the card number is ready.
Webhook
TheCARD_ISSUED event is fired when the card finishes provisioning (CREATING → ACTIVE) — immediately for instantly-provisioned cards, or later (up to ~1h) for cards that were CREATING. It always includes the complete card details:
Who Can Hold a Card
Two things about the cardholder are checked before a card is issued. Verification. Some BINs require a verified cardholder and some require none; BINs on one programme differ.GET /cardholders/{id} returns programEligibility, which says which BINs are
open to a given cardholder and what to do where one is not.
Country. Some products cannot be issued to cardholders from particular countries. Both
nationality and country of residence are checked, and a match returns
422 CARDHOLDER_COUNTRY_RESTRICTED naming the country.
Cards That Are Still Provisioning
A201 means the card was accepted, not that it exists at the provider yet. On some BINs
provisioning is immediate and the response carries everything; on others the card comes back as
"status": "CREATING" with maskedPan and last4 empty and no expirationDate.
Do not treat a missing PAN as a failure. Wait for the card.created webhook, or poll
GET /cards/{id} until status becomes ACTIVE.
Spending Limits
Spending limits belong to the product, which falls back to the program when it sets none. There is no per-card limit on this endpoint — a third place to set one would only give the three a way to disagree. To change what a card may spend, change the product, or usePOST /cards/{id}/limits where the BIN supports per-card limits. Some do not, and answer
422 CARD_LIMITS_UNSUPPORTED; for those the card balance is the spending ceiling.
Error Codes
Authorizations
API key from the FYATU CaaS portal. Pass as Authorization: Bearer <key>.
Body
application/json
The cardholder to issue the card to
Example:
"chl_01HXYZ1234ABCDEF5678"
The card product — card type and program are derived from this
Example:
"prd_01HXYZ1111ABCDEF0001"
Initial balance in USD. Required for non-JIT products; optional for JIT-enabled products.
Example:
100
Card label. Defaults to the cardholder's full name when omitted.
Example:
"Travel Card"

