The Grid sandbox environment allows you to test your integration without making real payments. When you set up your account, you can configure production and sandbox API tokens. The sandbox token is specifically for testing and development purposes. It corresponds to a separate platform instance in “sandbox” mode, which can only transact with the sandbox UMA addresses for testing.Documentation Index
Fetch the complete documentation index at: https://grid.lightspark.com/llms.txt
Use this file to discover all available pages before exploring further.
Overview
The sandbox environment provides:- A dedicated sandbox platform for testing
- Test UMA addresses for simulating payments
- Endpoints to simulate sending and receiving payments
- All the same webhooks and flows as production, but with simulated funds
Test UMA Addresses
The sandbox provides several test UMA addresses you can use to simulate different scenarios:| UMA Address | Description |
|---|---|
$success.usd@sandbox.uma.money | Always succeeds, sends USD |
$success.eur@sandbox.uma.money | Always succeeds, sends EUR |
$success.mxn@sandbox.uma.money | Always succeeds, sends MXN |
$pending.long.usd@sandbox.uma.money | Simulates a long-pending payment |
$fail.compliance.usd@sandbox.uma.money | Simulates compliance check failure |
Testing Outgoing Payments
To test sending payments from your platform, follow these steps:- Look up a sandbox UMA address:
- Create a quote as normal:
- Instead of making a real bank transfer, use the sandbox send endpoint:
Testing Incoming Payments
To test receiving payments to your platform’s users, use the sandbox receive endpoint:- You’ll receive an
INCOMING_PAYMENTwebhook withstatus: "PENDING" - Your platform should approve/reject the payment
- On approval, you’ll receive another webhook with
status: "COMPLETED"
Example Testing Flow
Here’s a complete example of testing both directions of payments:- First, register a test user:
- Test receiving a payment:
- Test sending a payment:
Testing Error Scenarios
You can test various error scenarios using the special sandbox UMA addresses:- Test compliance failures:
- Test long-pending payments:
- Non-existent UMA address:
Global Account magic values
The Grid sandbox accepts a small set of magic values that bypass real auth and credential checks for Global Account flows, so you can exercise the full request shape without standing up Turnkey, WebAuthn, or an OIDC provider. These values are sandbox-only — production enforces real signature verification, WebAuthn assertion, and OIDC nonce binding. A wrong magic value (or any other value) returns401 UNAUTHORIZED with a reason field that names the specific check that failed.
Email OTP code
Pass000000 as the body otp on POST /auth/credentials/{id}/verify when the credential type is EMAIL_OTP. The sandbox skips OTP delivery and accepts this value as a valid response to the issued challenge.
401 UNAUTHORIZED with reason: "Invalid OTP code".
Passkey assertion signature
Passsandbox-valid-passkey-signature as assertion.signature on POST /auth/credentials/{id}/verify when the credential type is PASSKEY. The sandbox accepts the rest of the assertion as-is and skips the WebAuthn signature check.
Passkey reauthentication is a two-step /challenge → /verify flow. The clientPublicKey is sent on /challenge (so Grid can seal the session signing key to your device) — the magic value bypasses the credential check, not the HPKE plumbing, so the public key is still required.
401 UNAUTHORIZED with reason: "Invalid passkey signature".
OAuth (OIDC) token
Passsandbox-valid-oidc-token as the body oidcToken on both POST /auth/credentials (OAUTH create) and POST /auth/credentials/{id}/verify (OAUTH).
401 UNAUTHORIZED with reason: "Invalid OIDC token".
OAUTH create still requires a JWT-shaped token. On the initial
POST /auth/credentials (OAUTH create), the oidcToken must be a structurally valid JWT (header.payload.signature) so Grid can decode the iss claim and resolve the provider name. The literal sandbox-valid-oidc-token works on verify but not on create — for create, sign your own dummy JWT with any payload that includes a recognized iss claim. The sandbox bypasses signature verification, not JWT structure parsing.Wallet signature header
Passsandbox-valid-signature as the Grid-Wallet-Signature HTTP header on any signed-retry flow:
POST /auth/credentials(add-additional-credential signed retry)DELETE /auth/credentials/{id}(revoke credential)DELETE /auth/sessions/{id}(revoke session)POST /internal-accounts/{id}/export(export wallet)POST /quotes/{quoteId}/execute(when source is an embedded wallet)
401 UNAUTHORIZED with reason: "Invalid Grid-Wallet-Signature".
Production vs Sandbox
Here are the key differences between production and sandbox environments:- API Tokens: Sandbox tokens only work in the sandbox environment and vice versa
- Bank Transfers: In sandbox, you use
/sandbox/sendinstead of real bank transfers - Test UMA Addresses: Special sandbox addresses for testing different scenarios
- Money: No real money is moved in sandbox