Sandbox environment
Test your integration without touching real flows.
Orkid provides a dedicated sandbox environment at https://sandbox.orkidlabs.com for integration testing. You can hammer it with thousands of test requests and never risk a real on-chain transaction.
How it works
| Environment | Base URL | Solve behavior | Volume tracked |
|---|---|---|---|
| Production | https://orkidlabs.xyz | Real execution (submits on-chain tx) | Yes — counts toward rebates |
| Sandbox | https://sandbox.orkidlabs.com | Dry-run only (never submits) | No — sandbox traffic is isolated |
The sandbox:
- Forwards
routeto the real solvers — you get authentic quotes, routing, and latency. - Forces
solvetodryRun: trueregardless of what you send — the solver encodes and validates the transaction but never submits it. - Accepts both
/v1/*and/api/v1/*path prefixes — SDKs, plugins, and raw curls all work unchanged. - Does not record usage or rebate volume.
No API key required
Route quotes and dry-run solves are permissionless on the sandbox — pass nothing and it works:
curl -X POST https://sandbox.orkidlabs.com/v1/route \
-H "Content-Type: application/json" \
-d '{"from":"USDC","to":"WETH","amount":"25.0","chain":"base"}'Anonymous callers are rate-limited per IP (60 req/min). If you need more headroom, request a sandbox key via api@orkidlabs.com — keyed callers get the pilot 300 req/min. Sandbox keys are distinct from production keys.
Using the sandbox with the SDK
import { OrkidClient, SANDBOX_BASE_URL } from '@orkid-labs/sdk'
const sandbox = new OrkidClient({
baseUrl: SANDBOX_BASE_URL, // https://sandbox.orkidlabs.com
// apiKey optional on sandbox
})
// Real quote from the real solver
const quote = await sandbox.getQuote({
from: 'USDC',
to: 'WETH',
amount: '25.0',
chain: 'base',
})
// Dry-run solve — encodes and validates but never submits
const result = await sandbox.solve({
from: 'USDC',
to: 'WETH',
amount: '25.0',
chain: 'base',
user: '0x...',
fromAddress: '0x833589fcd6edb6e08f4c7c32d4f71b54bda02913',
fromDecimals: 6,
toAddress: '0x4200000000000000000000000000000000000006',
toDecimals: 18,
dryRun: false, // ignored — sandbox always forces dryRun: true
permit: signed.permit,
signature: signed.signature,
})
// result.transaction.to / .data are real calldata
// result.transaction.txHash is absent (never submitted)Using the sandbox with curl
# Health check (no auth)
curl https://sandbox.orkidlabs.com/health
# Route (real quote, keyless)
curl -X POST https://sandbox.orkidlabs.com/v1/route \
-H "Content-Type: application/json" \
-d '{"from":"USDC","to":"WETH","amount":"25.0","chain":"base"}'
# Solve (always dry-run — never submits)
curl -X POST https://sandbox.orkidlabs.com/v1/solve \
-H "Content-Type: application/json" \
-d '{"from":"USDC","to":"WETH","amount":"25.0","chain":"base","user":"0x...","fromAddress":"0x...","fromDecimals":6,"toAddress":"0x...","toDecimals":18,"permit":{...},"signature":"0x..."}'Using the sandbox with the CLI
orkid --base-url https://sandbox.orkidlabs.com status
orkid --base-url https://sandbox.orkidlabs.com quote --from USDC --to WETH --amount 25 --chain baseSafety guarantees
- No on-chain execution: the sandbox proxy intercepts every
solveand forcesdryRun: truebefore forwarding to the solver. Even if you senddryRun: false, the sandbox ignores it. - No production volume: sandbox requests do not call the production usage-tracking or rebate-recording endpoints.
- Real routing:
routehits the actual per-chain solvers, so quotes reflect live pool state and real latency.
Rate limits
| Caller | Requests / minute |
|---|---|
| Anonymous (no key) | 60 per IP |
| Sandbox pilot key | 300 |