# Invo Network API Documentation — Full Reference Auto-generated from prerendered docs pages. Source: https://docs.invo.network --- ## Introduction URL: https://docs.invo.network/docs/introduction Learn how to get started with Invo Network API for cross-game currency transfers. Complete introduction guide for game developers. Welcome to INVO Network The INVO Network API is the world's most comprehensive cross-game financial infrastructure, supporting 60M+ users with enterprise-grade security. Build secure value transfers, enable player-to-player transactions, monetize cross-game engagement, and boost your revenue with our battle-tested platform. What Makes INVO Network Different? Unlike traditional single-game payment systems, INVO Network creates a unified financial ecosystem across all your games. Players can transfer currency between games they play, send currency to friends across different games, and maintain their value even when switching between games in your portfolio. Core Capabilities Cross-Game Self-Transfers Move YOUR currency between different games you play. Perfect for portfolio management and cross-game progression. • SMS verification for security • Claim codes for receiving • Cross-game only transfers • 10% platform fee structure Player-to-Player Sends Send currency to OTHER players using phone numbers. Works within same game or across different games. • Phone-based recipient targeting • Automatic SMS delivery to recipients • Same-game and cross-game support • Automatic player account creation Currency Purchases Real money to virtual currency conversion with saved payment methods and fraud protection. • Secure card processing with 3D Secure • Saved payment methods • Real-time fraud detection • Comprehensive purchase history Scalable Player Management Real-time player balance queries supporting 60M+ users with batch processing and streaming APIs. • Batch operations (100K players) • Real-time balance streaming • Multi-game player tracking • Comprehensive activity history Enterprise Security Advanced security with SMS verification, velocity limits, spending controls, and real-time fraud detection. • SMS two-factor authentication • Circuit breakers for reliability • Comprehensive rate limiting • Real-time fraud prevention Developer Experience RESTful API with comprehensive examples for Unity, Unreal, and Godot. Get up and running in minutes. • Multi-engine code examples • Comprehensive documentation • Sandbox testing environment • Dedicated developer support Why Choose INVO Network? Unified Cross-Game Ecosystem • Players retain value when switching between your games • Cross-game community building and engagement • Shared revenue opportunities between games • Portfolio-level player lifetime value optimization Proven Revenue Impact • Reduce player churn through cross-game value retention • Increase player lifetime value across your portfolio • Generate revenue from transaction fees (10% total) • Enable new monetization strategies and features Enhanced Player Experience • Seamless value transfer between games • Player-to-player gifting and transactions • Automatic SMS notifications for all operations • Intuitive claim code system for receiving funds Enterprise-Grade Infrastructure • 99.9% uptime SLA with automatic failover • Supports 60M+ concurrent players • SOC 2 and PCI DSS compliance ready • Real-time monitoring and comprehensive analytics Understanding Transfers vs Sends Cross-Game Self-Transfers For moving your own currency between different games you play. • Who: You → Yourself in another game • Games: Must be different games (cross-game only) • Claiming: You manually enter the claim code • Use case: Portfolio management, moving funds between your games Player-to-Player Currency Sends For sending currency to other players via their phone number. • Who: You → Another player (identified by phone) • Games: Same game or different games • Claiming: Claim code automatically sent via SMS • Use case: Gifting, player trades, peer-to-peer transactions Quick Integration Example Here's a simple example of getting a player's balance with the INVO Network API: // Get player balance by email const response = await fetch( 'https://invo.network/api/player-balances/player/by-email/player@example.com', { headers: { 'X-Game-Secret-Key': 'YOUR_SDK_KEY' } } ); const result = await response.json(); // Example response: { "player": { "player_id": 12345, "player_name": "John Doe", "player_email": "player@example.com", "identity_id": "f3a1b8c0d4e5...", "date_joined": "2024-01-15T10:30:00Z" }, "balances": [ { "currency_id": 1, "currency_name": "Gold Coins", "available_balance": "1500.00", "reserved_balance": "100.00", "total_balance": "1600.00" } ], "summary": { "total_value": "1600.00", "currency_count": 1, "has_funds": true }, "last_updated": "2024-12-09T12:34:56Z" } Ready to Get Started? Explore the API Browse our comprehensive API documentation with examples for Unity, Unreal, and Godot. Quick Integration Start with player balance management and add cross-game features as your needs grow. Enterprise Support Get dedicated support, custom rate limits, and SLA guarantees for your production deployment. Trusted by Game Developers Worldwide Built for scale, designed for developers, optimized for revenue 60M+ Active Players 99.9% Uptime SLA 100K Batch Size 24/7 Enterprise Support --- ## Quick Start URL: https://docs.invo.network/docs/quick-start Get started with Invo Network in 5 minutes. Step-by-step guide to integrate cross-game currency transfers. Quick Start Get a working integration with INVO Network in about 30 minutes. Follow these four steps. 🧪 Build against Sandbox first Always start in Sandbox at dev.console.invo.network . Sandbox uses test payment cards — no real money moves. Once your integration is solid, switch to console.invo.network for production. 1 Register Your Game Create a developer account and register a sandbox game. 2 Copy Your SDK Key Format ivsdk_ . Used as X-Game-Secret-Key on every API call. 3 Make Your First Call A read against player balance to confirm your key works. 4 Go Live Re-register on production and swap your key + base URL. Step 1: Register Your Game Choose your environment and complete the game registration wizard: 🧪 Sandbox dev.console.invo.network Test cards, no real money. 🚀 Production console.invo.network Live games, real-money transactions. The wizard collects: 1. Game Information: game icon, cover image, name, platforms. 2. SDK Key: auto-generated. Format ivsdk_ . Server-side use only. 3. Currency setup: branded currency name, symbol, transfer policy (allowed destinations). 4. Payout setup (optional): link a bank account so you can withdraw your developer revenue later. Step 2: Make Your First API Call Authentication is a single header: X-Game-Secret-Key . No login flow, no token refresh, no cookies. Send the header from your game backend (server-side only). Read a player balance (Sandbox) // Sandbox base URL: https://sandbox.invo.network/sandbox const SDK_KEY = process.env.INVO_SDK_KEY; // ivsdk_ const r = await fetch( 'https://sandbox.invo.network/sandbox/api/player-balances/player/by-email/test@example.com', { headers: { 'X-Game-Secret-Key': SDK_KEY } } ); if (r.status === 404) { // Player has never interacted with your game yet — that's fine. // The player auto-creates the first time they hit a writing endpoint // (purchase-currency, purchase-item, claim-transfer, etc.). console.log('No player record yet.'); } else { console.log(await r.json()); } Sandbox vs Production base URLs // Sandbox — test cards, no real money const SANDBOX_BASE = 'https://sandbox.invo.network/sandbox'; // Production — live transactions const PROD_BASE = 'https://invo.network'; // All endpoints share the same path suffix: // /api/player-balances/player/by-email/ // /api/item-purchases/purchase-item // /api/transfers/initiate-transfer // etc. Expected response (existing player) { "player": { "player_id": 12345, "player_name": "Test Player", "player_email": "test@example.com", "identity_id": "f3a1b8c0d4e5..." }, "balances": [ { "currency_id": 1, "currency_name": "Gold Coins", "available_balance": "1000.00", "reserved_balance": "0.00", "total_balance": "1000.00" } ], "summary": { "total_value": "1000.00", "currency_count": 1, "has_funds": true }, "last_updated": "2024-12-09T12:34:56Z" } Step 3: Explore Core Features Once that first call works, build out from here: 💰 Currency Purchases Players buy your branded currency with real money via hosted checkout. View Currency Purchase API → 🛒 Item Purchases Players spend their balance on items inside your game. 90% goes to you, 10% Invo network fee. View Item Purchase API → 🔄 Cross-Game Transfers A player moves their own balance from one game to another in the network. View Transfer API → 🎁 Player-to-Player Sends A player sends currency to another player by phone — same game or cross-game. View Send API → 🔔 Day one: surface incoming money Set this up before you go live. If you receive transfers/sends, set a webhook URL and subscribe to ["*"] (or at least transfer.claim_pending ), then poll /api/transfers/inbound-pending to list what's waiting and badge it. Skip this and incoming money silently never surfaces to your players. Webhooks & receiving money → Integration Best Practices • Server-side only. Never embed your SDK key in a Unity/Unreal/mobile build or browser code. • Idempotency. All write endpoints accept a client_request_id . Pass a fresh UUID per logical action and replay the same id on retry — duplicates return 409 with the original record. • Test on Sandbox first. Sandbox is a fully isolated database with test-card-only payments. • HTTPS only. Plain-HTTP requests are rejected at the edge. • Store the identity_id returned on player records — it's the stable cross-game join key for the same human across the network. • Handle 5xx with retry. Idempotency-keyed requests are safe to retry on a 5xx; the first successful result is replayed. Next Steps Read the Sandbox Testing Guide for the full sandbox-vs-production map. Browse the API Overview for every endpoint with request/response schemas. Set up your Virtual Currency branding and transfer policy. Follow the Game Developer Integration Guide for end-to-end checkout integration. --- ## API Overview URL: https://docs.invo.network/docs/api-overview Complete overview of Invo Network API endpoints, authentication, and core concepts for cross-game currency integration. INVO Network API Overview The INVO Network API gives game developers a unified ledger and payments infrastructure for virtual currency, real-money top-ups, item sales, cross-game transfers, and player-to-player sends. Server-to-server, REST, JSON, single-header auth. Two Environments INVO runs Production and Sandbox as fully isolated databases with independent SDK keys. Develop against Sandbox, cut over to Production when ready. 🚀 Production • Base URL: https://invo.network • Routes: /api/... • Real-money transactions • Console: console.invo.network 🧪 Sandbox • Base URL: https://sandbox.invo.network • Routes: /sandbox/api/... • Test cards only — no real money • Console: dev.console.invo.network Real-Money Top-ups • Players buy your branded currency with credit/debit cards • Hosted checkout — partners are out of scope for full PCI • Strong customer authentication (3DS) where required • Refund + chargeback handling with automatic balance debits Self-Transfers • A player moves their own currency between games they play • SMS PIN confirmation on the sender • Claim flow on the receiving game • Network fee split applied automatically Player-to-Player Sends • Send currency to another player by phone number • Same game or cross-game — recipient gets a claim SMS • SMS PIN confirmation on the sender • Velocity limits + fraud detection on every step Player Reads • Single-player balance lookup by email • Batch balance lookup (up to 100K emails per call) • Streaming reconciliation endpoint for nightly diffs • Cross-game stable join key ( identity_id ) Security & Reliability • Single-header auth ( X-Game-Secret-Key ) • Per-IP and per-key rate limiting with progressive penalties • Idempotency-keyed write endpoints (replay-safe) • Circuit breakers on every external dependency Core API Endpoints Player Balance Read player balances. Single, batch, or streaming. GET /api/player-balances/player/by-email/ {email} POST /api/player-balances/batch GET /api/player-balances/stream-all Currency Purchase Real-money top-ups, hosted checkout, payment confirmation. POST /api/checkout/sessions POST /api/currency-purchases/purchase-currency POST /api/currency-purchases/confirm-payment GET /api/currency-purchases/order-details Item Purchase Spend a player's branded currency on items inside your game. POST /api/item-purchases/purchase-item GET /api/item-purchases/player-purchase-history GET /api/item-purchases/order-details Self-Transfer (cross-game) A player moves their own balance from one game to another. POST /api/transfers/available-destinations POST /api/transfers/initiate-transfer POST /api/transfers/verify-sms POST /api/transfers/claim-transfer Player-to-Player Send Phone-based send to another player, same or different game. POST /api/currency-sends/initiate-send POST /api/currency-sends/verify-sms POST /api/currency-sends/claim-currency Withdrawals (developer revenue) Move developer revenue out of Invo to your bank. GET /api/withdrawals/available-balance POST /api/withdrawals/request GET /api/withdrawals/history Authentication Every server-to-server API call carries a single header. No login flow, no token refresh, no cookies. One-header authentication const SDK_KEY = process.env.INVO_SDK_KEY; // ivsdk_ // Production const r = await fetch( 'https://invo.network/api/player-balances/player/by-email/player@example.com', { headers: { 'X-Game-Secret-Key': SDK_KEY } } ); // Sandbox const r2 = await fetch( 'https://sandbox.invo.network/sandbox/api/player-balances/player/by-email/player@example.com', { headers: { 'X-Game-Secret-Key': SDK_KEY } } ); console.log(await r.json()); See Authentication for full details, including key rotation and error codes. Idempotency on writes Every write endpoint accepts a client_request_id in the body. Generate a UUID per logical action; replay the same id on retry. A duplicate returns 409 Conflict with the original record's identifiers. Replay-safe writes // Client generates a fresh UUID per checkout button click const clientRequestId = crypto.randomUUID(); const r = await fetch('https://invo.network/api/item-purchases/purchase-item', { method: 'POST', headers: { 'X-Game-Secret-Key': SDK_KEY, 'Content-Type': 'application/json' }, body: JSON.stringify({ client_request_id: clientRequestId, player_email: 'player@example.com', item_id: 'sword_001', item_name: 'Iron Sword', item_quantity: 1, unit_price: '100.00', total_price: '100.00' }) }); // On 5xx or network failure: retry the SAME request body with the same // client_request_id. The first successful result is replayed; duplicates // return 409 with { transaction_id, order_id } for lookup. Rate Limits & Error Contract Rate limits • Balance reads: 1500 / minute • Item purchase: 60 / minute / player • Currency purchase: 20 / minute / player • Transfers / sends initiate: 10 / minute / player • 429 responses include retry_after seconds Error envelope { "error": "Human-readable message", "error_code": "MACHINE_READABLE_CODE", "error_id": "ERR__", "timestamp": "2024-12-09T12:34:56Z" } Capture error_id when reporting issues. We map it to the matching server log entry instantly. Single-Header Auth X-Game-Secret-Key on every call. Server-side only — never bundled into clients. Real-Time Processing Balance updates apply on commit. Webhooks deliver state changes to your backend in seconds. Built for Scale Pagination, batch reads, streaming reconciliation. Designed for portfolios with millions of players. Quick Integration Path 1 Register your developer account + game Sandbox first ( dev.console.invo.network ). Capture your ivsdk_… SDK key. 2 Configure your branded currency Name, symbol, transfer policy. 3 Wire up balance reads + item purchase Smallest end-to-end loop: top up via hosted checkout → read balance → spend on an item. 4 Add transfers + sends if your design needs them Optional. Same auth, same response envelopes. 5 Promote to Production Re-register at console.invo.network . Swap base URL + SDK key. Done. --- ## Authentication URL: https://docs.invo.network/docs/authentication Learn how to authenticate with Invo Network API using API keys and secure your game integration. Authentication The INVO Network API authenticates server-to-server requests with a single header: X-Game-Secret-Key . Every game has its own SDK key issued at registration. Send the key on every API request. Server-to-Server Authentication Set the SDK key on every request. No login flow, no token refresh, no cookies. X-Game-Secret-Key: ivsdk_{your_sdk_key} Server-side only. Never embed your SDK key in client builds, mobile apps, or browser code. Game Server → Invo API Your game backend calls Invo with X-Game-Secret-Key. This is the only auth pattern game engines should use. Developer Console (Browser) The developer dashboard at console.invo.network uses session-based login for the human accessing the UI — separate from API auth. One Key Per Game Each registered game has a unique secret_key in the format ivsdk_. Different games on the same account get different keys. Sandbox + Production Two fully isolated environments with independent SDK keys. Use /sandbox/api/... for testing, /api/... for production. Quick Example A complete authenticated call. Replace ivsdk_YOUR_SDK_KEY with the key from your game registration. Authenticated Request // Production const BASE_URL = 'https://invo.network'; // Sandbox: const BASE_URL = 'https://sandbox.invo.network/sandbox'; const SDK_KEY = process.env.INVO_SDK_KEY; // ivsdk_ const response = await fetch( `${BASE_URL}/api/player-balances/player/by-email/player@example.com`, { headers: { 'X-Game-Secret-Key': SDK_KEY } } ); const data = await response.json(); console.log(data); Server-Side Only Your SDK key authorises every API call as your game. Anyone holding it can move your players' balances. Treat it like a database password. ✅ Store in your server's environment variables / secrets manager ✅ Make API calls from your game backend, never directly from client builds ❌ Never commit it to source control ❌ Never bundle it into a Unity/Unreal/mobile build ❌ Never include it in HTML/JavaScript served to a browser Getting Your SDK Key SDK keys are issued automatically when you register a game. Choose the environment that matches your stage: 🚀 Production Register at: console.invo.network Live games, real-money transactions. 🧪 Sandbox (Testing) Register at: dev.console.invo.network Test with virtual cards. No real money. Independent database. 1 Create your developer account Email verification, password, profile, ToS acceptance. 2 Register your game Game registration wizard: art, name, genre, platforms, transfer policy. 3 Copy your SDK key Format: ivsdk_ . Shown in the game settings page; rotate any time it leaks. 4 Start making API calls Send X-Game-Secret-Key on every request from your game server. Core Endpoints A handful of endpoints cover most integrations. Auth header is the same on all of them. Common API Calls const SDK_KEY = process.env.INVO_SDK_KEY; const BASE = 'https://invo.network'; // Get player's currency balance (auto-creates if writing flow runs first) async function getPlayerBalance(playerEmail) { const r = await fetch( `${BASE}/api/player-balances/player/by-email/${encodeURIComponent(playerEmail)}`, { headers: { 'X-Game-Secret-Key': SDK_KEY } } ); return r.json(); } // Player buys an in-game item with their currency balance async function purchaseItem(payload) { const r = await fetch(`${BASE}/api/item-purchases/purchase-item`, { method: 'POST', headers: { 'X-Game-Secret-Key': SDK_KEY, 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); return r.json(); } // Player sends currency to another player by phone async function initiateSend(payload) { const r = await fetch(`${BASE}/api/currency-sends/initiate-send`, { method: 'POST', headers: { 'X-Game-Secret-Key': SDK_KEY, 'Content-Type': 'application/json' }, body: JSON.stringify(payload) }); return r.json(); } Authentication Errors 401 — missing or invalid SDK key { "error": "missing X-Game-Secret-Key header", "error_code": "INVALID_GAME_SECRET" } Verify the header name is exactly X-Game-Secret-Key and the value is your full ivsdk_ string. 403 — game inactive Your game's status isn't live or testing . Check the developer console. 429 — rate-limited You've exceeded the per-IP or per-key request budget for that endpoint. Body includes a retry_after seconds value; back off accordingly. Rotating Your SDK Key Rotate a key from the developer console at any time. The new key is shown once after rotation — copy and update your environment variables before the old key is invalidated. --- ## Partner Credentials & Key Handling URL: https://docs.invo.network/docs/partner-credentials The three credentials every Invo integration needs (game_id, SDK secret_key, webhook signing secret), where each lives, the server-side player-token rule, webhook verification, and key rotation. Partner Credentials & Key Handling Everything your integration needs comes down to three credentials and two rules . This page is the canonical reference for what each key is, where it lives, and how to handle it safely. Your tenant gets three things Credential Lives What it's for game_id Anywhere Your tenant id. Not secret. SDK secret_key ivsdk_… Server-side ONLY Sent as the X-Game-Secret-Key header to mint player tokens and for server-to-server calls. Webhook signing secret Server-side ONLY Used to verify the webhooks we send you. It is NOT sent in requests to us. Where to find them • game_id and the SDK secret_key — on the dashboard's Platform & Keys page (user menu, top-right → Platform & Keys → pick your game). The key has a reveal/copy affordance and a self-serve rotate. • Webhook signing secret — shown once when you create the webhook on the dashboard's Webhooks page (and again on each rotation). Store it then; it isn't retrievable later. Never put a secret in a frontend bundle Anything in a browser build (Vite/React, etc.) is world-readable. The ivsdk_… secret and the webhook signing secret are server-side credentials — they must never ship to the client. Two rules that matter 1. The browser never holds the SDK key Your server mints a short-lived player token ; the browser uses that for every /api/sdk/* call. POST /api/sdk/player-token Header: X-Game-Secret-Key: // server-to-server ONLY Body: { "player_email": "user@example.com" } // player must exist in your tenant → { "token": "", // Authorization: Bearer "expires_at": "...Z", // ~15-min lifetime, NO refresh "identity_id": "id_…" } // On a 401 from any /api/sdk/* call → mint a fresh token and retry. 2. Verify every webhook X-Invo-Signature: t=,v1= is HMAC-SHA256 over the literal string "." , keyed with your signing secret. Verify constant-time, reject if the timestamp is outside a 5-minute window, and de-duplicate on X-Invo-Idempotency-Key . Full reference + verify snippet: Receiving Webhooks . Web platforms: passkey step-up WebAuthn runs on your origin Web platforms enroll a passkey on login and approve high-value transfers/sends with an assertion. The ceremony runs in the browser on your web origin , which must match the relying-party ID configured for your tenant. You configure the domain yourself on the dashboard's Platform & Keys page — submit the RP ID and origins, prove domain ownership with a DNS TXT record, and step-up turns on when verification passes. Un-enrolled users fall back to SMS automatically. See Platform Step-Up (WebAuthn) . Key rotation Both keys rotate self-serve, both with a 7-day grace window • The SDK secret_key rotates from the dashboard's Platform & Keys page (user menu → Platform & Keys → your game → Rotate key). The old key keeps working for 7 days so your integration can cut over without downtime — the new key is shown once in a copy dialog, and the page banners the grace deadline. • The webhook signing secret rotates from the dashboard's Webhooks page, also with a 7-day grace window — deliveries are dual-signed (two v1= values) so you can deploy the new value without downtime. X-Invo-Secret-Version tells you which is current. • If a key is ever exposed, rotate it immediately from the console — don't wait on us. Never share keys in chat or commit them to a repo. Related: Authentication · player token · Receiving Webhooks · Platform Step-Up · Transfers · Sends --- ## Sandbox Testing URL: https://docs.invo.network/docs/sandbox-testing Test your integration in the isolated sandbox environment at sandbox.invo.network. Test cards, no real money. Sandbox Testing The Invo Sandbox environment provides a safe testing space to integrate and validate your game's currency operations without affecting real player data or processing actual payments. Perfect for development, testing, and QA workflows. Safe Testing Environment Test all API operations without risk to production data or real financial transactions. Isolated Data Completely separate sandbox data that won't interfere with your production environment. Realistic Simulation Full API functionality with simulated payments, SMS verification, and transfer operations. Instant Setup Get started immediately with pre-configured test data and sample API keys. Full Feature Parity All production features available in sandbox for comprehensive testing coverage. Test Scenarios Built-in error scenarios and edge cases to validate your error handling logic. Sandbox Environment The INVO Network sandbox environment uses a separate base URL and requires the /sandbox prefix for all API routes. Test with fake payments, SMS, and crypto without real money. Production Environment Base URL: https://invo.network API Routes: /api/* and /auth/* Console: console.invo.network Payments: Real-money transactions. Sandbox Environment (Testing) Base URL: https://sandbox.invo.network API Routes: /sandbox/api/* Console: dev.console.invo.network Payments: Test cards only — no real money moves. Sandbox API call // Sandbox API call — same single-header auth as production const SDK_KEY = process.env.INVO_SDK_KEY; // ivsdk_ const r = await fetch( 'https://sandbox.invo.network/sandbox/api/player-balances/player/by-email/test@example.com', { headers: { 'X-Game-Secret-Key': SDK_KEY } } ); console.log(await r.json()); Sandbox vs Production: what changes • Path prefix. Sandbox is /sandbox/api/... ; production is /api/... . • SDK key. Different key per environment — sandbox keys do not work against production and vice versa. • Database. Fully isolated; sandbox players, balances, and transactions live in their own database. • Card processing. Sandbox accepts test cards only — no real money moves regardless of amount. • SMS verification. Sandbox sends through a test channel; verification codes are surfaced in the response and the developer console for QA convenience. Test Data & Scenarios The sandbox comes pre-loaded with test data to help you get started quickly: Test Players Create your own test players Register test accounts in the sandbox console Use sandbox console to manage test balances Example Test Data Email: your-test@example.com Create players via API or console Test Card Numbers Success 4242 4242 4242 4242 Always succeeds. Generic decline 4000 0000 0000 0002 Always declines. Insufficient funds 4000 0000 0000 9995 Card-issuer-side decline for insufficient funds. 3D Secure required 4000 0025 0000 3155 Triggers strong customer authentication challenge. Bank account linking (sandbox) Test bank-link credentials are surfaced in the developer console under Sandbox > Test Data . SMS Testing Test SMS verification flows without sending real SMS messages: SMS Testing Configuration // SMS verification in sandbox uses test mode // Use any phone number format for testing - no real SMS is sent // Example: Initiate transfer with test phone number { "from_player_email": "player@example.com", "to_player_email": "player@example.com", "from_game_secret": "your_game_secret", "to_game_secret": "target_game_secret", "amount": "50.00", "phone_number": "+1234567890" // Any valid format works in sandbox } // Verification codes in sandbox are displayed in the API response // or available in the sandbox console for testing Testing Checklist Use this checklist to ensure comprehensive testing of your integration: Basic Operations Get player balance Purchase currency Initiate cross-game transfer Verify SMS PIN Claim transfer Error Scenarios Invalid API key Player not found Insufficient balance Payment declined Rate limit exceeded Ready for Production? Once you've thoroughly tested your integration in sandbox, switch to production: • Update base URL: https://invo.network • Remove /sandbox prefix: Use /api/* instead of /sandbox/api/* • Use production credentials: Get your production game_secret from console.invo.network • Environment detection: Implement logic to switch between environments • Test with real cards. Real money will be charged in production. Environment Switcher // Environment configuration const INVO = { production: { baseURL: 'https://invo.network', apiRoute: '/api' }, sandbox: { baseURL: 'https://sandbox.invo.network', apiRoute: '/sandbox/api' } }; const env = process.env.NODE_ENV === 'production' ? 'production' : 'sandbox'; const cfg = INVO[env]; const SDK_KEY = process.env.INVO_SDK_KEY; // matching key for the env // Read a player's balance const url = `${cfg.baseURL}${cfg.apiRoute}/player-balances/player/by-email/${encodeURIComponent('test@example.com')}`; const r = await fetch(url, { headers: { 'X-Game-Secret-Key': SDK_KEY } }); --- ## Game Developer Integration URL: https://docs.invo.network/docs/game-developer-integration End-to-end integration guide: signed checkout sessions, iframe/WebView, webhook events, Unity/Unreal/iOS/Android examples. Game Developer Integration Guide Currency Purchase Integration End-to-end guide for adding INVO Network real-money top-ups to your game. The recommended pattern is signed checkout sessions : your backend mints a short-lived URL, you open it in an iframe or WebView, and the player completes the purchase on a hosted page. Card data never touches your servers. Don't put your SDK key in a URL Your SDK key is server-side credentials. URL parameters end up in browser history, server access logs, referrer headers, and crash reports. Always mint a session on your backend and open the returned checkout_url . The checkout session is a short-lived (15 minutes), single-use signed token. Replaying it after success returns a 409 — there's no value to an attacker who intercepts it. Overview Flow 1. Player clicks "Buy Currency" in your game ↓ 2. Game client tells your backend to mint a session ↓ 3. Your backend POSTs /api/checkout/sessions with X-Game-Secret-Key ↓ 4. Backend returns a signed checkout_url to the client ↓ 5. Client opens checkout_url in iframe / WebView ↓ 6. Player completes payment on the hosted page ↓ 7. Server-to-server webhook fires — your backend updates state ↓ 8. (Optional UX) postMessage hint refreshes UI immediately ✅ SAQ-A scope Card data stays on the INVO-hosted page. Your PCI scope is the lightest tier. Two backend calls Mint a session, listen for the webhook. That's it. Mobile-friendly Same URL works in WebView on iOS and Android. Prerequisites Before you start: Developer account. Sign up at console.invo.network (or dev.console.invo.network for sandbox). Game registered. Use the wizard in the developer console. SDK key. ivsdk_ , stored in your server secrets manager. Server endpoint your game can call to mint sessions on demand. Webhook receiver URL (recommended) — registered with Invo so we can deliver authoritative purchase events. Server-side only. Your SDK key authorises every API call as your game. Never bundle it into a Unity/Unreal/mobile build or browser code. Step 1 — Mint a session (backend) When the player clicks Buy, your game tells your backend "this user wants to buy $X of currency." Your backend posts to INVO and returns the checkout_url to the client. Node.js (Express) example // Your backend route — called by the game client app.post('/store/start-checkout', requireAuth, async (req, res) => { const { usdAmount } = req.body; const userEmail = req.user.email; const r = await fetch('https://invo.network/api/checkout/sessions', { method: 'POST', headers: { 'X-Game-Secret-Key': process.env.INVO_SDK_KEY, // ivsdk_ 'Content-Type': 'application/json' }, body: JSON.stringify({ player_email: userEmail, usd_amount: String(usdAmount), rail: 'platform', // optional, default 'platform' (card). Also: 'game' (regional/game-store), 'steam' success_url: 'https://yourgame.com/store/success', cancel_url: 'https://yourgame.com/store/cancel', metadata: { user_id: req.user.id, source: 'web_store' } }) }); if (!r.ok) { return res.status(502).json({ error: 'checkout session failed' }); } const { checkout_url, session_id, expires_at } = await r.json(); res.json({ checkout_url, session_id, expires_at }); }); The response carries a 15-minute single-use signed URL ( checkout_url , plus session_id , expires_at , expires_in_seconds ). Hand it to the client to open in a WebView/redirect or an iframe. usd_amount must be greater than 0 and at most 999.99 ; on sandbox the checkout_url host is sandbox.invo.network . Step 2 — Open the URL (web) Two ways to present the checkout URL — pick based on whether you need it embedded in-page: WebView / full-page redirect Works everywhere, no setup. Open checkout_url in a WebView or redirect the browser to it; on success the page redirects to your success_url . Recommended for most integrations. Embedded