> For clean Markdown of any page, append .md to the page URL. > For a complete documentation index, see https://docs.withpersona.com/2022-09-01/relay-sandbox/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. > Test your Relay integration end to end without incurring usage charges.