Update a card
Changed onUpdate a card's status, bound fundingSource, and / or maxSpendPerTransaction, maxSpendPerDay, or maxTransactionsPerDay, or set a new threeDSecurePassword. At least one field must be supplied.
- status transitions are limited to ACTIVE ⇄ FROZEN and ACTIVE | FROZEN → CLOSED. CLOSED is terminal and irreversible. Any other transition returns 409 INVALID_STATE_TRANSITION.
- fundingSource, when supplied, replaces the card's bound internal account. It must belong to the customer and be denominated in the card's currency. 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.
- maxSpendPerTransaction sets the largest amount the card can authorize on a single transaction. An authorization for exactly the limit is allowed, and a later clearing can still settle above it — a restaurant tip, for example — so this caps the authorization, not the final settled amount. Send a positive integer in the smallest unit of the card's currency (cents for USD) to set the limit, or null to remove it. If your platform config sets cardConfigs.maxSpendPerTransaction, the lower of the two applies. You can only send this when the card's cardCapabilities.supportsSpendLimits is true, and not together with status: CLOSED.
- maxSpendPerDay, when supplied, replaces the card-specific cap on cumulative new spend during one UTC calendar day. Supply a positive integer in the smallest unit of the card's currency to set it or null to clear it. If the platform config sets cardConfigs.maxSpendPerDay, Grid enforces the lower of the card and platform values. Refunds, reversals, and authorization expiries do not restore capacity during the day. The card's cardCapabilities.supportsSpendLimits must be true. maxSpendPerDay cannot be supplied alongside status: CLOSED.
- maxTransactionsPerDay, when supplied, replaces the card-specific cap on the number of transactions the card may authorize during one UTC calendar day. Supply a positive integer to set it or null to clear it. If the platform config sets cardConfigs.maxTransactionsPerDay, Grid enforces the lower of the card and platform values. Refunds, reversals, and authorization expiries do not restore capacity during the day. maxTransactionsPerDay requires the card's cardCapabilities.supportsTransactionCountLimit to be true and cannot be supplied alongside status: 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.
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
Example request
{
"status": "FROZEN",
"substatus": "SUSPICIOUS_ACTIVITY",
"reason": "Cardholder reported the card stolen.",
"fundingSource": "InternalAccount:019542f5-b3e7-1d02-0000-000000000002",
"maxSpendPerTransaction": 10000,
"maxSpendPerDay": 25000,
"maxTransactionsPerDay": 20,
"threeDSecurePassword": "AbCd1234EfGh5678"
}Response
Card updated. Returns the updated card.
Example response
{
"id": "Card:019542f5-b3e7-1d02-0000-000000000010",
"customerId": "Customer:019542f5-b3e7-1d02-0000-000000000001",
"platformCardId": "card-emp-001",
"last4": "4242",
"expMonth": 12,
"expYear": 2029,
"fundingSource": "InternalAccount:019542f5-b3e7-1d02-0000-000000000002",
"cardCapabilities": {
"supportsSpendLimits": true,
"supportsSpendLimitsAtIssuance": true,
"supportsTransactionCountLimit": true,
"supportsPanReveal": true,
"supportsDigitalWalletTokenization": true
},
"maxSpendPerTransaction": 5000,
"maxSpendPerDay": 25000,
"maxTransactionsPerDay": 20,
"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 new optional request property
- info
- info
added the new optional request property
- info
added the new optional request property
- info