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.

bash
https://api.caiboglobal.com/v1

Test vs live

Test (ck_test_)Live (ck_live_)
Moves real fundsNo — fully simulatedYes
Touches the blockchainNoYes (signs & broadcasts on-chain)
Requires verified KYBNo — available immediatelyYes
Screening runsYes (real screening logic)Yes
Webhooks fireYes (signed, realistic)Yes
Data visibilityTest payouts onlyLive 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:

json
{
  "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 suffixForces
0blockedThe payout is blocked by screening.
0failThe on-chain broadcast fails, and the funds are refunded to your balance.
Any other valid addressThe payout completes with a simulated tx_hash.
bash
# 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.