Scores, challenges and daily seeds
Scores & leaderboard
Banking a score and showing the board are two separate calls, which is what lets a game with progression save a run without being torn down. The overlay has three controls: Continue closes it and hands control back to your still-running game — nothing is reloaded and no state is lost. Play again reloads your game from scratch. Next game moves on through the feed. If your game has progression, point players at Continue and only end a run when you mean it.
The onResult payload
Your onResult callback receives a single object with these fields:
| Field | Type | Description |
|---|---|---|
| rank | number | The player's rank on the leaderboard for this round. |
| percentile | number | Percentage of players whose score this round beats. |
| ghostScore | number | null | The top score from the player the platform selected as a ghost opponent. null if no ghost was set. |
| ghostHandle | string | null | The handle of the ghost player. null if no ghost was set. |
| personalBest | number | The player's all-time best score for this game. |
Score cap
Each game has a server-enforced maximum score called scoreMax. Submitting a score higher than it returns a 400 error. Set a realistic scoreMax when uploading your game — it keeps the leaderboard fair and prevents exploits.
Challenges
When someone shares a score, the link carries a signed challenge. The player who opens it arrives with a number to beat, and your game can build the run around that instead of starting cold.
Daily seeds
This is what makes a daily puzzle work: everybody gets the same board on the same day, so they are all arguing about one thing and a shared score actually compares. It is on for every game with no setup — the platform derives a seed per game per day and delivers it with the handshake, so it costs no round trip and you can read it on your first frame.

