{"components":{"schemas":{"BoardClaim":{"additionalProperties":false,"properties":{"claim_id":{"type":"string"},"methodology_version":{"type":"string"},"predicate":{"enum":["rank","published_hours","board_total"],"type":"string"},"scope":{"additionalProperties":false,"properties":{"category_id":{"type":"string"},"game_id":{"type":"string"}},"required":["game_id","category_id"],"type":"object"},"snapshot_id":{"type":"string"},"subject_id":{"type":"string"},"unit":{"enum":["hours"],"type":"string"},"value":{"minimum":0,"type":"integer"}},"required":["claim_id","subject_id","predicate","value","scope","snapshot_id","methodology_version"],"type":"object"},"BoardEnvelope":{"additionalProperties":false,"properties":{"canonical_url":{"format":"uri","type":"string"},"citation_url":{"format":"uri","type":"string"},"data":{"additionalProperties":false,"properties":{"api_version":{"const":"hours.public-board.v1","type":"string"},"board_id":{"type":"string"},"board_total_hours":{"description":"Manifest-owned sum of all ranked products' backing hours, not a displayed-subset or distinct-player total.","minimum":0,"type":"integer"},"category":{"type":"string"},"claims":{"items":{"$ref":"#/components/schemas/BoardClaim"},"minItems":2,"type":"array"},"direct_answer":{"type":"string"},"effective_at":{"format":"date-time","type":"string"},"game":{"type":"string"},"manifest_hash":{"pattern":"^[0-9a-f]{64}$","type":"string"},"methodology_version":{"type":"string"},"row_count":{"minimum":1,"type":"integer"},"rows":{"items":{"$ref":"#/components/schemas/BoardRow"},"minItems":1,"type":"array"},"title":{"type":"string"}},"required":["api_version","board_id","game","category","title","direct_answer","effective_at","methodology_version","manifest_hash","row_count","board_total_hours","rows","claims"],"type":"object"},"generated_at":{"format":"date-time","type":"string"},"methodology_url":{"format":"uri","type":"string"},"presentation":{"$ref":"#/components/schemas/BoardPresentation"},"schema_version":{"const":"hours.technical-presence.v4.1","type":"string"},"snapshot_id":{"pattern":"^snapshot-[0-9a-f]{32}$","type":"string"}},"required":["schema_version","snapshot_id","canonical_url","methodology_url","citation_url","generated_at","data"],"type":"object"},"BoardPresentation":{"additionalProperties":false,"properties":{"board_total":{"additionalProperties":false,"properties":{"aggregation":{"const":"sum_of_ranking_rows","type":"string"},"claim_id":{"type":"string"},"evidence_sentence":{"type":"string"},"hours":{"minimum":0,"type":"integer"},"scope":{"const":"whole_board","type":"string"},"unit":{"const":"hours","type":"string"}},"required":["hours","unit","claim_id","scope","aggregation","evidence_sentence"],"type":"object"},"direct_answer":{"type":"string"},"evidence_basis":{"type":"string"},"hours_label":{"const":"Verified Hours","type":"string"},"metric_dictionary":{"const":{"board_total_hours":{"aggregation":"sum_of_ranking_rows","basis":"Sum of every row in this snapshot, not the total of a displayed shortlist or a distinct-player/sitewide total.","label":"Whole-board Verified Hours","unit":"hours"},"row_count":{"basis":"Number of ranked products, not number of contributing players.","unit":"products"},"row_hours":{"basis":"Released playtime backing this product's player selections in the named board scope.","label":"Verified Hours","unit":"hours"},"scope":{"basis":"The supplied game and category identify the board. Product eligibility filters do not establish a player-behavior cohort or a playtime period."}},"type":"object"},"presentation_version":{"const":"hours.public-presentation.v1","type":"string"},"ranking_label":{"const":"Ranked by Verified Playtime","type":"string"},"rows":{"items":{"$ref":"#/components/schemas/BoardRowPresentation"},"minItems":1,"type":"array"},"scope":{"additionalProperties":false,"properties":{"board_id":{"type":"string"},"category_id":{"type":"string"},"game_id":{"type":"string"}},"required":["board_id","game_id","category_id"],"type":"object"},"source":{"$ref":"#/components/schemas/PresentationSource"},"title":{"type":"string"}},"required":["presentation_version","source","scope","title","direct_answer","hours_label","ranking_label","evidence_basis","metric_dictionary","rows","board_total"],"type":"object"},"BoardRow":{"additionalProperties":false,"properties":{"brand":{"type":["string","null"]},"hours":{"description":"Verified playtime backing the product's player selections in the board scope; machine unit remains hours. Not measured device-use time.","minimum":0,"type":"integer"},"image_url":{"format":"uri","type":["string","null"]},"product_id":{"type":"string"},"product_name":{"type":"string"},"product_url":{"format":"uri","type":["string","null"]},"rank":{"minimum":1,"type":"integer"},"specification_pills":{"items":{"type":"string"},"type":"array"}},"required":["rank","product_id","product_name","product_url","brand","image_url","specification_pills","hours"],"type":"object"},"BoardRowPresentation":{"additionalProperties":false,"properties":{"evidence_sentence":{"type":"string"},"hours":{"minimum":0,"type":"integer"},"hours_claim_id":{"type":"string"},"product_id":{"type":"string"},"rank":{"minimum":1,"type":"integer"},"rank_claim_id":{"type":"string"},"unit":{"const":"hours","type":"string"}},"required":["product_id","rank","hours","unit","rank_claim_id","hours_claim_id","evidence_sentence"],"type":"object"},"Citation":{"additionalProperties":false,"properties":{"canonical_url":{"format":"uri","type":"string"},"citation_url":{"format":"uri","type":"string"},"effective_date":{"format":"date-time","type":"string"},"generated_at":{"format":"date-time","type":"string"},"methodology":{"additionalProperties":false,"properties":{"url":{"format":"uri","type":"string"},"version":{"type":"string"}},"required":["version","url"],"type":"object"},"presentation":{"$ref":"#/components/schemas/CitationPresentation"},"publisher":{"const":"Hours.gg","type":"string"},"schema_version":{"type":"string"},"scope":{"additionalProperties":false,"properties":{"category":{"type":"string"},"game":{"type":"string"}},"required":["game","category"],"type":"object"},"snapshot_id":{"type":"string"},"text":{"type":"string"},"title":{"type":"string"},"type":{"const":"dataset","type":"string"}},"required":["schema_version","snapshot_id","title","publisher","type","effective_date","generated_at","canonical_url","citation_url","methodology","scope","text"],"type":"object"},"CitationPresentation":{"additionalProperties":false,"properties":{"presentation_version":{"const":"hours.public-presentation.v1","type":"string"},"source":{"$ref":"#/components/schemas/PresentationSource"},"text":{"type":"string"},"title":{"type":"string"}},"required":["presentation_version","source","title","text"],"type":"object"},"Error":{"additionalProperties":false,"properties":{"error":{"additionalProperties":false,"properties":{"code":{"type":"string"},"message":{"type":"string"}},"required":["code","message"],"type":"object"}},"required":["error"],"type":"object"},"GuideEnvelope":{"additionalProperties":false,"properties":{"canonical_url":{"format":"uri","type":"string"},"changed_at":{"format":"date-time","type":"string"},"citation_url":{"format":"uri","type":"string"},"direct_answer":{"type":"string"},"evidence_basis":{"type":"string"},"generated_at":{"format":"date-time","type":"string"},"h1":{"type":"string"},"manifest_hash":{"pattern":"^[0-9a-f]{64}$","type":"string"},"methodology_url":{"format":"uri","type":"string"},"methodology_version":{"type":"string"},"presentation_version":{"type":"string"},"rows":{"items":{"additionalProperties":false,"properties":{"hours":{"minimum":1,"type":"integer"},"name":{"type":"string"},"product_id":{"type":"string"},"rank":{"minimum":1,"type":"integer"}},"required":["product_id","name","rank","hours"],"type":"object"},"type":"array"},"schema_version":{"const":"hours.public-guide.v1","type":"string"},"scope":{"additionalProperties":false,"properties":{"category":{"type":"string"},"cross_game":{"const":true,"type":"boolean"},"game":{"type":"null"},"intent":{"type":"string"}},"required":["game","category","intent","cross_game"],"type":"object"},"snapshot_id":{"pattern":"^snapshot-[0-9a-f]{32}$","type":"string"},"title":{"type":"string"},"total":{"minimum":0,"type":"integer"},"unit":{"const":"hours","type":"string"}},"required":["schema_version","canonical_url","snapshot_id","manifest_hash","generated_at","changed_at","methodology_url","methodology_version","citation_url","presentation_version","title","h1","direct_answer","scope","evidence_basis","unit","total","rows"],"type":"object"},"MaterialChangeFeed":{"additionalProperties":false,"properties":{"_hours_schema_version":{"const":"hours.material-change-feed.v1","type":"string"},"feed_url":{"format":"uri","pattern":"^https://hours\\.gg/api/v1/feeds/material-changes(?:\\?presentation=hours\\.public-presentation\\.v1&format=json(?:&limit=(?:[1-9][0-9]?|100))?)?$","type":"string"},"home_page_url":{"const":"https://hours.gg","type":"string"},"items":{"items":{"$ref":"#/components/schemas/MaterialChangeFeedItem"},"maxItems":100,"minItems":1,"type":"array"},"title":{"const":"Hours.gg material data changes","type":"string"},"version":{"const":"https://jsonfeed.org/version/1.1","type":"string"}},"required":["version","title","home_page_url","feed_url","_hours_schema_version","items"],"type":"object"},"MaterialChangeFeedItem":{"additionalProperties":false,"properties":{"_hours":{"additionalProperties":false,"properties":{"presentation":{"$ref":"#/components/schemas/MaterialChangePresentation"},"previous_snapshot_id":{"pattern":"^snapshot-[0-9a-f]{32}$","type":"string"},"snapshot_id":{"pattern":"^snapshot-[0-9a-f]{32}$","type":"string"}},"required":["snapshot_id"],"type":"object"},"content_text":{"minLength":1,"type":"string"},"date_published":{"format":"date-time","type":"string"},"external_url":{"format":"uri","type":"string"},"id":{"pattern":"^release-[1-9][0-9]*-board-[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"},"title":{"minLength":1,"type":"string"},"url":{"format":"uri","type":"string"}},"required":["id","url","external_url","title","content_text","date_published","_hours"],"type":"object"},"MaterialChangePresentation":{"additionalProperties":false,"properties":{"presentation_version":{"const":"hours.public-presentation.v1","type":"string"},"summary":{"type":"string"},"title":{"type":"string"}},"required":["presentation_version","title","summary"],"type":"object"},"PresentationSource":{"additionalProperties":false,"properties":{"canonical_url":{"format":"uri","type":"string"},"citation_url":{"format":"uri","type":"string"},"effective_at":{"format":"date-time","type":"string"},"manifest_hash":{"pattern":"^[0-9a-f]{64}$","type":"string"},"methodology_url":{"format":"uri","type":"string"},"methodology_version":{"type":"string"},"snapshot_id":{"pattern":"^snapshot-[0-9a-f]{32}$","type":"string"}},"required":["snapshot_id","manifest_hash","methodology_version","effective_at","canonical_url","citation_url","methodology_url"],"type":"object"},"ReportEnvelope":{"additionalProperties":false,"properties":{"data":{"additionalProperties":false,"properties":{"answer_manifest":{"type":"object"},"report":{"type":"object"}},"required":["report","answer_manifest"],"type":"object"},"envelope_hash":{"pattern":"^[0-9a-f]{64}$","type":"string"},"generation":{"minimum":1,"type":"integer"},"manifest_hash":{"pattern":"^[0-9a-f]{64}$","type":"string"},"promoted_at":{"format":"date-time","type":"string"},"publication_version":{"const":"hours.promoted-original-report.v1","type":"string"},"release_id":{"minLength":1,"type":"string"},"report_hash":{"pattern":"^[0-9a-f]{64}$","type":"string"},"report_slug":{"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"},"report_snapshot_id":{"pattern":"^report-snapshot-[0-9a-f]{32}$","type":"string"},"schema_version":{"const":"hours.technical-presence.v4.1","type":"string"}},"required":["schema_version","publication_version","report_slug","release_id","generation","promoted_at","report_snapshot_id","report_hash","manifest_hash","data","envelope_hash"],"type":"object"}}},"info":{"description":"Read-only access to promoted immutable Hours board and original-report snapshots. Verified Playtime is real game experience backing players' gear selections, not measured device-use time. Machine units remain hours. Board, citation, embed and feed requests can opt in to a versioned display projection while existing historical source representations remain unchanged.","title":"Hours.gg Public Snapshot API","version":"1.2.0"},"jsonSchemaDialect":"https://json-schema.org/draft/2020-12/schema","openapi":"3.1.0","paths":{"/api/v1/boards/{game}/{category}":{"get":{"operationId":"getCurrentBoard","parameters":[{"in":"path","name":"game","required":true,"schema":{"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"}},{"in":"path","name":"category","required":true,"schema":{"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"}},{"in":"query","name":"format","required":false,"schema":{"default":"json","enum":["json","csv","jsonl"],"type":"string"}},{"description":"Opt in to the versioned Verified Playtime display projection. Omit to retain legacy response bytes. Signed source fields, IDs, precise values and the hours unit are unchanged. Board CSV does not support this parameter; use JSON or JSONL. The version is part of the URL/cache identity.","in":"query","name":"presentation","required":false,"schema":{"enum":["hours.public-presentation.v1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardEnvelope"}},"application/x-ndjson":{"schema":{"type":"string"}},"text/csv":{"schema":{"type":"string"}}},"description":"Manifest-owned immutable board data. An explicit presentation version adds display fields without rewriting source fields. JSONL places board presentation context in metadata and each row's presentation on its ranking record; CSV retains its existing schema.","headers":{"X-Hours-Citation-URL":{"schema":{"format":"uri","type":"string"}},"X-Hours-Content-SHA256":{"schema":{"pattern":"^[0-9a-f]{64}$","type":"string"}},"X-Hours-Snapshot-ID":{"schema":{"type":"string"}}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."}},"summary":"Get the currently promoted board snapshot"}},"/api/v1/boards/{game}/{category}/citation":{"get":{"operationId":"getCurrentBoardCitation","parameters":[{"in":"path","name":"game","required":true,"schema":{"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"}},{"in":"path","name":"category","required":true,"schema":{"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"}},{"description":"Opt in to the versioned Verified Playtime display projection. Omit to retain legacy response bytes. Signed source fields, IDs, precise values and the hours unit are unchanged. Board CSV does not support this parameter; use JSON or JSONL. The version is part of the URL/cache identity.","in":"query","name":"presentation","required":false,"schema":{"enum":["hours.public-presentation.v1"],"type":"string"}},{"in":"query","name":"format","required":false,"schema":{"default":"json","enum":["json","text"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Citation"}},"text/plain":{"schema":{"type":"string"}}},"description":"Snapshot-bound citation."},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."}},"summary":"Get a stable citation for the promoted board"}},"/api/v1/boards/{game}/{category}/snapshots/{snapshot_id}":{"get":{"operationId":"getHistoricalBoardSnapshot","parameters":[{"in":"path","name":"game","required":true,"schema":{"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"}},{"in":"path","name":"category","required":true,"schema":{"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"}},{"in":"path","name":"snapshot_id","required":true,"schema":{"pattern":"^snapshot-[0-9a-f]{32}$","type":"string"}},{"in":"query","name":"format","required":false,"schema":{"default":"json","enum":["json","csv","jsonl"],"type":"string"}},{"description":"Opt in to the versioned Verified Playtime display projection. Omit to retain legacy response bytes. Signed source fields, IDs, precise values and the hours unit are unchanged. Board CSV does not support this parameter; use JSON or JSONL. The version is part of the URL/cache identity.","in":"query","name":"presentation","required":false,"schema":{"enum":["hours.public-presentation.v1"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BoardEnvelope"}},"application/x-ndjson":{"schema":{"type":"string"}},"text/csv":{"schema":{"type":"string"}}},"description":"Manifest-owned immutable board data. An explicit presentation version adds display fields without rewriting source fields. JSONL places board presentation context in metadata and each row's presentation on its ranking record; CSV retains its existing schema.","headers":{"X-Hours-Citation-URL":{"schema":{"format":"uri","type":"string"}},"X-Hours-Content-SHA256":{"schema":{"pattern":"^[0-9a-f]{64}$","type":"string"}},"X-Hours-Snapshot-ID":{"schema":{"type":"string"}}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."}},"summary":"Get one immutable released board snapshot"}},"/api/v1/boards/{game}/{category}/snapshots/{snapshot_id}/citation":{"get":{"operationId":"getHistoricalBoardCitation","parameters":[{"in":"path","name":"game","required":true,"schema":{"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"}},{"in":"path","name":"category","required":true,"schema":{"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"}},{"description":"Opt in to the versioned Verified Playtime display projection. Omit to retain legacy response bytes. Signed source fields, IDs, precise values and the hours unit are unchanged. Board CSV does not support this parameter; use JSON or JSONL. The version is part of the URL/cache identity.","in":"query","name":"presentation","required":false,"schema":{"enum":["hours.public-presentation.v1"],"type":"string"}},{"in":"path","name":"snapshot_id","required":true,"schema":{"pattern":"^snapshot-[0-9a-f]{32}$","type":"string"}},{"in":"query","name":"format","required":false,"schema":{"default":"json","enum":["json","text"],"type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Citation"}},"text/plain":{"schema":{"type":"string"}}},"description":"Immutable snapshot-bound citation."},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."}},"summary":"Get a stable citation for one immutable released snapshot"}},"/api/v1/boards/{game}/{category}/snapshots/{snapshot_id}/social-card/v1/{renderer_hash}":{"get":{"operationId":"getHistoricalBoardSocialCard","parameters":[{"in":"path","name":"game","required":true,"schema":{"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"}},{"in":"path","name":"category","required":true,"schema":{"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"}},{"in":"path","name":"snapshot_id","required":true,"schema":{"pattern":"^snapshot-[0-9a-f]{32}$","type":"string"}},{"description":"SHA-256 identity of the immutable social-card renderer bytes.","in":"path","name":"renderer_hash","required":true,"schema":{"pattern":"^[0-9a-f]{64}$","type":"string"}}],"responses":{"200":{"content":{"image/png":{"schema":{"format":"binary","type":"string"}}},"description":"A deterministic PNG card derived only from one immutable released Hours snapshot.","headers":{"ETag":{"schema":{"type":"string"}},"X-Hours-Card-Model-SHA256":{"schema":{"pattern":"^[0-9a-f]{64}$","type":"string"}},"X-Hours-Manifest-SHA256":{"schema":{"pattern":"^[0-9a-f]{64}$","type":"string"}},"X-Hours-Snapshot-ID":{"schema":{"type":"string"}}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."}},"summary":"Get the deterministic social card for one released snapshot"}},"/api/v1/embeds/{game}/{category}":{"get":{"operationId":"getBoardEmbed","parameters":[{"in":"path","name":"game","required":true,"schema":{"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"}},{"in":"path","name":"category","required":true,"schema":{"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"}},{"description":"Opt in to the versioned Verified Playtime display projection. Omit to retain legacy response bytes. Signed source fields, IDs, precise values and the hours unit are unchanged. Board CSV does not support this parameter; use JSON or JSONL. The version is part of the URL/cache identity.","in":"query","name":"presentation","required":false,"schema":{"enum":["hours.public-presentation.v1"],"type":"string"}},{"in":"query","name":"limit","schema":{"default":5,"maximum":10,"minimum":1,"type":"integer"}},{"in":"query","name":"snapshot","schema":{"pattern":"^snapshot-[0-9a-f]{32}$","type":"string"}}],"responses":{"200":{"content":{"text/html":{"schema":{"type":"string"}}},"description":"Noindex HTML embed with canonical attribution."},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."}},"summary":"Get an accessible attributed board embed"}},"/api/v1/feeds/material-changes":{"get":{"description":"Returns JSON Feed 1.1 by default or Atom through format/Accept negotiation. An empty or invalid release-event projection fails closed. The optional presentation is additive in each item's _hours.presentation or Atom's urn:hours:public-presentation:v1 namespace; original titles, summaries and event dates remain unchanged.","operationId":"getMaterialChanges","parameters":[{"description":"Opt in to the versioned Verified Playtime display projection. Omit to retain legacy response bytes. Signed source fields, IDs, precise values and the hours unit are unchanged. Board CSV does not support this parameter; use JSON or JSONL. The version is part of the URL/cache identity.","in":"query","name":"presentation","required":false,"schema":{"enum":["hours.public-presentation.v1"],"type":"string"}},{"in":"query","name":"format","required":false,"schema":{"default":"json","enum":["json","atom"],"type":"string"}},{"in":"query","name":"limit","required":false,"schema":{"default":50,"maximum":100,"minimum":1,"type":"integer"}}],"responses":{"200":{"content":{"application/atom+xml":{"schema":{"type":"string"}},"application/feed+json":{"schema":{"$ref":"#/components/schemas/MaterialChangeFeed"}}},"description":"A non-empty feed of genuine promoted or rolled-back material board changes.","headers":{"ETag":{"schema":{"type":"string"}},"Last-Modified":{"schema":{"type":"string"}},"X-Hours-Content-SHA256":{"schema":{"pattern":"^[0-9a-f]{64}$","type":"string"}},"X-Hours-Feed-Item-Count":{"schema":{"maximum":100,"minimum":1,"type":"integer"}}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"406":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."}},"summary":"Get genuine material-change release events"}},"/api/v1/guides/{category}/{slug}":{"get":{"description":"Returns the signed guide and its released eligible rows, never a substitute game board. Category uses the URL slug, such as gaming-mice. The optional snapshot pins the response: if that snapshot is no longer independently authorized, the request returns 404 rather than newer data. Historical guide archival retrieval is not supported. Check evidence_basis before interpreting hours; some qualified guides publish a category baseline rather than verified player-hour totals. Every read rechecks active release authority and is no-store.","operationId":"getExactGuide","parameters":[{"in":"path","name":"category","required":true,"schema":{"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"}},{"in":"path","name":"slug","required":true,"schema":{"pattern":"^[a-z0-9]+(?:-[a-z0-9]+)*$","type":"string"}},{"in":"query","name":"snapshot","required":false,"schema":{"pattern":"^snapshot-[0-9a-f]{32}$","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuideEnvelope"}}},"description":"Exact released guide with snapshot-scoped rows."},"400":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"}},"required":["error"],"type":"object"}}},"description":"Invalid request or unavailable guide authority."},"404":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"}},"required":["error"],"type":"object"}}},"description":"Invalid request or unavailable guide authority."},"503":{"content":{"application/json":{"schema":{"properties":{"error":{"type":"string"}},"required":["error"],"type":"object"}}},"description":"Invalid request or unavailable guide authority."}},"summary":"Get the exact currently authorized cross-game guide"}},"/api/v1/oembed":{"get":{"operationId":"getHoursOEmbed","parameters":[{"description":"Opt in to the versioned Verified Playtime display projection. Omit to retain legacy response bytes. Signed source fields, IDs, precise values and the hours unit are unchanged. Board CSV does not support this parameter; use JSON or JSONL. The version is part of the URL/cache identity.","in":"query","name":"presentation","required":false,"schema":{"enum":["hours.public-presentation.v1"],"type":"string"}},{"in":"query","name":"url","required":true,"schema":{"format":"uri","type":"string"}},{"in":"query","name":"format","schema":{"enum":["json"],"type":"string"}},{"in":"query","name":"maxwidth","schema":{"maximum":1200,"minimum":240,"type":"integer"}},{"in":"query","name":"maxheight","schema":{"maximum":1200,"minimum":240,"type":"integer"}}],"responses":{"200":{"content":{"application/json":{"schema":{"type":"object"}}},"description":"Attributed rich oEmbed object. The generated board iframe is pinned to the advertised snapshot; direct embed URLs without snapshot continue to follow the current release."},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."}},"summary":"Resolve a canonical Hours board or original-report URL to oEmbed JSON"}},"/api/v1/reports/snapshots/{report_snapshot_id}":{"get":{"operationId":"getOriginalReportSnapshot","parameters":[{"in":"path","name":"report_snapshot_id","required":true,"schema":{"pattern":"^report-snapshot-[0-9a-f]{32}$","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportEnvelope"}}},"description":"One promoted original-report envelope addressed by its globally unique immutable report snapshot ID.","headers":{"ETag":{"schema":{"type":"string"}},"X-Hours-Envelope-SHA256":{"schema":{"pattern":"^[0-9a-f]{64}$","type":"string"}},"X-Hours-Manifest-SHA256":{"schema":{"pattern":"^[0-9a-f]{64}$","type":"string"}},"X-Hours-Report-SHA256":{"schema":{"pattern":"^[0-9a-f]{64}$","type":"string"}},"X-Hours-Report-Snapshot-ID":{"schema":{"type":"string"}}}},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"406":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."}},"summary":"Get one promoted immutable original-report envelope"}},"/api/v1/reports/snapshots/{report_snapshot_id}/embed":{"get":{"operationId":"getOriginalReportEmbed","parameters":[{"in":"path","name":"report_snapshot_id","required":true,"schema":{"pattern":"^report-snapshot-[0-9a-f]{32}$","type":"string"}}],"responses":{"200":{"content":{"text/html":{"schema":{"type":"string"}}},"description":"Withdrawal-aware noindex HTML with the exact report finding, table, citation and attribution."},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"406":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."}},"summary":"Get an accessible attributed embed for one promoted report snapshot"}},"/api/v1/reports/snapshots/{report_snapshot_id}/social-card":{"get":{"operationId":"getOriginalReportSocialCard","parameters":[{"in":"path","name":"report_snapshot_id","required":true,"schema":{"pattern":"^report-snapshot-[0-9a-f]{32}$","type":"string"}}],"responses":{"200":{"content":{"image/svg+xml":{"schema":{"format":"binary","type":"string"}}},"description":"Withdrawal-aware SVG card derived only from the promoted report artifact."},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."},"503":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Error"}}},"description":"The request failed closed."}},"summary":"Get a deterministic social card for one promoted report snapshot"}}},"servers":[{"url":"https://hours.gg"}]}
