POST /cards request and progresses
through a fixed lifecycle. This page covers the request shape, what
happens after issuance, and the errors you should handle.
Request shape
The card program fixes the card’s
currency at issuance and returns it on
the Card resource. USDB-funded cards have currency: "USD", with funding
converted at 1 USDB = 1 USD. Spending limits use the smallest unit of the
card’s currency: for a USDB-funded card, 50000 means $500.00 in USD cents.
Changing the funding source does not change the card’s currency or
spending-limit units.
The lifecycle
PENDING_KYC is valid but is not emitted in v1 because issuance is gated
on KYC up front.
After issuance
POST /cards returns PROCESSING while provisioning is incomplete. If
provisioning completes synchronously, the response can already be ACTIVE
or PENDING, with last4, expMonth, and expYear populated.
For USDB Embedded Wallet funding, complete all three calls to
POST /auth/delegated-keys, including both signed retries. The card remains
PENDING with statusReason: "DELEGATION_REQUIRED" until the final retry
returns an ACTIVE delegated key. A provisioned pending card then becomes
ACTIVE automatically and emits CARD.STATUS_CHANGE.
USD funding does not require delegation. If delegation completes before
provisioning, the card can go directly from PROCESSING to ACTIVE.
Replacing USD funding with USDB lacking an active key can move an active
card back to PENDING. Switching back to USD, or completing delegation,
restores readiness. Revoking the required key also moves an active card to
PENDING. Frozen and closed cards retain their status.
Revealing the PAN
To show the cardholder their full PAN, CVV, and expiry, request a reveal right before rendering:panEmbedUrl is a signed URL for the card processor’s iframe that
renders the full credentials directly to the cardholder. The full PAN
and CVV never cross your servers or Grid’s.
For cards in programs where Grid makes authorization decisions,
POST /cards/{id}/reveal is the only way to obtain a reveal URL;
cards in programs where the card issuer makes authorization decisions use
the card issuer’s challenge-based hosted reveal flow instead. The Card
resource never carries one (not in responses, not in webhook
payloads). The URL expires at expiresAt (within minutes), so request a
fresh reveal each time the cardholder asks for their details,
immediately before rendering the iframe. Never store, cache, or log the
URL. Every reveal is audit-logged.Styling the reveal
By default the iframe renders with Grid’s own styling. To carry your branding instead, host a stylesheet and point your platform config at it:null to go
back to the default.
To style one reveal differently — to match the cardholder’s light or dark
theme, say — send cssUrl in the reveal request instead. It overrides the
platform setting for that call only:
Errors to handle
Changing the funding source later
The bound funding source can be replaced after issuance viaPATCH /cards/{id} with a new fundingSource. See
Funding sources for the rules
and request example.
Listing cards
customerId, platformCardId, or status. The response is
paginated using the standard cursor shape used by other Grid list
endpoints.