- Brand and customer experience
- Retail price, currency, bundles, and markup
- Customer game, prize rules, and settlement
- Your customer-facing obligations
Build the game. Luckotto runs the verifiable draw.
Create funded tickets through one API. You control the brand, customer experience, retail price, and markup. Luckotto supplies the shared draw, prize bankroll, Bitcoin commitment, and partner payout.
Holding a ticket? View its receipt link, browse the round ledger, or find the partner that sold it.
You own the customer. Luckotto owns the draw.
Luckotto is the wholesale layer underneath your product, not a replacement for it.
- Funded, public ticket receipts
- One shared weekly draw and prize bankroll
- A Bitcoin commitment before randomness exists
- Partner payout and independently replayable proof
Three moves. One public record.
- 01Create and sell
Fund one UUIDv4 receipt through the API and sell your customer experience through your own channels.
- 02Seal and draw
The exact round is committed on Bitcoin before a later block supplies the external randomness.
- 03Pay and prove
Luckotto pays the selected partner at its fixed address and publishes everything needed to replay the result.
A claim you can actually check.
A resolved round is not a result page backed by Luckotto's word. It is a chain of public assertions that the browser verifier checks independently.
- 1Ticket set fixedExact funded receipts
- 2Manifest committedHash anchored on Bitcoin
- 3Randomness arrivedA later Bitcoin block
- 4Delay proof acceptedCanonical public VDF evidence
- 5Outcome replayedExact interval selection
Your first funded ticket is ordinary JSON.
Choose the permanent ticket id, contribution, and public metadata. Retries are idempotent; the same id and fields return the same ticket.
POST /api/partners/<partner-payout-address>/tickets
Authorization: Bearer <partner-api-key>
Content-Type: application/json
{
"id": "018f58d2-2800-4000-8000-000000000123",
"metadata": {
"display": {
"game": "partner-defined"
}
},
"contributedSats": 1000,
"expectedRoundNumber": 3,
"expectedTicketFeeSats": 100
}