Two API namespaces — keep them separate.
The
/v1/customers/* path is WaaS (wallet sub-accounts for crypto deposits/withdrawals). It has nothing to do with card customers. Do not mix them up.Identity Model
- You are a Yativo user who has been approved into the Card Issuer Program.
- Your Customers are the end users of your platform who get a card. They are never authenticated directly against Yativo — all API calls come from your backend using your token.
yativo_card_idis the primary identifier for a card customer. Store it after onboarding.external_customer_idis your own reference ID — pass it at onboarding and use it to look up the customer later without storing Yativo IDs.
Flow Overview
Step 1 — Check Eligibility
Confirm your account has been granted access before applying.Response
eligible is false, contact your account manager. This gate is admin-only — there is no API call to change it yourself.
Step 2 — Apply
Funding Structures
Response
Step 3 — Check Program Status
Applications are reviewed within 1–2 business days. Poll untilstatus is approved.
Approved
On approval, Yativo provisions your master wallet set:
- SOL deposit address (
sol.address) — send USDC on Solana here to top up your USD balance. - USD balance — funded automatically when your SOL deposit confirms.
- EUR balance — funded by swapping from USD.
- GBP balance — funded by swapping from USD.
Step 4 — Fund Your Master Wallet (master_wallet programs only)
Get your current balances and deposit addresses:Response
sol.address. Once the deposit confirms, your usdc balance increases automatically. Swap to eur or gbp before funding customers who hold those card currencies.
Swap Currencies
If your customers are in the EU or UK, swap USDC into the correct card currency before funding:Response
Step 5 — Onboard a Customer
Start the onboarding flow for each end customer. Onlyemail is required.
Response 201
Step 6 — Verify OTP
Collect the OTP from your customer and submit it:Response 200
Every error response with these codes includes a
data.next_step field and a data.action URL pointing to the exact endpoint to call next.
Resend OTP
Step 7 — Get KYC Link
Generate a verification URL for this customer:Response
kyc_url, or embed the KYC flow in your app using the Sumsub SDK with sumsub_sdk_token. Add ?refresh=true to generate a new link if the existing one has expired.
Step 8 — Poll KYC Status
Approved
Pending
Rejected
next_step is retry_kyc, fetch a fresh kyc-link?refresh=true and redirect the customer.
Step 9 — Source of Funds
Get questions
Response
Submit answers
Response
Step 10 — Phone Verification
Request SMS code
Response
Verify SMS code
Response
Step 11 — Create Virtual Card
All prerequisites are complete. Issue the card:Response 201
Multiple Cards per Customer
A single customer account supports up to 5 active cards (virtual + physical combined). You can issue additional virtual cards on top of the first one, subject to the limits set on your program.403 Limit reached
Card Limits
Limits work in a three-tier hierarchy:Set per-customer limits (issuer)
Override the limit for a specific customer, up to your program’s ceiling:Response 200
program_ceilings reflects the maximum values your program permits. You cannot set a customer limit above its corresponding ceiling.
Step 12 — Fund the Card
Option A: Push from Master Wallet (master_wallet programs)
You can identify the customer by any of:customer_id, card_id, external_id, email, or yativo_card_id.
Response 200
transfer_id. Poll GET /v1/card-issuer/transfers/:transferId until status is completed (typically 2–5 minutes).
pricing_mode:
receive_x— the customer receives exactlyamount. Yativo deducts slightly more from your master wallet to cover fees.send_x(default) — exactlyamountis debited from your master wallet. The customer receives less after fees.
TOKEN_MISMATCH error: if you fund with the wrong currency for a customer’s card region, the API returns this error with the exact token their card requires. Swap your master wallet balance first.
Option B: Customer Self-Funds via Deposit Address (non_master programs)
Get the customer’s deposit address:Response
Card Management
List all customers
Response
flow_status: otp_requested, otp_verified, kyc_initiated, kyc_completed, card_created, active.
Look up a customer
Find a customer by any identifier:Response
Freeze / Unfreeze a Card
Response
Response
Get Card Transactions
Response
Spending Limits
Get the current spending limit for a customer’s card:Response
Response
Limit changes go through a Gelato relay with a 3-minute processing delay. The
gelato_status: "ExecSuccess" confirms the transaction was enqueued. Poll GET /wallet/limits after 3 minutes to confirm the new limit is active.Secure Card View
To let a cardholder view their full card details (PAN, CVV, expiry, PIN), your backend requests a secure view URL from Yativo. You send that URL to your customer — via your app, an email link, or an in-app iframe. Yativo hosts the page and handles all cryptography internally. Your backend never sees or handles raw card data.How it works
Request a secure view URL
Response
secure_view_url in a browser tab, iframe, or mobile WebView. The URL is short-lived. Request a new one each time the customer wants to view their card.
The response includes pin_set — the last known state from the physical.card.pin.changed webhook. Use it in your UI to decide whether to prompt the customer to set their PIN before showing card details.
Customer PIN setup and change
Every card starts withpin_set: false. The customer must set a PIN before chip-and-PIN or ATM transactions will work. Use the same view-token endpoint with enabled_views: ["pin"] to show the PIN setup page — this also handles PIN changes.
secure_view_url for your customer in an iframe or WebView. The cardholder enters their 4-digit PIN directly in the hosted page — it never passes through your backend. Once saved, the card network fires a physical.card.pin.changed webhook and Yativo updates pin_set: true on the card record.
pin_set is sourced from the webhook, not from a direct card network API lookup. Use it as a UI hint to prompt customers who haven’t yet set a PIN — not as a hard access gate.Deposits
View all funding deposits into your issuer program (SOL auto-funding and XDC manual deposits):status: pending, auto_funding, awaiting_manual, funding, funded, failed.
Filter by chain: SOL, XDC.
Transfers
All transfers
View all funding transfers you have sent to customer cards:Response
status, customer_id, and chain query filters. See List Transfers.
Single transfer or withdrawal status
transfer_id or a withdrawal’s withdrawal_id — checks funding transfers first, falls back to withdrawals. The response’s type field ("funding" or "withdrawal") tells you which one matched. See Get Transfer Status for the full response shape and status enum.
Transfers for a specific customer
customerId accepts yativo_card_id, customer_id, or your own external_id. See List Customer Transfers.
Check Progress Anytime
Response
Delete an Incomplete Customer Record
If you created a customer by mistake (e.g. wrong email) and the card has not yet been issued:card_created or active status.
Reset Customer Onboarding
If a customer’s onboarding is stuck (KYC rejected multiple times, verification loop, wrong details submitted) and you need to start completely fresh, use the reset endpoint. This deletes the Yativo record and allows re-onboarding with a new verification flow.Response 200
card_created status, this endpoint returns:
400 Card already issued
Webhook Events
Subscribe to webhooks for real-time events. See Webhook Events for payload examples, signature verification, and the full event reference.KYC status changes are not delivered as webhooks — poll Get Customer or Look Up Customer to check
kyc_status after directing customers through the KYC link.Recovery & Continuation Reference
Every operation that can fail returns adata.next_step field and a data.action URL so you never have to guess what to do. This section documents every failure mode and the exact API call that recovers from it.
Onboarding State Machine
Handling All Error Codes
OTP Phase errors
All OTP errors include
data.attempts_remaining, data.next_step: "resend_otp", and data.action in the response body.
KYC Phase errors
Abandoned Onboardings — resume Endpoint
If a customer starts onboarding but never finishes (OTP not verified, KYC link never opened, KYC in progress for days), call the resume endpoint. It inspects the current state, takes the correct action automatically, and tells you exactly what to present to the customer next.
Response — OTP phase
Response — KYC phase
Polling Strategy
For KYC status polling, use an exponential-backoff approach with a hard timeout:kyc_status === 'rejected', fetch a fresh KYC link and redirect the customer:
Full next_step Reference
Every API response in the customer lifecycle includes data.next_step. Use it to drive your state machine without hardcoding assumptions about flow order.
Common Integration Mistakes
Handling INITIALIZATION_FAILED on Onboard
POST /customers/onboard performs several steps internally (wallet generation, SIWE signing, OTP request, DB write). In rare cases — typically a transient database timeout or network issue — the API returns 500 INITIALIZATION_FAILED even though the customer record was successfully created and the OTP email was already sent.
Recovery pattern: Retry the onboard call with the same email (and external_customer_id if you use one). One of two things will happen:
- Success (201) — the first call truly failed end-to-end. A fresh customer record is created.
CUSTOMER_CARD_ALREADY_ACTIVE(409) — the first call partially succeeded. The response includes theyativo_card_idandnext_stepso you can pick up exactly where you left off:
409 CUSTOMER_CARD_ALREADY_ACTIVE
yativo_card_id to call POST /customers/{yativoCardId}/verify-otp (the OTP email was already delivered on the first call). Do not treat CUSTOMER_CARD_ALREADY_ACTIVE as an error — it is the system telling you the card exists and showing you how to continue.

