Sandbox and live
What sandbox does, and the one thing it cannot do.
A ehs_sk_test_ key runs against test. Same code path, same response shapes, same
validation.
What is identical
Registering roles and candidates, creating assessments, launch links, browser sessions, scheduling and webhooks all behave exactly as they do on live.
What is different
| Sandbox | Live | |
|---|---|---|
| Credits | Separate monthly quota | Your credit balance |
| Recording | Off | On |
| Report | Fixed sample, flagged sample: true | Real, measured |
| Recruiter pipeline | Excluded | Candidates appear |
Recording is off because it is the largest cost per assessment. Nothing is recorded, so
nothing is measured. Rather than leave you with no shape to parse,
GET /v1/assessments/{id}/report returns 200 with a fixed sample carrying
"sample": true and "livemode": false. The field set matches a live report exactly,
so a parser written against sandbox works unchanged on live.
Every number in a sandbox report is a constant. Never render one as a result: it
describes nobody. Branch on sample and use a live key for a real decision.
Sandbox never reaches your recruiters
A sandbox assessment does not appear on the pipeline board, in candidate search, or in any hiring surface. You can integrate against a customer's real organisation without putting anything in front of their team.
Quota
Sandbox draws on a separate monthly allowance per assessment type, not on the credit pool. It defaults to 50 per type per month and can be raised or lowered for your organisation.
GET /v1/usage on a sandbox key reports what is left of it, per type, so you can see a
cap coming instead of meeting it as an error:
"assessments": {
"ai_interview": { "credit_cost": 5, "granted": 50, "used_this_period": 47, "remaining": 3 }
}
used_this_period resets on the 1st of the calendar month, IST. Past the allowance a
create returns sandbox_quota_exceeded.
Next
- Assessments: create your first one
- Reference: rate limits, pagination, idempotency