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 Grid sandbox environment allows you to test your payouts integration without moving real money. All API endpoints work the same way in sandbox as they do in production, but money movements are simulated and you can control test scenarios using special test values.Getting Started with Sandbox
Sandbox Credentials
To use the sandbox environment:- Go to app.lightspark.com, create an account, and generate your sandbox API keys from the dashboard.
- Add your sandbox API token and secret to your environment variables.
- Use the normal production base URL:
https://api.lightspark.com/grid/2025-10-13 - Authenticate using your sandbox token with HTTP Basic Auth
Simulating Money Movements
Funding Internal Accounts
In production, internal accounts are funded by following the payment instructions (bank transfer, wire, etc.). In sandbox, you can instantly add funds to any internal account using the following endpoint:InternalAccount object with the new balance.
Alternatively, you can also fund internal accounts using the /quotes or /transfer-in endpoints as described below.
Testing Transfer Scenarios
Adding Test External Accounts
The flows for creating external accounts in sandbox are the same as in production. The last 3 digits of an external account’s primary identifier (account number, IBAN, CLABE, Spark wallet address, etc.) determine the test scenario when that account is used in transfers or quotes. For identifiers with a domain part (e.g. PIX email keys), append the test digits to the username portion — for example,testuser.002@pix.com.br.
Beneficiary name verification
For account types that support beneficiary name verification, you can simulate different verification outcomes in sandbox. Use account identifiers with a1xx suffix to trigger verification scenarios (this range is reserved for verification and does not conflict with transfer or quote test patterns):
| Suffix | beneficiaryVerificationStatus | Behavior |
|---|---|---|
| 102 | NOT_MATCHED | Account is valid but name does not match |
| 103 | PARTIAL_MATCH | Account is valid, name is a fuzzy match |
| 104 | PENDING | Verification still in progress |
| 105 | (error) | Returns 400 — invalid account |
| 106 | UNSUPPORTED | Payment rail does not support name verification |
| 107 | CHECKED_BY_RECEIVING_FI | Verification deferred to receiving financial institution (e.g., ACH) |
| 109 | (error) | Returns 500 — simulated API error |
| Any other | MATCHED | Account is valid, name matches exactly |
Testing Transfer-In (Pull from External Account)
When you call/transfer-in with an external account created using test patterns, the transfer will complete instantly in sandbox with the behavior determined by the account number:
| Suffix | Behavior |
|---|---|
| 002 | Insufficient funds — transfer fails immediately |
| 003 | Account closed/invalid — transfer fails immediately |
| 004 | Transfer rejected — bank rejects the transfer |
| 005 | Timeout/delayed failure — stays pending ~30s, then fails |
| Any other | Success — transfer completes normally |
Testing Transfer-Out (Push to External Account)
Transfer-out works the same way - the destination external account’s test pattern determines the outcome:Testing Cross-Currency Quotes
When creating a quote with an external account destination, the account number suffix determines the payment outcome after quote execution:| Suffix | Behavior |
|---|---|
| 002 | Quote execution failed |
| 003 | Long payment — completes after approximately 6 minutes |
| 004 | Counterparty delivery failed |
| 005 | Receiving bank returned payment (completes then transitions to failed) |
| 006 | User cancellation |
| 007 | Payout and refund failed |
| Any other | Successful payment |
Creating Quotes with Test Accounts
When creating quotes with test external accounts, first create an external account with a test account pattern, then reference it in the quote:003 triggers the slow payment test pattern.
Executing Quotes in Sandbox
For quotes from an external account source, execute as in production via/quotes/{quoteId}/execute. The sandbox will:
- Instantly process the currency conversion
- Apply the test behavior based on any external accounts involved
- Update transaction statuses immediately (no waiting for bank processing)
- Trigger webhooks for state changes
/sandbox/send endpoint to simulate payment:
Testing Webhooks
All webhook events fire normally in sandbox. To test your webhook endpoint:- Configure your webhook URL in the dashboard
- Perform actions that trigger webhooks (transfers, quote execution, etc.)
- Receive webhook events at your endpoint
- Verify signature using the sandbox public key
Common Testing Workflows
Complete Payout Flow Test
Here’s a complete test workflow for a USD → EUR payout:- Create customer and internal accounts (via regular API)
-
Fund customer’s USD internal account:
-
Create a test external EUR account:
-
Create and execute a quote:
- Verify transaction status and webhooks
Testing Error Scenarios
Test each failure mode systematically: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".
Sandbox Limitations
While sandbox closely mimics production, there are some differences:- Instant settlement: All transfers complete immediately (success cases) or fail immediately (error cases), except timeout scenarios (005)
- No real bank validation: Account numbers aren’t validated against real banking networks
- Simplified KYC: KYC processes are simulated and complete instantly. You must add customers via the
/customersendpoint, rather than using the KYC link flow. - Fixed exchange rates: Currency conversion rates may not reflect real-time market rates.
Moving to Production
When you’re ready to move to production:- Generate production API tokens in the dashboard
- Swap those credentials for the sandbox credentials in your environment variables
- Remove any sandbox-specific test patterns from your code
- Configure production webhook endpoints
- Test with small amounts first
Next Steps
- Review Webhooks for event handling
- Check out the Postman Collection for API examples
- See Error Handling for production error strategies