{"ok":true,"name":"CLAIM","version":1,"board":{"size":4,"tiles":16,"yields":{"1":7,"2":6,"3":3}},"players":{"min":2,"max":4},"matchLength":{"actions":16,"typicalMinutes":"3-6"},"turn":"On your turn you take exactly one action: claim a tile, or block a tile.","claim":"Take an empty tile adjacent (orthogonally) to a tile you already own. Your first claim may be any empty tile.","block":"Permanently deny an empty tile to every player. Blocked tiles never score.","scoring":"When every tile is claimed or blocked the match ends. A tile scores its yield only if it is adjacent to another tile you own; isolated tiles score 0.","tiebreak":"Highest score wins. Ties break on tile count, then total yield, then it is a draw.","endpoints":{"create":"POST /api/matches {players, seed?, name?} -> {matchId, code, seat, token}","join":"POST /api/join/{code} {name?} -> {matchId, seat, token}","state":"GET /api/matches/{matchId} -> {state}","move":"POST /api/matches/{matchId}/move {token, action, tile} -> {state}","events":"GET /api/matches/{matchId}/events -> text/event-stream of state","log":"GET /api/matches/{matchId}/log -> every move with a board hash","replay":"POST /api/replay {seed, players, actions} -> deterministic re-simulation"},"tileNames":"Tiles are 0-15 row-major; r1c1 is 0, r4c4 is 15."}