{"components":{"parameters":{},"schemas":{"Ability":{"properties":{"cooldown":{"description":"Cooldown in seconds, or null when the ability has none.","example":12,"type":["number","null"]},"description":{"type":["string","null"]},"id":{"example":"sleep-dart","type":"string"},"kind":{"description":"Slot the ability occupies. Abilities are positional: match logs report `Ability1Used` and `Ability2Used` by slot, so the array order is part of the contract.","enum":["primary","secondary","ability","ultimate","passive"],"example":"ability","type":"string"},"name":{"example":"Sleep Dart","type":"string"}},"required":["id","kind","name","description","cooldown"],"type":"object"},"AbilityCollection":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Ability"},"type":"array"},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"],"type":"object"},"Game":{"properties":{"id":{"example":"overwatch","type":"string"},"name":{"example":"Overwatch","type":"string"}},"required":["id","name"],"type":"object"},"GameCollection":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Game"},"type":"array"},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"],"type":"object"},"Health":{"properties":{"patch":{"example":"2026-02-10","type":"string"},"status":{"enum":["ok"],"type":"string"},"version":{"example":"a1b2c3d","type":"string"}},"required":["status","patch","version"],"type":"object"},"Hero":{"properties":{"abilities":{"description":"Complete kit. The first three entries remain Ability 1, Ability 2 and Ultimate for match-log compatibility; weapon modes, passives, alternate forms and additional inputs follow.","items":{"$ref":"#/components/schemas/Ability"},"type":"array"},"aliases":{"description":"Alternate spellings seen in match logs or legacy data. Every alias resolves to this hero.","items":{"type":"string"},"type":"array"},"health":{"$ref":"#/components/schemas/HeroHealth"},"id":{"example":"ana","type":"string"},"name":{"example":"Ana","type":"string"},"names":{"$ref":"#/components/schemas/LocalizedNames"},"portrait":{"example":"https://assets.sightline.gg/overwatch/heroes/ana.png","format":"uri","type":"string"},"role":{"enum":["tank","damage","support"],"example":"support","type":"string"},"subrole":{"description":"Blizzard's official gameplay sub-role.","enum":["bruiser","initiator","stalwart","flanker","recon","sharpshooter","specialist","medic","survivor","tactician"],"example":"tactician","type":"string"}},"required":["id","name","names","role","health","subrole","aliases","abilities","portrait"],"type":"object"},"HeroCollection":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Hero"},"type":"array"},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"],"type":"object"},"HeroHealth":{"description":"Baseline recoverable hit-point pool in 5v5 Role Queue. Standard is ordinary health; total equals standard plus armor plus shields.","properties":{"armor":{"example":50,"minimum":0,"type":"integer"},"shields":{"example":0,"minimum":0,"type":"integer"},"standard":{"example":200,"minimum":0,"type":"integer"},"total":{"example":250,"exclusiveMinimum":0,"type":"integer"}},"required":["standard","armor","shields","total"],"type":"object"},"LocalizedNames":{"properties":{"en":{"example":"Ana","type":"string"},"ko":{"example":"아나","type":"string"},"zh":{"example":"安娜","type":"string"}},"required":["en","ko","zh"],"type":"object"},"Map":{"properties":{"aliases":{"items":{"type":"string"},"type":"array"},"id":{"example":"blizzard-world","type":"string"},"mode":{"enum":["control","escort","hybrid","push","flashpoint"],"example":"hybrid","type":"string"},"name":{"example":"Blizzard World","type":"string"},"thumbnail":{"example":"https://assets.sightline.gg/overwatch/maps/blizzard-world.webp","format":"uri","type":"string"},"variants":{"description":"Cosmetic re-skins of this map. A variant is never its own map; anything recorded on a variant belongs to this document.","items":{"$ref":"#/components/schemas/MapVariant"},"type":"array"}},"required":["id","name","mode","aliases","variants","thumbnail"],"type":"object"},"MapCollection":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Map"},"type":"array"},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"],"type":"object"},"MapVariant":{"properties":{"id":{"example":"winter","type":"string"},"name":{"example":"Blizzard World (Winter)","type":"string"},"thumbnail":{"example":"https://assets.sightline.gg/overwatch/maps/blizzard-world-winter.webp","format":"uri","type":"string"}},"required":["id","name","thumbnail"],"type":"object"},"Meta":{"properties":{"count":{"example":53,"type":"integer"},"patch":{"description":"Id of the newest patch this data describes.","example":"2026-02-10","type":"string"}},"required":["patch","count"],"type":"object"},"Mode":{"properties":{"id":{"enum":["control","escort","hybrid","push","flashpoint"],"example":"control","type":"string"},"name":{"example":"Control","type":"string"}},"required":["id","name"],"type":"object"},"ModeCollection":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Mode"},"type":"array"},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"],"type":"object"},"Patch":{"properties":{"changes":{"description":"Machine-readable field alterations recorded against this patch, covering the core competitive game only.","items":{"$ref":"#/components/schemas/PatchChange"},"type":"array"},"date":{"example":"2026-02-10","type":"string"},"id":{"description":"The patch date, suffixed `-b`, `-c`, … only when two patches land on the same day.","example":"2026-02-10","type":"string"},"kind":{"enum":["season","mid-season","hotfix"],"example":"season","type":"string"},"name":{"example":"Season 1: Conquest","type":"string"},"sourceUrl":{"type":["string","null"]},"summary":{"type":["string","null"]}},"required":["id","date","kind","name","sourceUrl","summary","changes"],"type":"object"},"PatchChange":{"properties":{"from":{"description":"The value before the patch."},"target":{"description":"A `/`-separated path rooted at a resource collection, e.g. `heroes/ana/abilities/biotic-grenade/cooldown`.","example":"heroes/ana/abilities/biotic-grenade/cooldown","type":"string"},"to":{"description":"The value after the patch."}},"required":["target"],"type":"object"},"PatchChangeCollection":{"properties":{"data":{"items":{"$ref":"#/components/schemas/PatchChange"},"type":"array"},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"],"type":"object"},"PatchCollection":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Patch"},"type":"array"},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"],"type":"object"},"Problem":{"description":"An RFC 9457 problem document.","properties":{"detail":{"type":"string"},"instance":{"example":"/v1/overwatch/heroes/nobody","type":"string"},"status":{"example":404,"type":"integer"},"title":{"example":"Not Found","type":"string"},"type":{"example":"https://api.sightline.gg/problems/not-found","format":"uri","type":"string"}},"required":["type","title","status","detail","instance"],"type":"object"},"Role":{"properties":{"id":{"enum":["tank","damage","support"],"example":"support","type":"string"},"name":{"example":"Support","type":"string"},"subroles":{"items":{"properties":{"description":{"type":"string"},"id":{"enum":["bruiser","initiator","stalwart","flanker","recon","sharpshooter","specialist","medic","survivor","tactician"],"example":"tactician","type":"string"},"name":{"example":"Tactician","type":"string"},"passive":{"description":"The current in-game passive granted by this sub-role.","type":"string"}},"required":["id","name","description","passive"],"type":"object"},"type":"array"}},"required":["id","name","subroles"],"type":"object"},"RoleCollection":{"properties":{"data":{"items":{"$ref":"#/components/schemas/Role"},"type":"array"},"meta":{"$ref":"#/components/schemas/Meta"}},"required":["data","meta"],"type":"object"}},"securitySchemes":{"apiKey":{"description":"A Personal API Key (`sl_…`), issued at https://sightline.gg/settings/api-keys. May also be sent as `Authorization: Bearer sl_…`. Raises the caller's limit to 1,000 requests per minute, keyed on the key rather than the IP. Requires the `gamedata:read` Scope.","in":"header","name":"x-api-key","type":"apiKey"},"bearerAuth":{"bearerFormat":"JWT","description":"An access token issued by the Sightline Authorization Server (`https://auth.sightline.gg`). Verified statelessly against its JWKS. Raises the caller's limit to 1,000 requests per minute, keyed on the account.","scheme":"bearer","type":"http"}}},"info":{"description":"Public reference facts about the games Sightline supports — heroes, roles, maps, modes and patches. Game Data is never derived from Sightline match data and is a pure function of the deployed `@sightline/game-data` package, so every Sightline surface and this API describe the game as of the same patch.\n\nSingle resources are returned bare; collections are wrapped in `{ data, meta }`, where `meta.patch` names the newest recorded patch. Errors are RFC 9457 problem documents served as `application/problem+json`.\n\n## Access tiers\n\n**Anonymous Access** needs no credential and is limited to 60 requests per minute per IP.\n\n**Keyed Access** is limited to 1,000 requests per minute and comes in two forms: a Personal API Key sent as `x-api-key: sl_…` (or `Authorization: Bearer sl_…`), and an access token issued by the Sightline Authorization Server sent as `Authorization: Bearer <jwt>`. A key's window is keyed on the key and a token's on the account, so neither is shared with the rest of your network. Every operation here requires the `gamedata:read` Scope.\n\nPresenting a credential is optional, but presenting a bad one is an error: a rejected key or token is a `401`, and a valid credential without `gamedata:read` is a `403`. The `RateLimit-Limit`, `RateLimit-Remaining` and `RateLimit-Reset` headers always describe the caller's own tier.","license":{"name":"Sightline","url":"https://sightline.gg"},"title":"Sightline Game Data API","version":"1.0.0"},"openapi":"3.1.0","paths":{"/health":{"get":{"description":"Reports the patch this deployment describes and the commit it was built from. Never cached.","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}},"description":"The service is up."}},"summary":"Liveness and deployment identity","tags":["Health"]}},"/v1/games":{"get":{"description":"Every game whose Game Data Sightline publishes. Each id is the `{game}` segment of every other route.","responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GameCollection"}}},"description":"The Supported Games."},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The presented API key or bearer token was rejected."},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The credential does not carry the `gamedata:read` Scope."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The caller's rate limit is exhausted."},"500":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The request could not be completed."}},"security":[{},{"apiKey":[]},{"bearerAuth":[]}],"summary":"List Supported Games","tags":["Games"]}},"/v1/openapi.json":{"get":{"description":"The OpenAPI 3.1 description of this API, generated from the same schemas the routes validate against.","responses":{"200":{"content":{"application/json":{"schema":{"additionalProperties":{},"description":"This OpenAPI 3.1 document.","type":"object"}}},"description":"The OpenAPI 3.1 document."}},"security":[{},{"apiKey":[]},{"bearerAuth":[]}],"summary":"Get the OpenAPI document","tags":["Spec"]}},"/v1/{game}/heroes":{"get":{"description":"Every hero as of the latest patch, with localized names, aliases, official sub-role, hit-point composition and complete kit. The first three ability entries preserve match-log slot order.","parameters":[{"description":"A Supported Game. `overwatch` is the only one today; anything else is a 404.","in":"path","name":"game","required":true,"schema":{"description":"A Supported Game. `overwatch` is the only one today; anything else is a 404.","example":"overwatch","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/HeroCollection"}}},"description":"The heroes."},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The presented API key or bearer token was rejected."},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The credential does not carry the `gamedata:read` Scope."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No such resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The caller's rate limit is exhausted."},"500":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The request could not be completed."}},"security":[{},{"apiKey":[]},{"bearerAuth":[]}],"summary":"List heroes","tags":["Heroes"]}},"/v1/{game}/heroes/{hero}":{"get":{"description":"Resolves a hero by id, by its English, Korean or Chinese name, or by any alias recorded from match logs.","parameters":[{"description":"A Supported Game. `overwatch` is the only one today; anything else is a 404.","in":"path","name":"game","required":true,"schema":{"description":"A Supported Game. `overwatch` is the only one today; anything else is a 404.","example":"overwatch","type":"string"}},{"description":"A hero id, an English, Korean or Chinese name, or any recorded alias.","in":"path","name":"hero","required":true,"schema":{"description":"A hero id, an English, Korean or Chinese name, or any recorded alias.","example":"ana","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Hero"}}},"description":"The hero."},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The presented API key or bearer token was rejected."},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The credential does not carry the `gamedata:read` Scope."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No such resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The caller's rate limit is exhausted."},"500":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The request could not be completed."}},"security":[{},{"apiKey":[]},{"bearerAuth":[]}],"summary":"Get a hero","tags":["Heroes"]}},"/v1/{game}/heroes/{hero}/abilities":{"get":{"description":"The hero's complete kit. The first three entries are Ability 1, Ability 2 and Ultimate because match logs report those slots positionally; weapon modes, passives, alternate forms and additional inputs follow.","parameters":[{"description":"A Supported Game. `overwatch` is the only one today; anything else is a 404.","in":"path","name":"game","required":true,"schema":{"description":"A Supported Game. `overwatch` is the only one today; anything else is a 404.","example":"overwatch","type":"string"}},{"description":"A hero id, an English, Korean or Chinese name, or any recorded alias.","in":"path","name":"hero","required":true,"schema":{"description":"A hero id, an English, Korean or Chinese name, or any recorded alias.","example":"ana","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AbilityCollection"}}},"description":"The hero's abilities."},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The presented API key or bearer token was rejected."},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The credential does not carry the `gamedata:read` Scope."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No such resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The caller's rate limit is exhausted."},"500":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The request could not be completed."}},"security":[{},{"apiKey":[]},{"bearerAuth":[]}],"summary":"List a hero's abilities","tags":["Heroes"]}},"/v1/{game}/maps":{"get":{"description":"Every map as of the latest patch. Seasonal re-skins are nested as variants inside their base map and are never returned as maps of their own.","parameters":[{"description":"A Supported Game. `overwatch` is the only one today; anything else is a 404.","in":"path","name":"game","required":true,"schema":{"description":"A Supported Game. `overwatch` is the only one today; anything else is a 404.","example":"overwatch","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/MapCollection"}}},"description":"The maps."},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The presented API key or bearer token was rejected."},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The credential does not carry the `gamedata:read` Scope."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No such resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The caller's rate limit is exhausted."},"500":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The request could not be completed."}},"security":[{},{"apiKey":[]},{"bearerAuth":[]}],"summary":"List maps","tags":["Maps"]}},"/v1/{game}/maps/{map}":{"get":{"description":"Resolves a map by id, name or alias. A Map Variant — by its name or its `<map>-<variant>` id — resolves to the base map document that carries it.","parameters":[{"description":"A Supported Game. `overwatch` is the only one today; anything else is a 404.","in":"path","name":"game","required":true,"schema":{"description":"A Supported Game. `overwatch` is the only one today; anything else is a 404.","example":"overwatch","type":"string"}},{"description":"A map id, name or alias, or a Map Variant name or `<map>-<variant>` id. A variant resolves to its base map.","in":"path","name":"map","required":true,"schema":{"description":"A map id, name or alias, or a Map Variant name or `<map>-<variant>` id. A variant resolves to its base map.","example":"blizzard-world","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Map"}}},"description":"The map."},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The presented API key or bearer token was rejected."},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The credential does not carry the `gamedata:read` Scope."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No such resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The caller's rate limit is exhausted."},"500":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The request could not be completed."}},"security":[{},{"apiKey":[]},{"bearerAuth":[]}],"summary":"Get a map","tags":["Maps"]}},"/v1/{game}/modes":{"get":{"description":"The core competitive modes. Every map belongs to exactly one of them.","parameters":[{"description":"A Supported Game. `overwatch` is the only one today; anything else is a 404.","in":"path","name":"game","required":true,"schema":{"description":"A Supported Game. `overwatch` is the only one today; anything else is a 404.","example":"overwatch","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ModeCollection"}}},"description":"The modes."},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The presented API key or bearer token was rejected."},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The credential does not carry the `gamedata:read` Scope."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No such resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The caller's rate limit is exhausted."},"500":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The request could not be completed."}},"security":[{},{"apiKey":[]},{"bearerAuth":[]}],"summary":"List modes","tags":["Modes"]}},"/v1/{game}/patches":{"get":{"description":"Every recorded patch, newest first. Game Data always describes the game as of the newest one; earlier states are reconstructed from the recorded changes.","parameters":[{"description":"A Supported Game. `overwatch` is the only one today; anything else is a 404.","in":"path","name":"game","required":true,"schema":{"description":"A Supported Game. `overwatch` is the only one today; anything else is a 404.","example":"overwatch","type":"string"}},{"description":"Only patches on or after this ISO calendar date.","in":"query","name":"since","required":false,"schema":{"description":"Only patches on or after this ISO calendar date.","example":"2026-01-01","type":"string"}},{"description":"Only patches on or before this ISO calendar date.","in":"query","name":"until","required":false,"schema":{"description":"Only patches on or before this ISO calendar date.","example":"2026-06-30","type":"string"}},{"description":"Only patches of this kind: `season`, `mid-season` or `hotfix`.","in":"query","name":"kind","required":false,"schema":{"description":"Only patches of this kind: `season`, `mid-season` or `hotfix`.","example":"season","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchCollection"}}},"description":"The patches."},"400":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"A query parameter failed to parse."},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The presented API key or bearer token was rejected."},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The credential does not carry the `gamedata:read` Scope."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No such resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The caller's rate limit is exhausted."},"500":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The request could not be completed."}},"security":[{},{"apiKey":[]},{"bearerAuth":[]}],"summary":"List patches","tags":["Patches"]}},"/v1/{game}/patches/{patch}":{"get":{"description":"One patch, with the changes it recorded.","parameters":[{"description":"A Supported Game. `overwatch` is the only one today; anything else is a 404.","in":"path","name":"game","required":true,"schema":{"description":"A Supported Game. `overwatch` is the only one today; anything else is a 404.","example":"overwatch","type":"string"}},{"description":"A patch id — its date, suffixed `-b`, `-c`, … for same-day patches.","in":"path","name":"patch","required":true,"schema":{"description":"A patch id — its date, suffixed `-b`, `-c`, … for same-day patches.","example":"2026-02-10","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/Patch"}}},"description":"The patch."},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The presented API key or bearer token was rejected."},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The credential does not carry the `gamedata:read` Scope."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No such resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The caller's rate limit is exhausted."},"500":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The request could not be completed."}},"security":[{},{"apiKey":[]},{"bearerAuth":[]}],"summary":"Get a patch","tags":["Patches"]}},"/v1/{game}/patches/{patch}/changes":{"get":{"description":"The machine-readable field alterations this patch recorded, covering the core competitive game only. Stadium balance is not Game Data.","parameters":[{"description":"A Supported Game. `overwatch` is the only one today; anything else is a 404.","in":"path","name":"game","required":true,"schema":{"description":"A Supported Game. `overwatch` is the only one today; anything else is a 404.","example":"overwatch","type":"string"}},{"description":"A patch id — its date, suffixed `-b`, `-c`, … for same-day patches.","in":"path","name":"patch","required":true,"schema":{"description":"A patch id — its date, suffixed `-b`, `-c`, … for same-day patches.","example":"2026-02-10","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PatchChangeCollection"}}},"description":"The recorded changes."},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The presented API key or bearer token was rejected."},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The credential does not carry the `gamedata:read` Scope."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No such resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The caller's rate limit is exhausted."},"500":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The request could not be completed."}},"security":[{},{"apiKey":[]},{"bearerAuth":[]}],"summary":"List a patch's changes","tags":["Patches"]}},"/v1/{game}/roles":{"get":{"description":"The roles a hero can occupy, with Blizzard's official sub-roles and their current passive effects.","parameters":[{"description":"A Supported Game. `overwatch` is the only one today; anything else is a 404.","in":"path","name":"game","required":true,"schema":{"description":"A Supported Game. `overwatch` is the only one today; anything else is a 404.","example":"overwatch","type":"string"}}],"responses":{"200":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RoleCollection"}}},"description":"The roles."},"401":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The presented API key or bearer token was rejected."},"403":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The credential does not carry the `gamedata:read` Scope."},"404":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"No such resource."},"429":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The caller's rate limit is exhausted."},"500":{"content":{"application/problem+json":{"schema":{"$ref":"#/components/schemas/Problem"}}},"description":"The request could not be completed."}},"security":[{},{"apiKey":[]},{"bearerAuth":[]}],"summary":"List roles","tags":["Roles"]}}},"servers":[{"description":"Production","url":"https://api.sightline.gg"}],"tags":[{"description":"Liveness and deployment identity.","name":"Health"},{"description":"The Supported Games.","name":"Games"},{"description":"Heroes and their kits.","name":"Heroes"},{"description":"The roles a hero can occupy.","name":"Roles"},{"description":"Maps and their seasonal variants.","name":"Maps"},{"description":"The core competitive modes.","name":"Modes"},{"description":"Patches and their recorded changes.","name":"Patches"},{"description":"This document.","name":"Spec"}],"webhooks":{}}