Skip to main content

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

SandboxLive
CreditsSeparate monthly quotaYour purchased pool
Candidate emailsNever sentSent
Cloud recordingOffOn
Interview reportSample, flagged sample: trueReal
Interview lengthCapped at 5 minutesFull round length
Data retentionPurged after 30 daysRetained

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.