Cards

Issue cards with limits through our card issuing partner. Cards run with test money today. With the card issuing partner connected, every card is issued under an active cardholder.

POST /api/cards

Bearer apk_ · write:cards · Idempotent · Live: KYB approved

{
"holderKind": "agent",               // "agent" | "human"
"holderLabel": "claude-runtime-prod",
"cardholderId": "ch_…",              // optional; without it, the first active cardholder is used
"monthlyLimitUsdCents": 500000,
"perTxnLimitUsdCents": 50000,
"allowedMccs": ["5734", "7372"],     // null = all
"allowedMerchants": ["openai", "anthropic"]
}

Returns { card, fixture }. card includes last4; fixture: true means a test stand-in, not a card from the issuing partner.

GET /api/cards

Bearer apk_ · read:cards

Lists cards in the workspace, newest first.

GET /api/cards/[id]

Bearer apk_ · read:cards

One card.

PATCH /api/cards/[id]

Bearer apk_ · write:cards

Change state, limits, merchant categories or merchant names:

{
"state": "frozen",                    // or "active", "terminated"
"monthlyLimitUsdCents": 100000,
"perTxnLimitUsdCents": 10000,
"allowedMccs": ["5734"],
"allowedMerchants": null
}

Terminating can't be undone.

Cardholders

POST /api/cardholders

Bearer apk_ · write:cards · Idempotent · Live: KYB approved

{
"displayName": "Jane Doe",
"kind": "employee",                  // "control_person" | "agent" | "employee"
"firstName": "Jane",
"lastName": "Doe",
"email": "jane@acme.com",
"phoneNumber": "+15555550123",
"shippingAddress": {
  "line1": "1 Main St",
  "city": "Austin",
  "region": "TX",
  "postalCode": "78701",
  "country": "US"
}
}

firstName, lastName, email, phoneNumber and shippingAddress are required to enrol the person with the card issuing partner. In sandbox the cardholder is saved but not enrolled, and stays pending. dateOfBirth and ssnLast4 are optional; they're stored and never returned.

GET /api/cardholders

Bearer apk_ · read:cards

Physical cards

POST /api/physical-cards

Bearer apk_ · write:cards · Idempotent · Live: KYB approved

{
"holderLabel": "Jane Doe",
"finish": "metal",                   // "standard" | "metal"
"unlockMethod": "premium_99",        // "premium_99" | "balance_commit_5000"
"monthlyLimitUsdCents": 500000,
"perTxnLimitUsdCents": 50000,
"shipping": {
  "line1": "1 Main St",
  "city": "Austin",
  "region": "TX",
  "postalCode": "78701",
  "country": "US"
}
}

premium_99 takes $99 from your balance; balance_commit_5000 needs a balance of at least $5,000. Needs the issuing partner's physical card product to be configured. Shipping updates aren't built yet.

GET /api/physical-cards

Bearer apk_ · read:cards