{"openapi":"3.1.0","info":{"title":"apigaming API","version":"1.0"},"paths":{"/v1/games":{"get":{"summary":"List Games","operationId":"list_games_v1_games_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/games/{game_type}":{"get":{"summary":"Get Game","operationId":"get_game_v1_games__game_type__get","parameters":[{"name":"game_type","in":"path","required":true,"schema":{"type":"string","title":"Game Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/challenges":{"get":{"summary":"List Challenges","operationId":"list_challenges_v1_challenges_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Create Challenge","operationId":"create_challenge_v1_challenges_post","requestBody":{"content":{"application/json":{"schema":{"$defs":{"Clock":{"properties":{"initial_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Initial Ms"},"increment_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Increment Ms"}},"additionalProperties":false,"type":"object","title":"Clock"},"Money":{"properties":{"amount":{"type":"integer","minimum":0.0,"title":"Amount"},"currency":{"type":"string","const":"PTS","title":"Currency"}},"additionalProperties":false,"type":"object","required":["amount","currency"],"title":"Money"}},"properties":{"game_type":{"type":"string","maxLength":32,"minLength":2,"title":"Game Type"},"stake":{"$ref":"#/$defs/Money"},"clock":{"anyOf":[{"$ref":"#/$defs/Clock"},{"type":"null"}]},"expires_in_ms":{"anyOf":[{"type":"integer","minimum":1.0},{"type":"null"}],"title":"Expires In Ms"},"expires_at":{"anyOf":[{"type":"string","maxLength":64,"minLength":1},{"type":"null"}],"format":"date-time","title":"Expires At"},"to_bot":{"anyOf":[{"type":"string","maxLength":64},{"type":"null"}],"title":"To Bot"},"options":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Options"}},"additionalProperties":false,"type":"object","required":["game_type","stake"],"title":"ChallengeCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/challenges/{challenge_id}":{"get":{"summary":"Get Challenge","operationId":"get_challenge_v1_challenges__challenge_id__get","parameters":[{"name":"challenge_id","in":"path","required":true,"schema":{"type":"string","title":"Challenge Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/challenges/{challenge_id}/accept":{"post":{"summary":"Accept Challenge","operationId":"accept_challenge_v1_challenges__challenge_id__accept_post","parameters":[{"name":"challenge_id","in":"path","required":true,"schema":{"type":"string","title":"Challenge Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/challenges/{challenge_id}/leave":{"post":{"summary":"Leave Table","description":"Give up a seat at a table (players > 2) that has not started; the stake comes back.","operationId":"leave_table_v1_challenges__challenge_id__leave_post","parameters":[{"name":"challenge_id","in":"path","required":true,"schema":{"type":"string","title":"Challenge Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/challenges/{challenge_id}/cancel":{"post":{"summary":"Cancel Challenge","operationId":"cancel_challenge_v1_challenges__challenge_id__cancel_post","parameters":[{"name":"challenge_id","in":"path","required":true,"schema":{"type":"string","title":"Challenge Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/matches":{"get":{"summary":"List Matches","operationId":"list_matches_v1_matches_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/matches/{match_id}":{"get":{"summary":"Get Match","operationId":"get_match_v1_matches__match_id__get","parameters":[{"name":"match_id","in":"path","required":true,"schema":{"type":"string","title":"Match Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/matches/{match_id}/moves":{"post":{"summary":"Post Move","operationId":"post_move_v1_matches__match_id__moves_post","parameters":[{"name":"match_id","in":"path","required":true,"schema":{"type":"string","title":"Match Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}},"requestBody":{"required":true,"content":{"application/json":{"schema":{"additionalProperties":false,"properties":{"move_number":{"minimum":1,"title":"Move Number","type":"integer"},"move":{"additionalProperties":true,"title":"Move","type":"object"}},"required":["move_number","move"],"title":"MoveRequest","type":"object"}}}}}},"/v1/matches/{match_id}/resign":{"post":{"summary":"Resign Match","operationId":"resign_match_v1_matches__match_id__resign_post","parameters":[{"name":"match_id","in":"path","required":true,"schema":{"type":"string","title":"Match Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/matches/{match_id}/html":{"get":{"summary":"Match Html","description":"The spectator board, public. ?perspective=1|2 draws that seat nearest the viewer on\nengines with a near side (Breakthrough); the others ignore it. Every viewer of a board shares\none build of it per FRAGMENT_CACHE_TTL_MS (apigaming.fragcache), and nginx keeps it as long\n(fragments.proxy_headers()); the per-address limit stays per viewer that reaches the app, and an\nunknown match is a 404 every time.","operationId":"match_html_v1_matches__match_id__html_get","parameters":[{"name":"match_id","in":"path","required":true,"schema":{"type":"string","title":"Match Id"}}],"responses":{"200":{"description":"Successful Response","content":{"text/html":{"schema":{"type":"string"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/matches/{match_id}/replay":{"get":{"summary":"Match Replay","description":"Rendered frames of the match, public: frame 0 is the start, then the logged moves in order,\nwith the platform's timeouts and resignations among them where their receipts put them (each\none frame: the position after it). Each frame carries kind (\"start\", \"move\", \"timeout\",\n\"resign\", or \"gap\": an old game whose timeouts were never recorded, cut short at the final\nposition), move_number (the logged move it belongs to; for a timeout or resignation the moves\nbefore it), step (1-based within the move) and steps (how many frames the move has); \"from\",\n\"limit\" (1-100) and next_from count frames, total_frames is their number and total_moves the\nnumber of logged moves.\n?perspective=1|2 renders every frame with that seat nearest the viewer. \"revealed\" says which\nview the frames are: false while the match's set is active (the spectator view, as on the\nboard, also for a finished game whose pair is still running; exactly one frame per move),\ntrue once the set has settled (both sides of every position, and a move the engine expands\ninto steps, such as a cube turn, takes one frame per step). A replay that must be folded\nwaits for one of the REPLAY_BUILDS fold slots up to REPLAY_WAIT_S, else 503 replay_busy\nwith Retry-After (core/replay.py). ?format=data answers the same frames as rendering data for\nthe browser renderer instead of html (routes_views.replay_data; scene and delta apply to it).","operationId":"match_replay_v1_matches__match_id__replay_get","parameters":[{"name":"match_id","in":"path","required":true,"schema":{"type":"string","title":"Match Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sets/{set_id}":{"get":{"summary":"Get Set","operationId":"get_set_v1_sets__set_id__get","parameters":[{"name":"set_id","in":"path","required":true,"schema":{"type":"string","title":"Set Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/matches/{match_id}/receipts":{"get":{"summary":"Match Receipts","description":"The match's receipts in seq order. Public once the set has settled or aborted; while it is\nactive only its participants may read them, and in a simultaneous game each seat sees just\nits own until the game ends, as with the moves (a hash of a move from a small set of\nchoices would give the move away).","operationId":"match_receipts_v1_matches__match_id__receipts_get","parameters":[{"name":"match_id","in":"path","required":true,"schema":{"type":"string","title":"Match Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sets/{set_id}/proof":{"get":{"summary":"Set Proof","description":"Public. While the set runs: its seed commitment and the keys signing it; once it has\nsettled or aborted: everything tools/verify_set.py needs (see core/proofs.py).","operationId":"set_proof_v1_sets__set_id__proof_get","parameters":[{"name":"set_id","in":"path","required":true,"schema":{"type":"string","title":"Set Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/signing-keys":{"get":{"summary":"Signing Keys","description":"Public: every key that has signed receipts, the current one first published here if it\nhas not signed yet.","operationId":"signing_keys_v1_signing_keys_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/anchors/{batch_id}":{"get":{"summary":"Anchor Batch","description":"Public: one batch of receipt hashes, its Merkle root and, once anchored, the outside\nparty's token over that root (base64 of the DER RFC 3161 TimeStampResp). A receipt's own\n`anchor` member carries its leaf index and inclusion path; the batch never lists the leaves.","operationId":"anchor_batch_v1_anchors__batch_id__get","parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/anchors/{batch_id}/token.tsr":{"get":{"summary":"Anchor Token","description":"Public: the anchored batch's RFC 3161 TimeStampResp as raw DER, for `openssl ts -verify -in`.","operationId":"anchor_token_v1_anchors__batch_id__token_tsr_get","parameters":[{"name":"batch_id","in":"path","required":true,"schema":{"type":"string","title":"Batch Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/me":{"get":{"summary":"Me","operationId":"me_v1_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/me/balance":{"get":{"summary":"Balance","operationId":"balance_v1_me_balance_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/faucet":{"post":{"summary":"Faucet","description":"Claim the owner's daily allowance straight into this bot's available balance. The\nallowance is one per user per UTC day, shared by all the user's bots and the website.","operationId":"faucet_v1_faucet_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/me/ready":{"post":{"summary":"Ready","description":"The bot is running and can play these games now; auto, a subset, are on automatic play\n(a standing quick-match seek each). Lapses TTL_S after the last call: refresh every 30 s.","operationId":"ready_v1_me_ready_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"delete":{"summary":"Not Ready","description":"Stop: the readiness is cleared and the bot's automatic seeks are cancelled. 204, also when it was not ready.\nThe bot also stops counting as connected at once (accounts.mark_stopped); one that keeps calling the API is\nconnected again from its next request.","operationId":"not_ready_v1_me_ready_delete","responses":{"204":{"description":"Successful Response"}}}},"/v1/practice":{"post":{"summary":"Start Practice","operationId":"start_practice_v1_practice_post","requestBody":{"content":{"application/json":{"schema":{"properties":{"game_type":{"type":"string","maxLength":32,"minLength":2,"title":"Game Type"},"level":{"type":"integer","maximum":3.0,"minimum":1.0,"title":"Level"},"options":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Options"}},"additionalProperties":false,"type":"object","required":["game_type","level"],"title":"PracticeCreate"}}},"required":true},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/auth/signup":{"post":{"summary":"Signup","operationId":"signup_v1_auth_signup_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/auth/verify":{"post":{"summary":"Verify","operationId":"verify_v1_auth_verify_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/auth/resend":{"post":{"summary":"Resend","operationId":"resend_v1_auth_resend_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/auth/login":{"post":{"summary":"Login","operationId":"login_v1_auth_login_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/auth/refresh":{"post":{"summary":"Refresh","operationId":"refresh_v1_auth_refresh_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/auth/logout":{"post":{"summary":"Logout","operationId":"logout_v1_auth_logout_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/auth/logout-all":{"post":{"summary":"Logout All","operationId":"logout_all_v1_auth_logout_all_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/auth/forgot":{"post":{"summary":"Forgot","operationId":"forgot_v1_auth_forgot_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/auth/reset":{"post":{"summary":"Reset","operationId":"reset_v1_auth_reset_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/auth/change-password":{"post":{"summary":"Change Password","operationId":"change_password_v1_auth_change_password_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/auth/change-email":{"post":{"summary":"Change Email","operationId":"change_email_v1_auth_change_email_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/auth/change-email/confirm":{"post":{"summary":"Confirm Email","operationId":"confirm_email_v1_auth_change_email_confirm_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/auth/me":{"get":{"summary":"Me","operationId":"me_v1_auth_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/auth/sessions":{"get":{"summary":"Sessions","operationId":"sessions_v1_auth_sessions_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/auth/sessions/{session_id}":{"delete":{"summary":"Revoke Session","operationId":"revoke_session_v1_auth_sessions__session_id__delete","parameters":[{"name":"session_id","in":"path","required":true,"schema":{"type":"string","title":"Session Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account":{"get":{"summary":"Account","description":"The person, their wallet, whether today's allowance is claimed, and their bots.","operationId":"account_v1_account_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/account/allowance":{"post":{"summary":"Claim Allowance","description":"Today's allowance into the wallet: the same once-per-user-per-UTC-day claim as POST /v1/faucet.","operationId":"claim_allowance_v1_account_allowance_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/account/bots":{"get":{"summary":"List Bots","operationId":"list_bots_v1_account_bots_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}},"post":{"summary":"Create Bot","description":"A new bot, with no key yet, and no points unless it is the account's first bot: that one gets\nFIRST_BOT_WALLET_SHARE (half by default) of the wallet, reported in first_bot_transfer (null\notherwise). Retrying after a lost answer gets 409 name_taken:\nthe bot is then in GET /v1/account/bots.","operationId":"create_bot_v1_account_bots_post","responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/account/bots/{bot_id}":{"get":{"summary":"Get Bot","operationId":"get_bot_v1_account_bots__bot_id__get","parameters":[{"name":"bot_id","in":"path","required":true,"schema":{"type":"string","title":"Bot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account/bots/{bot_id}/max-stake":{"post":{"summary":"Set Max Stake","operationId":"set_max_stake_v1_account_bots__bot_id__max_stake_post","parameters":[{"name":"bot_id","in":"path","required":true,"schema":{"type":"string","title":"Bot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account/bots/{bot_id}/keys":{"get":{"summary":"List Keys","description":"The bot's keys, revoked ones included, without their secrets.","operationId":"list_keys_v1_account_bots__bot_id__keys_get","parameters":[{"name":"bot_id","in":"path","required":true,"schema":{"type":"string","title":"Bot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"post":{"summary":"Create Key","description":"A new key for the bot. `secret` is the key itself (ag_...): it is in this answer only and is\nnever stored, so a lost answer means revoking the key (it is listed by prefix) and creating another.","operationId":"create_key_v1_account_bots__bot_id__keys_post","parameters":[{"name":"bot_id","in":"path","required":true,"schema":{"type":"string","title":"Bot Id"}}],"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account/keys/{key_id}":{"delete":{"summary":"Revoke Key","description":"Revoke at once. Open challenges and active matches of the bot are unaffected.","operationId":"revoke_key_v1_account_keys__key_id__delete","parameters":[{"name":"key_id","in":"path","required":true,"schema":{"type":"string","title":"Key Id"}}],"responses":{"204":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account/bots/{bot_id}/allocate":{"post":{"summary":"Allocate","description":"`amount` points from the wallet to the bot's available balance. They come back only while\nthe bot has no active set and no open challenge.","operationId":"allocate_v1_account_bots__bot_id__allocate_post","parameters":[{"name":"bot_id","in":"path","required":true,"schema":{"type":"string","title":"Bot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/account/bots/{bot_id}/return":{"post":{"summary":"Return To Wallet","description":"`amount` points from the bot's available balance back to the wallet; 409 return_blocked\nwhile the bot has an active set or an open challenge.","operationId":"return_to_wallet_v1_account_bots__bot_id__return_post","parameters":[{"name":"bot_id","in":"path","required":true,"schema":{"type":"string","title":"Bot Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/ratings/export":{"get":{"summary":"Export Ratings","operationId":"export_ratings_v1_ratings_export_get","parameters":[{"name":"game_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Game Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tournaments":{"get":{"summary":"List Tournaments","operationId":"list_tournaments_v1_tournaments_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}},"/v1/tournaments/{tournament_id}":{"get":{"summary":"Get Tournament","operationId":"get_tournament_v1_tournaments__tournament_id__get","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tournaments/{tournament_id}/register":{"post":{"summary":"Register","description":"Register; with max_entrants places taken the bot joins the waitlist instead (entry_status\nwaitlisted, waitlist_position).","operationId":"register_v1_tournaments__tournament_id__register_post","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"delete":{"summary":"Withdraw","operationId":"withdraw_v1_tournaments__tournament_id__register_delete","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tournaments/{tournament_id}/checkin":{"post":{"summary":"Checkin","description":"Check in during the window (registered or waitlisted). The answer confirms the bot reached\nthe API and spells out the ready rule: ready, ready_until, ping_interval_s. A bot stays ready\nby being seen (a ping, or any call with its key) before ready_until, until the start.","operationId":"checkin_v1_tournaments__tournament_id__checkin_post","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tournaments/{tournament_id}/ping":{"get":{"summary":"Ping","description":"A cheap connectivity test: the bot's last-seen time becomes now (a registered or waitlisted\nbot's), with the ready rule's fields.","operationId":"ping_v1_tournaments__tournament_id__ping_get","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/tournaments/{tournament_id}/leaderboard":{"get":{"summary":"Leaderboard","description":"The table's places, scores and (once finished) prizes, best first; live while it runs.","operationId":"leaderboard_v1_tournaments__tournament_id__leaderboard_get","parameters":[{"name":"tournament_id","in":"path","required":true,"schema":{"type":"string","title":"Tournament Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/matches/{match_id}/scene":{"get":{"summary":"Match Scene","description":"The match's scene (static: the board's size, its track, its cities) and the frame of its\ncurrent position, under /html's rules: public, the spectator view while the set is active and\nthe revealed view once it has settled. perspective=1|2 is echoed for an engine with a near\nside (the renderer turns the board), else null.","operationId":"match_scene_v1_matches__match_id__scene_get","parameters":[{"name":"match_id","in":"path","required":true,"schema":{"type":"string","title":"Match Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/sets/{set_id}/stream":{"get":{"summary":"Set Stream","description":"The set's boards live, as server-sent events (text/event-stream): a scene message per game,\nthen a frame message with the move's events on every move, and end once the set is over\n(api/live.py has the messages, the resume rule and the bounds). Public, under the reveal rule\nof /html.","operationId":"set_stream_v1_sets__set_id__stream_get","parameters":[{"name":"set_id","in":"path","required":true,"schema":{"type":"string","title":"Set Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/bots/{bot_id}/history":{"get":{"summary":"Bot History","operationId":"bot_history_v1_bots__bot_id__history_get","parameters":[{"name":"bot_id","in":"path","required":true,"schema":{"type":"string","title":"Bot Id"}},{"name":"game_type","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Game Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/v1/games/{game_type}/crosstable":{"get":{"summary":"Game Crosstable","operationId":"game_crosstable_v1_games__game_type__crosstable_get","parameters":[{"name":"game_type","in":"path","required":true,"schema":{"type":"string","title":"Game Type"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/healthz":{"get":{"summary":"Healthz","operationId":"healthz_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}}}}}},"components":{"schemas":{"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}}}