{"openapi":"3.1.0","info":{"title":"Platform Rating API","version":"1.0.0","description":"Versioned read-only API for validated platform-rating observations and the Equal Mean v1 composite. Requests never trigger collection."},"x-source-metrics":{"casino_guru":{"sourceName":"Casino Guru","metric":"safety_index","sourceLabel":"Safety Index","displayName":"Safety Index","adminName":"Safety Index（安全指数，10 分制）","max":10,"kind":"safety_index","excluded":["玩家评分","用户评论分"],"location":"Casino Guru 平台评测页的 Safety Index 区域。","screenshotPosition":"同时截取平台名称、Safety Index 标题和数值；不以用户评论区代替。"},"askgamblers":{"sourceName":"AskGamblers","metric":"casino_rank","sourceLabel":"Our Rating","displayName":"CasinoRank","adminName":"Our Rating（编辑评分，CasinoRank，10 分制）","max":10,"kind":"editorial","excluded":["旧指标（不计入）","玩家评论分","排名序号"],"location":"AskGamblers 评测页顶部的 Our Rating；不使用旧指标或玩家评论分。","screenshotPosition":"保留平台名称、Our Rating 标题、数值与满分；同时截入相邻指标的标题以便区别。"},"casino_org":{"sourceName":"Casino.org","metric":"overall_rating","sourceLabel":"Overall Rating","displayName":"Overall Rating","adminName":"Overall Rating（整体评分，5 分制）","max":5,"kind":"editorial","excluded":["分项评分","未经确认的其他满分"],"location":"Casino.org 对应平台评测页的整体评分区域。","screenshotPosition":"保留平台名称、整体评分标签与满分；不使用支付、奖金等单项分数。"},"lcb":{"sourceName":"LCB","metric":"player_rating","sourceLabel":"Player rating","displayName":"Player rating","adminName":"Player rating（玩家评分，5 分制）","max":5,"kind":"player","excluded":["编辑分","评论数量","排名序号"],"location":"LCB 平台页面的玩家整体评分区域。","screenshotPosition":"保留平台名称、玩家评分标签、数值与满分；评论数不是分数。"},"trustpilot":{"sourceName":"Trustpilot","metric":"trustscore","sourceLabel":"TrustScore","displayName":"TrustScore","adminName":"TrustScore（5 分制）；Consumer Warning 按 0 计入","max":5,"kind":"consumer_reviews","excluded":["显示星级代替 TrustScore","评论数量代替分数"],"location":"Trustpilot 对应域名页的 TrustScore；Consumer Warning 是单独状态。","screenshotPosition":"保留域名、TrustScore 数字，或完整 Consumer Warning 提示；不凭星形图估分。"}},"x-changelog":[{"date":"2026-10-22","release":"R1.3","description":"AG uses Our Rating (CasinoRank). Genuine legacy AG history is exposed with the neutral legacy_excluded metric identifier, never relabelled CasinoRank. Stored facts, historical numbers and check dates remain unchanged; LCB is unaffected."},{"date":"2026-10-22","release":"R1.2","description":"AskGamblers casino_rank means Our Rating (editorial, out of 10). Approved legacy manual labels are corrected append-only without changing scores or check dates. LCB player_rating remains the player rating. Deferred AG legacy pages retain their original metric until a real Our Rating review."}],"paths":{"/api/v1/platforms/{slug}/ratings/history":{"get":{"operationId":"getPlatformRatingHistory","summary":"Read monthly month-end state on the fixed 10-point scale","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string","maxLength":120,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"}},{"name":"months","in":"query","required":false,"schema":{"oneOf":[{"type":"integer","minimum":1,"maximum":240,"default":12},{"type":"string","enum":["all"]}]}}],"responses":{"200":{"description":"One point per Hong Kong calendar month. Current month is partial; gaps remain null. No collection is triggered.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/RatingHistory"}}}},"400":{"description":"Malformed key or window parameters.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"properties":{"error":{"enum":["invalid_platform_slug","invalid_input"]}}}]}}}},"404":{"description":"No public platform has this key.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"properties":{"error":{"enum":["platform_not_found"]}}}]}}}},"503":{"description":"History temporarily unavailable.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"properties":{"error":{"enum":["history_unavailable"]}}}]}}}}}}},"/api/v1/logos/{id}":{"get":{"operationId":"getPlatformLogo","summary":"Read the current public platform LOGO (WebP, at most 80,000 bytes)","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string","format":"uuid"}}],"responses":{"200":{"description":"Static WebP image. ETag and one-day public cache; internal platforms require an administrator session.","content":{"image/webp":{"schema":{"type":"string","format":"binary"}}}},"304":{"description":"ETag matches the current asset."},"404":{"description":"No currently linked accessible asset, or asset unavailable."}}}},"/api/v1/platforms/{slug}/ratings":{"get":{"operationId":"getPlatformRatings","summary":"Read current validated ratings for one platform","parameters":[{"name":"slug","in":"path","required":true,"description":"Lowercase platform key.","schema":{"type":"string","maxLength":120,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"}}],"responses":{"200":{"description":"Five source groups from one database-time snapshot.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/PlatformRatings"}}}},"400":{"description":"The platform key is malformed.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"properties":{"error":{"enum":["invalid_platform_slug"]}}}]}}}},"404":{"description":"No platform has this key.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"properties":{"error":{"enum":["platform_not_found"]}}}]}}}},"503":{"description":"The ratings service is not configured or temporarily unavailable.","content":{"application/json":{"schema":{"allOf":[{"$ref":"#/components/schemas/Error"},{"properties":{"error":{"enum":["database_not_configured","ratings_unavailable"]}}}]}}}}}}}},"components":{"schemas":{"RatingHistory":{"type":"object","properties":{"apiVersion":{"type":"number","const":1},"platformId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"generatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"timezone":{"type":"string","const":"Asia/Hong_Kong"},"basis":{"type":"string","const":"month_end_state"},"scaleMax":{"type":"number","const":10},"historyStartedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"truncated":{"type":"boolean"},"points":{"maxItems":240,"type":"array","items":{"type":"object","properties":{"month":{"type":"string","pattern":"^\\d{4}-\\d{2}$"},"asOf":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"snapshotAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"snapshotId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"partial":{"type":"boolean"},"baselinePartial":{"type":"boolean"},"composite":{"type":"object","properties":{"formula":{"type":"string","const":"equal_mean_v1"},"score":{"anyOf":[{"type":"number","minimum":0,"maximum":10},{"type":"null"}]},"scaleMax":{"type":"number","const":10},"includedSourceCount":{"type":"integer","minimum":0,"maximum":5},"coverageStatus":{"type":"string","enum":["unavailable","provisional","established"]},"minimumSourceCount":{"type":"number","const":3},"lowScoreCount":{"type":"integer","minimum":0,"maximum":5},"warningCount":{"type":"integer","minimum":0,"maximum":5},"contributions":{"minItems":5,"maxItems":5,"type":"array","items":{"type":"object","properties":{"source":{"type":"string","enum":["casino_guru","askgamblers","casino_org","lcb","trustpilot"]},"state":{"type":"string","enum":["included","warning_zero","omitted"]},"normalizedScore":{"anyOf":[{"type":"number","minimum":0,"maximum":10},{"type":"null"}]},"lowScore":{"type":"boolean"},"pageId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"metric":{"type":["string","null"]},"reason":{"anyOf":[{"type":"string","enum":["no_record","selection_required","ambiguous_selection","not_observed","no_score","hidden","removed","stale","invalid_scale"]},{"type":"null"}]}},"required":["source","state","normalizedScore","lowScore","pageId","metric","reason"],"additionalProperties":false}}},"required":["formula","score","scaleMax","includedSourceCount","coverageStatus","minimumSourceCount","lowScoreCount","warningCount","contributions"],"additionalProperties":false},"coverageChanged":{"type":"boolean"},"comparable":{"type":"boolean"},"changeFromPrevious":{"type":["number","null"]},"unchangedSince":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"hasRecheck":{"type":"boolean"},"checkedSourceCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"recheckedSourceCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"ratingChangeCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"sources":{"minItems":5,"maxItems":5,"type":"array","items":{"type":"object","properties":{"source":{"type":"string","enum":["casino_guru","askgamblers","casino_org","lcb","trustpilot"]},"state":{"type":"string","enum":["included","warning_zero","omitted"]},"normalizedScore":{"type":["number","null"]},"score":{"type":["number","null"]},"scaleMax":{"type":["number","null"]},"metric":{"type":["string","null"]},"mappingVersion":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"sourceUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"observedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"status":{"type":["string","null"]},"flags":{"type":"array","items":{"type":"string"}},"method":{"anyOf":[{"type":"string","enum":["manual","parser"]},{"type":"null"}]},"reason":{"type":["string","null"]}},"required":["source","state","normalizedScore","score","scaleMax","metric","mappingVersion","sourceUrl","observedAt","method","reason"],"additionalProperties":false}}},"required":["month","asOf","snapshotAt","snapshotId","partial","baselinePartial","composite","coverageChanged","comparable","changeFromPrevious","sources"],"additionalProperties":false}}},"required":["apiVersion","platformId","generatedAt","timezone","basis","scaleMax","historyStartedAt","truncated","points"],"additionalProperties":false},"PlatformRatings":{"type":"object","properties":{"apiVersion":{"type":"number","const":1},"generatedAt":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},"platform":{"type":"object","properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"name":{"type":"string","minLength":1},"slug":{"type":"string","maxLength":120,"pattern":"^[a-z0-9]+(-[a-z0-9]+)*$"},"officialUrl":{"anyOf":[{"type":"string","format":"uri"},{"type":"null"}]},"description":{"description":"Administrator-entered plain text platform introduction; null when absent.","anyOf":[{"type":"string","maxLength":5000},{"type":"null"}]},"logoUrl":{"description":"LOGO image URL; null when absent. WebP, maximum 80,000 bytes.","type":["string","null"]},"scope":{"type":"string","enum":["casino","sportsbook","both","unknown"]}},"required":["id","name","slug","officialUrl","scope"],"additionalProperties":false},"sources":{"minItems":5,"maxItems":5,"type":"array","items":{"type":"object","properties":{"source":{"type":"string","enum":["casino_guru","askgamblers","casino_org","lcb","trustpilot"]},"setup":{"type":"string","enum":["not_searched","no_page","needs_review","confirmed","paused"]},"updateSummary":{"type":"object","properties":{"automaticReadStatus":{"anyOf":[{"type":"string","enum":["unsupported","paused","disabled","mapping_required","eligible"]},{"type":"null"}]},"linkCount":{"type":"integer","minimum":0,"maximum":9007199254740991},"lastSuccessAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"lastAttemptAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"lastAttemptStatus":{"type":["string","null"]},"errorCode":{"type":["string","null"]},"method":{"type":["string","null"]},"scoreChangedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"nextDueAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"queuedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"queueState":{"type":["string","null"]},"lastResult":{"type":"string","enum":["missing_link","queued","running","success","failure","needs_review","not_checked"]}},"required":["linkCount","lastSuccessAt","lastAttemptAt","lastAttemptStatus","errorCode","method","scoreChangedAt","nextDueAt","queuedAt","queueState","lastResult"],"additionalProperties":false},"ratings":{"type":"array","items":{"type":"object","properties":{"pageId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"sourceUrl":{"type":"string","format":"uri"},"reviewedEntity":{"type":"string","minLength":1},"scope":{"type":"string","enum":["casino","sportsbook","both","unknown"]},"region":{"type":"string","minLength":1},"mappingVersion":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"metric":{"type":"string","minLength":1},"status":{"type":"string","enum":["not_observed","available","hidden","removed","no_score","stale"]},"factVisibility":{"anyOf":[{"type":"string","enum":["available","hidden","removed","no_score"]},{"type":"null"}]},"score":{"type":["number","null"]},"scaleMin":{"type":["number","null"]},"scaleMax":{"type":["number","null"]},"counts":{"type":"object","properties":{"reviews":{"type":"integer","minimum":0,"maximum":9007199254740991},"votes":{"type":"integer","minimum":0,"maximum":9007199254740991},"comments":{"type":"integer","minimum":0,"maximum":9007199254740991},"complaints":{"type":"integer","minimum":0,"maximum":9007199254740991}},"additionalProperties":false},"flags":{"type":"array","items":{"type":"string","enum":["consumer_warning","consumer_alert","closed"]}},"lastSuccessAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"sourceUpdatedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"expiresAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"checkedAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"unchangedSince":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"consecutiveCheckCount":{"anyOf":[{"type":"integer","minimum":0,"maximum":9007199254740991},{"type":"null"}]},"reviewDueAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"freshness":{"anyOf":[{"type":"string","enum":["recent","review_due"]},{"type":"null"}]},"method":{"anyOf":[{"type":"string","enum":["parser","manual"]},{"type":"null"}]},"lastAttemptAt":{"anyOf":[{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d:[0-5]\\d(?:\\.\\d+)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"},{"type":"null"}]},"lastAttemptStatus":{"anyOf":[{"type":"string","enum":["started","ok","blocked","timeout","redirect_error","fetch_failed","parse_failed","needs_review"]},{"type":"null"}]}},"required":["pageId","sourceUrl","reviewedEntity","scope","region","mappingVersion","metric","status","factVisibility","score","scaleMin","scaleMax","counts","flags","lastSuccessAt","sourceUpdatedAt","expiresAt","method","lastAttemptAt","lastAttemptStatus"],"additionalProperties":false}},"selections":{"type":"array","items":{"type":"object","properties":{"reviewedEntity":{"type":"string","minLength":1},"scope":{"type":"string","enum":["casino","sportsbook","both","unknown"]},"region":{"type":"string","minLength":1},"metric":{"type":"string","minLength":1},"status":{"type":"string","enum":["ready","needs_review","unselected"]},"primaryPageId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"pages":{"type":"array","items":{"type":"object","properties":{"pageId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"mappingVersion":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"role":{"type":"string","enum":["primary","backup"]},"position":{"type":"integer","minimum":0,"maximum":9007199254740991},"status":{"type":"string","enum":["ready","needs_review"]}},"required":["pageId","mappingVersion","role","position","status"],"additionalProperties":false}}},"required":["reviewedEntity","scope","region","metric","status","primaryPageId","pages"],"additionalProperties":false}}},"required":["source","setup","ratings","selections"],"additionalProperties":false}},"composite":{"type":"object","properties":{"formula":{"type":"string","const":"equal_mean_v1"},"score":{"anyOf":[{"type":"number","minimum":0,"maximum":10},{"type":"null"}]},"scaleMax":{"type":"number","const":10},"includedSourceCount":{"type":"integer","minimum":0,"maximum":5},"coverageStatus":{"type":"string","enum":["unavailable","provisional","established"]},"minimumSourceCount":{"type":"number","const":3},"lowScoreCount":{"type":"integer","minimum":0,"maximum":5},"warningCount":{"type":"integer","minimum":0,"maximum":5},"contributions":{"minItems":5,"maxItems":5,"type":"array","items":{"type":"object","properties":{"source":{"type":"string","enum":["casino_guru","askgamblers","casino_org","lcb","trustpilot"]},"state":{"type":"string","enum":["included","warning_zero","omitted"]},"normalizedScore":{"anyOf":[{"type":"number","minimum":0,"maximum":10},{"type":"null"}]},"lowScore":{"type":"boolean"},"pageId":{"anyOf":[{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},{"type":"null"}]},"metric":{"type":["string","null"]},"reason":{"anyOf":[{"type":"string","enum":["no_record","selection_required","ambiguous_selection","not_observed","no_score","hidden","removed","stale","invalid_scale"]},{"type":"null"}]}},"required":["source","state","normalizedScore","lowScore","pageId","metric","reason"],"additionalProperties":false}}},"required":["formula","score","scaleMax","includedSourceCount","coverageStatus","minimumSourceCount","lowScoreCount","warningCount","contributions"],"additionalProperties":false}},"required":["apiVersion","generatedAt","platform","sources","composite"],"additionalProperties":false},"Error":{"type":"object","properties":{"error":{"type":"string","enum":["invalid_platform_slug","platform_not_found","database_not_configured","ratings_unavailable","invalid_input","history_unavailable"]}},"required":["error"],"additionalProperties":false}}}}