A sweepstakes API provider for auditable draws

Provable.io provides REST endpoints for sweepstakes winner selection, not entrant collection, prize fulfillment, or legal administration. Integrate it with your existing campaign platform to draw an entry number or pick directly from a frozen entrant list, then retain the response as a reproducible audit receipt.

Sweepstakes API integration and audit trail

Publish the serverHash before entries close, freeze and digest the eligible entrant list, select a winner through the API, and retain the client seed, request time, winning entry, and outcome permalink together. Third parties can use the draw verifier to audit the result. Your sweepstakes platform remains responsible for participant data, eligibility, consent, and regulatory retention.

What it is

A sweepstakes-grade winner picker built on /api/ints (for entry-number draws) and /api/pick (for direct entrant lists). One call returns the winning entry plus a serverHash that any third party — your legal team, an administrator, a state regulator, an annoyed Reddit thread — can paste into /verify to confirm the draw wasn't re-rolled.

The pain point

Sweepstakes are heavily regulated in the US and EU and the operator usually has to provide proof — to a bonding company, to a regulator, sometimes to a court — that the winner was selected at random and not, say, the brand manager's cousin. Screenshots of Math.random() won't cut it. A verifiable RNG with a pre-published commitment is exactly the kind of evidence affidavits ask for.

Try it live — draw entry #X out of N

Most sweepstakes assign entrants sequential entry numbers. Draw a winning entry number directly:

curl "https://api.provable.io/api/ints?clientSeed=sweepstakes_summer_2026_main&count=1&min=1&max=15842"

Or draw a runner-up + 5 alternates from the same seed (the API auto-advances the cursor so each call returns a distinct draw):

curl "https://api.provable.io/api/ints?clientSeed=sweepstakes_summer_2026_alts&count=5&min=1&max=15842"

Integration snippet

// 1. When entries open: pre-commit the draw.
const commit = await fetch("https://api.provable.io/api/commit", {
  method: "POST",
  headers: { "x-api-key": process.env.PROVABLE_KEY }
}).then((r) => r.json());
publishToRulesPage(commit.serverHash); // pinned at the top of the official rules

// 2. When entries close: freeze the entrant list and assign sequential IDs.
const entrants = await db.entrants.findAll({ where: { campaignId }, order: ["id"] });
const total = entrants.length;

// 3. Reveal the draw with an unguessable clientSeed
//    (a published block hash from a public chain is ideal).
const winner = await fetch(
  `https://api.provable.io/api/ints?clientSeed=sweeps_${campaignId}_${blockHash}` +
  `&count=1&min=1&max=${total}`,
  { headers: { "x-api-key": process.env.PROVABLE_KEY } }
).then((r) => r.json());

// 4. The audit packet: clientSeed, serverHash, winning entry number,
//    permalink to /o/{shortId}, and a CSV of the frozen entrant list.

Why this clears compliance

Where it fits

Related