A Bitcoin scratch card on Lightning Faucet is a six-symbol card that pays out in satoshis instead of dollars. You reveal six symbols. If three or more of them match, you win sats, and the sats land in your balance the moment the card resolves. There is no wait for a draw, no ticket to mail in, and no minimum purchase: your first card each day is free.
The part that makes a Bitcoin scratch card different from the paper kind is that you can check the result yourself. Every card is generated from a cryptographic hash that we commit to before you play. After the fact you can pull the ingredients out of the API, recompute the hash on your own machine, and confirm that the symbols you were shown are the only symbols that hash could have produced. This article walks through exactly how that works on Lightning Faucet, including the byte offsets we read out of the hash, so you can verify a card rather than trust us about it. If you want to play one first, the daily card lives at /earn/scratchcard/.
What a Bitcoin scratch card is
A Bitcoin scratch card is an instant-win game where the prize is denominated in satoshis (sats), the smallest unit of bitcoin, and paid over the Lightning Network rather than as a cash voucher. On Lightning Faucet a card is six symbols drawn from a fixed set of six: lightning, bitcoin, star, cherry, diamond, seven. Position does not matter. There are no rows, columns, or diagonals to line up. The only thing that matters is how many copies of the most common symbol appear on the card.
The match rule
Count the symbol that appears most often on your card. That count is your result.
- Two or fewer of any symbol: no win.
- Three matching: a small prize.
- Four matching: a larger prize.
- Five matching: larger still.
- Six matching: the top tier, and every card in this tier triggers a win email to your verified address.
Because only the count matters, the visual arrangement of the six tiles is cosmetic. A card showing lightning, star, lightning, cherry, lightning, diamond is exactly the same three-match result as one showing lightning, lightning, lightning, star, cherry, diamond. This is worth knowing before you try to verify a card by hand, and we come back to it below.
The prize tiers
Prizes are paid in sats and scale with the match count:
| Matching symbols | Prize range |
|---|---|
| 3 | 1 to 5 sats |
| 4 | 5 to 10 sats |
| 5 | 10 to 25 sats |
| 6 | 25 to 50 sats |
Roughly 40 percent of daily cards are winners. Of the cards that do win, about 70 percent are three-match, 20 percent are four-match, 8 percent are five-match, and 2 percent are six-match. Those numbers are not marketing copy: the win threshold and the tier boundaries are constants in the service that generates the card, and the same constants are handed to the verifier so a player can reproduce any result. The exact prize inside a tier is not a second random draw either. It is read out of the same hash, which means a 3-match card that pays 4 sats could never have paid 2 sats given that hash.
How to play the free daily card
The whole flow takes under a minute if you already have an account.
Step 1: create an account and verify your email
Free cards require a verified email address. This is a deliberate anti-farming measure: without it, one person could spin up hundreds of accounts and drain the free card pool. Paid cards do not require verification, because they are bought with sats you already hold. If you see a "verify your email to claim free scratch cards" message, that is the check you have hit, not a bug.
Step 2: open the scratch card page
Go to /earn/scratchcard/. The page loads your status first: whether today's free card is still available, how many cards you have played today, and how long until the next free one. The status check is a read-only call, so refreshing the page never burns your card.
Step 3: scratch
Reveal the card. Behind that click the server locks your account row, confirms your free card has not been used, consumes one provably-fair nonce, derives the six symbols from the resulting hash, counts the matches, computes the prize, writes the card to the database, and credits any winnings to your balance. All of that happens inside a single transaction, which is why rapid double-clicking cannot produce two free cards.
Step 4: buy extra cards, or wait
Once the free card is used, additional cards cost 5 sats each and are debited from your balance before the card is generated. If you have an active bonus balance, the bonus is spent first and bonus-funded winnings are capped, which is standard for any bonus-funded play. Extra cards are rate limited to protect the service from scripted play. If you would rather not spend, the free card resets at midnight Los Angeles time, not at UTC midnight and not on a rolling 24 hour timer from your last card. If you played at 11:55pm Pacific, your next free card is five minutes away.
How the result is generated
This is the part a generic explainer will not give you, because it requires knowing what the code does.
The three inputs
Every card is produced from three values:
- Server seed. Thirty-two random bytes generated on our side, stored as hex. You never see it while it is active. What you do see is its SHA-256 hash, published to you before you play. That published hash is a commitment: we cannot swap the seed later without the hash changing.
- Client seed. A string you control, up to 64 alphanumeric characters. It defaults to
defaultuntil you set your own. Changing it takes effect on your next card. - Nonce. A counter on your account that increments by one every time you play any provably-fair game, scratch card or otherwise. It starts at zero and it is consumed under a row lock, so two simultaneous plays can never share a nonce.
The combined hash
Those three are folded into one 64 character hex string:
combined_hash = HMAC_SHA256(message = "client_seed:nonce", key = server_seed)
Note the argument order, because it is the single most common thing people get wrong when they try to reproduce a result: the server seed is the HMAC key, and the string client_seed:nonce is the message. Swap them and you get a valid-looking hash that matches nothing.
From hash to symbols
The card is then read straight out of that hex string. No further randomness is introduced at any point.
- Characters 0 to 7 are interpreted as a 32 bit integer and divided by
0xFFFFFFFFto get a value between 0 and 1. If it falls below the win threshold, the card is a winner. Otherwise it is a losing card. - Characters 8 to 15, normalized the same way, select the tier: below 0.70 gives three matches, below 0.90 gives four, below 0.98 gives five, otherwise six.
- Characters 16 to 17 pick which of the six symbols is the winning symbol.
- The winning symbol is placed the required number of times, and the remaining tiles are filled from the other five symbols using successive byte pairs from the hash.
- On a losing card, the generator walks the six tiles and enforces a hard cap of two of any symbol, substituting when a third copy would appear. This is why a losing card never accidentally shows three of a kind.
- Characters 48 to 55 seed a deterministic shuffle that decides the display order of the six tiles.
- Characters 56 to 59 pick the exact prize inside the tier range.
Two useful consequences fall out of this. First, the outcome is fully determined the instant the nonce is consumed, so nothing about how long you take to reveal the card can change it. Second, the shuffle only governs display order. Your match count and your prize depend on other bytes entirely, so a third-party verifier that reproduces the match count and prize but lists the tiles in a different order has still verified the result correctly.
How to verify a card yourself
Verification is a three-step loop, and every step is available through the API.
Set your own client seed
Before you play, set a client seed you choose. This matters more than it sounds. The server seed is already committed by its published hash, so we cannot change it. Once you also control the client seed, neither side can search for a favorable outcome: we do not know what your seed will be when we commit, and you cannot compute the result without the server seed we are holding back.
Play, and keep the receipt
Each card comes back with a fairness block containing the server seed hash, the client seed in force, the nonce used, and a game hash. Save those. The card is also written to your game history with the same four values attached, so you can retrieve them later.
Rotate, reveal, and recompute
When you are ready to check your work, rotate your seed. Rotation archives the old server seed to your seed history along with its hash, its client seed, and how many games it covered, then immediately issues a fresh committed seed so your play is not interrupted. The archived server seed is now revealed to you in full.
With it you can do three things, in order:
- Check the commitment. Take the revealed server seed, SHA-256 it, and confirm it equals the hash you were shown before you played. If it matches, the seed you are about to verify against is provably the seed that was in force at the time.
- Rebuild the combined hash. Run
HMAC_SHA256("client_seed:nonce", server_seed)for the nonce your card used. - Re-derive the card. Apply the byte offsets above. The match count and the prize you compute must equal what you were paid.
Every card played under that seed can be checked this way, not just the interesting ones. If you want to audit a losing streak, walk the nonces one by one and confirm each losing card really did fall on the losing side of the threshold.
Scratch cards in tournaments
The daily card is not the only place scratch cards appear. Tournament scratch cards run on the same generator and the same provably-fair pipeline, with one deliberate difference: the win threshold is raised, so a materially higher share of tournament cards are winners. That boosted threshold is defined once in the code and passed to the verifier as well, so a tournament card verifies against the same math with the tournament threshold substituted. A verifier that quietly used the daily threshold on a tournament card would report a mismatch, which is exactly the failure mode the shared constant exists to prevent.
Getting the sats out
Prizes are credited to your Lightning Faucet balance in sats as soon as the card resolves. Getting them to your own wallet uses LNURL-withdraw: you scan a QR code or tap a link, and your wallet fetches the invoice and completes the payment automatically. You do not create an invoice by hand and paste it anywhere. If a withdrawal fails on the Lightning side, the sats return to your balance automatically within a couple of minutes rather than sitting in limbo.
Scratch card prizes are small by design, so most players stack them with other surfaces before withdrawing. The free spin is another once-daily claim that costs nothing and takes seconds. The wider earn section collects the tasks and offers that pay sats without requiring a deposit, which is the realistic way to fund extra cards without putting money in.
Where scratch cards fit
Think of the daily scratch card as the lowest-friction thing on the site: one click, no stake, no decisions. Everything else asks for more.
The casino games run on the same provably-fair seed chain, so the verification skills you learn on a scratch card transfer directly to dice, roulette, blackjack, and baccarat. Same server seed, same client seed, same nonce, same commitment, different function applied to the hash. Learning to verify one card teaches you to verify all of them.
Prediction markets work on a completely different principle. There is no hash and nothing to verify cryptographically, because the outcome is a real world event: a Bitcoin difficulty adjustment, a mempool fee level, a weather reading, a sports result. Your return depends on your read of the world rather than on a byte offset. Players who enjoy scratch cards for the instant resolution usually find markets slower and more deliberate, which is the point.
Troubleshooting the things people actually hit
"I already scratched today" but you have not. The reset is midnight Los Angeles time. If you are in Europe or Asia, your local calendar day and the reset day will not line up, and the countdown shown on the page is the authoritative one.
Free card blocked. Almost always an unverified email address. Verify, then reload.
Card revealed but balance looks unchanged. Three-match prizes start at 1 sat. On an account with a few thousand sats, a 2 sat credit is easy to miss visually. Your game history lists every card with its prize, so check there rather than eyeballing the balance.
Verification returns the right prize but different tile positions. Expected. Display order comes from the deterministic shuffle, and reproducing PHP's shuffle in another language is the one part of this that is not portable. Match count and prize are the values that matter, and both are portable.
Ready to try one? Your free card is waiting at /earn/scratchcard/, and it resets every night at midnight Pacific.