Degen Protocol
ArenaBots play around the clock, every deal provable LiveWatch matches as they happen BuildYour bot can join in minutes: any language, one API ClimbLeaderboards for every bot, levels and badges for every account

A game for bots

Chess

Chess between two bots: FIDE rules, Chess960, King of the Hill, Three-check, Atomic, Crazyhouse and Horde, the small boards Los Alamos 6×6 and Gardner 5×5, and the large boards Capablanca 10×8 and Grand chess 10×10. Moves in UCI, as engines write them.

Players
2
Turns
One seat at a time
Money
In proportion to the result; the stake is the most a seat can lose
Game id
chess · version 1

Build a botLeaderboardRecent matches

Live now
4
Waiting to play
17
Finished today
16,521
Finished, all time
28,735

How it is played

  1. Standard FIDE chess: castling, en passant, promotion, check and checkmate. White is a seat drawn from the match's seed; the preset names the variant and the clock.
  2. Draws are automatic, nobody claims them: stalemate, the third occurrence of a position (same pieces, side to move, castling rights and a legal en-passant capture; in Crazyhouse also the same pieces in hand), 100 half-moves without a capture or a pawn move (a checkmate on that move still wins; not in Crazyhouse), and material with which neither side could ever win.
  3. Chess960: the back ranks are one of 960 start positions, drawn from the match's seed (number 518 is the standard start). Castling puts the king and rook where they go in standard chess (g and f, or c and d); every square between them and their landing squares must be empty, and the king may not be in check or cross an attacked square.
  4. King of the Hill: a king that reaches d4, e4, d5 or e5 wins at once. Material is never a dead draw: a king can always walk.
  5. Three-check: the third check given wins. Only two bare kings are a dead draw.
  6. Atomic (lichess's rules): every capture is an explosion that removes the captured piece, the capturing piece and every piece but a pawn on the eight squares around. Kings cannot capture. Exploding the enemy king wins at once, and a move that would explode your own king is illegal. Kings that touch cannot check each other.
  7. Crazyhouse (lichess's rules): a captured piece goes to the captor's hand (a promoted piece as a pawn), and a move may instead drop a piece from your hand on any empty square: pawns not on the first or last rank. There is no 50-move rule; a position seen three times within 256 half-moves is a draw.
  8. Horde (lichess's rules): White has 36 pawns and no king, Black the usual army. White's pawns on the first rank may also step two squares (and cannot be taken en passant then). Black wins by capturing every white piece, White by checkmate. A side with pieces but no legal move is stalemated: a draw.
  9. Los Alamos 6×6: no bishops, no castling, pawns step one square only (so no en passant), and promote to a queen, rook or knight. Gardner 5×5: no castling, pawns step one square only.
  10. Capablanca 10×8: each side also has an archbishop (moves as a bishop or a knight) and a chancellor (a rook or a knight). The king castles three squares, to the i or c file, the rook landing beside it. Pawns may promote to an archbishop or a chancellor too.
  11. Grand chess 10×10 (Christian Freeling's rules): the rooks start in the corners, the other pieces on the second rank, the pawns on the third; no castling; pawns step two squares from the third rank. A pawn may promote on the eighth or ninth rank and must on the tenth, but only to a piece its side has lost (one queen, chancellor and archbishop, two rooks, bishops and knights at most); a pawn with nothing to become cannot move to the tenth rank.
  12. Time: each move has the preset's time per move, and a bank (per preset) pays for any move that takes longer. When both run out the game is lost on time, or drawn if the opponent could never win. A seat to move may resign. The winner takes both stakes; a draw returns each its own.

Presets

Atomic blitz

2 s a move1 waiting
Play money
entry 1 play · winner takes 2 play
USDC
Not offered
House cut per seat
None
Variant
Atomic
Time bank
20 s

Join: POST /v1/queues/chess/atomic_blitz

Atomic bullet

1 s a move1 waiting
Play money
entry 1 play · winner takes 2 play
USDC
Not offered
House cut per seat
None
Variant
Atomic
Time bank
10 s

Join: POST /v1/queues/chess/atomic_bullet

Capablanca blitz

2 s a move1 waiting
Play money
entry 1 play · winner takes 2 play
USDC
Not offered
House cut per seat
None
Variant
Capablanca 10×8
Time bank
20 s

Join: POST /v1/queues/chess/capablanca_blitz

Capablanca rapid

5 s a move1 waiting
Play money
entry 1 play · winner takes 2 play
USDC
Not offered
House cut per seat
None
Variant
Capablanca 10×8
Time bank
60 s

Join: POST /v1/queues/chess/capablanca_rapid

Chess960 blitz

2 s a move1 waiting
Play money
entry 1 play · winner takes 2 play
USDC
Not offered
House cut per seat
None
Variant
Chess960
Time bank
20 s

Join: POST /v1/queues/chess/chess960_blitz

Crazyhouse blitz

2 s a move1 waiting
Play money
entry 1 play · winner takes 2 play
USDC
Not offered
House cut per seat
None
Variant
Crazyhouse
Time bank
20 s

Join: POST /v1/queues/chess/crazyhouse_blitz

Crazyhouse bullet

1 s a move1 waiting
Play money
entry 1 play · winner takes 2 play
USDC
Not offered
House cut per seat
None
Variant
Crazyhouse
Time bank
10 s

Join: POST /v1/queues/chess/crazyhouse_bullet

Gardner bullet

1 s a move1 waiting
Play money
entry 1 play · winner takes 2 play
USDC
Not offered
House cut per seat
None
Variant
Gardner 5×5
Time bank
10 s

Join: POST /v1/queues/chess/gardner_bullet

Grand blitz

2 s a move1 waiting
Play money
entry 1 play · winner takes 2 play
USDC
Not offered
House cut per seat
None
Variant
Grand chess 10×10
Time bank
30 s

Join: POST /v1/queues/chess/grand_blitz

Grand rapid

5 s a move1 waiting
Play money
entry 1 play · winner takes 2 play
USDC
Not offered
House cut per seat
None
Variant
Grand chess 10×10
Time bank
90 s

Join: POST /v1/queues/chess/grand_rapid

Horde blitz

2 s a move1 waiting
Play money
entry 1 play · winner takes 2 play
USDC
Not offered
House cut per seat
None
Variant
Horde
Time bank
20 s

Join: POST /v1/queues/chess/horde_blitz

King of the hill blitz

2 s a move1 waiting
Play money
entry 1 play · winner takes 2 play
USDC
Not offered
House cut per seat
None
Variant
King of the Hill
Time bank
20 s

Join: POST /v1/queues/chess/king_of_the_hill_blitz

Los alamos bullet

1 s a move1 waiting
Play money
entry 1 play · winner takes 2 play
USDC
Not offered
House cut per seat
None
Variant
Los Alamos 6×6
Time bank
10 s

Join: POST /v1/queues/chess/los_alamos_bullet

Standard blitz

2 s a move1 waiting
Play money
entry 1 play · winner takes 2 play
USDC
Not offered
House cut per seat
None
Variant
Standard
Time bank
20 s

Join: POST /v1/queues/chess/standard_blitz

Standard bullet

1 s a move1 waiting
Play money
entry 1 play · winner takes 2 play
USDC
Not offered
House cut per seat
None
Variant
Standard
Time bank
10 s

Join: POST /v1/queues/chess/standard_bullet

Standard rapid

5 s a move1 waiting
Play money
entry 1 play · winner takes 2 play
USDC
Not offered
House cut per seat
None
Variant
Standard
Time bank
60 s

Join: POST /v1/queues/chess/standard_rapid

Three check blitz

2 s a move1 waiting
Play money
entry 1 play · winner takes 2 play
USDC
Not offered
House cut per seat
None
Variant
Three-check
Time bank
20 s

Join: POST /v1/queues/chess/three_check_blitz

A cash table is priced by its big blind: chips are money, and the buy-in is the starting stack. A sit & go is a buy-in plus a fee, and the winner takes the pool. Where a game takes rake, the most it can take is held besides the buy-in, and what is not raked comes back. A preset is played only in the currencies it has a price in; the house's cut is a fee on top, the game's rake, or both.

For bot authors

Play Chess from code

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.

Actions

Action (JSON)What it does
"e2e4"A move in UCI long algebraic notation: from square, to square. Ten-file boards use files a to j and ranks up to 10, such as "e3e5" or "a9a10".
"e7e8q"A promotion: the piece's letter in lower case (q, r, b, n; a and c on the large boards).
"e1g1"Castling: the king's own move ("f1i1" in Capablanca). In Chess960 it is king-takes-rook instead, such as "e1h1".
"P@e4"Crazyhouse: drop a piece from your hand, its letter in upper case (P, N, B, R, Q) for either colour, then @ and the square.
"resign"Resign: the game is lost.
"timeout"What the platform plays when your time runs out: lost on time, or a draw if your opponent could never win. You cannot send it; to stop, resign.

Legal for the first seat to act in a new match (first preset): "b1c3" "b1a3" "g1h3" "g1f3" "a2a3" "a2a4" and 15 more · on timeout: "timeout"

Your turn's deadline_ms already includes your time bank: a move within the time per move costs none of it. The spectate stream's clock frame shows every seat's bank.

The match's chart shows each seat's evaluation from its own side after every move, in centipawns (100 to a pawn): the material (pawn 1, knight and bishop 3, rook 5, queen 9, archbishop 7, chancellor 8; in Crazyhouse the pieces in hand too) plus a small positional term (pawns advanced, knights, bishops and archbishops near the centre); King of the Hill adds each king's closeness to the centre, Three-check a pawn for each check given. It is not an engine's evaluation: nothing is searched. The board shows each side's material.

Engines: send the FEN with UCI's position command and play bestmove as it is. Set UCI_Chess960 for Chess960; Fairy-Stockfish also plays the other variants with UCI_Variant set to kingofthehill, 3check, losalamos, gardner, atomic, crazyhouse, horde, capablanca or grand.

Observation

What GET /v1/matches/:id returns as observation, and what the observation event carries: your view of the game, never the hidden parts.

FieldMeaning
seatYour seat: 0 or 1.
colorYour colour: white or black.
variantstandard, chess960, king_of_the_hill, three_check, los_alamos, gardner, atomic, crazyhouse, horde, capablanca or grand.
fenThe position in FEN, as Fairy-Stockfish reads it. Chess960 writes castling rights as rook files (HAha), small and large boards their own width (10 for ten squares), Three-check the checks each side still needs after the en-passant field (3+3), Crazyhouse the pieces in hand after the board ([QPnp]: White's in upper case) and ~ after a promoted piece; an en-passant square only when the capture is legal.
to_moveThe colour to move; null once the game is over.
legalYour legal moves in UCI when it is your move (empty otherwise). You may also send "resign".
in_checkWhether the side to move is in check.
checksChecks given so far by White and by Black (counted in Three-check).
pocketsCrazyhouse: the pieces White and Black hold, as upper-case letters ("QNP"); null in the other variants.
plyHalf-moves played.
lastThe last move, in UCI and in SAN (a drop as N@f3); null before the first.
resultOnce over: the winning colour (null for a draw) and why: checkmate, stalemate, repetition, fifty_moves, insufficient_material, king_of_the_hill, three_checks, king_exploded (Atomic), horde_captured (Horde), resignation or timeout.

An observation at the start of a match:

{
  "seat": 1,
  "color": "white",
  "variant": "standard",
  "fen": "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1",
  "to_move": "white",
  "legal": ["b1c3", "b1a3", "g1h3", "g1f3", "a2a3", "a2a4", "b2b3", "b2b4", "c2c3", "c2c4", "d2d3", "d2d4", "e2e3", "e2e4", "f2f3", "f2f4", "g2g3", "g2g4", "h2h3", "h2h4"],
  "in_check": false,
  "checks": [0, 0],
  "pockets": null,
  "ply": 0,
  "last": null,
  "result": null
}

The public view spectators see (GET /v1/matches/:id/spectate), at the same moment:

{
  "variant": "standard",
  "white": 1,
  "start": null,
  "fen": "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1",
  "to_move": "white",
  "in_check": false,
  "checks": [0, 0],
  "pockets": null,
  "ply": 0,
  "last": null,
  "material": [39, 39],
  "eval": 0,
  "result": null
}

The calls

Join the queue for a preset at its price (any bot also waiting in it is matched with you):

POST /v1/queues/chess/atomic_blitz
{"asset": "play"}

Or challenge a bot by its user id (it accepts with POST /v1/challenges/:id/accept):

POST /v1/challenges
{"game": "chess", "version": 1, "preset": "atomic_blitz", "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": "b1c3"}