Overview
Use the sandbox to test the complete IBAN onboarding flow. The sandbox uses Monerium on the Chiado testnet (Gnosis testnet) — no real IBAN is provisioned, and no real bank transfers can be sent to sandbox IBANs.
Sandbox base URL: https://crypto-sandbox.yativo.com/api/
In the sandbox, IBAN operations run on Chiado testnet. No real IBANs are assigned and no real bank transfers can be received. Use the sandbox to verify your integration logic and status-handling code.
Step 1 — Get IBAN Options
Retrieve available options and requirements for standalone IBAN onboarding.
GET https://crypto-sandbox.yativo.com/api/iban/options
curl -X GET 'https://crypto-sandbox.yativo.com/api/iban/options' \
-H 'Authorization: Bearer YOUR_SANDBOX_TOKEN'
{
"status" : "success" ,
"data" : {
"supported_currencies" : [ "EUR" ],
"supported_networks" : [ "SEPA" , "SEPA_INSTANT" ],
"kyc_required" : true ,
"supported_payout_tokens" : [ "USDC" , "USDT" ],
"supported_payout_chains" : [ "ethereum" , "polygon" , "solana" ],
"sandbox_note" : "IBAN options in sandbox mirror production. Uses Chiado testnet (Gnosis). No real IBANs provisioned."
}
}
Step 2 — Initialize Onboarding
POST https://crypto-sandbox.yativo.com/api/iban/onboarding/init
The applicant’s email address.
Your internal customer identifier. Links the IBAN to an existing customer record.
curl -X POST 'https://crypto-sandbox.yativo.com/api/iban/onboarding/init' \
-H 'Authorization: Bearer YOUR_SANDBOX_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"email": "sandbox-iban-test@example.com",
"customer_id": "cus_sandbox_iban_001"
}'
{
"status" : "success" ,
"message" : "IBAN onboarding initialized" ,
"data" : {
"onboarding_id" : "onb_01HX9KZMB3F7VNQP8R2WDGTAAA" ,
"customer_id" : "cus_sandbox_iban_001" ,
"email" : "sandbox-iban-test@example.com" ,
"status" : "pending_kyc" ,
"next_step" : "kyc" ,
"created_at" : "2026-03-28T21:00:00Z"
}
}
Step 3 — Submit KYC
POST https://crypto-sandbox.yativo.com/api/iban/onboarding/kyc
Your internal customer identifier.
KYC data for the applicant.
curl -X POST 'https://crypto-sandbox.yativo.com/api/iban/onboarding/kyc' \
-H 'Authorization: Bearer YOUR_SANDBOX_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"customer_id": "cus_sandbox_iban_001",
"kyc": {
"method": "direct_docs",
"first_name": "Sandbox",
"last_name": "User",
"date_of_birth": "1990-01-01",
"nationality": "DE"
}
}'
{
"status" : "success" ,
"data" : {
"customer_id" : "cus_sandbox_iban_001" ,
"kyc_status" : "pending" ,
"submitted_at" : "2026-03-28T21:05:00Z"
}
}
Step 4 — Request IBAN
Once KYC is approved, request IBAN provisioning.
POST https://crypto-sandbox.yativo.com/api/iban/iban/request
Your internal customer identifier.
Token to receive converted funds in: "USDC".
Chain for payouts: "solana", "ethereum", "polygon".
Testnet wallet address for payouts.
curl -X POST 'https://crypto-sandbox.yativo.com/api/iban/iban/request' \
-H 'Authorization: Bearer YOUR_SANDBOX_TOKEN' \
-H 'Content-Type: application/json' \
-d '{
"customer_id": "cus_sandbox_iban_001",
"payout_token": "USDC",
"payout_chain": "solana",
"payout_address": "GY1EZGdpiJNyx2BSKq8rfTDRe5K8Bb6Cf2Bn1pdmE2o1"
}'
Success
KYC Not Yet Approved
{
"status" : "success" ,
"data" : {
"customer_id" : "cus_sandbox_iban_001" ,
"iban_request_id" : "ibanreq_01HX9KZMB3F7VNQP8R2WDGTBBB" ,
"status" : "provisioning"
}
}
Step 5 — Check Status
Poll the status endpoint to track the flow.
GET https://crypto-sandbox.yativo.com/api/iban/status
Your internal customer identifier.
curl -X GET 'https://crypto-sandbox.yativo.com/api/iban/status?customer_id=cus_sandbox_iban_001' \
-H 'Authorization: Bearer YOUR_SANDBOX_TOKEN'
IBAN Active (Sandbox)
Pending KYC
{
"status" : "success" ,
"data" : {
"customer_id" : "cus_sandbox_iban_001" ,
"overall_status" : "active" ,
"kyc_status" : "approved" ,
"iban_status" : "active" ,
"iban" : "DE89370400440532013099" ,
"bic" : "SSKMDEMMXXX" ,
"account_holder_name" : "Sandbox User" ,
"currency" : "EUR" ,
"payout_token" : "USDC" ,
"payout_chain" : "solana" ,
"payout_address" : "GY1EZGdpiJNyx2BSKq8rfTDRe5K8Bb6Cf2Bn1pdmE2o1" ,
"activated_at" : "2026-03-28T21:07:00Z" ,
"sandbox_note" : "Chiado testnet IBAN. Cannot receive real bank transfers."
}
}
Sandbox Limitations
IBANs run on Chiado testnet (Gnosis testnet) via Monerium
Cannot receive transfers from real banks — testnet Monerium only
The IBAN number returned is a testnet IBAN with no real banking connectivity
End-to-End Test Script
#!/bin/bash
BASE_URL = "https://crypto-sandbox.yativo.com/api"
TOKEN = "YOUR_SANDBOX_TOKEN"
CUSTOMER_ID = "sandbox_iban_$( date +%s)"
echo "=== Step 1: Init onboarding ==="
curl -s -X POST " $BASE_URL /iban/onboarding/init" \
-H "Authorization: Bearer $TOKEN " \
-H 'Content-Type: application/json' \
-d "{ \" email \" : \" test+ $CUSTOMER_ID @example.com \" , \" customer_id \" : \" $CUSTOMER_ID \" }" | jq .
echo "=== Step 2: Submit KYC ==="
curl -s -X POST " $BASE_URL /iban/onboarding/kyc" \
-H "Authorization: Bearer $TOKEN " \
-H 'Content-Type: application/json' \
-d "{ \" customer_id \" : \" $CUSTOMER_ID \" , \" kyc \" :{ \" method \" : \" direct_docs \" , \" first_name \" : \" Sandbox \" , \" last_name \" : \" User \" , \" date_of_birth \" : \" 1990-01-01 \" , \" nationality \" : \" DE \" }}" | jq .
echo "=== Step 3: Check status ==="
curl -s -X GET " $BASE_URL /iban/status?customer_id= $CUSTOMER_ID " \
-H "Authorization: Bearer $TOKEN " | jq .
echo "=== Step 4: Request IBAN ==="
curl -s -X POST " $BASE_URL /iban/iban/request" \
-H "Authorization: Bearer $TOKEN " \
-H 'Content-Type: application/json' \
-d "{ \" customer_id \" : \" $CUSTOMER_ID \" , \" payout_token \" : \" USDC \" , \" payout_chain \" : \" solana \" , \" payout_address \" : \" GY1EZGdpiJNyx2BSKq8rfTDRe5K8Bb6Cf2Bn1pdmE2o1 \" }" | jq .
Testing Error Scenarios
Test IBAN request before KYC approval
Submit a KYC request and immediately call the IBAN request endpoint before KYC is approved. You should receive a KYC_NOT_APPROVED error.
Test duplicate customer ID
Submit two init calls with the same customer_id to test conflict handling in your application.
Use unique customer_id values for each test run (e.g., append a timestamp) to avoid state conflicts between test runs.