Skip to main content
ENSC has two environments, Sandbox and Live. Your API key selects the environment; everything downstream (the chain, the bank rail, screening) follows the key. The API surface, the SDK and the cryptography are identical in both. Sandbox and Live share one host, api.ensc.prosperavest.com; the key prefix selects the environment.

Keys

A Sandbox key can never touch Live resources and a Live key can never touch Sandbox resources (ENSC_TEST_LIVE_MISMATCH). Naming a chain from the other environment answers ENSC_INVALID_CHAIN.

Chains

Conversions run on one converter chain per environment: The wallet you name on a conversion must hold the token it sends and enough native CELO for gas on that chain. GET /v1/balance reads any whitelisted asset on any enabled chain of your environment. Other chains in the registry (base, polygon, optimism, ethereum, arbitrum, bsc, mode and their testnets base-sepolia, polygon-amoy, optimism-sepolia, sepolia, arbitrum-sepolia, bsc-testnet, mode-sepolia) carry the ENSC token only: balance and transfer work where ENSC is deployed and the chain is enabled for your environment, and POST /v1/conversions answers ENSC_CONVERTER_UNAVAILABLE.

The sandbox bank rail

In Sandbox, GET /v1/banks, POST /v1/accounts/resolve, fiat-issue collections and fiat-redeem payouts go to a sandbox banking network instead of the live one. No real money moves.
  • Use the test bank and the test account numbers shown on the dashboard’s Sandbox page. One of them always fails, which is how you exercise the payout.failed and conversion.requires_manual_review path.
  • A Sandbox fiat-redeem to a test account succeeds about one minute after payout.initiated, so you see the full payout_pending, payout_in_progress, payout_confirmed, succeeded sequence.
  • Bank transfer only: paymentInstructions on a Sandbox fiat-issue describe a sandbox account; the transfer amount and expiry are real values.
accountName on a fiat-redeem must still match what accounts/resolve returns for the test account.

Screening

Transaction screening applies in both environments; screening statuses and holds behave on Sandbox as they do on Live.

Exercising webhooks

POST /v1/test-data/events (ensc.testEvents.emit, with your Sandbox or Live key) writes a synthetic event of the type you name into your Sandbox webhook stream with a realistic payload, delivered and signed exactly like a real one. Use it to test every conversion.* and payout.* handler before you can produce the real event. Synthetic events are always Sandbox events and are only ever delivered to Sandbox endpoints. POST /v1/webhook-endpoints/{id}/test (ensc.webhookEndpoints.sendTest) queues one event in that endpoint’s environment instead of the whole Sandbox stream: every active endpoint there that subscribes to the type receives it, and willDeliverToTargetEndpoint in the response says whether the endpoint you named is among them. A Live endpoint accepts only synthetic.test_event. The full receiver guide is Webhooks.

Moving to Live

Generate Live keys, switch the chain slug from celo-sepolia to celo, point your wallet at the mainnet RPC, and follow the checklist in Going live. Nothing else in your integration changes.