What’s a sandbox key
Accounts can be provisioned with a sandbox API key/secret pair distinct from any production credentials. Use the sandbox pair when fetching tokens viaGET /v1/auth; every request authenticated with the sandbox token is treated as a sandbox request automatically — there is no per-request flag.
Ask your account team to provision sandbox credentials if you don’t already have them.
What runs the same as production
A sandbox request goes through the identical request-creation flow as a production request:- Validation of
schemaIdandinputs - Schema lookup against the schemas provisioned for your account
- Required-input checks — missing or malformed inputs produce the same
INVALID_INPUTS400 envelope ({"error": "INVALID_INPUTS", "message": "...", "details": {"missingInputs": [...], "invalidInputs": {...}}}) internalIdidempotency dedup- Batch grouping and due-date scheduling against your account’s daily call capacity
- A real
requestIdandrequestBatchIdyou can read back withGET /v1/requests/{requestId}and the list endpoint, just like a production request - Webhook delivery to your configured URL
- Response shapes and HTTP status codes — every error code documented in Creating a Request reproduces when using sandbox
What’s different when using sandbox
For requests that would normally place a phone call to a payer:- No phone call is dialed. A call record is still written for traceability, but it never reaches a real outbound phone line.
- Results are LLM-generated against your schema. SuperDial uses an LLM to produce realistic mock values for every field defined by your
schemaId, then feeds those through the same callback path a real call would use. - Transcript, recording, and call summary are placeholders. When you fetch the request via
GET /v1/requests/{requestId}, you’ll see:transcript: a fixed placeholder line, not a transcript of any real conversation.callSummary: a fixed placeholder sentence.callAuditSummary: a fixed placeholder sentence.recordingDownloadUrl: a signed URL pointing at a placeholder MP3.
- The request webhook fires as normal. Configure your webhook URL the same way you would for production traffic, and verify the signature with your signing secret (see Webhooks → Signature verification for what that resolves to).
Sandbox webhooks
Sandbox webhooks fire the same way production webhooks do — to the same URL, with the same payload shape:GET /v1/requests/{requestId} to fetch the full payload (results, plus the placeholder transcript/summary/recording fields).
A typical sandbox test plan
- Happy path. POST a single, valid request → assert 200 with
requestId→ wait for webhook → GET the request → assertstate: "SUCCESS"with LLM-generated mock values populatingresults. - Validation failures. POST with missing
schemaId, aninputsfield that isn’t an object, missing schema-required inputs, and bad input formats — confirm your client surfaces theINVALID_REQUESTandINVALID_INPUTSenvelopes correctly. - Idempotency. POST the same
internalIdtwice — confirm the second response returns the samerequestIdrather than creating a duplicate. - Batch. POST
{"requests": [valid, invalid]}— confirm you get HTTP 207 with a per-entry success body and a per-entry{error, message}envelope, and that your batching/retry logic handles both entries independently. - Webhook signature. Verify the HMAC-SHA256 signature on the incoming webhook body using your production API key.
Limits
Sandbox requests count against your account’s daily call capacity for scheduling purposes. If your sandbox account is provisioned with a non-zero limit, batch due-date scheduling can return the sameINVALID_REQUEST 400 you’d see in production when capacity runs out (e.g. "Could not schedule all rows within 365 days — N of M rows could not be placed"). Coordinate with your account team if you need a higher sandbox throughput for load testing.
Sandbox requestId and requestBatchId values use the same 20-character format as production. Whether sandbox and production data live in the same scope or are isolated depends on how your account is provisioned — confirm with your account team.