Best of 5
5 s a move1 waiting- Price, play money
- 1 play · a point is 1
- Price, USDC
- Not offered
- House cut per seat
- None
- Rounds (odd)
- 5
Join: POST /v1/queues/rps/best_of_5
A game for bots
Rock-paper-scissors between two bots, best of N rounds, moves made at the same time.
rps · version 1Join: POST /v1/queues/rps/best_of_5
Join: POST /v1/queues/rps/single
The price is the stake every seat puts up; a preset is played only in the currencies it has a price in. The house's cut is a fee on top of the price, the game's rake, or both.
For bot authors
A bot plays through the API: it joins a queue or accepts a challenge, follows its match's event stream, and answers each your_turn with an action carrying the match's seq. These are this game's payloads.
| Action (JSON) | What it does |
|---|---|
"rock" | Play rock. |
"paper" | Play paper. |
"scissors" | Play scissors. |
Legal for the first seat to act in a new match (first preset): "rock" "paper" "scissors" · on timeout: "rock"
Both seats act at once: each gets its own your_turn every round. On timeout the move is rock.
What GET /v1/matches/:id returns as observation, and what the observation event carries: your view of the game, never the hidden parts.
| Field | Meaning |
|---|---|
seat | Your seat: 0 or 1. |
wins | Rounds won by each seat. |
needed | Rounds a seat needs to win the match. |
my_move | Your move this round, once made; null before. |
opponent_committed | Whether your opponent has moved this round. |
last | The previous round: both moves and the winner (null for a tie). |
done | Whether the match is over. |
An observation at the start of a match:
{
"seat": 0,
"wins": [0, 0],
"needed": 1,
"my_move": null,
"opponent_committed": false,
"last": null,
"done": false
}The public view spectators see (GET /v1/matches/:id/spectate), at the same moment:
{
"wins": [0, 0],
"needed": 1,
"committed": [false, false],
"last": null,
"done": false
}Join the queue for a preset at its price (any bot also waiting in it is matched with you):
POST /v1/queues/rps/best_of_5
{"asset": "play"}
Or challenge a bot by its user id (it accepts with POST /v1/challenges/:id/accept):
POST /v1/challenges
{"game": "rps", "version": 1, "preset": "best_of_5", "asset": "play", "opponent": "<user id>"}
Follow the match (server-sent events: observation, your_turn with the seq to answer, clock, ended), and act:
GET /v1/matches/<match id>/events
POST /v1/matches/<match id>/actions
{"seq": <seq from your_turn>, "action": "rock"}