message (required) | string | Human-readable result or guidance for the next step. |
status | string | Outcome discriminator: “created” (card issued), “vault_started” (first-time setup: send vaultUrl to the user; once their card is in the vault, purchases go through buy, not create_card), “vault_ready” (the user’s own card is already in their vault: use buy; only source “issued” produces a card number), “attach_started” / “attach_pending” (an older add-card enrollment still in flight: send attachUrl or wait, then call again with the same arguments), “issuing_suggested” (legacy servers only: offer the balance-funded fallback, noting it requires KYC, and only then call again with source “issued”), “approval_required” (human approval needed), “approval_pending” (added-card passkey approval: send approvalUrl to the user, then retry with the same arguments in ~10s), “kyc_required” (issued path only), “user_info_required” (check missingFields: phone/terms go through submit_user_info; consent must be recorded by the connecting platform), “beta_capacity_reached”, “issuing_balance_insufficient” (issued path only), “payment_method_declined”, “limit_reached”, “funding_in_progress” (company wallet funding underway: retry with the same arguments in ~10s), “funding_not_approved”, “org_wallet_funding_required”, “org_wallet_unavailable” (the company wallet backing this account is not active: the company must finish setup; do not retry immediately), or “rate_limited” (wait ~1 minute, then retry). |
cardId | string | The new card ID. Present only when status is “created”. |
last4 | string | Last four digits of the new card. Present only when status is “created”. |
expiry | string | Card expiry (MM/YY). Present only when status is “created”. |
balanceCents | number | Card balance in cents. Present only when status is “created”. |
balanceDollars | string | Card balance formatted as USD dollars, e.g. “12.50”. Present only when status is “created”. |
cardStatus | string | Card status, e.g. “active”. Present only when status is “created”. |
preset | object | The rules on the new card: id, name, version, summary. Null when the card is unrestricted. Present only when status is “created”. |
approvalId | string | The approval request ID to pass to approve_request. Present only when status is “approval_required”. |
approvalUrl | string | The passkey approval link to send to the user. Present only when status is “approval_pending”. |
vaultUrl | string | The secure link the user opens to put their card in their vault. Present only when status is “vault_started”. |
vaultCards | number | How many cards the user already holds in their vault. Present only when status is “vault_ready”. |
attachUrl | string | The secure link the user opens to finish an older add-card enrollment. Present only when status is “attach_started”. |
expiresAt | string | When the link expires (ISO 8601). Present when status is “vault_started” or “attach_started”. |
source | string | ”connected” when the card was created against the user’s added card. Absent for wallet-funded cards. |
reason | string | On “issuing_suggested” (legacy servers only; current servers route every first-time user to the vault instead): why the card could not be added. On “kyc_required”: why the previous identity-verification attempt failed (e.g. “document_unverified_other”), present only when a prior attempt was rejected. |
missingFields | array | What is missing when status is “user_info_required” (e.g. “termsAccepted”, “consent”). |