Environments
Two modes — test and live — on the same base URL. Build in the sandbox, then flip to a live key.
There is a single base URL. Your API key's prefix selects the environment: ck_test_ for the sandbox, ck_live_ for production. You don't change hosts to switch — you change keys.
https://api.caiboglobal.com/v1Test vs live
Test (ck_test_) | Live (ck_live_) | |
|---|---|---|
| Moves real funds | No — fully simulated | Yes |
| Touches the blockchain | No | Yes (signs & broadcasts on-chain) |
| Requires verified KYB | No — available immediately | Yes |
| Screening runs | Yes (real screening logic) | Yes |
| Webhooks fire | Yes (signed, realistic) | Yes |
| Data visibility | Test payouts only | Live payouts only |
Test and live data are isolated. A payout created with a test key never appears when you list with a live key, and the reverse holds too — so you can leave test data around without polluting production.
What the sandbox simulates
In test mode your integration exercises the whole flow — validation, screening, limits, balance holds, state transitions, and signed webhooks — but the on-chain step is simulated. A completed sandbox payout has a simulated transaction hash prefixed with 0xSIMULATED:
{
"id": "po_9f8e7d6c5b4a",
"status": "completed",
"mode": "test",
"tx_hash": "0xSIMULATED8f3a9c2b1d4e5f60"
}Test organizations are seeded with a sandbox balance, so you can create payouts without funding anything.
Sandbox test addresses
To let you drive every branch deterministically — like test card numbers on other platforms — the sandbox recognizes special destination addresses by their suffix:
| Address suffix | Forces |
|---|---|
…0blocked | The payout is blocked by screening. |
…0fail | The on-chain broadcast fails, and the funds are refunded to your balance. |
| Any other valid address | The payout completes with a simulated tx_hash. |
# Force a blocked payout
curl https://api.caiboglobal.com/v1/payouts \
-H "X-API-Key: $CAIBO_TEST_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{ "amount": "10.00", "currency": "USDC", "rail": "stablecoin",
"destination": { "network": "polygon", "address": "0x00000000000000000000000000000000000blocked" } }'
# Force a failed broadcast (funds refunded)
curl https://api.caiboglobal.com/v1/payouts \
-H "X-API-Key: $CAIBO_TEST_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{ "amount": "10.00", "currency": "USDC", "rail": "stablecoin",
"destination": { "network": "polygon", "address": "0x000000000000000000000000000000000000fail" } }'These suffixes are only honored in test mode — a live payout to such an address is treated as an ordinary destination and screened normally.
Moving to live
When your integration works end-to-end in the sandbox, submit KYB, create a ck_live_ key, and swap it in. Everything else stays the same. Walk through the full checklist in Going live.