{"openapi":"3.1.0","info":{"title":"TipMaster consensus feed","version":"1.0.0","summary":"Aggregated predictions of TipMaster’s human players, per real football match.","description":"Read-only, no authentication, 60 requests per minute per IP. Aggregates only: no odds, no user identities, no bookmaker links. Classic consensus is live while tipping is open; National and World Tour consensus appears once a fixture is locked. Please link to https://tipmaster.net/agents/ when you cite the data.","termsOfService":"https://tipmaster.net/agents/terms/","contact":{"name":"TipMaster","url":"https://tipmaster.net/agents/"},"license":{"name":"TipMaster terms of use","url":"https://tipmaster.net/terms/"}},"security":[],"servers":[{"url":"https://tipmaster.net"}],"paths":{"/api/agent/v1/matches":{"get":{"operationId":"listMatches","summary":"Published matches without the consensus fields","parameters":[{"name":"mode","in":"query","required":false,"schema":{"type":"string","enum":["classic","national","worldtour"]},"description":"Restrict to one game mode. Omit for all."},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["open","locked","played","cancelled"]},"description":"Restrict to one match status. Omit for all."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"generatedAt":{"type":"string","format":"date-time"},"matches":{"type":"array","items":{"$ref":"#/components/schemas/MatchSummary"}}},"required":["ok","generatedAt","matches"]}}}},"400":{"description":"Bad mode, status or id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Per-IP rate limit (60/min) exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/agent/v1/consensus":{"get":{"operationId":"getConsensus","summary":"Published matches with the crowd’s 1X2 shares, scorelines and expert cohort","parameters":[{"name":"mode","in":"query","required":false,"schema":{"type":"string","enum":["classic","national","worldtour"]},"description":"Restrict to one game mode. Omit for all."},{"name":"status","in":"query","required":false,"schema":{"type":"string","enum":["open","locked","played","cancelled"]},"description":"Restrict to one match status. Omit for all."}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"generatedAt":{"type":"string","format":"date-time"},"matches":{"type":"array","items":{"$ref":"#/components/schemas/ConsensusMatch"}}},"required":["ok","generatedAt","matches"]}}}},"400":{"description":"Bad mode, status or id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Per-IP rate limit (60/min) exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}},"/api/agent/v1/consensus/{id}":{"get":{"operationId":"getConsensusById","summary":"One match by id","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","pattern":"^(classic:(btm|tmi):\\d{1,3}:\\d{1,2}|daily:\\d{1,9})$","examples":["classic:btm:7:14","daily:4821"]}}],"responses":{"200":{"description":"OK","content":{"application/json":{"schema":{"type":"object","properties":{"ok":{"type":"boolean","const":true},"match":{"$ref":"#/components/schemas/ConsensusMatch"}},"required":["ok","match"]}}}},"400":{"description":"Bad mode, status or id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"404":{"description":"No published match with that id","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Per-IP rate limit (60/min) exceeded","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}},"components":{"schemas":{"Outcome":{"type":"object","description":"Shares of the sample, each 0..1, summing to 1 within rounding.","properties":{"home":{"type":"number"},"draw":{"type":"number"},"away":{"type":"number"}},"required":["home","draw","away"]},"Scoreline":{"type":"object","properties":{"home":{"type":"integer"},"away":{"type":"integer"},"share":{"type":"number"}},"required":["home","away","share"]},"ExpertConsensus":{"type":"object","properties":{"sample":{"type":"integer"},"outcome":{"oneOf":[{"$ref":"#/components/schemas/Outcome"},{"type":"null"}]},"weighting":{"type":"string","enum":["weltrang","classic_tier"]}},"required":["sample","outcome","weighting"]},"MatchResult":{"type":"object","properties":{"home":{"type":"integer"},"away":{"type":"integer"}},"required":["home","away"]},"MatchSummary":{"type":"object","properties":{"id":{"type":"string","pattern":"^(classic:(btm|tmi):\\d{1,3}:\\d{1,2}|daily:\\d{1,9})$","examples":["classic:btm:7:14","daily:4821"]},"mode":{"type":"string","enum":["classic","national","worldtour"]},"competition":{"type":"string"},"round":{"type":"integer"},"home":{"type":["string","null"]},"away":{"type":["string","null"]},"kickoffUtc":{"type":["integer","null"],"description":"unix seconds"},"deadlineUtc":{"type":["integer","null"],"description":"unix seconds; when the crowd’s picks froze"},"status":{"type":"string","enum":["open","locked","played","cancelled"]},"result":{"oneOf":[{"$ref":"#/components/schemas/MatchResult"},{"type":"null"}]}},"required":["id","mode","competition","round","home","away","kickoffUtc","deadlineUtc","status","result"]},"ConsensusMatch":{"allOf":[{"$ref":"#/components/schemas/MatchSummary"},{"type":"object","properties":{"sample":{"type":"integer","description":"tippers counted for this match"},"skipped":{"type":"integer","description":"unreadable tip files (Classic only)"},"minCohort":{"type":"integer","const":20},"outcome":{"oneOf":[{"$ref":"#/components/schemas/Outcome"},{"type":"null"}],"description":"null while sample < minCohort"},"reason":{"type":"string","enum":["below_min_cohort"]},"scorelines":{"oneOf":[{"type":"array","items":{"$ref":"#/components/schemas/Scoreline"}},{"type":"null"}],"description":"top 3 exact scores (Daily modes only)"},"expert":{"oneOf":[{"$ref":"#/components/schemas/ExpertConsensus"},{"type":"null"}]},"updatedAt":{"type":"string","format":"date-time"},"source":{"type":"string","format":"uri"}},"required":["sample","skipped","minCohort","outcome","scorelines","expert","updatedAt","source"]}]},"Error":{"type":"object","properties":{"ok":{"type":"boolean","const":false},"reason":{"type":"string"}},"required":["ok","reason"]}}},"externalDocs":{"description":"Feed documentation and MCP endpoint","url":"https://tipmaster.net/agents/"}}