Skip to main content
A sandbox key is an ordinary API key with two differences: it acts in an isolated partition of your organization, and it cannot leave it. That is what makes it safe to hand to a test suite. Nothing a sandbox key writes touches your real graph, and nothing it reads can reach a real subject.

Minting one

The response carries the plaintext exactly once, like any minted key.
Four things are fixed and not negotiable through the request: Minting needs the admin scope. See POST /v1/sandbox/keys.

The containment rule

A sandbox key presenting X-Exo-Subject for anything but its own partition is refused with 403 permission_denied. Without that rule “sandbox” would be a label rather than a boundary: one leaked test key could read, and once exports shipped, dump, every provisioned subject in the organization. The check asks the database rather than trusting the key prefix, so it holds even for a key minted through another route. A sandbox key also cannot mint API keys, for the same reason.

Resetting it

The response reports what went:
The reset keeps the sandbox user and its keys. That is the point: your test credential keeps working against a now-empty partition, so a suite does not have to re-mint between runs. Running it on an already-empty sandbox is a no-op that returns zeroes. Reset is replay-safe. A resubmitted Idempotency-Key returns the original counts rather than running the wipe again.

What reset does not clear

Reset removes rows it can attribute to the sandbox partition. Some derived structure has no attribution: domains the sandbox content helped form, segmentation rows, and clustered agent patterns are organization-wide aggregates, and deleting them would take a real user’s cognition with them. Those are left in place, deliberately. If you genuinely need a clean slate for the whole organization, that is POST /v1/purge with scope: "org", which is a two-phase destructive ceremony rather than a test convenience.

Routes

All four require admin.

One conflict to know about

__sandbox__ is a reserved subject id. If it was already provisioned as an ordinary subject, the sandbox cannot claim it without colliding with real data, and the routes refuse with 409 sandbox_subject_conflict rather than proceeding.

Next

Authentication

How keys are minted, presented and revoked.

Scopes

Why a sandbox key is capped at read and write.