Cards

Update a card's status, funding source, merchant categories, risk ceiling, or threeDSecurePassword. At least one field must be supplied. Manage velocity limits through /card-velocity-limits.

  • status transitions include ACTIVE ⇄ FROZEN, PENDING_AUTH → ACTIVE | FROZEN, and ACTIVE | PENDING_AUTH | FROZEN → CLOSED. CLOSED is terminal and irreversible. Activating a card whose USDB funding source lacks a usable delegated key returns 409 INVALID_STATE_TRANSITION. PENDING_AUTH is managed by Grid and cannot be requested. Completing delegation does not unfreeze or reopen a card. Requesting status: ACTIVE returns 409 INVALID_STATE_TRANSITION while the customer is not ACTIVE, for a card Grid froze for review, and for a card frozen with substatus COMPROMISED. Contact Grid support to have such a card reviewed, or close a compromised card and issue a new one.
  • fundingSource, when supplied, replaces the card's bound internal account. It must belong to the customer and use a currency supported by the card program, including USDB for USD cards. An active card becomes PENDING_AUTH when switched to USDB without an active delegated key. Switching back to USD restores readiness. fundingSource cannot be supplied alongside status: CLOSED. On card programs where the card issuer makes authorization decisions, fundingSource cannot be combined with any status change, so send the changes as separate requests. On card programs where Grid makes the authorization decision, the combination remains valid for status changes other than CLOSED. This endpoint is authenticated by the platform credential alone and returns 200 directly. It deliberately does not use Grid's 202 → signed-retry pattern: that pattern signs with the session key of a credential on the owning internal account, so it models actions taken by the end user on their own credentials or funds. Freezing or closing a card is routinely an action taken about a user and without them present - fraud response, offboarding, an ops-driven freeze - and requiring the cardholder's signature would make exactly those cases impossible. Operations that expose sensitive card data (POST /cards/{id}/reveal, 3DS password retrieval) are SCA-railed instead, because there the cardholder is the party being served.

Effects:

  • status: FROZEN: Authorization Decisioning declines new auths with cardDeclinedReason: CARD_NOT_ACTIVE. Existing pulls and in-flight reconciliation continue — freezing does not pause the lifecycle of authorizations that already passed.
  • status: ACTIVE: normal authorization behavior resumes.
  • status: CLOSED: terminal close. The card transitions to status: "CLOSED" with statusReason: "CLOSED_BY_PLATFORM" and stays in the system for audit and reconciliation. All pending auths reconcile to a terminal state via the existing reconcile primitive. Inbound clearings received after close follow the standard force-post / late-presentment path — Lightspark absorbs the loss if a post-hoc pull on the now-unbound source fails. The funding source is detached. Refunds already in flight still complete because Lightspark holds the card-reserve keys.
  • fundingSource change: returns the updated card with the new binding and fires no webhook.

The card.status_change webhook fires on every successful status transition.

patch/cards/{id}

Request

  • Base URL
    https://api.lightspark.com/grid/2025-10-13
  • URL
    https://api.lightspark.com/grid/2025-10-13/cards/{id}
  • Auth
    HTTP basic

Request body

status'ACTIVE' | 'FROZEN' | 'CLOSED'

Target status for the card. Permitted transitions are ACTIVE ⇄ FROZEN, PENDING_AUTH → ACTIVE | FROZEN, and ACTIVE | PENDING_AUTH | FROZEN → CLOSED. Activation requires completed delegated signing authorization. CLOSED is terminal and irreversible; once closed, the card stays in the system for audit and reconciliation but cannot transact again.

substatus'LOST' | 'COMPROMISED' | 'DAMAGED' | 'END_USER_REQUEST' | 'ISSUER_REQUEST' | 'NOT_ACTIVE' | 'SUSPICIOUS_ACTIVITY' | 'INTERNAL_REVIEW' | 'EXPIRED' | 'UNDELIVERABLE' | 'OTHER'

Why the card is moving, in the card issuer's vocabulary. Required whenever status is supplied, and forwarded to the issuer. Pick OTHER when none of the named values fit and say why in reason.

reasonstring

A short sentence naming why the card is moving. Required whenever status is supplied, and recorded against the card so a later reader can tell why it changed.

fundingSourcestring

Replaces the card's funding source. Must belong to the customer and be denominated in a currency supported by the card's program, including USDB for USD cards. Changing the funding source does not change the card's currency or spending-limit units. Cannot be supplied alongside status: CLOSED. To stop a card from spending, set status: FROZEN instead.

maxNetworkRiskScoreinteger nullable

Maximum normalized network risk score allowed for real-time card authorizations. Scores range from 0 (lowest risk) to 999 (highest risk). Visa scores are normalized by multiplying the raw 0–99 score by 10. Scores equal to the ceiling are allowed. Authorizations without a score are also allowed. The lowest configured card or platform ceiling applies. Omit to preserve the current setting or send null to clear this scope.

threeDSecurePasswordstring

Sets a new static 3-D Secure password on the card. Send it on its own, and only when the card's cardCapabilities.supports3dSecurePassword is true.

allowedMccsstring[] nullable

Replacement list of merchant category codes the card may spend at. Applies only to a card issued for an agent, and is ignored otherwise. Supply null to allow every category not blocked, or omit to leave it unchanged. Cannot be supplied alongside status: CLOSED.

blockedMccsstring[] nullable

Replacement list of merchant category codes the card declines. Applies only to a card issued for an agent, and is ignored otherwise. Supply null to clear it, or omit to leave it unchanged. Grid's default agent blocks still apply on top of this list; lift them with defaultMccBlocksLifted. Cannot be supplied alongside status: CLOSED.

defaultMccBlocksLiftedboolean

On a card issued for an agent, true lifts Grid's default agent merchant-category blocks and false restores them. Ignored on a card with no agent. Cannot be supplied alongside status: CLOSED.

Example request

{
  "status": "FROZEN",
  "substatus": "SUSPICIOUS_ACTIVITY",
  "reason": "Cardholder reported the card stolen.",
  "fundingSource": "InternalAccount:019542f5-b3e7-1d02-0000-000000000002",
  "maxNetworkRiskScore": 700,
  "threeDSecurePassword": "AbCd1234EfGh5678",
  "allowedMccs": [
    "5411"
  ],
  "blockedMccs": [
    "7995"
  ],
  "defaultMccBlocksLifted": true
}

Response

Card updated. Returns the updated card.

idstring required

System-generated unique card identifier

customerIdstring required

The id of the Customer who holds this card.

platformCardIdstring

Platform-specific card identifier generated by the server.

status'PENDING_KYC' | 'PROCESSING' | 'PENDING_AUTH' | 'ACTIVE' | 'FROZEN' | 'CLOSED' required

Lifecycle status of a card.

StatusDescription
PENDING_KYCThe cardholder has not yet completed KYC. Cards in this status cannot transact.
PROCESSINGThe card has been requested and is being provisioned with the issuer.
PENDING_AUTHThe issuer has provisioned the card, but its USDB Embedded Wallet funding source lacks an active delegated signing key. Complete POST /auth/delegated-keys before using the card.
ACTIVEThe card is live and can authorize transactions.
FROZENThe card is temporarily disabled by the platform or by Grid. New authorizations are declined with cardDeclinedReason: CARD_NOT_ACTIVE. Existing settlements and refunds continue to reconcile. A card Grid froze for review, or one frozen as COMPROMISED, cannot be unfrozen by the platform.
CLOSEDThe card is permanently closed. Terminal, irreversible status.
statusReason'DELEGATION_REQUIRED' | 'ISSUER_REJECTED' | 'CLOSED_BY_PLATFORM' | 'CLOSED_BY_GRID'

Reason a card reached a terminal or non-active status. Present on PENDING_AUTH and CLOSED cards, and on cards that fail provisioning before reaching ACTIVE.

ReasonDescription
DELEGATION_REQUIREDThe card funding source has no usable delegated signing key. Present while the card is PENDING_AUTH.
ISSUER_REJECTEDThe card issuer rejected provisioning during PROCESSING.
CLOSED_BY_PLATFORMThe card was closed via PATCH /cards/{id} (status: CLOSED) by the platform.
CLOSED_BY_GRIDThe card was closed by Grid (e.g. compliance or risk action).
brand'VISA' | 'MASTERCARD'

Card network brand. Read-only — determined by Grid when the card is provisioned with the issuer.

form'VIRTUAL' required

Physical form factor of the card. Only VIRTUAL is supported in v1; PHYSICAL will be added in a later release.

pinStatus'NOT_SET' | 'OK' | 'BLOCKED'

State of the card's PIN. On the Card resource, this is the last known status and is present whenever PIN management is supported. An absent value means PIN management is unavailable for this card; it does not mean NOT_SET. Use GET /cards/{id} to retrieve pinStatus.

StatusDescription
NOT_SETNo PIN has been set on the card. PIN verification is not enabled. Set one with POST /cards/{id}/set-pin or the hosted form returned by GET /cards/{id}/pin-entry-url.
OKA PIN is set and usable.
BLOCKEDThe PIN was entered incorrectly three consecutive times and is refused until cleared with POST /cards/{id}/pin/unblock, or replaced with POST /cards/{id}/set-pin.
pinUnblockAvailableAtstring date-time

Earliest time another PIN unblock attempt is allowed. Absent until the unblock allowance is used. Changing the PIN does not reset this time.

last4string

Last four digits of the card PAN.

expMonthinteger

Card expiration month (1–12).

expYearinteger

Card expiration year (four digits).

fundingSourcestring required

Internal account id that funds this card.

maxNetworkRiskScoreinteger nullable

Maximum normalized network risk score allowed for real-time card authorizations. Scores range from 0 (lowest risk) to 999 (highest risk). Visa scores are normalized by multiplying the raw 0–99 score by 10. Scores equal to the ceiling are allowed. Authorizations without a score are also allowed. The lowest configured card or platform ceiling applies. Null means no card-specific ceiling. Platform controls still apply.

allowedMccsstring[]

Merchant category codes the card may spend at. Present only on a card issued for an agent; absent when that card may spend at any category not blocked.

blockedMccsstring[]

Merchant category codes a card issued for an agent declines, with cardDeclinedReason: BLOCKED. Present only on such a card, which also declines Grid's default agent categories unless defaultMccBlocksLifted is true.

agentIdstring

The agent the card was issued for, when there is one.

defaultMccBlocksLiftedboolean

Whether the platform lifted Grid's default agent merchant-category blocks on this card. Present only for a card issued for an agent.

currencystring

Currency the card transacts in, fixed at issuance by its card program. USDB-funded cards transact in USD, with funding converted at 1 USDB = 1 USD. Spending limits use the smallest unit of the card's currency (USD cents for USDB-funded cards). Changing the funding source does not change the card's currency or spending-limit units.

processorRefstring

Opaque processor-side reference for the card (e.g. the Lithic card token). Useful for cross-referencing in the processor's dashboards; not used for any Grid request routing.

issuerRefstring

Opaque identifier for the card on the issuer of record (e.g. the Lead Bank account/card identifier). Useful for cross-referencing in issuer dashboards; not used for any Grid request routing.

createdAtstring date-time required

Creation timestamp

updatedAtstring date-time required

Last update timestamp

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

    • 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