Teams

A team's Glicko-2 rating history

The team's own computed Glicko-2 rating over time (one point per played match), oldest→newest for a left-to-right chart.

GET
/v1/{game}/teams/{id}/ratings

The team's own computed Glicko-2 rating over time (one point per played match), oldest→newest for a left-to-right chart. limit default 30, max 1000; naming a window returns that whole span (the default then rises to the maximum). Each point carries the match_id that moved it, so a chart can say what happened there and join it to /teams/{id}/results. Enveloped {"data": [TeamRatingPoint, ...], "meta": {...}} (not cursor-paginated).

Authorization

AuthorizationBearer <token>

The primary way to authenticate: Authorization: Bearer <api-key>. When a request also carries ?apiKey=, the header wins. We store only a SHA-256 hash of a key, never the key itself. To try the API with no account, use the public sample key eo_sample_public: one published key, shared by everyone, that reads a fixed sample of past matches within daily limits. For evaluation; our Terms apply.

In: header

Path Parameters

game*string

Game slug. cs2 is the only populated title today; an un-onboarded game 404s cleanly.

id*string

Resource identifier — either a UUID or the resource's human-readable slug, scoped to {game}. /v1/cs2/teams/natus-vincere and /v1/cs2/teams/019f23d1-fb5c-7987-b522-47c3a5e72111 address the same row, so you can go straight from a slug you already have without first looking up its id.

Slugs work on teams, players and tournaments. Matches have no slug, so a match id must be a UUID. Either way, an identifier that resolves to nothing returns 404 not_found.

A team or a player also answers to a slug it was renamed away from, as long as no current team or player holds that slug — so a link made before a rename keeps working. The row returned carries its current slug.

Query Parameters

limit?integer

How many rating points to return. Default 30 (1000 when a window is named), maximum 1000. Selects the most recent N points but returns them oldest-first, so the series plots directly. Not paginated.

Range1 <= value <= 1000
Default30
window?string

Only points inside this trailing span: a whole number of months with an m suffix, such as 6m, up to 60m, or all. Naming a window raises the default limit to the maximum, because a caller who names a span wants all of it. Omit it for the most recent limit points whatever their age.

Response Body

application/json

application/json

application/json

curl -X GET "https://example.com/v1/cs2/teams/019f2858-e253-7f3d-bdff-bc7738bd1036/ratings"
{  "data": [    {      "rating": 1706.0276191063963,      "rd": 49.52154040701407,      "as_of": "2026-07-18T21:04:24.374135Z",      "match_id": "019f77b7-6726-7180-b25b-f907e328ee7a"    },    {      "rating": 1675.2415434256247,      "rd": 48.417509610034934,      "as_of": "2026-07-19T23:00:00Z",      "match_id": "019f28e1-e6ae-7032-8255-4c7e26548918"    },    {      "rating": 1655.5108014567663,      "rd": 48.70136068925787,      "as_of": "2026-07-23T19:00:19.424253Z",      "match_id": "019f23d2-5a34-794e-85fa-ae2f2009ef4f"    }  ],  "meta": {    "count": 3,    "next_cursor": null  }}
{  "error": {    "code": "not_found",    "message": "not found",    "request_id": "019f3d18-c15f-7319-81a7-343e8a80a578"  }}

{  "error": {    "code": "rate_limited",    "message": "rate limit exceeded",    "request_id": "019f3d18-c15f-7319-81a7-343e8a80a578"  }}