Skip to main content
Use sandbox mode with predetermined API payloads to retrieve every status this endpoint can return. Each payload is mapped to a specific outcome so you can confirm how your integration handles verified results. This page covers how sandbox works, the matching rules, and the shared response envelopes. The copy-paste payloads for each verification live on their own pages in this section.

How sandbox works

Sandbox is a property of your company account, not of the URL. When your account is in sandbox mode, the same production endpoints stop calling the real upstream source and answer from stored fixtures instead. Same URLs, same tokens, same authentication. Sandbox differs from live in exactly two ways:
  • The upstream source is never called. The response comes from a fixture.
  • No credit is reserved or charged.
A sandbox response is deliberately identical in shape to a live one. There is no sandbox or environment field to branch on — that is the point, so code you write against sandbox works unchanged in production.

Going live

Nothing in your integration changes. Your account is switched to live mode and the same calls begin reaching the real sources. There is no URL or token to swap.

Authentication

Use the same Bearer token you use in live:
Sandbox mode is resolved from the authenticated company. See Introduction to the Stateless Verification API for how to create a token.

Matching rules

Your request payload must match one of the documented sandbox requests exactly to get that scenario’s response. A valid payload that matches nothing is answered as a no-match — HTTP 200 with isValid set to false — the same answer the real source gives for identity data it holds no record for. Copy the payloads from the sandbox page for your verification to exercise the other outcomes.
Testing with your own real details is expected to come back as a no-match. The sandbox has no records to check against, only the documented scenarios. This is not an error and does not mean your integration is wrong.

Response placeholders

The sample responses on the sandbox pages use placeholders for values that change on every call:

Sending metadata

metadata is ignored for fixture matching and echoed back untouched. Any scenario can be called with it:

Error codes

Non-verification responses

Four responses do not use the verification envelope. They are produced before — or instead of — a verification result, so they carry no verificationStatus, verificationStatusCode, or data.
Returned when the request body fails field validation. This happens before any fixture matching, so it is identical in sandbox and live. Note that transactionId is null and there is no verificationStatus.
There is one exception. On PhilSys Check Tier 2, a rejected face-liveness session fails validation after the request has reached the service, so that response carries a real transactionId, echoes metadata, and writes a transaction row with status FAILED (6).
Returned when the authenticated company has no plan for the verification type. The plan gate is enforced in sandbox exactly as in live.This envelope is deliberately short — it carries no code field, despite PLAN_NOT_AVAILABLE appearing in the error-code list above.
Live only. Sandbox reserves no credit, so this is unreachable there. Note that the field is error_code, not code.
Returned when the Authorization header is missing, malformed, or carries a token that is not valid. Authentication is resolved before anything else, so this envelope is the shortest of all — no code, no verificationType, no transactionId.