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. Creating candidates and resumes, scoring a resume, creating an interview, minting a launch link, conducting the interview and receiving webhooks all behave exactly as they do in live.
The one exception is the interview report. See below.
What is different
| Sandbox | Live | |
|---|---|---|
| Credits | Separate monthly quota | Your purchased pool |
| Candidate emails | Never sent | Sent |
| Cloud recording | Off | On |
| Interview report | Sample, flagged sample: true | Real |
| 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. Scoring runs off
that recording, so a sandbox interview has nothing to score: it stays at
processing and never reaches completed.
Rather than leave the report endpoint permanently unanswerable, sandbox returns
a sample report carrying "sample": true. Same shape, same keys, same scales,
fixed numbers that describe nobody. Write your parser against it, gate on
sample before rendering, and use a live key for real scores.
The transcript is real in sandbox. It is uploaded by the interviewer when the
interview ends, not by the scoring pipeline, and
GET /v1/interviews/{id}/transcript has no completed gate.
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. There is one
pool, reported as credit_pool; each credits.* entry says what that pool costs
per call and how many calls it still covers. Note also that the module key and
the credit key differ for Psychometric Test: the gate is modules.psychometric,
the entry is credits.psychometric.