{"name":"SolCrate","version":"1","summary":"Provably-fair mystery boxes on Solana. Open a box, always win a prize (0 to the jackpot), withdraw to any wallet. Custodial balance — no wallet connection required.","disclaimer":"This is a REAL-MONEY game of chance played with real SOL. The house edge is disclosed per box. By playing, the operator of the agent affirms its principal is of legal age and permitted to gamble in their jurisdiction. Play responsibly.","baseUrl":"https://solcrate.shop","currency":{"unit":"lamports","perSol":1000000000},"averageRtpPercent":60.3,"specUrl":"https://solcrate.shop/openapi.json","exampleSdk":"https://solcrate.shop/examples/solcrate_agent.py","auth":{"scheme":"Bearer","how":"POST /api/agent/register to create an account; use the returned `token` as `Authorization: Bearer <token>` on every subsequent request. No cookies needed.","note":"Store the returned `recoveryCode` — it is the only way to recover the account and its balance if the token is lost."},"playLoop":["1. POST /api/agent/register → { token, recoveryCode, depositAddress }","2. POST /api/consent { version, age: true } → accept the policy (required before betting)","3. Send SOL to depositAddress, then POST /api/deposits until { creditedLamports > 0 }","4. GET /api/session → read balanceLamports, bonusLamports, boxAvailability, points","5. POST /api/purchase { boxTypeId, quantity, idempotencyKey } → open boxes, read results[]","6. Repeat, or POST /api/withdraw { address, sol, idempotencyKey } to cash out"],"endpoints":[{"method":"GET","path":"/api/agent","auth":false,"desc":"This manifest."},{"method":"POST","path":"/api/agent/register","auth":false,"desc":"Create an account.","returns":"playerId, token, recoveryCode, depositAddress, consentRequired"},{"method":"POST","path":"/api/consent","auth":true,"body":{"version":"string (=consentVersion)","age":true},"desc":"Accept the policy + legal-age confirmation. Required before betting."},{"method":"GET","path":"/api/session","auth":true,"desc":"Current account state.","returns":"id, balanceLamports, bonusLamports, depositAddress, nonce, points, boxAvailability, consentRequired"},{"method":"POST","path":"/api/deposits","auth":true,"desc":"Scan the deposit address for new transfers and credit them.","returns":"creditedLamports, balanceLamports"},{"method":"POST","path":"/api/purchase","auth":true,"body":{"boxTypeId":"starter|silver|gold|diamond","quantity":"1..50","idempotencyKey":"uuid (recommended)"},"desc":"Open 1..50 boxes from one balance bucket.","returns":"results[] (tier, prizeSol, roll, nonce), balanceLamports, bonusLamports, points, serverSeedHash, clientSeed"},{"method":"POST","path":"/api/withdraw","auth":true,"body":{"address":"solana address","sol":"number >= 0.01","idempotencyKey":"uuid (recommended)"},"desc":"Withdraw real balance. A new address must age through a cooldown before funds are sent to it.","returns":"withdrawalId, status, txSignature, balanceLamports"},{"method":"GET","path":"/api/fairness","auth":false,"desc":"Provably-fair method + revealed past server seeds for independent verification."},{"method":"GET","path":"/api/leaderboard","auth":false,"desc":"Top recent wins."},{"method":"GET","path":"/api/stats","auth":false,"desc":"Public aggregate stats."}],"boxes":[{"id":"starter","name":"Starter","priceSol":0.1,"priceLamports":100000000,"jackpotSol":10,"jackpotOdds":"1 in 10,000","rtpPercent":60.3,"houseEdgePercent":39.7,"prizes":[{"tier":"Legendary","probabilityBps":1,"probabilityPercent":0.01,"prizeSol":10},{"tier":"Epic","probabilityBps":8,"probabilityPercent":0.08,"prizeSol":2},{"tier":"Rare","probabilityBps":50,"probabilityPercent":0.5,"prizeSol":0.6},{"tier":"Uncommon","probabilityBps":300,"probabilityPercent":3,"prizeSol":0.25},{"tier":"Common","probabilityBps":1500,"probabilityPercent":15,"prizeSol":0.13},{"tier":"Consolation","probabilityBps":8141,"probabilityPercent":81.41,"prizeSol":0.034}],"expectedValueSol":0.060279},{"id":"silver","name":"Silver","priceSol":0.5,"priceLamports":500000000,"jackpotSol":50,"jackpotOdds":"1 in 10,000","rtpPercent":60.3,"houseEdgePercent":39.7,"prizes":[{"tier":"Legendary","probabilityBps":1,"probabilityPercent":0.01,"prizeSol":50},{"tier":"Epic","probabilityBps":8,"probabilityPercent":0.08,"prizeSol":10},{"tier":"Rare","probabilityBps":50,"probabilityPercent":0.5,"prizeSol":3},{"tier":"Uncommon","probabilityBps":300,"probabilityPercent":3,"prizeSol":1.25},{"tier":"Common","probabilityBps":1500,"probabilityPercent":15,"prizeSol":0.65},{"tier":"Consolation","probabilityBps":8141,"probabilityPercent":81.41,"prizeSol":0.17}],"expectedValueSol":0.301397},{"id":"gold","name":"Gold","priceSol":1,"priceLamports":1000000000,"jackpotSol":100,"jackpotOdds":"1 in 10,000","rtpPercent":60.3,"houseEdgePercent":39.7,"prizes":[{"tier":"Legendary","probabilityBps":1,"probabilityPercent":0.01,"prizeSol":100},{"tier":"Epic","probabilityBps":8,"probabilityPercent":0.08,"prizeSol":20},{"tier":"Rare","probabilityBps":50,"probabilityPercent":0.5,"prizeSol":6},{"tier":"Uncommon","probabilityBps":300,"probabilityPercent":3,"prizeSol":2.5},{"tier":"Common","probabilityBps":1500,"probabilityPercent":15,"prizeSol":1.3},{"tier":"Consolation","probabilityBps":8141,"probabilityPercent":81.41,"prizeSol":0.34}],"expectedValueSol":0.602794},{"id":"diamond","name":"Diamond","priceSol":5,"priceLamports":5000000000,"jackpotSol":500,"jackpotOdds":"1 in 10,000","rtpPercent":60.3,"houseEdgePercent":39.7,"prizes":[{"tier":"Legendary","probabilityBps":1,"probabilityPercent":0.01,"prizeSol":500},{"tier":"Epic","probabilityBps":8,"probabilityPercent":0.08,"prizeSol":100},{"tier":"Rare","probabilityBps":50,"probabilityPercent":0.5,"prizeSol":30},{"tier":"Uncommon","probabilityBps":300,"probabilityPercent":3,"prizeSol":12.5},{"tier":"Common","probabilityBps":1500,"probabilityPercent":15,"prizeSol":6.5},{"tier":"Consolation","probabilityBps":8141,"probabilityPercent":81.41,"prizeSol":1.7}],"expectedValueSol":3.01397}],"fairness":{"method":"roll = HMAC-SHA256(serverSeed, `${clientSeed}:${nonce}`) → first 8 hex → mod 10000. The serverSeed is committed (hashed) in advance and revealed on rotation, so every past roll is independently verifiable.","verify":"https://solcrate.shop/api/fairness"},"limits":{"rateLimits":{"purchase":"30/min per account","withdraw":"5/min per account","deposits":"15/min per account","register":"20/min per IP"},"idempotency":"Send a unique `idempotencyKey` (UUID) on /api/purchase and /api/withdraw. A replayed request returns the original result instead of acting twice.","solvency":"Bigger boxes may be temporarily unavailable if the house cannot back their jackpot; check boxAvailability. Withdrawals never exceed the house balance."},"consentVersion":"2026-07-18"}