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.
A cardholder is the person a card is issued to. Every card belongs to one, and a cardholder must be active before you can issue them a card. One customer can have many cardholders, each with their own cards and limits. The customer’s Cards capability must be available first. Until then, creation returns 403 cards-tos-not-accepted. See Activating customers.

Create a cardholder

POST /customers/{customer_id}/cardholders takes one of three request shapes. The shape you send depends on the customer type, and on whether the person is already on the customer’s onboarding application. phone is in E.164 format. external_id is optional on every shape: it is your own lookup key. Send the cardholder’s own mobile number and email address. The phone number is how the cardholder is verified at online checkouts that ask for 3-D Secure, so a shared or placeholder number makes those purchases fail. Adding the card to Apple Pay or Google Pay can also send a code to the phone or the email.

From a person already on the application

For a business customer, reuse the people Dakota already verified during onboarding instead of collecting their details again:
  • cardholder_id is set when the person already has a cardholder. A declined cardholder still counts. Delete it before you enroll the person again.
  • missing_for_cards lists what to collect before you create the cardholder. It always includes phone, and includes email when none is on file.
The response is the cardholder, with status: "pending".

When creation is refused

Two people cannot share one email address.

Lifecycle

Wait for cardholder.updated with status: "active" before you issue a card. Most cardholders become active within seconds.
Review requests are not live yet. When a reviewer needs something, GET /cardholders/{cardholder_id}/application will list it, and you will answer with POST /cardholders/{cardholder_id}/application/information. The request goes to you, never to the cardholder. Until the review pipeline is on, the list is always empty and a submission returns 501.

Update a cardholder

PATCH /cardholders/{cardholder_id} changes first_name, last_name, email, or phone. Fields you leave out are unchanged.

Delete a cardholder

  1. Close each of the cardholder’s cards. Dakota refuses the delete while any of their cards is not closed, including frozen ones.
  2. DELETE /cardholders/{cardholder_id}.
The delete is a soft delete. A final cardholder.updated reports status: "closed", and the cardholder is no longer returned by the API. Purchases already made on their cards still clear or reverse, and their card_transaction events keep arriving. You can enroll the same person again afterwards.

Find a cardholder

GET /customers/{customer_id}/cardholders accepts an external_id filter. The match is exact and case-sensitive, and it can return more than one cardholder, because external_id is not unique.