Skip to main content
The Card Management API is the partner-facing surface for driving an issued card through its lifecycle. Every action is a transition on a status / sub-status state machine, recorded for audit. The Card Management API is live.

Why this exists

The card itself is issued through the Visa issuance rail (see Visa card issuance). What partners need from Sumvin is a stable, auth-scoped API for the user-facing actions that follow — freezing a card the user can’t find, reporting it stolen, reactivating it after a false alarm — without integrating against the card issuance partner directly. The state machine is enforced server-side, so partners can drive transitions without re-implementing validation.
The endpoints, validation, and audit trail described below are live. Network-side card provisioning runs through the Visa issuance partner rail (in private preview); the lifecycle layer works either way.

Endpoints

All routes live under /v0/card. Auth is the standard Juno-issued JWT (x-juno-jwt header). Routes accept an optional token — when present, the token’s scopes are enforced (sr:us:pint:cards:read for reads, sr:us:pint:cards:manage for state-changing actions). All read and write endpoints require the user to be in a serviceable status (KYC verified, account active). Card identifiers in the API are the card’s external_id (a card-{uuid} string), not the internal numeric primary key.

The state machine

A card’s state is a (status, sub_status) pair. Reads return the current pair; lifecycle actions transition between pairs. The state machine has four top-level statuses.

Sub-statuses

User-initiated transitions

The lifecycle endpoints map to a restricted set of transitions a user (or a partner acting on their behalf) is allowed to make. System and compliance transitions exist in the underlying state machine but aren’t exposed to partners.
Reporting a card stolen is a two-step transition on the server side. The card moves to (suspended, stolen), then the system attempts a follow-up transition to (suspended, fraud_suspected). The response always reflects the final state. If the escalation fails, the card stays at (suspended, stolen) and the failure is logged.

Discoverable next actions

Each card response includes a _links object with the actions available from the current state. A frozen card surfaces an unfreeze link; an active card surfaces freeze, lost, and stolen links; a pending card awaiting activation surfaces an activate link. Drive UI off these links rather than computing legality client-side.

Reference

List cards

GET /v0/card/ Returns every card belonging to the authenticated user, with current status and the linked funding wallet address inlined for each card.
Response200 OK

Get card

GET /v0/card/{card_id} Returns a single card by its external_id. Pass include_history=true to inline the full status change history.
string
required
The card’s external identifier (card-{uuid}).
boolean
default:"false"
When true, returns the full ordered status history (most recent first) on status_history.
The response includes:
string
External card ID.
string
Last four digits of the PAN.
string
Card brand — one of sumvin, visa, mastercard, amex, discover, unknown.
integer
Expiry month (1–12).
integer
Expiry year (4 digits).
string | null
Cardholder name as printed.
string
One of virtual, physical, metal.
boolean
Whether this is the user’s primary card.
string | null
Address of the funding wallet backing this card.
integer
Creation timestamp (epoch ms).
object
Current (status, sub_status, changed_by, created_at) pair.
array | null
Full status history when include_history=true.
The PAN, CVV, and other sensitive card data are never returned by the Card Management API. Surfacing the full PAN is part of the issuance flow and lives behind a separate, secured surface.

Freeze

POST /v0/card/{card_id}/freeze Suspends an active card. Transitions the card to (suspended, wallet_suspended). Reversible via unfreeze.
Response200 OK

Unfreeze

POST /v0/card/{card_id}/unfreeze Reinstates a card from (suspended, wallet_suspended) or (suspended, lost) to (active, reinstated). Returns the same CardActionResponse shape as freeze.

Report lost

POST /v0/card/{card_id}/lost Transitions an active card to (suspended, lost). The card can be reinstated with unfreeze if the user finds it, or replaced through the issuance rail.

Report stolen

POST /v0/card/{card_id}/stolen Transitions an active card to (suspended, stolen) and then auto-escalates to (suspended, fraud_suspected). This action is intentionally less recoverable than lost — reinstating from a stolen state requires going through fraud review, not a simple unfreeze.

Activate

POST /v0/card/{card_id}/activate Activates a card sitting at (pending, activation_required), transitioning it to (active, verified). Use this when the issuance rail has provisioned the card and the user has confirmed receipt.

Errors

All errors follow RFC 7807 Problem Details. A typical error response: