403.
If you’ve been invited, use the sandbox to build and test your integration, then switch the base URL and API key when your production account is enabled.
Sandbox behaves like production for corporate cards. Account approval, customer requirements, fees and the USDC reserve all apply. Fees are charged to your sandbox USDC balance, which holds test funds only.
Before you start
All requests go to the sandbox base URL with your sandbox key:
customer_id and employee_id are never part of a POST path. Send them in the request body, or in the query string on GET. Every customer_id must be one of your customers and every employee_id must belong to that customer, or the request returns 404.
Test in the dashboard
The sandbox dashboard has the same Corporate Card screens as production. Open Issuing → Corporate Card, pick a customer, then add employees, issue cards, fund balances and review memos. Use it to see the flow before you call the API.Test flow
1
Check your USDC balance
GET /corporate-card/wallet?customer_id=... returns the customer’s funding address and your USDC balance:usdc_available_balance. The first request for a customer creates its funding address and returns wallet: null, so call it again to read the address. Address creation counts towards the wallet address limits.2
Create an employee
customer_id and full_name are required. To attach a selfie, send selfie_image as a multipart/form-data file (jpeg, jpg, png or webp, up to 10 MB) or selfie_image_url as a hosted URL. The response includes the new employee_id.3
Submit employee KYC
country_id and nationality are ISO2 codes. state_id is optional and is the numeric id from GET /locations/states/{country_id}, where {country_id} is the numeric id from GET /locations/countries. Documents (gov_id_image, payslip, proof_of_address) are optional and accept a file or a *_url field.You can submit an employee’s KYC but not read it back. Follow kyc_status on GET /corporate-card/employees/{employee_id} instead. In sandbox, a submission is approved straight away and kyc_status becomes approved. The first submission for each employee charges the employee_kyc fee. Resubmissions are free.4
Issue a card
card_type is Virtual (default) or Physical. Omit employee_id and the card goes to the customer’s employee, created automatically the first time. The employee is the cardholder: every card they hold is denominated in, and spends from, the employee’s balance. An employee can hold any number of cards. The response contains the card under data.card, including its card_id, status, masked_pan and expiration_date.An employee’s first virtual card is free. Further virtual cards and physical cards are charged as listed in Fees. If a fee can’t be charged the request returns 402 and no card is issued.5
Fund the employee
action is fund or withdraw, and amount is in USD (minimum 0.01). Funding debits your USDC balance and can’t use the reserve. Withdrawing returns money to your USDC balance, charges the card_withdrawal fee, and fails with 422 if it exceeds the employee’s available balance. An employee with no card yet returns 404.Check the employee’s balance with GET /corporate-card/employees/{employee_id}/balance:6
Manage the card
Only the employee sees the full card number, expiry, CVV and PIN, on the card’s card link. Share the link or embed it in your app. The employee confirms their email the first time, sets up a passkey or authenticator app, and sets their PIN there.
7
Test memos
Employees attach notes and invoices to card activity, and you approve or reject them:
8
Test suspension and termination
PUT /corporate-card/employees/{employee_id} with "status": "suspended" blocks every corporate card request for that employee with 403. Set it back to active to restore access.DELETE /corporate-card/employees/{employee_id} terminates the employee and suspends all of their cards. It can’t be undone, so create a fresh employee for each test run.Card transactions
Card authorizations are recorded in your spend card transaction history, and Yativo sendsbusiness_spend_card.transaction.* webhooks for them. The transaction_id in those webhooks is the id used below.
dispute fee. A second dispute on the same transaction returns 409.
Sandbox has no endpoint to simulate a card authorization. Test the transaction and dispute flows with transactions that appear on your sandbox cards, and test your webhook handling with the payloads in Webhooks.
Reserve
While Business Spend Cards are enabled, a minimum amount must stay in your USDC balance. The default is 2,000 USD. Card funding stops at the reserve. Fees can still use it. A debit that would go below it returns an error that states the reserve and how much is available to spend.USDC balance
Your USDC balance is only for corporate cards. Card funding and corporate card fees are the only debits from it. Payouts, transfers between Yativo accounts and swaps out of USDC fail withInvalid wallet selected.
You can add to it in two ways:
- Deposit USDC to the funding address from
GET /corporate-card/wallet - Swap from your USD wallet with
POST /wallet/swap. USD is the only currency you can swap into USDC
Fees
Every corporate card fee is charged to your USDC balance, in sandbox as in production. Amounts come from your pricing agreement.GET /fees returns them under employee_card. See Fees.
Errors
Errors use the standard envelope:
When the card service rejects a request,
data.error explains why, for example an invalid date of birth. When it can’t complete the request at all, you get 502 with The card service could not complete this request right now. Please try again later.
Going live
- Change the base URL to
https://api.yativo.com/api/v1and use your production API key. - Wait for Yativo to enable corporate cards on your production account. This is part of your invitation.
- Make sure each customer has an approved
cobo_poboendorsement in production. - Fund your production USDC balance above the reserve.
- Point your webhook URL at your production endpoint.

