Issue a card
Changed onIssue a new card for a cardholder. Every card is bound to one internal account, fundingSource, at create time. The cardholder must have KYC status APPROVED before a card can be issued; otherwise the request is rejected with CARDHOLDER_KYC_NOT_APPROVED.
Card issuance is fee-bearing and cannot be reversed, so an Idempotency-Key header is required. Retries must carry the same key.
Configure card velocity limits through POST /card-velocity-limits. Omit cardId to set platform defaults before issuance, or supply the returned card id to set card-specific limits after issuance. Limits use the smallest unit of the card's currency, including USD cents for USDB-funded USD cards.
If the funding source is an Embedded Wallet internal account, the cardholder must authorize Grid to sign Spark token transactions for that card funding source by completing the delegated-key creation flow with POST /auth/delegated-keys. Until an active delegated key exists for that funding source, Authorization Decisioning cannot use it to fund card transactions.
A platform may be limited to a maximum number of live cards. Once that limit is reached, further issuance is rejected with CARD_LIMIT_REACHED until a card is closed or Lightspark raises the limit. Cards in CLOSED status do not count toward the limit.
New cards start in status: "PROCESSING" while the card issuer provisions the card. The card.status_change webhook fires on each status transition, including the transition to ACTIVE (or to CLOSED with statusReason: "ISSUER_REJECTED" if provisioning fails). A provisioned card funded by a USDB Embedded Wallet remains PENDING_AUTH with statusReason: "DELEGATION_REQUIRED" until all signed retries of POST /auth/delegated-keys are complete. Replacing USD funding with USDB without an active key, or revoking the required key, also moves an active card to PENDING_AUTH. Completing delegation or switching back to USD restores ACTIVE; frozen and closed cards keep their status.
Request
- Base URLhttps://api.lightspark.com/grid/2025-10-13
- URLhttps://api.lightspark.com/grid/2025-10-13/cards
- AuthHTTP basic
Headers
A unique identifier for the request, up to 255 characters. A retry carrying the same key returns the card created by the first request; reusing a key for a materially different card request is rejected with 409.
Request body
Example request
{
"customerId": "Customer:019542f5-b3e7-1d02-0000-000000000001",
"platformCardId": "card-emp-001",
"threeDSecurePassword": "AbCd1234EfGh5678",
"fundingSource": "InternalAccount:019542f5-b3e7-1d02-0000-000000000002",
"maxNetworkRiskScore": 700,
"allowedMccs": [
"5411"
],
"blockedMccs": [
"7995"
],
"agentId": "Agent:019542f5-b3e7-1d02-0000-000000000042"
}Response
Card created successfully. Newly-created cards start in PROCESSING while the issuer provisions them. Cards funded by an Embedded Wallet internal account also require an active delegated key for that funding source before Authorization Decisioning can use it.
Example response
{
"id": "Card:019542f5-b3e7-1d02-0000-000000000010",
"customerId": "Customer:019542f5-b3e7-1d02-0000-000000000001",
"platformCardId": "card-emp-001",
"pinStatus": "OK",
"pinUnblockAvailableAt": "2026-10-15T15:00:00Z",
"last4": "4242",
"expMonth": 12,
"expYear": 2029,
"fundingSource": "InternalAccount:019542f5-b3e7-1d02-0000-000000000002",
"cardCapabilities": {
"supportsVelocityLimits": true,
"supportsPanReveal": true,
"supportsDigitalWalletTokenization": true
},
"maxNetworkRiskScore": 700,
"allowedMccs": [
"5411"
],
"blockedMccs": [
"7995"
],
"agentId": "Agent:019542f5-b3e7-1d02-0000-000000000042",
"currency": "USD",
"processorRef": "card_b81c2a4f",
"issuerRef": "lead_card_7a1b9c3d",
"createdAt": "2026-05-08T14:10:00Z",
"updatedAt": "2026-05-08T14:11:00Z"
}Changes
- info
added the optional property
/to the response with the status - info
added the optional property
/to the response with the status
- info
- breaking
removed the required property
/from the response with the status - breaking
removed the required property
/from the response with the status - breaking
removed the required property
/from the response with the status - breaking
removed the required property
from the response with the status - breaking
removed the required property
from the response with the status - breaking
removed the required property
from the response with the status - warning
removed the request property
- warning
removed the request property
- warning
removed the request property
- info
added the required property
/to the response with the status
- breaking