Sandbox and live
What sandbox does differently, and what it deliberately does not.

Which environment you are in is decided by the key you send, not the URL you
call. A ehp_sk_test_ key is sandbox; ehp_sk_live_ is live.
Every response tells you which you got, in the X-EH-Environment header and in
livemode on the object. Every webhook carries livemode too.
What is identical
Sandbox runs the same code, the same models and the same response shapes as live. A sandbox that behaves differently is a sandbox that lies to you, so scoring uses the same model and reports have the same fields. What you validate in sandbox is what you get in production.
What is different
| Sandbox | Live | |
|---|---|---|
| Credits | Separate monthly quota | Your purchased pool |
| Candidate emails | Never sent | Sent |
| Cloud recording | Off | On |
| Interview length | Capped at 5 minutes | Full round length |
| Data retention | Purged after 30 days | Retained |
Recording is off because it is the largest cost per interview and an integration test never needs the video back. If you are testing report rendering, use the transcript.
Sandbox is metered
Sandbox is free but not unlimited. Every sandbox interview still runs a real voice agent and real scoring, so each organisation gets a monthly allowance that resets on the first of the month.
Check what is left:
curl https://prep-api.experthire.cloud/v1/usage \
-H "Authorization: Bearer ehp_sk_test_..."
{
"object": "usage",
"environment": "sandbox",
"livemode": false,
"credits": {
"interview": { "remaining": 21, "granted": 25, "used_this_period": 4 }
},
"modules": { "interviews": true, "coding": true, "placements": false }
}
Past the allowance you get 402 with code sandbox_quota_exceeded. It never
falls through to your live credits, so testing cannot spend what you paid for.
Ask us if you need a larger sandbox allowance.
Modules
modules reports which features your organisation has. Read it at boot and hide
what is off, rather than discovering a 403 when a user clicks. Anything
disabled is reported false rather than omitted, so the surface describes itself.
modules and credits describe your organisation, not the API surface. A true
means you hold the product; it does not prove a route exists. Check
the API reference before writing the call. Note also that
the module key and the credit key differ for Psychometric Test: the gate is
modules.psychometric, the pool is credits.psychometric.