> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.withpersona.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.withpersona.com/_mcp/server.

# Sandbox

> Test your Relay integration end to end without incurring usage charges.

Relay supports Persona's [sandbox environment](/environments#sandbox), so you can build and test a full integration — session creation, the user-facing verification, the Privacy Pass, and claim retrieval — without running real verifications or incurring usage charges.

> **Availability**
>
> Relay must be enabled for your sandbox environment, which depends on your
> Persona plan. If issuing a Privacy Pass returns a "Privacy Pass for Relay is
> not enabled" error, talk to your Persona team or [contact us](https://app.withpersona.com/dashboard/contact-us).

## What's different in sandbox

Sandbox behaves like production from your integration's point of view — the same endpoints, the same request and response shapes, the same Privacy Pass flow, the same payload shape and encryption. What changes is what happens underneath:

* **No real verification is performed.** Sandbox does not evaluate the end user — the claim result is simulated. See [Environments](/environments#sandbox).
* **No usage charges.** Sandbox activity is not billed.
* **A separate Privacy Pass scope.** A sandbox pass cannot be redeemed against a production relay, and a production pass cannot be redeemed against a sandbox relay.

## What a sandbox claim returns

> **Sandbox claims always pass**
>
> A sandbox relay returns `"claim_result": "passed"` for every claim type. The
> result is fixed — it does not depend on what the end user did, and it is
> returned even if the verification flow was never started or completed. Use
> sandbox to prove your integration is wired up correctly, not to test how your
> application handles a failing claim.

The payload is otherwise identical to production:

```json
{
  "claim_type": "live_human_presence",
  "claim_result": "passed",
  "methodology": [{ "method": "live_selfie", "result": "passed" }]
}
```

* `methodology` reports a single calculation — the primary method configured for that claim type — and is omitted for claim types that hide methodology, exactly as in production.
* If you supplied an `encryptionKeyPem`, the payload is still RSA-OAEP encrypted. Decrypt it the same way.
* Because the claim passes, a successful redemption returns `token-consumed: true` and the pass is spent. Errors leave the pass unspent, exactly as in production.

## Selecting the environment

Sandbox is opt-in on top of whichever server-side integration you already use. See the documentation for your [server-side integration method](/relay-getting-started#server-side-integration-methods) for the specifics:

* The **Server SDKs** infer the environment from your API key, so a sandbox key runs against sandbox with nothing further to configure.
* The **Relay Gateway Service** and the **API** take a `sandbox` field on relay creation.

### Client-side integrations

Nothing changes in the client-side integration. During the flow you can use Persona's [sandbox controls](/environments#sandbox) to move an end user through passing and failing paths, which is useful for exercising your own UI — though as above, the Relay claim itself returns `passed` either way.