Documentation Index
Fetch the complete documentation index at: https://ramps-docs-sync-20260602.mintlify.app/llms.txt
Use this file to discover all available pages before exploring further.
Overview
The Grid sandbox environment allows you to test your rewards integration without moving real money or cryptocurrency. All API endpoints work the same way in sandbox as they do in production, but transactions 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 Platform Internal Accounts
In production, your platform’s internal account is funded by following the payment instructions (bank transfer, wire, etc.). In sandbox, you can instantly add funds to your platform’s internal account using the following endpoint:InternalAccount object with the new balance. You’ll also receive an INTERNAL_ACCOUNT.BALANCE_UPDATED webhook showing the balance change.
In production, ACH transfers typically take 1-3 business days to settle. In sandbox, funding is instant.
Testing Reward Distributions
Testing Successful Bitcoin Rewards
The standard reward flow works seamlessly in sandbox. First create the destination external account, then create and execute a quote to instantly convert USD to BTC:- The USD is instantly debited from your platform’s internal account
- Bitcoin is “purchased” at a simulated exchange rate
- The Bitcoin is delivered to the Spark wallet address. In sandbox, BTC funds are regtest funds so that they’re compatible with real regtest spark wallets.
- You receive an
OUTGOING_PAYMENTwebhook notification
In sandbox, Bitcoin transfers complete instantly on regtest. In production, Spark wallet transfers typically complete within seconds.
Testing Wallet Address Failures
Use special Spark wallet address patterns to test different failure scenarios. The last 3 digits of the wallet address determine the test behavior:| Last Digits | Behavior | Use Case |
|---|---|---|
| 003 | Wallet unavailable | Recipient wallet is offline or unreachable |
| 005 | Timeout/delayed failure | Transaction stays pending ~30s, then fails |
| Any other | Success | All transfers complete normally |
- 002: Insufficient funds (transfer-in will fail)
- 004: Transfer rejected (bank rejects the transfer)
Testing Customer Onboarding
Sandbox KYB Flow
In sandbox, the KYB onboarding process is simplified to always use the/customers endpoint instead of the KYB link flow.
Testing Insufficient Balance
To test insufficient balance scenarios, simply attempt to send more than your platform’s internal account balance: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 (funding accounts, executing quotes, etc.)
- Receive webhook events at your endpoint
- Verify signature using the sandbox public key
Common Testing Workflows
Complete Reward Distribution Test
Here’s a complete test workflow for distributing a $1.00 Bitcoin reward:-
Fund your platform’s internal account:
-
Create a test customer:
-
Execute a reward quote:
-
Verify completion via webhook (
OUTGOING_PAYMENTevent) -
Check transaction history:
Testing Error Scenarios
Test each failure mode systematically. First create external accounts with test address patterns, then use them in quotes:Global Account magic values
The Grid sandbox lets you exercise Global Account auth flows without moving real money. Email OTP uses the fixed sandbox code000000. Passkey auth can use the same browser WebAuthn ceremony as production, and signed wallet actions can use the same decrypted session signing key and Grid-Wallet-Signature stamp as production. OAuth uses JWT-shaped sandbox OIDC tokens: sandbox skips real IdP signature verification, but still validates token claims, freshness, credential identity, and verify-time nonce binding.
Sandbox-only compatibility values are still available for some flows, but they do not exercise the production-shaped client implementation. Authentication failures return 401 UNAUTHORIZED with a reason field that names the specific check that failed. A malformed OIDC JWT can return 400 INVALID_INPUT before authentication starts.
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 WebAuthn ceremony
For new sandbox integrations, use the same WebAuthn calls you plan to use in production.Create a WebAuthn credential
Generate your own WebAuthn registration challenge and call
navigator.credentials.create().Register the passkey
Register the passkey with
POST /auth/credentials, passing the challenge and attestation returned by the browser.Request a challenge
Reauthenticate with
POST /auth/credentials/{id}/challenge, passing the P-256 clientPublicKey that Grid should seal the session signing key to.Run the browser assertion
Pass the returned
challenge into navigator.credentials.get() using the returned credentialId in allowCredentials.encryptedSessionSigningKey, sealed to the clientPublicKey, just like production.
The legacy sandbox-only assertion signature
sandbox-valid-passkey-signature is still accepted for compatibility, but it skips WebAuthn verification and should not be used for production-shaped sandbox tests.OAuth (OIDC) token
OAuth does not use a fixed magic token in sandbox. Pass a JWT-shaped OIDC token asoidcToken. The JWT signature segment can be a dummy value, but the payload must look like a real ID token.
For POST /auth/credentials with type: "OAUTH", the sandbox token must include:
iss: a supported issuer, such ashttps://accounts.google.com,accounts.google.com, orhttps://appleid.apple.comaud: a non-empty string, or a single-element string arraysub: a non-empty subject identifier for the useriat: a numeric issued-at timestamp no more than 60 seconds before the request, with 5 seconds of clock skew allowedexp: a numeric expiration timestamp later than the request time
iss, aud, and sub. On POST /auth/credentials/{id}/verify, the fresh oidcToken must carry the same iss, aud, and sub as the credential being verified. It must also include nonce equal to sha256(clientPublicKey), where clientPublicKey is the exact hex public key sent in the verify request.
The old literal
sandbox-valid-oidc-token is no longer accepted. Use a freshly generated sandbox JWT for both OAuth credential registration and OAuth verification. Production requires a real ID token from your provider and verifies the provider signature.Wallet signature header
After verifying an auth credential, decryptencryptedSessionSigningKey with the private key matching the clientPublicKey you supplied on verify or refresh. Use the decrypted session signing key to build a Turnkey API-key stamp over the exact payloadToSign string returned by Grid, then pass that full stamp as the Grid-Wallet-Signature HTTP header on signed flows:
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)PATCH /internal-accounts/{id}(update wallet privacy)POST /quotes/{quoteId}/execute(when source is an embedded wallet)
This example uses the sample signer in the Grid API repo’s scripts directory. See the scripts README for setup, or replace
SIGN with your own Turnkey API-key stamp implementation.The legacy sandbox-only
Grid-Wallet-Signature: sandbox-valid-signature value is still accepted for compatibility. Use a real session stamp when you want the client implementation to match production.Sandbox Limitations
While sandbox closely mimics production, there are some differences:- Instant settlement: All Bitcoin transfers complete instantly (success cases) or fail immediately (error cases), except timeout scenarios (005)
- Uses Regtest funds: Spark bitcoin funds are regtest funds so that they’re compatible with real regtest spark wallets.
- Simplified KYB: KYB processes are simulated and complete instantly with automatic approval
- 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 (magic number wallet addresses)
- Configure production webhook endpoints
- Test with small reward amounts first (1.00)
- Gradually increase volume as you gain confidence
Next Steps
- Review Webhooks for event handling
- Check out the Postman Collection for API examples
- See Platform Configuration for production settings