


Loading developer docs…
Developers
A public, versioned REST API for the catalog, provably-fair verification, and API-key management — plus a dependency-free TypeScript SDK. Money-moving actions (bets, deposits, withdrawals, claims) are intentionally not in the public API; they stay behind an authenticated session.
Read endpoints are open and metered by IP; an API key raises your limit. Send it asX-API-Key: vk_… (or Authorization: Bearer vk_…). Every response carries X-RateLimit-* headers.
| Tier | How | Limit |
|---|---|---|
| Anonymous | no header | 30 / min / IP |
| public | X-API-Key: vk_… | 60 / min |
| pro | X-API-Key: vk_… | 600 / min |
| agent | X-API-Key: vk_… | 6000 / min |
/v1/statusService status + active money mode./v1/configChains, tokens, credit unit, and public feature flags./v1/games/originalsIn-house game catalog (ids, house edge, params)./v1/games/lootboxPublished lootbox cases with full weighted odds./v1/rufflerCurrent VRF raffle round: pool, tiers, resolved draw./v1/loyalty/tiersVIP tier ladder + referral rate./v1/provably-fair/originalsReproduce a game outcome from its published word./v1/keyssessionMint an API key (returned once)./v1/keyssessionList your API keys (hashes never returned)./v1/keys/:idsessionRevoke one of your API keys.Every Originals outcome is reproducible from its published random word — the endpoint runs the exact same math as the server and the on-chain contracts.
curl -s https://api.vulcasino.magmaprotocol.xyz/v1/provably-fair/originals \
-H 'content-type: application/json' \
-d '{"game":"dice","word":"123456789012345678901234567890",
"params":{"target":5000,"direction":"under"}}'
# → { "game":"dice", "word":"…", "outcome":{ "payoutMilli":…, "win":…, "detail":{…} } }@vulcasino/sdk is a zero-dependency client for the browser and Node 18+.
npm install @vulcasino/sdkimport { VulcasinoClient } from '@vulcasino/sdk';
const vc = new VulcasinoClient({
apiKey: process.env.VULCASINO_API_KEY, // optional — raises your rate limit
});
const { outcome } = await vc.verifyOriginal({
game: 'dice',
word: '123456789012345678901234567890',
params: { target: 5000, direction: 'under' },
});
console.log(outcome.win, outcome.payoutMilli);Keys are minted with your signed-in session bearer and are owner-scoped. The secret is shown exactly once — store it immediately. Agents that need pay-per-use access top up an agent key (see the x402 metering layer).
const vc = new VulcasinoClient({ sessionToken });
const { key } = await vc.keys.create({ label: 'my bot', tier: 'agent' });
// store `key` (vk_…) now — it is never shown again
await vc.keys.list();
await vc.keys.revoke(id);Agents fund an agent key with prepaid request credits over thex402HTTP-402 handshake — no human checkout. Discover the price at GET /v1/x402/pricing, then top up:
accepts array — one entry per settlement rail (Base/EVM + Solana/SVM). Pay on whichever chain you hold USDC on.X-PAYMENT header — the server settles and grants the credits; the receipt returns in X-PAYMENT-RESPONSE.// with @vulcasino/sdk
const vc = new VulcasinoClient({ sessionToken });
try {
await vc.keys.topup(keyId, { credits: 10_000 });
} catch (e) {
// e.status === 402 — e.body.accepts lists a requirement per rail (Base + Solana)
const req = e.body.accepts.find((a) => a.network === myNetwork) ?? e.body.accepts[0];
const paymentHeader = await buildX402Payment(req); // your wallet / x402 lib
const { credits } = await vc.keys.topup(keyId, { credits: 10_000, paymentHeader });
// → credits now reflects the top-up
}Settlements are recorded once (idempotent by settlement id), so a replayed payment never double-credits. Set the facilitator to remote to settle on-chain via a real x402 facilitator.
The public API is read + verify + keys only. It never exposes wagering, funds movement, or personal data.