{"openapi":"3.1.0","info":{"title":"Receipts API","version":"v1","description":"Run and play Receipts prediction pools for a friend group: fantasy football picks, group calls on who wins, bragging rights.\n\nPoints only: nothing is paid in and nothing of value is won.\n\nAuth: a personal access token, made by the account owner on their account page (/account, under \"Connect an assistant\"), sent as `Authorization: Bearer igr_...`. A token acts as its account's own player. Scopes: read (see pools, standings, picks), play (join, pick, leave), host (create pools, and run the pools this account hosts or helps run as an admin).\n\nHost actions only reach pools this account runs: as the host, or as an admin the host has allowed to take that action (anything else is not-owner or not-permitted). Every player sees them marked AGENT-ASSISTED. Confirm them with the person first. Ending a pool and leaving one need {\"confirm\": true}; calling or uncalling a result needs the question's current `version`.\n\nWebsite-only for now (send the person to the pool's host page): rename a player, remove a player, require accounts to join, manage pool admins, hand a pool over to someone else. GET /me lists them as website_only. Renaming the pool itself is renamePool (PUT /pools/{code}/title).\n\nRate limits: 60 requests a minute per token and 120 per account; a 429 comes with Retry-After.\n\nRefusals are {\"error\": {\"reason\", \"message\"}}: pass the message on to the person. Guide: /help/assistants.\n\nResponses may gain fields within v1; ignore fields you don't know.","termsOfService":"https://ivegotreceipts.com/terms","contact":{"email":"hello@ivegotreceipts.com"}},"externalDocs":{"description":"Using an AI assistant with Receipts","url":"https://ivegotreceipts.com/help/assistants"},"servers":[{"url":"https://ivegotreceipts.com/api/v1"}],"security":[{"bearerAuth":[]}],"tags":[{"name":"read","description":"See pools, standings and picks."},{"name":"play","description":"Join, pick and leave."},{"name":"host","description":"Create pools, and run the pools this account hosts or is an admin of."}],"paths":{"/me":{"get":{"operationId":"getMe","summary":"Who this connection is, and its limits","description":"The account and connection behind this token, its scopes, and its active-pool limits. `website_only` lists the host actions an assistant can't take yet; those are on the pool's host page. Scope: read.","tags":["read"],"x-scope":"read","security":[{"bearerAuth":[]}],"responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"type":"object","properties":{"user":{"type":"object","properties":{"id":{"type":"string"},"email":{"type":"string"}}},"connection":{"type":"object","properties":{"id":{"type":"string"},"name":{"type":"string"},"scopes":{"type":"array","items":{"type":"string","enum":["read","play","host"]}},"created_at":{"type":"string","format":"date-time"},"expires_at":{"type":["string","null"],"format":"date-time"}}},"limits":{"type":"object","properties":{"hosting_active":{"type":"integer"},"max_hosting_active":{"type":"integer"},"playing_active":{"type":"integer"},"max_playing_active":{"type":"integer"}}},"points_only":{"type":"string"},"website_only":{"type":"array","items":{"type":"string"},"description":"Host actions only on the website for now."}}}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pools":{"get":{"operationId":"listMyPools","summary":"List the pools this account hosts, helps run and plays in","description":"One line per pool: id, code, title, status, end date, join link and this account's `role` there. `admin_of`: pools whose host made this account an admin, each with the `admin_permissions` the host gave it. Active pools only by default; `status` picks ended, recent (ended in the last 30 days) or all instead, across all three lists. The response's `status` names the one applied. Scope: read.","tags":["read"],"x-scope":"read","security":[{"bearerAuth":[]}],"parameters":[{"name":"status","in":"query","required":false,"description":"Which pools to list. active: open for picks, or locked awaiting results. ended: finished (every question called), ended by the host, or past its end date. recent: ended in the last 30 days. all: every pool. active when left out.","schema":{"type":"string","enum":["active","ended","recent","all"],"default":"active"}}],"responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"type":"object","properties":{"status":{"type":"string","enum":["active","ended","recent","all"],"description":"Which pools these are: the status asked for, or active."},"hosting":{"type":"array","items":{"$ref":"#/components/schemas/PoolSummary"}},"admin_of":{"type":"array","items":{"$ref":"#/components/schemas/PoolSummary"}},"playing":{"type":"array","items":{"$ref":"#/components/schemas/PoolSummary"}}}}}}},"400":{"description":"A query parameter isn't one it takes (bad-request).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"createPool","summary":"Start a pool on this account","description":"Starts a pool owned by this account, counted against its active-pool limit. `join_url` is the link players join with. Points only: nothing is paid in and nothing of value is won. Scope: host.","tags":["host"],"x-scope":"host","security":[{"bearerAuth":[]}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title","questions"],"properties":{"title":{"type":"string","minLength":1,"maxLength":60},"questions":{"type":"array","minItems":1,"items":{"oneOf":[{"type":"object","required":["text","options"],"properties":{"text":{"type":"string","maxLength":200,"description":"The question. No \"|\" or line breaks."},"options":{"type":"array","minItems":2,"items":{"type":"string","maxLength":60,"description":"An option. No \"|\" or line breaks."}}}},{"type":"string","description":"One line: \"Who wins? | Mike | Jordan\". No line breaks. The question up to 200 characters, each option up to 60."}]}},"ends_on":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"Optional end date, \"YYYY-MM-DD\"."},"requires_account":{"type":"boolean","description":"Only signed-in players can join."}}}}}},"responses":{"201":{"description":"Done.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"pool":{"$ref":"#/components/schemas/Pool"},"note":{"type":"string"}}}}}},"400":{"description":"The body is missing something or isn't valid (bad-request, confirm-required, bad-...).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Refused by the pool's rules: closed, full, capped, stale... The message says why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pools/{code}":{"get":{"operationId":"getPool","summary":"One pool: questions, standings, my picks","description":"For the host or a current player (`access: full`): the questions with their results and this account's picks (and how each was made), the standings, and the host actions; the host and the pool's admins also get each question's `version` (send it with callResult), and the host the caps. `you.role` says which this account is: host, admin (with `you.admin_permissions`) or player. Anyone else with the code gets what the join page shows (`access: summary`): whether it can be joined, its end date and how many questions, and the standings once it can't be joined. A player the host removed gets `access: removed` and the pool's name only. `invite` ({text, url}): Only for someone who may invite people: the owner, or a player once the host turns on players_can_invite; and only while the pool can take players (open, not full, not ended). `invite.text` is the pool's standard invite, for the person to send from their own email or messages. Receipts doesn't send invites itself. Scope: read.","tags":["read"],"x-scope":"read","security":[{"bearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"description":"The pool's join code (e.g. A7X3) or its id (a UUID). Codes are reused once a pool is final; the id never is.","schema":{"type":"string"}}],"responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PoolResponse"}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No pool with that code or id (not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pools/{code}/join":{"post":{"operationId":"joinPool","summary":"Join a pool under a name","description":"Joins as this account's own player, the same player the person is on the web. A first join needs a name (bad-name without one); joining again under the same name changes nothing. Scope: play.","tags":["play"],"x-scope":"play","security":[{"bearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"description":"The pool's join code (e.g. A7X3) or its id (a UUID). Codes are reused once a pool is final; the id never is.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["name"],"properties":{"name":{"type":"string","minLength":2,"maxLength":40,"description":"The name on the board."}}}}}},"responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"already":{"type":"boolean"},"pool":{"$ref":"#/components/schemas/Pool"}}}}}},"400":{"description":"The body is missing something or isn't valid (bad-request, confirm-required, bad-...).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No pool with that code or id (not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Refused by the pool's rules: closed, full, capped, stale... The message says why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pools/{code}/picks":{"post":{"operationId":"makePicks","summary":"Make or change picks","description":"One pick ({question_id, option}) or several ({picks: [...]}). Picks go in order: they're applied in question order, and the first refusal stops the rest (`applied` says which went in). Scope: play.","tags":["play"],"x-scope":"play","security":[{"bearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"description":"The pool's join code (e.g. A7X3) or its id (a UUID). Codes are reused once a pool is final; the id never is.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","description":"Name the question by question_id, or by its number (1-based) as question.","anyOf":[{"type":"object","required":["question_id","option"],"properties":{"question_id":{"type":"string"},"question":{"type":"integer","minimum":1},"option":{"oneOf":[{"type":"integer","minimum":0,"description":"The option's index (0-based)."},{"type":"string","description":"The option's label (case and spacing ignored)."}]}}},{"type":"object","required":["question","option"],"properties":{"question_id":{"type":"string"},"question":{"type":"integer","minimum":1},"option":{"oneOf":[{"type":"integer","minimum":0,"description":"The option's index (0-based)."},{"type":"string","description":"The option's label (case and spacing ignored)."}]}}}]},{"type":"object","required":["picks"],"properties":{"picks":{"type":"array","minItems":1,"items":{"type":"object","description":"Name the question by question_id, or by its number (1-based) as question.","anyOf":[{"type":"object","required":["question_id","option"],"properties":{"question_id":{"type":"string"},"question":{"type":"integer","minimum":1},"option":{"oneOf":[{"type":"integer","minimum":0,"description":"The option's index (0-based)."},{"type":"string","description":"The option's label (case and spacing ignored)."}]}}},{"type":"object","required":["question","option"],"properties":{"question_id":{"type":"string"},"question":{"type":"integer","minimum":1},"option":{"oneOf":[{"type":"integer","minimum":0,"description":"The option's index (0-based)."},{"type":"string","description":"The option's label (case and spacing ignored)."}]}}}]}}}}]}}}},"responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"applied":{"type":"array","items":{"type":"string"}},"pool":{"$ref":"#/components/schemas/Pool"}}}}}},"400":{"description":"The body is missing something or isn't valid (bad-request, confirm-required, bad-...).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No pool with that code or id (not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Refused by the pool's rules: closed, full, capped, stale... The message says why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pools/{code}/proposals":{"post":{"operationId":"proposeQuestion","summary":"Propose a question to the host","description":"Proposes one question, {text, options} or {question: \"Who wins? | Mike | Jordan\"}, for the host to add or not: nothing goes into the pool until they do. Refused while the host hasn't turned proposals on (proposals-off), once this account has as many waiting as it can (proposal-limit), when the pool isn't taking picks (closed), for an account that runs the pool (runs-pool: it adds questions itself), or one that isn't playing here (not-joined). Players can propose questions to the host once the host turns on players_can_propose (setPoolSettings; off by default), while the pool is taking picks. A proposal is seen only by the player who made it and whoever runs the pool (the host and its admins), never on the Action log or the results receipt. Each player can have 2 waiting for a decision at once in a pool, or 10 when the host or that player is on Baller; once the host adds one or declines it, the slot frees up. An added proposal becomes an ordinary question, with nothing saying who proposed it. Scope: play.","tags":["play"],"x-scope":"play","security":[{"bearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"description":"The pool's join code (e.g. A7X3) or its id (a UUID). Codes are reused once a pool is final; the id never is.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["text","options"],"properties":{"text":{"type":"string","maxLength":200,"description":"The question. No \"|\" or line breaks."},"options":{"type":"array","minItems":2,"items":{"type":"string","maxLength":60,"description":"An option. No \"|\" or line breaks."}}}},{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"One line: \"Who wins? | Mike | Jordan\". No line breaks. The question up to 200 characters, each option up to 60."}}}]}}}},"responses":{"201":{"description":"Done.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"proposal_id":{"type":"string"},"proposal_limit":{"type":"integer"},"proposals_waiting":{"type":"integer","description":"This account's proposals waiting now, this one included."},"pool":{"$ref":"#/components/schemas/Pool"}}}}}},"400":{"description":"The body is missing something or isn't valid (bad-request, confirm-required, bad-...).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No pool with that code or id (not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Refused by the pool's rules: closed, full, capped, stale... The message says why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pools/{code}/leave":{"post":{"operationId":"leavePool","summary":"Leave a pool (needs confirm: true)","description":"While the pool is open, leaving deletes this account's picks there and takes it off the leaderboard. Once picks are locked, the picks stay and the pool just stops counting toward its active pools. Needs {\"confirm\": true}: without it the answer is confirm-required, saying what would happen. Scope: play.","tags":["play"],"x-scope":"play","security":[{"bearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"description":"The pool's join code (e.g. A7X3) or its id (a UUID). Codes are reused once a pool is final; the id never is.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["confirm"],"properties":{"confirm":{"const":true}}}}}},"responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"mode":{"type":"string","enum":["leave","stop-counting"]},"note":{"type":"string"}}}}}},"400":{"description":"The body is missing something or isn't valid (bad-request, confirm-required, bad-...).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No pool with that code or id (not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Refused by the pool's rules: closed, full, capped, stale... The message says why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pools/{code}/questions":{"post":{"operationId":"addQuestion","summary":"Add a question to a pool","description":"Adds one question, within the pool's question cap, to the round taking picks. `round_id` is optional; if sent, it must name that round. Scope: host. Host scope: works only on a pool this account runs, as its host, or as an admin the host has allowed to do this (a host link is never accepted). Every player sees this action marked AGENT-ASSISTED in the pool's Action log (getPool: host_log, agent_assisted).","tags":["host"],"x-scope":"host","security":[{"bearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"description":"The pool's join code (e.g. A7X3) or its id (a UUID). Codes are reused once a pool is final; the id never is.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","required":["text","options"],"properties":{"text":{"type":"string","maxLength":200,"description":"The question. No \"|\" or line breaks."},"options":{"type":"array","minItems":2,"items":{"type":"string","maxLength":60,"description":"An option. No \"|\" or line breaks."}},"round_id":{"type":"string","pattern":"^(r[0-9]+|current)$","description":"The round: its id (r1, r2, ...) from getPool, or \"current\" for the round taking picks. Refused (round-closed) unless it is that round."}}},{"type":"object","required":["question"],"properties":{"question":{"type":"string","description":"One line: \"Who wins? | Mike | Jordan\". No line breaks. The question up to 200 characters, each option up to 60."},"round_id":{"type":"string","pattern":"^(r[0-9]+|current)$","description":"The round: its id (r1, r2, ...) from getPool, or \"current\" for the round taking picks. Refused (round-closed) unless it is that round."}}}]}}}},"responses":{"201":{"description":"Done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostResult"}}}},"400":{"description":"The body is missing something or isn't valid (bad-request, confirm-required, bad-...).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No pool with that code or id (not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Refused by the pool's rules: closed, full, capped, stale... The message says why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pools/{code}/proposals/{proposal}/accept":{"post":{"operationId":"acceptProposal","summary":"Add a proposed question","description":"Adds a question a player proposed (proposals[] in getPool), as they wrote it, to the round taking picks, exactly as addQuestion would: within the pool's question cap, logged as the question being added, with nothing saying who proposed it. The proposal is then accepted, which frees the player's slot. Refused as addQuestion is (closed, question-cap, ...), the proposal stays waiting. One no longer waiting is no-such-proposal or proposal-decided. Needs the host, or an admin the host lets add questions. Scope: host. Host scope: works only on a pool this account runs, as its host, or as an admin the host has allowed to do this (a host link is never accepted). Every player sees this action marked AGENT-ASSISTED in the pool's Action log (getPool: host_log, agent_assisted).","tags":["host"],"x-scope":"host","security":[{"bearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"description":"The pool's join code (e.g. A7X3) or its id (a UUID). Codes are reused once a pool is final; the id never is.","schema":{"type":"string"}},{"name":"proposal","in":"path","required":true,"description":"The proposal's id (proposals[].id from getPool).","schema":{"type":"string"}}],"responses":{"201":{"description":"Done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostResult"}}}},"400":{"description":"No proposal with that id waiting (no-such-proposal).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No pool with that code or id (not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Refused by the pool's rules: closed, full, capped, stale... The message says why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pools/{code}/proposals/{proposal}/decline":{"post":{"operationId":"declineProposal","summary":"Don't add a proposed question","description":"Declines a question a player proposed (proposals[] in getPool): it isn't added, the player sees it as not added, and their slot frees up. Not on the Action log: only the player and whoever runs the pool ever see proposals. One no longer waiting is no-such-proposal or proposal-decided. Works only on a pool this account runs, as its host, or as an admin the host has allowed to add questions. Scope: host.","tags":["host"],"x-scope":"host","security":[{"bearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"description":"The pool's join code (e.g. A7X3) or its id (a UUID). Codes are reused once a pool is final; the id never is.","schema":{"type":"string"}},{"name":"proposal","in":"path","required":true,"description":"The proposal's id (proposals[].id from getPool).","schema":{"type":"string"}}],"responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"const":true},"proposal_id":{"type":"string"},"note":{"type":"string","description":"How the decision was recorded."},"pool":{"$ref":"#/components/schemas/Pool"}}}}}},"400":{"description":"No proposal with that id waiting (no-such-proposal).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No pool with that code or id (not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Refused by the pool's rules: closed, full, capped, stale... The message says why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pools/{code}/lock":{"post":{"operationId":"lockPool","summary":"Lock picks (permanent)","description":"Permanent: stops everyone's picks in the round taking picks (in a pool with one round, the whole pool). Anyone who hasn't picked a question yet is out of it. `round_id` is optional; if sent, it must name that round. Scope: host. Host scope: works only on a pool this account runs, as its host, or as an admin the host has allowed to do this (a host link is never accepted). Every player sees this action marked AGENT-ASSISTED in the pool's Action log (getPool: host_log, agent_assisted).","tags":["host"],"x-scope":"host","security":[{"bearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"description":"The pool's join code (e.g. A7X3) or its id (a UUID). Codes are reused once a pool is final; the id never is.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"round_id":{"type":"string","pattern":"^(r[0-9]+|current)$","description":"The round: its id (r1, r2, ...) from getPool, or \"current\" for the round taking picks. Refused (round-closed) unless it is that round."}}}}}},"responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostResult"}}}},"400":{"description":"The body is missing something or isn't valid (bad-request, confirm-required, bad-...).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No pool with that code or id (not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Refused by the pool's rules: closed, full, capped, stale... The message says why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pools/{code}/rounds":{"post":{"operationId":"createRound","summary":"Start the next round","description":"Starts the next round of questions (a week of matchups, say), with an optional name and its first questions; more can be added with addQuestion. Only once the round taking picks is locked: one round takes picks at a time (round-open otherwise). Its questions count toward the pool's open-question cap with every other uncalled question. How many rounds a pool can have depends on it: a pool without an account, or from before accounts, has one (round-cap); so does a Free pool, unless it was made from a Sleeper league; a Baller pool, or a Free pool made from a Sleeper league, can have up to 40. Anyone can join while the pool hasn't ended, and newcomers pick from the new round on. Starting a round on a finished pool reopens it, unless its join code has gone to another pool since (code-taken). Scope: host. Host scope: works only on a pool this account runs, as its host, or as an admin the host has allowed to do this (a host link is never accepted). Every player sees this action marked AGENT-ASSISTED in the pool's Action log (getPool: host_log, agent_assisted).","tags":["host"],"x-scope":"host","security":[{"bearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"description":"The pool's join code (e.g. A7X3) or its id (a UUID). Codes are reused once a pool is final; the id never is.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"title":{"type":"string","maxLength":40,"description":"The round's name, e.g. \"Week 7\". Without one it's \"Round N\"."},"questions":{"type":"array","items":{"oneOf":[{"type":"object","required":["text","options"],"properties":{"text":{"type":"string","maxLength":200,"description":"The question. No \"|\" or line breaks."},"options":{"type":"array","minItems":2,"items":{"type":"string","maxLength":60,"description":"An option. No \"|\" or line breaks."}}}},{"type":"string","description":"One line: \"Who wins? | Mike | Jordan\". No line breaks. The question up to 200 characters, each option up to 60."}]},"description":"Its first questions, as createPool takes them."},"deadline":{"type":"string","format":"date-time","description":"Optional: when its picks close, as setRoundDeadline takes it. When picks close, as ISO-8601 with an offset or Z, e.g. \"2026-10-25T13:00:00-04:00\". It must be in the future and before the pool ends. An admin needs the host's \"Lock picks\" permission for it as well as \"Add questions\"."}}}}}},"responses":{"201":{"description":"Done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostResult"}}}},"400":{"description":"The body is missing something or isn't valid (bad-request, confirm-required, bad-...).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No pool with that code or id (not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Refused by the pool's rules: closed, full, capped, stale... The message says why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pools/{code}/rounds/sleeper":{"get":{"operationId":"getSleeperRound","summary":"Preview the next week's round from Sleeper","description":"For a pool made from a Sleeper, Fleaflicker or Yahoo league (`provider` says which; the operation keeps its Sleeper name): the NFL week its next round would be, that week's head-to-head matchups from the league (each with its id, its two teams and the question it becomes), which ones startSleeperRound starts with by default (as many as the pool's open-question cap leaves room for: `room`), and when its picks would close (the week's first kickoff from the NFL schedule, or the usual Thursday 8:15 PM ET kickoff when the schedule has no time). Changes nothing. Refused for a pool not made from a Sleeper league (not-sleeper), after week 18 (sleeper-season-over), or while no round can start (round-open, round-cap, read-only). Needs the host, or an admin the host lets add questions. Scope: host.","tags":["host"],"x-scope":"host","security":[{"bearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"description":"The pool's join code (e.g. A7X3) or its id (a UUID). Codes are reused once a pool is final; the id never is.","schema":{"type":"string"}}],"responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"type":"object","properties":{"provider":{"type":"string","enum":["sleeper","fleaflicker","yahoo"],"description":"The platform the pool's league is on."},"week":{"type":"integer","description":"The NFL week the next round is built from."},"league_name":{"type":"string"},"room":{"type":["integer","null"],"description":"How many questions the round can start with under the open-question cap (null: no cap)."},"matchups":{"type":"array","items":{"type":"object","properties":{"id":{"type":"string","description":"The Sleeper matchup id, for matchup_ids."},"teams":{"type":"array","items":{"type":"string"},"minItems":2,"maxItems":2},"question":{"type":"string"}}}},"default_matchup_ids":{"type":"array","items":{"type":"string"},"description":"The matchups startSleeperRound uses when matchup_ids is left out: the first `room` of them."},"title":{"type":"string","description":"The round name it starts with unless one is given, e.g. \"Week 8\"."},"deadline":{"type":["string","null"],"description":"When its picks would close (UTC), or null for none."},"deadline_label":{"type":"string","description":"The same time in the pool's time_zone, when there is one."},"deadline_source":{"type":["string","null"],"enum":["kickoff","thursday-default",null],"description":"kickoff: the week's first kickoff from the NFL schedule. thursday-default: the schedule had no time, so the usual Thursday 8:15 PM ET kickoff. Null when there's no deadline."},"deadline_note":{"type":["string","null"],"enum":["passed","unavailable",null],"description":"Why there's no deadline: passed (the week has kicked off) or unavailable (no time known)."}}}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No pool with that code or id (not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"post":{"operationId":"startSleeperRound","summary":"Start the next week's round from Sleeper","description":"For a pool made from a Sleeper, Fleaflicker or Yahoo league (`provider` says which; the operation keeps its Sleeper name): starts its next round from the league's matchups for the next NFL week, the same as the host page's \"Start Week N from Sleeper\". The questions are built here from Sleeper's own data (\"Week 8: who wins, A or B?\"), never from the request. `week` is the week getSleeperRound showed: if the pool has moved on since, nothing starts (sleeper-week). `matchup_ids` picks which matchups go in (default: as many as the open-question cap leaves room for, in Sleeper's order); an id that isn't one of that week's matchups is refused (bad-matchups), and more than `room` is too-many-matchups. Picks close at the week's first kickoff, or the usual Thursday 8:15 PM ET kickoff when the NFL schedule has no time (signed SCHEDULE on the tape). Only once the round taking picks is locked (round-open). Needs the host, or an admin the host lets add questions. Scope: host. Host scope: works only on a pool this account runs, as its host, or as an admin the host has allowed to do this (a host link is never accepted). Every player sees this action marked AGENT-ASSISTED in the pool's Action log (getPool: host_log, agent_assisted).","tags":["host"],"x-scope":"host","security":[{"bearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"description":"The pool's join code (e.g. A7X3) or its id (a UUID). Codes are reused once a pool is final; the id never is.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["week"],"properties":{"week":{"type":"integer","minimum":1,"maximum":18,"description":"The NFL week, as getSleeperRound gave it."},"matchup_ids":{"type":"array","items":{"type":"string"},"minItems":1,"description":"Optional: which of the week's matchups become questions, by getSleeperRound's ids."},"title":{"type":"string","maxLength":40,"description":"Optional: the round's name. Without one it's \"Week N\"."}}}}}},"responses":{"201":{"description":"Done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostResult"}}}},"400":{"description":"The body is missing something or isn't valid (bad-request, confirm-required, bad-...).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No pool with that code or id (not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Refused by the pool's rules: closed, full, capped, stale... The message says why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pools/{code}/rounds/{round}/lock":{"post":{"operationId":"lockRound","summary":"Lock a round (permanent)","description":"Permanent: stops everyone's picks in that round. `round` is the round's id (r1, r2, ...), or current for the round taking picks; a round that's already locked is refused (round-closed). Its results can still be called afterwards. Scope: host. Host scope: works only on a pool this account runs, as its host, or as an admin the host has allowed to do this (a host link is never accepted). Every player sees this action marked AGENT-ASSISTED in the pool's Action log (getPool: host_log, agent_assisted).","tags":["host"],"x-scope":"host","security":[{"bearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"description":"The pool's join code (e.g. A7X3) or its id (a UUID). Codes are reused once a pool is final; the id never is.","schema":{"type":"string"}},{"name":"round","in":"path","required":true,"description":"The round: its id (r1, r2, ...) from getPool, or current for the round taking picks.","schema":{"type":"string","pattern":"^(r[0-9]+|current)$"}}],"responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostResult"}}}},"400":{"description":"No round with that id (no-such-round).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No pool with that code or id (not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Refused by the pool's rules: closed, full, capped, stale... The message says why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pools/{code}/questions/{question}/lock":{"post":{"operationId":"lockQuestion","summary":"Lock one question (permanent)","description":"Permanent: stops everyone's picks on this one question. Picks already made on it stay, and every other question keeps taking picks. `question` is the question's id (questions[].id from getPool). Only a question still taking picks: one already called is refused (already-called), so is one already locked (question-locked), or one in a round that isn't taking picks (round-closed). Its result can still be called afterwards. Scope: host. Host scope: works only on a pool this account runs, as its host, or as an admin the host has allowed to do this (a host link is never accepted). Every player sees this action marked AGENT-ASSISTED in the pool's Action log (getPool: host_log, agent_assisted).","tags":["host"],"x-scope":"host","security":[{"bearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"description":"The pool's join code (e.g. A7X3) or its id (a UUID). Codes are reused once a pool is final; the id never is.","schema":{"type":"string"}},{"name":"question","in":"path","required":true,"description":"The question's id (questions[].id from getPool).","schema":{"type":"string"}}],"responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostResult"}}}},"400":{"description":"No question with that id (no-such-prediction).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No pool with that code or id (not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Refused by the pool's rules: closed, full, capped, stale... The message says why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pools/{code}/rounds/{round}/deadline":{"put":{"operationId":"setRoundDeadline","summary":"Set or move a round's pick deadline","description":"Picks in the round close on their own at `deadline`, exactly then, as if the host locked them on time; in a pool with one round, that closes the pool's picks. `round` is the round's id (r1, r2, ...) or current; only the round taking picks can have its deadline set or moved (round-closed once its picks have closed). The deadline must be in the future (deadline-past) and before the pool ends (deadline-after-end). The pages show it in the pool's time zone (time_zone; setPoolSettings changes it). Setting the deadline it already has changes nothing. Scope: host. Host scope: works only on a pool this account runs, as its host, or as an admin the host has allowed to do this (a host link is never accepted). Every player sees this action marked AGENT-ASSISTED in the pool's Action log (getPool: host_log, agent_assisted).","tags":["host"],"x-scope":"host","security":[{"bearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"description":"The pool's join code (e.g. A7X3) or its id (a UUID). Codes are reused once a pool is final; the id never is.","schema":{"type":"string"}},{"name":"round","in":"path","required":true,"description":"The round: its id (r1, r2, ...) from getPool, or current for the round taking picks.","schema":{"type":"string","pattern":"^(r[0-9]+|current)$"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["deadline"],"properties":{"deadline":{"type":"string","format":"date-time","description":"When picks close, as ISO-8601 with an offset or Z, e.g. \"2026-10-25T13:00:00-04:00\". It must be in the future and before the pool ends."}}}}}},"responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostResult"}}}},"400":{"description":"No round with that id (no-such-round).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No pool with that code or id (not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Refused by the pool's rules: closed, full, capped, stale... The message says why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"clearRoundDeadline","summary":"Clear a round's pick deadline","description":"Takes the deadline off the round taking picks, so its picks stay open until the host locks them. Only before the deadline passes (round-closed after). Clearing a round that has no deadline changes nothing. Scope: host. Host scope: works only on a pool this account runs, as its host, or as an admin the host has allowed to do this (a host link is never accepted). Every player sees this action marked AGENT-ASSISTED in the pool's Action log (getPool: host_log, agent_assisted).","tags":["host"],"x-scope":"host","security":[{"bearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"description":"The pool's join code (e.g. A7X3) or its id (a UUID). Codes are reused once a pool is final; the id never is.","schema":{"type":"string"}},{"name":"round","in":"path","required":true,"description":"The round: its id (r1, r2, ...) from getPool, or current for the round taking picks.","schema":{"type":"string","pattern":"^(r[0-9]+|current)$"}}],"responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostResult"}}}},"400":{"description":"No round with that id (no-such-round).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No pool with that code or id (not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Refused by the pool's rules: closed, full, capped, stale... The message says why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pools/{code}/results":{"post":{"operationId":"callResult","summary":"Call or uncall a result (needs version)","description":"Call a result ({question_id, option, version}) or take one back ({question_id, uncall: true, version}). Calling scores everyone. A call can be taken back until the pool ends; after that it's final. `version` is required: read it from getPool (questions[].version). If the result changed since, the answer is stale and nothing changes. Scope: host. Host scope: works only on a pool this account runs, as its host, or as an admin the host has allowed to do this (a host link is never accepted). Every player sees this action marked AGENT-ASSISTED in the pool's Action log (getPool: host_log, agent_assisted).","tags":["host"],"x-scope":"host","security":[{"bearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"description":"The pool's join code (e.g. A7X3) or its id (a UUID). Codes are reused once a pool is final; the id never is.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"oneOf":[{"type":"object","title":"Call","required":["question_id","option","version"],"properties":{"question_id":{"type":"string"},"option":{"oneOf":[{"type":"integer","minimum":0,"description":"The option's index (0-based)."},{"type":"string","description":"The option's label (case and spacing ignored)."}],"description":"The winning option, by index or label."},"uncall":{"const":false},"version":{"type":"integer","minimum":0}}},{"type":"object","title":"Uncall","required":["question_id","uncall","version"],"properties":{"question_id":{"type":"string"},"uncall":{"const":true,"description":"Takes the call back."},"version":{"type":"integer","minimum":0}}}]}}}},"responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostResult"}}}},"400":{"description":"The body is missing something or isn't valid (bad-request, confirm-required, bad-...).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No pool with that code or id (not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Refused by the pool's rules: closed, full, capped, stale... The message says why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pools/{code}/end-date":{"put":{"operationId":"setEndDate","summary":"Set the end date","description":"The pool closes, read-only, at the end of that day. Setting the date it already has changes nothing. Refused (end-before-deadline) if the round taking picks has a deadline at or after that end: move or clear the deadline first. Scope: host. Host scope: works only on a pool this account runs, as its host, or as an admin the host has allowed to do this (a host link is never accepted). Every player sees this action marked AGENT-ASSISTED in the pool's Action log (getPool: host_log, agent_assisted).","tags":["host"],"x-scope":"host","security":[{"bearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"description":"The pool's join code (e.g. A7X3) or its id (a UUID). Codes are reused once a pool is final; the id never is.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["ends_on"],"properties":{"ends_on":{"type":"string","pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"A day, as \"YYYY-MM-DD\". The pool closes at the end of that day."}}}}}},"responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostResult"}}}},"400":{"description":"The body is missing something or isn't valid (bad-request, confirm-required, bad-...).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No pool with that code or id (not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Refused by the pool's rules: closed, full, capped, stale... The message says why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}},"delete":{"operationId":"clearEndDate","summary":"Clear the end date","description":"Takes the end date off. Scope: host. Host scope: works only on a pool this account runs, as its host, or as an admin the host has allowed to do this (a host link is never accepted). Every player sees this action marked AGENT-ASSISTED in the pool's Action log (getPool: host_log, agent_assisted).","tags":["host"],"x-scope":"host","security":[{"bearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"description":"The pool's join code (e.g. A7X3) or its id (a UUID). Codes are reused once a pool is final; the id never is.","schema":{"type":"string"}}],"responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostResult"}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No pool with that code or id (not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Refused by the pool's rules: closed, full, capped, stale... The message says why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pools/{code}/title":{"put":{"operationId":"renamePool","summary":"Rename the pool","description":"Changes the pool's name. Every player sees the new name: on their page, the join page, their account page and the results receipt. The join code and links stay the same. Works while the pool is open, locked or being called, not once it has ended. Renaming it to the name it already has changes nothing. Scope: host. Host scope: works only on a pool this account runs, as its host, or as an admin the host has allowed to do this (a host link is never accepted). Every player sees this action marked AGENT-ASSISTED in the pool's Action log (getPool: host_log, agent_assisted).","tags":["host"],"x-scope":"host","security":[{"bearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"description":"The pool's join code (e.g. A7X3) or its id (a UUID). Codes are reused once a pool is final; the id never is.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["title"],"properties":{"title":{"type":"string","minLength":1,"maxLength":60,"description":"The new name, up to 60 characters."}}}}}},"responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostResult"}}}},"400":{"description":"The body is missing something or isn't valid (bad-request, confirm-required, bad-...).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No pool with that code or id (not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Refused by the pool's rules: closed, full, capped, stale... The message says why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pools/{code}/settings":{"put":{"operationId":"setPoolSettings","summary":"Change pool settings: player invites, question proposals, the tiebreak, the time zone","description":"Send any of the settings. `players_can_propose` turns \"Players can propose questions\" on or off: off by default; when it's on, players can propose questions for the host to add or not (proposeQuestion), and an admin needs \"Add questions\" for it. `players_can_invite` turns \"Players can invite\" on or off: off by default, so only the host can invite. When it's on, players get the pool's invite on their page and in getPool (`invite`), while the pool can take players; it changes only while the pool is open. Receipts never sends invites itself. `tiebreak` is how standings rank equal points: \"share\" (the default: they share the position) or \"success\" (higher % success ranks first, sharing only if that's equal too); it applies to every table in the pool, its receipts included. `time_zone` is the zone the pages show deadlines in (an IANA name from the list; America/New_York until changed); an admin needs \"Lock picks\" for it, as it goes with deadlines. An admin needs the host's permission for each setting. Setting one to what it already is changes nothing. Scope: host. Host scope: works only on a pool this account runs, as its host, or as an admin the host has allowed to do this (a host link is never accepted). Every player sees this action marked AGENT-ASSISTED in the pool's Action log (getPool: host_log, agent_assisted).","tags":["host"],"x-scope":"host","security":[{"bearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"description":"The pool's join code (e.g. A7X3) or its id (a UUID). Codes are reused once a pool is final; the id never is.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"players_can_invite":{"type":"boolean","description":"true: players can invite people too. false: only the host can."},"players_can_propose":{"type":"boolean","description":"true: players can propose questions to the host. false: they can't."},"tiebreak":{"type":"string","enum":["share","success"],"description":"share: equal points share a position. success: % success breaks the tie."},"time_zone":{"type":"string","enum":["America/New_York","America/Chicago","America/Denver","America/Phoenix","America/Los_Angeles","America/Anchorage","Pacific/Honolulu","America/Halifax","America/St_Johns","America/Mexico_City","America/Sao_Paulo","Europe/London","Europe/Dublin","Europe/Lisbon","Europe/Paris","Europe/Berlin","Europe/Madrid","Asia/Kolkata","Asia/Tokyo","Australia/Sydney","Pacific/Auckland","UTC"],"description":"The pool's time zone, an IANA name: the pages show every deadline in it, named (\"Picks close Sun Oct 25, 1:00 PM ET (New York time)\"). America/New_York until the host picks one."}},"anyOf":[{"required":["players_can_invite"]},{"required":["players_can_propose"]},{"required":["tiebreak"]},{"required":["time_zone"]}]}}}},"responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostResult"}}}},"400":{"description":"The body is missing something or isn't valid (bad-request, confirm-required, bad-...).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No pool with that code or id (not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Refused by the pool's rules: closed, full, capped, stale... The message says why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/pools/{code}/end":{"post":{"operationId":"endPool","summary":"End the pool now (permanent, needs confirm: true)","description":"Permanent: the pool goes read-only for good, with no new players, picks or results. Needs {\"confirm\": true}: without it the answer is confirm-required. Scope: host. Host scope: works only on a pool this account runs, as its host, or as an admin the host has allowed to do this (a host link is never accepted). Every player sees this action marked AGENT-ASSISTED in the pool's Action log (getPool: host_log, agent_assisted).","tags":["host"],"x-scope":"host","security":[{"bearerAuth":[]}],"parameters":[{"name":"code","in":"path","required":true,"description":"The pool's join code (e.g. A7X3) or its id (a UUID). Codes are reused once a pool is final; the id never is.","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","required":["confirm"],"properties":{"confirm":{"const":true}}}}}},"responses":{"200":{"description":"Done.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HostResult"}}}},"400":{"description":"The body is missing something or isn't valid (bad-request, confirm-required, bad-...).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"401":{"description":"No token, or not a current one (reason unauthorized).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"403":{"description":"The token lacks this operation's scope (forbidden-scope), or this account doesn't run the pool (not-owner), or it's an admin the host hasn't allowed this (not-permitted), or the host removed this account (removed).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No pool with that code or id (not-found).","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"409":{"description":"Refused by the pool's rules: closed, full, capped, stale... The message says why.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Too many requests (rate-limited). Wait a minute; see Retry-After.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"securitySchemes":{"bearerAuth":{"type":"http","scheme":"bearer","bearerFormat":"igr_...","description":"A personal access token. The account owner makes one on their account page (/account, under \"Connect an assistant\") and chooses its scopes: read, play, host."}},"schemas":{"Error":{"type":"object","required":["error"],"properties":{"error":{"type":"object","required":["reason","message"],"properties":{"reason":{"type":"string","enum":["bad-request","no-endpoint","unauthorized","forbidden-scope","rate-limited","confirm-required","server-error","not-found","not-owner","not-permitted","access-changed","account-removed","already-called","already-playing","question-locked","side-pool-only","bad-date","bad-deadline","bad-name","bad-option","bad-pool","bad-question","bad-round-title","bad-tiebreak","bad-time-zone","bad-title","capped","closed","code-taken","deadline-after-end","deadline-past","end-before-deadline","finished","full","left","no-code","no-name","no-such-guest","no-such-prediction","no-such-round","not-called","not-current","not-in-pool","not-joined","not-open","past","past-window","question-cap","read-only","rejected","removed","round-cap","round-closed","round-open","secret-cap","secret-runner","stale","bad-matchups","not-sleeper","sleeper-league-gone","sleeper-no-matchups","sleeper-no-room","sleeper-season-over","sleeper-unavailable","yahoo-not-connected","sleeper-week","too-many-matchups","no-such-proposal","proposal-decided","proposal-limit","proposals-off","runs-pool"]},"message":{"type":"string","description":"Why, in one plain sentence."}}},"applied":{"type":"array","items":{"type":"string"},"description":"makePicks only: the picks that went in before the refusal."},"limit":{"type":"string","enum":["hosted-pools","played-pools"],"description":"With reason capped: which account limit was hit."}}},"PoolSummary":{"type":"object","properties":{"id":{"type":"string","format":"uuid"},"code":{"type":"string","description":"The join code. Reused once a pool is final; the id never is."},"title":{"type":"string"},"status":{"type":"string","enum":["open","locked","final","closed","unavailable"],"description":"unavailable: only in listMyPools' playing list, when the pool couldn't be read just now."},"ends_on":{"type":["string","null"],"pattern":"^\\d{4}-\\d{2}-\\d{2}$","description":"The host's end date, or null."},"join_url":{"type":"string","format":"uri"},"role":{"type":"string","enum":["host","admin","player"],"description":"listMyPools: what this account is in the pool."},"admin_permissions":{"type":"array","items":{"type":"string","enum":["questions","lock","results","end-date","rename","players","invites","accounts","tiebreak"]},"description":"listMyPools, admin_of only: the host actions the host lets this account take."}}},"Round":{"type":"object","description":"A round of questions in the pool (a week of fantasy matchups, say). Every pool has at least one; a pool from before rounds is one round with no title.","properties":{"id":{"type":"string","description":"r1, r2, ..."},"number":{"type":"integer","description":"Its place in the pool, from 1."},"title":{"type":["string","null"]},"status":{"type":"string","enum":["open","locked"],"description":"open: taking picks. A lock is permanent."},"deadline":{"type":["string","null"],"format":"date-time","description":"When picks in this round close on their own (setRoundDeadline), or null. Picks close exactly then."},"deadline_label":{"type":"string","description":"Only with a deadline: it as the pages show it, in the pool's time zone, e.g. \"Sun Oct 25, 1:00 PM ET (New York time)\"."},"receipt_url":{"type":"string","format":"uri","description":"Only in a pool with more than one round: this round's own results receipt (public, like the pool's). A pool with one round has just the pool's receipt."}}},"Question":{"type":"object","properties":{"id":{"type":"string"},"number":{"type":"integer","description":"Its number in the whole pool, from 1."},"round_id":{"type":"string","description":"The round it belongs to (rounds[].id)."},"number_in_round":{"type":"integer","description":"Its number within its round, from 1."},"text":{"type":"string"},"options":{"type":"array","items":{"type":"string"}},"result":{"type":["object","null"],"properties":{"index":{"type":"integer"},"option":{"type":"string"}}},"my_pick":{"type":["object","null"],"properties":{"index":{"type":"integer"},"option":{"type":"string"},"via":{"type":"string","enum":["web","agent"]}}},"correct":{"type":["boolean","null"]},"locked":{"type":"boolean","description":"Only on a question the host locked on its own (lockQuestion) that isn't called yet: it takes no more picks, while the rest of the pool may."},"side_pool":{"type":"object","properties":{"visible_to":{"type":"array","items":{"type":"string"}}},"description":"Only on a side pool's question, before its result is called: the names of the players it's visible to (besides whoever runs the pool). Nobody else gets any part of the question in any response until it's called."},"version":{"type":"integer","description":"The host and admins only. Send it with callResult, so a retry never re-calls a corrected result."}}},"Standing":{"type":"object","properties":{"position":{"type":"integer","description":"Equal points share a position."},"name":{"type":"string"},"score":{"type":"integer"},"you":{"type":"boolean"},"success":{"type":"object","description":"Only in a pool with more than one round: how often they call it right. `rate` is correct ÷ called (the called questions they picked on), null before they have one.","properties":{"rate":{"type":["number","null"]},"correct":{"type":"integer"},"called":{"type":"integer"}}},"left":{"type":"boolean","description":"Only in a pool with more than one round: they left the pool; their earlier picks still count."}}},"HostAction":{"type":"object","properties":{"kind":{"type":"string"},"label":{"type":"string"},"via":{"type":"string","enum":["web","agent"]},"actor":{"oneOf":[{"type":"object","required":["role"],"properties":{"role":{"type":"string","enum":["host","admin","schedule","auto"]},"name":{"type":"string","description":"An admin's name as a player in this pool."}}},{"type":"null"}],"description":"Who signed it: {\"role\": \"host\"}, or {\"role\": \"admin\", \"name\": \"Mike\"} for a pool admin, or {\"role\": \"schedule\"} for a round closing at its deadline (signed DEADLINE on the tape). Null for actions from before host actions were signed."},"at":{"type":"string","format":"date-time"},"token_id":{"type":["string","null"],"description":"Owner only: which connection made it."}}},"Pool":{"description":"What this account can see of the pool, as the web shows it. `access: full` (the host, or a current player, admins included): everything below. `access: summary` (anyone else with the code): the summary fields, `joinable`, `full` and `question_count`, plus `standings`, `host_log` and `agent_assisted` once it can't be joined (as a latecomer sees on the web); never the questions or anyone's picks. `access: removed` (the host took this account off): only id, code, title, join_url and `you`.","allOf":[{"$ref":"#/components/schemas/PoolSummary"},{"type":"object","required":["access","you"],"properties":{"access":{"type":"string","enum":["full","summary","removed"]},"joinable":{"type":"boolean","description":"Summary only: open, not full, so join_pool would work."},"full":{"type":"boolean","description":"Summary only: at its player cap."},"question_count":{"type":"integer","description":"Summary only: how many questions it has, in every round."},"round_question_count":{"type":"integer","description":"Summary only, in a pool with more than one round: how many questions the latest round has."},"requires_account":{"type":"boolean"},"time_zone":{"type":"string","enum":["America/New_York","America/Chicago","America/Denver","America/Phoenix","America/Los_Angeles","America/Anchorage","Pacific/Honolulu","America/Halifax","America/St_Johns","America/Mexico_City","America/Sao_Paulo","Europe/London","Europe/Dublin","Europe/Lisbon","Europe/Paris","Europe/Berlin","Europe/Madrid","Asia/Kolkata","Asia/Tokyo","Australia/Sydney","Pacific/Auckland","UTC"],"description":"Full access only, once the host has picked a time zone or set a deadline: the zone the pages show deadlines in. Absent means America/New_York."},"players_can_invite":{"type":"boolean","description":"Full access only: whether the host lets players invite people too (setPoolSettings). Off by default."},"players_can_propose":{"type":"boolean","description":"Full access only, for the host and admins, or a player once proposals are on (or they have made one): whether the host lets players propose questions (setPoolSettings). Off by default."},"proposals":{"type":"array","description":"The host and admins only, once proposals are on or any are waiting: the questions players proposed that wait for a decision, oldest first, each with `name`, the player who proposed it. Players can propose questions to the host once the host turns on players_can_propose (setPoolSettings; off by default), while the pool is taking picks. A proposal is seen only by the player who made it and whoever runs the pool (the host and its admins), never on the Action log or the results receipt. Each player can have 2 waiting for a decision at once in a pool, or 10 when the host or that player is on Baller; once the host adds one or declines it, the slot frees up. An added proposal becomes an ordinary question, with nothing saying who proposed it.","items":{"type":"object","properties":{"id":{"type":"string","description":"The proposal: acceptProposal and declineProposal take it."},"text":{"type":"string"},"options":{"type":"array","items":{"type":"string"}},"name":{"type":"string"}}}},"proposals_allowed":{"type":"boolean","description":"A player only, once proposals are on (or they have made one): whether this account can propose a question now (proposeQuestion), before its limit."},"proposal_limit":{"type":"integer","description":"With proposals_allowed: how many proposals this account can have waiting at once here."},"proposals_waiting":{"type":"integer","description":"With proposals_allowed: how many of this account's proposals wait for a decision."},"my_proposals":{"type":"array","description":"With proposals_allowed: this account's own proposals, newest first, each with `status`: pending (waiting for the host), accepted (added as a question) or declined.","items":{"type":"object","properties":{"id":{"type":"string","description":"The proposal: acceptProposal and declineProposal take it."},"text":{"type":"string"},"options":{"type":"array","items":{"type":"string"}},"status":{"type":"string","enum":["pending","accepted","declined"]}}}},"tiebreak":{"type":"string","enum":["share","success"],"description":"How the standings rank equal points (setPoolSettings): share (they share the position, the default) or success (% success breaks the tie). Given in a pool with more than one round, or once it is set; absent means share."},"invite":{"type":"object","required":["text","url"],"description":"Only for someone who may invite people: the owner, or a player once the host turns on players_can_invite; and only while the pool can take players (open, not full, not ended). `invite.text` is the pool's standard invite, for the person to send from their own email or messages. Receipts doesn't send invites itself.","properties":{"text":{"type":"string","description":"The invite, link included. Send it as written."},"url":{"type":"string","format":"uri","description":"The pool's join link."}}},"you":{"type":"object","properties":{"owner":{"type":"boolean","description":"This account is the host."},"role":{"type":"string","enum":["host","admin","player"],"description":"Full access only. admin: the host made this account a pool admin."},"admin_permissions":{"type":"array","items":{"type":"string","enum":["questions","lock","results","end-date","rename","players","invites","accounts","tiebreak"]},"description":"Admins only: the host actions the host lets this account take here."},"playing":{"type":"boolean"},"name":{"type":["string","null"]},"score":{"type":["integer","null"]},"position":{"type":["integer","null"]},"removed":{"type":"boolean"},"next_question_id":{"type":["string","null"],"description":"Picks go in order: the earliest question this account hasn't picked."},"round_progress":{"type":"object","description":"Only in a pool with more than one round: this account's progress through the latest round's questions alone. `askable` leaves out questions called before it picked them.","properties":{"round_id":{"type":"string"},"total":{"type":"integer"},"answered":{"type":"integer"},"askable":{"type":"integer"}}},"left":{"type":"boolean","description":"Only in a pool with more than one round: this account left it, so it picks in no more rounds."}}},"rounds":{"type":"array","items":{"$ref":"#/components/schemas/Round"},"description":"Full access only: every round, oldest first."},"current_round_id":{"type":["string","null"],"description":"Full access only: the round taking picks, or null when none is."},"source":{"type":["object","null"],"description":"Full access only, and only in a pool with more than one round or one made from a fantasy league: where its questions come from. {kind: 'sleeper', league: '<Sleeper league ID>'} for a pool made from a Sleeper league (which can run more rounds on Free), null otherwise.","properties":{"kind":{"type":"string","enum":["sleeper"]},"league":{"type":"string"}}},"next_sleeper_round":{"type":"object","description":"Host and admins only, in a pool made from a Sleeper, Fleaflicker or Yahoo league (`provider` says which): whether its next NFL week can start from the league now (getSleeperRound, startSleeperRound). `week` is null once week 18 is used; `reason` says why it can't start (round-open, round-cap, read-only, sleeper-season-over), null when it can; `room` is how many questions the open-question cap leaves (null: no cap).","properties":{"provider":{"type":"string","enum":["sleeper","fleaflicker","yahoo"]},"week":{"type":["integer","null"]},"can_start":{"type":"boolean"},"reason":{"type":["string","null"]},"room":{"type":["integer","null"]}}},"questions":{"type":"array","items":{"$ref":"#/components/schemas/Question"}},"standings":{"type":"array","description":"The whole pool: every round together.","items":{"$ref":"#/components/schemas/Standing"}},"round_standings":{"type":"object","description":"Full access only: the latest round's own table, counting only its questions.","properties":{"round_id":{"type":"string"},"standings":{"type":"array","items":{"$ref":"#/components/schemas/Standing"}}}},"host_actions":{"type":"array","items":{"$ref":"#/components/schemas/HostAction"}},"host_log":{"type":"array","items":{"type":"string"},"description":"The tape every player sees: each signed host action, e.g. \"LOCKED · HOST · OCT 13, 7:02 PM UTC\", with AGENT-ASSISTED before the time when an assistant made it."},"agent_assisted":{"type":"array","items":{"type":"string"},"description":"Only the AGENT-ASSISTED lines from the tape."},"usage":{"type":"object","description":"Owner only: players and questions against the caps."},"players":{"type":"integer","description":"Owner only: how many players have a name on the board."}}}]},"PoolResponse":{"type":"object","properties":{"pool":{"$ref":"#/components/schemas/Pool"}}},"HostResult":{"type":"object","properties":{"ok":{"const":true},"unchanged":{"type":"boolean","description":"True when nothing changed, so nothing was recorded."},"action":{"oneOf":[{"$ref":"#/components/schemas/HostAction"},{"type":"null"}]},"note":{"type":"string","description":"How the action was recorded."},"question_id":{"type":"string","description":"addQuestion and acceptProposal only: the new question."},"proposal_id":{"type":"string","description":"acceptProposal only: the proposal it was."},"round_id":{"type":"string","description":"createRound and startSleeperRound only: the new round (r2, r3, ...)."},"provider":{"type":"string","enum":["sleeper","fleaflicker","yahoo"],"description":"startSleeperRound only: the platform the pool's league is on."},"week":{"type":"integer","description":"startSleeperRound only: the NFL week the new round was built from."},"matchup_ids":{"type":"array","items":{"type":"string"},"description":"startSleeperRound only: the league matchups that became its questions."},"pool":{"$ref":"#/components/schemas/Pool"}}}}}}