Checklist
- Complete business verification in the dashboard. Live keys cannot be generated before it is approved.
- Know your egress IPs. Live keys require an IP allowlist (1 to 32 addresses or CIDR ranges). See IP allowlist.
- Generate Live keys (dashboard, Live, Credentials, Generate keys), then Download .env. Save the six values once. See Generating keys.
- Configure your production environment with the six live values. Keep them in a secret manager; never in source control or a client bundle.
- Upgrade the SDK to
@ensc/sdk0.4.0 or later. 0.4.0 introduced the conversions API; earlier versions call endpoints that no longer exist, and versions before 0.3.0 send plaintext requests the API refuses. - Register your production webhook endpoint and verify deliveries against the public key at
GET /v1/.well-known/ensc-public-keys.json. Send a test event from the dashboard or withensc.webhookEndpoints.sendTest(id); a Live endpoint accepts onlysynthetic.test_event. Handle every event type listed in Conversions, in particularconversion.requires_manual_reviewandpayout.failed. - Run one read and one write against Live before routing traffic: for example
ensc.banks.list()and a smallensc.conversions.create({ type: 'crypto-issue', chain: 'celo', ... })that you sign, broadcast and report withensc.conversions.events.confirmed(). Fund the wallet with a little native gas token first. - Switch the chain slug. Sandbox conversions run on
celo-sepolia; Live conversions run oncelo. The chain id in every unsigned transaction changes with it (see Environments). - Set up rotation. Decide who holds the dashboard access that can rotate and revoke, and rehearse a rotation on Sandbox: rotate, deploy the new value, confirm, let the old key expire after 24 hours.
Sandbox vs Live
A test key can never touch live resources and a live key can never touch test resources (
ENSC_TEST_LIVE_MISMATCH, or ENSC_INVALID_CHAIN when a live key names a testnet). Everything else about the two environments is in Environments.
Operational expectations
- Idempotency keys on every write. Your retries then can never double-execute. The SDK does this by default. See Idempotency.
- Clock accuracy. Signatures and sealed responses are time-bound to 5 minutes; run NTP on the servers that call ENSC.
- Handle
ENSC_RATE_LIMITED(429) by backing off. The limits: 600 requests per minute and 10,000 per hour per key; 600 per minute per source IP on every route; 60 per minute per key on writes to the conversion, account-resolution and transfer routes; 120 per minute per source IP on the public routes (the key document, the OpenAPI documents and the reference page). A request body may be at most 1 MiB. See Rate limits. - Watch
expiresAton rotated keys (signingKeys.list(),apiKeys.list(),encryptionKeys.list()) so a rotation is completed inside its 24-hour window. - Pin
X-ENSC-API-Version. The SDK pins2026-09-15. Read the changelog before adopting a newer version.