Skip to main content
Run the supported sandbox journey with your own test key. This uses a one-pixel PNG fixture, so there is no model call, provider charge or real talent. Sandbox decisions are simulated: a signed test receipt does not clear a real person’s likeness or prove the image depicts the fixture. You need Bash, cURL, jq and Node.js 22 or later. The API reference also includes native TypeScript, Python and Go HTTP examples; no Reflections SDK package is required.

1. Get a test key

Create an unrestricted test key in the dashboard. The escalation helper needs an unrestricted key. Keep it private and export it in your terminal:

2. Check, submit and verify

Save this block as quickstart.sh, then run bash quickstart.sh from the same terminal. It stops on an HTTP failure, malformed response, a check without allow, or a generation without allow. It writes request bodies and one idempotency key per logical request to reflections-demo. Rerun it with that directory unchanged after an unknown network outcome. For a new request, export a new REFLECTIONS_DEMO_DIR; never change a body while reusing its key.
Inline media is limited to 7 MiB (7,340,032 decoded bytes) and the entire generation JSON body to 10 MiB (10,485,760 bytes), including base64 overhead. /files, multipart verification, manifest verification and media evaluation by a real model are not supported. See Sandbox.

3. Verify the signature locally

Run this from your original directory. It checks the JWS against the published test JWKS, the pinned issuer, receipt identity, test key ID and original artifact digest. This is a test-mode example; do not use it to accept real talent content.
Signature verification proves what this issuer signed. To read its current status, retrieve the receipt again. JSON verification also accepts { "receipt": "rcpt_…" } or { "sha256": "<the original file's hex digest>" }; use a new persisted key for each new logical verification. The sandbox does not fetch URLs or extract C2PA manifests.

4. Exercise the stop paths

Use the same check body with Iris Calder or Dev Marlow in place of Maya. Each returns deny. Add rfl_test_escalate to Maya’s prompt to get escalate. Save each changed body in a new demo directory with new keys. The script stops before submission in all three cases. A 200 alone is never permission to proceed.
The request:
The response:
Branch on reasons[].code. remedy tells the licensee what would change the answer.
Jonah Reyes’s check allows the use, but his output stays held with decision: "escalate". The script stops after saving that generation. Resolve its escalation and retrieve the generation again; continue only when it returns allow. For asynchronous test outputs, poll at most once every five seconds. Webhook delivery is not implemented in the sandbox.

Next

  • Sandbox: supported operations, fixtures, stop paths and limits.
  • API reference: native HTTP samples and per-operation availability.
  • Production status: what remains before live generation.