Skip to main content
Cards is available in sandbox only while we finish development. Dakota enables Cards per account. The Cards endpoints are in the API reference, marked Sandbox only. Endpoints, fields, and flows can still change before release.
Card events arrive on your existing webhook stream, in the standard envelope, with the same signing and retries. See Webhook Integration for delivery. Delivery is at least once, so dedupe on the event id. If your webhook target filters by type, add the card events first. A target with global: false receives only the types in its event_types list. A card event type missing from that list is never delivered and never retried. Targets with global: true receive card events automatically. data.object is the resource that changed, in the same shape the API returns for it. On updates, data.previous_attributes holds the prior values of the fields that changed.

Events

A new card fires card.created with status: pending, then card.updated with status: active. Build against the second one. Events can arrive out of order (see Event ordering), so card.created can land after card.updated.
  • Cards carry version, which goes up by one on every card event. Keep the highest version you have applied for each card, and drop any event or response whose version is not greater.
  • Cardholders and card transactions carry updated_at, in seconds. Ignore an event whose object is older than the one you stored, and re-fetch the object when the two are equal.

Enablement completed

wallet.card_enablement.completed records what the customer signed. Keep it as their acceptance record.

Card transactions

A card transaction is one purchase, refund, or other network event on a card. Its id stays the same for its whole life. Its first state arrives on card_transaction.created and later ones on card_transaction.updated, but a status can arrive on either event: a transaction can start pending and become authorized on an update, and a decline can arrive on an update too. Upsert by data.object.id and switch on status, not on the event type. There are no separate hold, release, or settlement events. Amounts such as auth_amount and cleared_amount are decimal strings in major units ("39.00"). The card’s spend_limit.amount is different: an integer in minor units. outstanding_amount is the part of cleared_amount that no authorization covered, less any refunds. It is non-zero after a force post, or when a merchant clears more than it authorized.

Refunds

A merchant refund is a new card transaction on the same card, with status: returned. The original purchase stays cleared, and the refund is not linked to it. status: returned means the network sent the money back. refund_state says whether it has reached the wallet: pending, then paid, or it ends reversed or failed. Credit the cardholder only when refund_state is paid. It is null on every transaction that is not a refund.
Refund payouts to the wallet are not live yet. Until they are, refund_state stays pending.

Declines

decline_code is the raw network code. Use it for support only; do not build logic on it.

A handler

Card events never contain the full card number, expiry, or CVV. last4 is the most they carry.