Ratings & Players
Website statistics
Three project settings, site.statistics.online, site.statistics.accounts and site.statistics.characters, independently allow publication. All eight combinations are valid; absent settings default to false. Only boolean true permits publication. The project guide illustrates every combination.
| Setting | Current query | Result type |
|---|---|---|
online | serversOnline(gameServerIds: [Int!]) | [ServerOnline!] |
characters | serversCharacters(gameServerIds: [Int!]) | [ServerCharacterCount!] |
accounts | siteAccountCount | SiteAccountCount |
The outer online and character lists are nullable. When a metric is disabled, the entire requested field is null, not an empty list or zero.
All operations use the existing project protocol: POST /graphql, X-Project-Context from identity.contextToken, and JSON containing documentId and variables. No player session is required. The GraphQL below describes the named operation, not a replacement HTTP request format.
serversCharacters
Character population for one, several or all servers in the current project. This counts server characters, not registered cabinet users.
| Input field | Type | Description |
|---|---|---|
gameServerIds | [Int!] | Omit or pass null for all project servers. To select servers, pass 1 to 100 distinct positive IDs. |
Use unique IDs of servers in the selected project; an empty list is invalid. With publication enabled, a project without servers returns []. With publication disabled, the result is null.
Each ServerCharacterCount contains:
| Field | Type | Description |
|---|---|---|
gameServerId | Int! | Game server ID. |
state | ServerOnlineState! | FRESH, STALE, MISSING or UNAVAILABLE. |
count | UnsignedInt | Measured character count: a JSON number from 0 to 4,294,967,295. |
observedAt | String | Observation time in UTC RFC3339. |
staleAt | String | UTC RFC3339 time after which the observation is stale. |
{
"documentId": "serversCharacters",
"variables": {
"gameServerIds": [
1,
2
]
}
}
{
"data": {
"serversCharacters": [
{
"gameServerId": 1,
"state": "FRESH",
"count": 0,
"observedAt": "2026-09-08T13:30:00Z",
"staleAt": "2026-09-08T13:40:00Z"
},
{
"gameServerId": 2,
"state": "MISSING",
"count": null,
"observedAt": null,
"staleAt": null
}
]
}
}
A measured 0 is numeric, not a string. MISSING means there is no measurement; UNAVAILABLE means data is temporarily unavailable. Both states return null counts and observation timestamps. STALE retains the last count and observation time, which can be displayed with a stale label. The same rules apply to current online. A request failure is not converted into a zero measurement.
siteAccountCount
Registered cabinet users in the current project. This query accepts no arguments: team, project and server IDs cannot be supplied. Selecting game servers does not change this count. Accounts currently means cabinet users, not game accounts or a sum of accounts across servers.
The nullable SiteAccountCount result contains only:
| Field | Type | Description |
|---|---|---|
count | SiteAccountPopulation! | Integer JSON number from 0 through 9,007,199,254,740,991 inclusive. It is not restricted to the signed 32-bit Int range. |
observedAt | String! | Measurement time in UTC RFC3339, not the time the page was opened. |
No email, IP or other personal fields are returned. When site.statistics.accounts !== true, the result is null. When publication is enabled and no cabinet users are registered, the result contains an honest numeric 0. A read failure is an error, not an empty population. This type has no state or staleAt fields.
{
"documentId": "siteAccountCount",
"variables": {}
}
{
"data": {
"siteAccountCount": {
"count": 0,
"observedAt": "2026-09-08T13:30:00.000000Z"
}
}
}
siteStatistics
One named operation for the website metrics:
query siteStatistics(
$gameServerIds: [Int!]
$includeServers: Boolean!
$includeAccounts: Boolean!
) {
serversOnline(gameServerIds: $gameServerIds) @include(if: $includeServers) {
gameServerId
state
current
peak
observedAt
staleAt
loginAvailable
gameAvailable
}
serversCharacters(gameServerIds: $gameServerIds) @include(if: $includeServers) {
gameServerId
state
count
observedAt
staleAt
}
siteAccountCount @include(if: $includeAccounts) {
count
observedAt
}
}
| Variable | Type | When to pass |
|---|---|---|
gameServerIds | [Int!] | Optional server selection for online and characters. Does not affect accounts. |
includeServers | Boolean! | true when online or characters are needed. Required. |
includeAccounts | Boolean! | true when registered cabinet users are needed. Required. |
A field skipped with @include(if: false) is absent from the response. A requested but disabled metric is present as null.
{
"documentId": "siteStatistics",
"variables": {
"gameServerIds": [
1
],
"includeServers": true,
"includeAccounts": true
}
}
{
"data": {
"serversOnline": [
{
"gameServerId": 1,
"state": "FRESH",
"current": 0,
"peak": 18,
"observedAt": "2026-09-08T13:30:00Z",
"staleAt": "2026-09-08T13:40:00Z",
"loginAvailable": true,
"gameAvailable": true
}
],
"serversCharacters": [
{
"gameServerId": 1,
"state": "FRESH",
"count": 12,
"observedAt": "2026-09-08T13:30:00Z",
"staleAt": "2026-09-08T13:40:00Z"
}
],
"siteAccountCount": {
"count": 24,
"observedAt": "2026-09-08T13:30:00.000000Z"
}
}
}
For accounts only, send includeServers: false and includeAccounts: true; a server list is not required. If the caller needs none of the three metrics, both flags can be false to omit all three fields from the response. Request needed metrics regardless of locally cached publication flags; use the current API response to determine availability.
During partial unavailability, do not substitute zeros or present an incomplete sum of server measurements. A successfully retrieved cabinet-user count can remain visible even when online and character measurements are temporarily unavailable.
Available Sections
Operations use the selected project. Disabled tools return an error, and hidden tables and groups are absent from the response. History, search and comparison use the selected rankings and top limits.
The crest archive contains images for response rows.
The website publication switches also determine available historical data. Disabling online makes serverOnlineHistory.points[].online null; disabling characters hides points[].characters. Disabled characters also removes count_char from top_statistic.summary and the races and genders groups; rankingClassDistribution becomes unavailable. Character and clan leaderboard tables are configured independently.
serverRatingVisibility
Currently available statistics sections. Use the response for navigation and tools. Read it again after settings change.
Input
| Field | Type | Required | Description |
|---|---|---|---|
gameServerId | Int! | Yes | Positive server ID within the current project. |
Result
ServerRatingVisibility!. Every field is Boolean!.
| Field | Section |
|---|---|
records | Online records. |
onlineChart | History chart; false when all series are disabled. |
generalSummary | General summary. |
raceDistribution | Race distribution. |
genderDistribution | Gender distribution. |
activityHeatmap | Activity by day and hour. |
classPopularity | Class popularity. |
risingStars | Rising players. |
serverTimeline | Ranking-change timeline. |
search | Rating search and character profile. |
comparison | Character comparison. |
snapshot | Rating at a selected date. |
A flag permits display but does not indicate data availability. The summary and distributions also require general statistics to be enabled. serverRankingSnapshot returns the permitted tables with current entry limits applied.
Errors
Invalid input returns an error. Refresh the available sections after changing settings.
Exchange example
{
"documentId": "serverRatingVisibility",
"variables": {
"gameServerId": 1
}
}
{
"data": {
"serverRatingVisibility": {
"records": false,
"onlineChart": true,
"raceDistribution": false,
"genderDistribution": false,
"generalSummary": false,
"activityHeatmap": false,
"classPopularity": false,
"risingStars": false,
"serverTimeline": false,
"search": false,
"comparison": false,
"snapshot": false
}
}
}
Current And Dated Rankings
serverRankingSnapshot
Description
One operation serves current tables and dated rankings. Without at, it returns the latest available observation for every permitted type. With at, it selects the latest observation at or before that time; dated snapshots must be enabled by the administrator.
Each table has its own observation ID and collection time. Do not replace them with page-load time or assume every table was collected simultaneously. Current publication settings also apply to historical observations.
Input
| Field | Type | Required | Description |
|---|---|---|---|
gameServerId | Int! | Yes | Positive ID of a server in the current project. |
type | String | For continuation | One permitted type. Omit it to request all permitted tables. |
at | String | No | RFC3339 with a timezone, not in the future. For example, 2026-09-08T12:00:00Z. Responses normalize it to UTC milliseconds. |
first | Int | No | 1..100 rows per table, default 50. The configured top limit can restrict the result further. |
after | String | No | Non-empty endCursor from the previous page, up to 4096 characters. Requires type. |
Competitive types: top_pvp, top_pk, top_exp, top_clan, top_clan_pvp, top_ally, top_hero, top_hero_active, top_pkw, top_pkt, top_rank, rankings_glory, rankings_abyss, rankings_kills, rankings_legions. World-statistic types: top_castle, top_clanhols, top_raidboss, top_statistic. Availability depends on the game and settings.
Result
Response type: RankingSnapshotReport!.
| Field | Type | Meaning |
|---|---|---|
generatedAt | String | Response preparation time. |
observedAt | String | Observation boundary; matches at for a dated request. |
snapshots | [RankingSnapshot!]! | Permitted tables only. Empty when none are enabled. |
crest | RankingSnapshotCrest | Optional crest archive: gameServerId: Int!, file: String! (Base64 ZIP). A missing archive does not invalidate rankings. |
generatedAt and observedAt are null when the report is unavailable. Other timestamps use UTC RFC3339.
Each RankingSnapshot contains:
| Field | Type | Meaning |
|---|---|---|
type | String! | Table identifier. |
state | RankingSnapshotState! | State described below. |
snapshotId | String | Opaque observation identifier for this table. |
capturedAt | String | Its actual collection time. |
staleAt | String | Observation freshness boundary. |
entries | JSON! | Array of rows on this page, not an encoded JSON string. |
pageInfo.hasNextPage | Boolean! | Whether this table has a next page. |
pageInfo.endCursor | String | Continuation cursor; null when no page follows. |
| State | Rows and metadata |
|---|---|
FRESH | Current observation. Empty entries means collection succeeded but there were no participants. |
STALE | Outdated observation; rows, ID and actual times remain available. For dated requests, freshness is evaluated at the selected time. |
MISSING | No observation exists at that point in the available history. Empty rows; null ID and times. |
SOURCE_ERROR | The latest collection attempt failed. Attempt time and ID remain, but rows are empty. |
UNAVAILABLE | The report cannot currently be retrieved. Empty rows; null ID and times. |
Rows contain rank (integer position in the full snapshot), value, positionChange, isNew and game-specific fields. Names use charName, clanName and allianceName where applicable. positionChange can be null: without a comparable previous observation, change is unknown. isNew: true means the entry appeared relative to that previous observation, not that the player just registered.
Competitive value is always an exact decimal string, up to 160 characters. For example, converting "9223372036854775808" to a JavaScript Number loses precision. World-statistic rows explicitly use value: null, never "0".
top_statistic organizes permitted measurements into summary, genders and races. Disabled groups are absent. Disabling character publication removes summary.count_char, genders and races; other permitted summary measurements remain. Only crests referenced by visible rows are included.
Continuing A Table
Save the selected table's pageInfo.endCursor. Send it as after with that table's type, keeping the same gameServerId and at. first remains bounded to 1..100.
The cursor pins the original observation, so a new collection cannot mix pages. Positions do not restart at one. Cursors expire after one hour. Pass the cursor unchanged; when selecting another server, type, date or top limit, start from the first page. A failed continuation is not the end of the list: preserve existing rows and offer to refresh the table.
Errors
Invalid arguments, unknown or disabled types and disabled dated access return GraphQL errors. Invalid, expired or no longer accessible cursors also return errors. Do not turn them into successful empty lists. Temporary report failure is represented by UNAVAILABLE.
Exchange example
{
"documentId": "serverRankingSnapshot",
"variables": {
"gameServerId": 1,
"type": "top_exp",
"at": "2026-09-08T12:00:00Z",
"first": 50
}
}
{
"data": {
"serverRankingSnapshot": {
"generatedAt": "2026-09-08T12:05:00.000Z",
"observedAt": "2026-09-08T12:00:00.000Z",
"snapshots": [
{
"type": "top_exp",
"state": "FRESH",
"snapshotId": "019927d0-1234-7000-8000-000000000001",
"capturedAt": "2026-09-08T11:59:00.000Z",
"staleAt": "2026-09-08T12:59:00.000Z",
"entries": [
{
"rank": 1,
"value": "9223372036854775808",
"charName": "Aeris",
"clanName": "Aether",
"positionChange": null,
"isNew": false
}
],
"pageInfo": {
"hasNextPage": false,
"endCursor": null
}
}
],
"crest": null
}
}
}
Use the same documentId for the next page:
{
"documentId": "serverRankingSnapshot",
"variables": {
"gameServerId": 1,
"type": "top_pvp",
"first": 50,
"after": "<endCursor from the previous response with hasNextPage: true>"
}
}
The angle-bracket value is illustrative; pass the entire returned cursor. Omit at for current rankings and repeat the selected time for dated rankings.
Related types
Character History
rankingCharacterHistory
One character's positions in one ranking over a selected period. Names match in full, case-insensitively. Clans, alliances and world statistics are not part of this operation.
| Field | Type | Description |
|---|---|---|
gameServerId | Int! | Positive ID of a server in the current project. |
name | String! | Character name, 1-128 characters, without control characters or surrounding whitespace. |
type | String! | An enabled character ranking, such as top_pvp. |
days | Int | 1-90 days; defaults to 30. |
first | Int | 1-100 observations; defaults to 50. |
after | String | The previous response's pageInfo.endCursor; omit on the first page. |
The RankingCharacterHistoryReport! result contains:
| Field | Description |
|---|---|
type, name | Requested ranking and name. |
state | READY, MISSING or UNAVAILABLE. |
generatedAt | Response generation time in UTC RFC3339. |
observedAt, from | Upper and lower period bounds in UTC RFC3339. |
summary | Summary of the entire period, not just this page. |
entries | Observations ordered newest first. |
pageInfo | hasNextPage: Boolean! and endCursor: String. |
In the summary, observations counts observations, rankedObservations counts appearances within the permitted top and sourceErrors counts collection failures. sampledDays counts UTC days with successful observations; daysRanked counts days in the top. bestRank and worstRank are null when there were no appearances.
Each entry has snapshotId, capturedAt, state, rank and value:
| Entry state | Meaning |
|---|---|
RANKED | A rank and exact score represented as a string. |
NOT_RANKED | Collection succeeded but the character is outside the permitted top. Rank and score are null. |
SOURCE_ERROR | Collection failed. Rank and score are null; this does not indicate a lost position. |
MISSING means no observations exist for the period: entries are empty and summary counters are zero. UNAVAILABLE means the report is temporarily unavailable: summary and timestamps are null, with no entries. Do not replace unknown ranks or scores with zero.
{
"documentId": "rankingCharacterHistory",
"variables": {
"gameServerId": 1,
"name": "AriaDawn",
"type": "top_exp",
"days": 7,
"first": 50
}
}
{
"data": {
"rankingCharacterHistory": {
"type": "top_exp",
"name": "AriaDawn",
"state": "READY",
"generatedAt": "2026-09-09T12:00:00.000Z",
"observedAt": "2026-09-09T12:00:00.000Z",
"from": "2026-09-02T12:00:00.000Z",
"summary": {
"observations": 3,
"rankedObservations": 1,
"sourceErrors": 1,
"sampledDays": 1,
"daysRanked": 1,
"bestRank": 1,
"worstRank": 1
},
"entries": [
{
"snapshotId": "01a083cd-f900-7000-8000-000000000003",
"capturedAt": "2026-09-09T11:55:00.000Z",
"state": "RANKED",
"rank": 1,
"value": "9223372036854775808"
},
{
"snapshotId": "01a083cd-f900-7000-8000-000000000002",
"capturedAt": "2026-09-09T11:50:00.000Z",
"state": "SOURCE_ERROR",
"rank": null,
"value": null
},
{
"snapshotId": "01a083cd-f900-7000-8000-000000000001",
"capturedAt": "2026-09-09T11:45:00.000Z",
"state": "NOT_RANKED",
"rank": null,
"value": null
}
],
"pageInfo": {
"hasNextPage": false,
"endCursor": null
}
}
}
}
Keep the name, ranking, server and period unchanged when continuing, and pass the returned cursor unchanged. Period bounds and summary stay fixed across pages. An expired or unsuitable cursor is rejected: restart from the first page. Changes to visibility, top size or stored observations may also require a refresh.
Disabled search or rankings and invalid arguments return errors. The current top size applies to every historical observation. A period containing more than 25,000 observations must be shortened.
Character Search
searchRankingCharacters
Search character names in the selected server's latest available rankings. Each match includes its name, rank, exact score and position change.
| Field | Type | Description |
|---|---|---|
gameServerId | Int! | Positive ID of a server in the current project. |
name | String! | 1-128 characters, without control characters or surrounding whitespace. |
matchMode | RankingCharacterMatchMode | CONTAINS for a partial name (default), or EXACT for a full name. Case-insensitive. |
type | String | One enabled character ranking. Omit to select all available rankings. |
first | Int | 1-100 matches per ranking; defaults to 50. |
after | String | Continuation cursor. Requires a specific type. |
The RankingCharacterSearchReport! result contains generatedAt, observedAt and snapshots. Each snapshot has type, state, snapshotId, capturedAt, staleAt, entries and pageInfo. States and timestamps follow the ranking snapshot rules.
Each entry contains name: String!, rank: Int!, value: String!, positionChange: Int and isNew: Boolean!. Do not convert scores to floating-point numbers: they may exceed JavaScript's safe integer range. Positive change means a rise, negative means a fall, 0 means unchanged and null means no comparable previous observation.
{
"documentId": "searchRankingCharacters",
"variables": {
"gameServerId": 1,
"name": "AriaDawn",
"matchMode": "EXACT",
"type": "top_exp",
"first": 50
}
}
{
"data": {
"searchRankingCharacters": {
"generatedAt": "2026-09-09T12:00:00.000Z",
"observedAt": "2026-09-09T12:00:00.000Z",
"snapshots": [
{
"type": "top_exp",
"state": "FRESH",
"snapshotId": "01a083cd-f900-7000-8000-000000000003",
"capturedAt": "2026-09-09T11:55:00.000Z",
"staleAt": "2026-09-09T12:55:00.000Z",
"entries": [
{
"name": "AriaDawn",
"rank": 1,
"value": "9223372036854775808",
"positionChange": null,
"isNew": true
}
],
"pageInfo": {
"hasNextPage": false,
"endCursor": null
}
}
]
}
}
}
Empty entries in a fresh or stale snapshot mean no names matched within the published top. Collection failures and unavailable reports have distinct states. Continue using the ranking's cursor with the original name and match mode. Ranks remain positions in the full ranking, not search result row numbers.
To build a character profile, use exact search and request rankingCharacterHistory for the selected ranking separately.
Rising Players
rankingRisingCharacters
Returns new entries and characters who moved up in each enabled character ranking. New entries come first, followed by positive position changes in descending order; current rank breaks ties. "New" means absent from the previous published top, not newly created in the game.
| Field | Type | Meaning |
|---|---|---|
gameServerId | Int! | Positive server ID belonging to the current project. |
type | String | One enabled character ranking; omitted means all enabled character rankings. Required with after. |
first | Int | 1..100 rows per ranking; default 50. |
after | String | Opaque continuation from that ranking, up to 4096 characters. |
The RankingRisingCharactersReport! response contains generatedAt, observedAt and snapshots.
| Snapshot field | Meaning |
|---|---|
type, state | Ranking and its availability: FRESH, STALE, MISSING, SOURCE_ERROR or UNAVAILABLE. |
snapshotId, capturedAt, staleAt | Observation identity and UTC timestamps, or null when unavailable. |
movementAvailable | Both current and previous observations provide valid movement evidence. |
entries | Exact name, current rank, decimal-string value, nullable positionChange and boolean isNew. |
pageInfo | hasNextPage and nullable endCursor. |
For a new entry, isNew=true and positionChange=null; other returned changes are strictly positive. Scores must not be converted to floating point. A successful empty list with movementAvailable=true means no gains; false means insufficient evidence, including a failed previous collection. Source failure does not become an empty successful ranking.
{
"documentId": "rankingRisingCharacters",
"variables": {
"gameServerId": 1,
"type": "top_exp",
"first": 50
}
}
{
"data": {
"rankingRisingCharacters": {
"generatedAt": "2026-09-09T10:00:00.000Z",
"observedAt": "2026-09-09T10:00:00.000Z",
"snapshots": [
{
"type": "top_exp",
"state": "FRESH",
"snapshotId": "01a07fab-8130-7000-8000-000000000001",
"capturedAt": "2026-09-09T09:59:00.000Z",
"staleAt": "2026-09-09T10:59:00.000Z",
"movementAvailable": true,
"entries": [
{
"name": "KaelDawn",
"rank": 3,
"value": "8000000000",
"positionChange": null,
"isNew": true
},
{
"name": "Aria",
"rank": 1,
"value": "9223372036854775809",
"positionChange": 2,
"isNew": false
}
],
"pageInfo": {
"hasNextPage": false,
"endCursor": null
}
}
]
}
}
}
Continuation preserves the current and previous observations. Keep the same server, ranking and page size. A changed visibility/top limit or invalid/expired cursor is rejected; reload from the first page. Search may be disabled independently.
Normal current client results do not need metadata badges or timestamps. A short notice is sufficient for delayed or unavailable data; the API preserves metadata for integrations.
Character comparison
compareRankingCharacters
Compares two characters by their full names. Within each rating, both results belong to the same observation. Comparison is configured independently from search; disabling search does not disable this operation.
| Field | Type | Description |
|---|---|---|
gameServerId | Int! | Positive server ID in the current project. |
firstName | String! | First character's full name, 1..128 characters. |
secondName | String! | Second character's full name, 1..128 characters. |
type | String | One enabled character rating. Omit to return all available character ratings. |
Names cannot contain control characters or leading/trailing whitespace. Matching ignores case; identical names with different casing are rejected. Partial-name matching is not used.
The RankingCharacterComparisonReport! result contains firstName, secondName, generatedAt, observedAt and snapshots. Each snapshot contains:
| Field | Meaning |
|---|---|
type, state | Rating and state: FRESH, STALE, MISSING, SOURCE_ERROR or UNAVAILABLE. |
snapshotId, capturedAt, staleAt | Observation ID, capture time and freshness boundary. Different ratings have their own observations. Fields are null when the corresponding metadata is unavailable. |
first, second | The corresponding character's result or null: name, position, exact score, position change and new-entry indicator. |
value is always a string: do not convert it to JavaScript Number. positionChange compares against the previous comparable observation: positive means moving up, negative means moving down, zero means unchanged, and null means no comparison is available. isNew indicates entering the published top.
{
"documentId": "compareRankingCharacters",
"variables": {
"gameServerId": 1,
"firstName": "AriaDawn",
"secondName": "KaelDawn",
"type": "top_exp"
}
}
{
"data": {
"compareRankingCharacters": {
"firstName": "AriaDawn",
"secondName": "KaelDawn",
"generatedAt": "2026-09-09T12:00:00.000Z",
"observedAt": "2026-09-09T12:00:00.000Z",
"snapshots": [
{
"type": "top_exp",
"state": "FRESH",
"snapshotId": "01a083cd-f900-7000-8000-000000000003",
"capturedAt": "2026-09-09T11:55:00.000Z",
"staleAt": "2026-09-09T12:55:00.000Z",
"first": {
"name": "AriaDawn",
"rank": 2,
"value": "9223372036854775808",
"positionChange": 0,
"isNew": false
},
"second": {
"name": "KaelDawn",
"rank": 1,
"value": "9223372036854775809",
"positionChange": 0,
"isNew": false
}
}
]
}
}
}
In FRESH or STALE, a null participant means absence from the published top, not absence from the game. In MISSING, SOURCE_ERROR and UNAVAILABLE, both results are null; do not substitute zero positions or scores. If the latest collection failed, an older successful observation is not returned as current.
Disabled comparison, disabled or unsuitable rating types and invalid names return errors. The current published top limit applies to both results.
Comparison history
rankingCharacterComparisonHistory
Shared history for two characters in one rating. Each row represents one observation and contains each participant's state, position and score. History follows names: a rename does not merge records automatically.
| Field | Type | Description |
|---|---|---|
gameServerId | Int! | Server in the current project. |
firstName, secondName | String! | Two different full names with the same constraints as comparison. |
type | String! | One enabled character rating. |
days | Int | Period of 1..90 days; default 30. |
first | Int | 1..100 observations per page; default 50. |
after | String | Shared continuation cursor from pageInfo.endCursor. |
The RankingCharacterComparisonHistoryReport! result contains the names, type, state, generatedAt, observedAt, from, firstSummary, secondSummary, entries and pageInfo. Report states are READY when observations exist, MISSING when the period has none, and UNAVAILABLE when the report cannot currently be loaded.
Each summary contains observations, rankedObservations, sourceErrors, sampledDays, daysRanked, bestRank and worstRank. It covers the full selected period, not just one page. Days use UTC. Summaries are null when the report is unavailable.
Each entry has a shared snapshotId, capturedAt and two results, first / second:
state | rank and value |
|---|---|
RANKED | Observed position and exact score as a string. |
NOT_RANKED | Both are null: the character is outside the published rows for this observation. |
SOURCE_ERROR | Both are null: rating collection failed. This state applies to both participants. |
{
"documentId": "rankingCharacterComparisonHistory",
"variables": {
"gameServerId": 1,
"firstName": "AriaDawn",
"secondName": "KaelDawn",
"type": "top_exp",
"days": 7,
"first": 50
}
}
{
"data": {
"rankingCharacterComparisonHistory": {
"firstName": "AriaDawn",
"secondName": "KaelDawn",
"type": "top_exp",
"state": "READY",
"generatedAt": "2026-09-09T12:00:00.000Z",
"observedAt": "2026-09-09T12:00:00.000Z",
"from": "2026-09-02T12:00:00.000Z",
"firstSummary": {
"observations": 3,
"rankedObservations": 1,
"sourceErrors": 1,
"sampledDays": 1,
"daysRanked": 1,
"bestRank": 2,
"worstRank": 2
},
"secondSummary": {
"observations": 3,
"rankedObservations": 2,
"sourceErrors": 1,
"sampledDays": 1,
"daysRanked": 1,
"bestRank": 1,
"worstRank": 1
},
"entries": [
{
"snapshotId": "01a083cd-f900-7000-8000-000000000003",
"capturedAt": "2026-09-09T11:55:00.000Z",
"first": {
"state": "RANKED",
"rank": 2,
"value": "9223372036854775808"
},
"second": {
"state": "RANKED",
"rank": 1,
"value": "9223372036854775809"
}
},
{
"snapshotId": "01a083cd-f900-7000-8000-000000000002",
"capturedAt": "2026-09-09T11:50:00.000Z",
"first": {
"state": "SOURCE_ERROR",
"rank": null,
"value": null
},
"second": {
"state": "SOURCE_ERROR",
"rank": null,
"value": null
}
},
{
"snapshotId": "01a083cd-f900-7000-8000-000000000001",
"capturedAt": "2026-09-09T11:45:00.000Z",
"first": {
"state": "NOT_RANKED",
"rank": null,
"value": null
},
"second": {
"state": "RANKED",
"rank": 1,
"value": "9223372036854775809"
}
}
],
"pageInfo": {
"hasNextPage": false,
"endCursor": null
}
}
}
}
Observations are ordered newest first. Continue with the unchanged cursor and the same server, names in the same order, rating and period. Period boundaries and both summaries remain fixed. If the cursor is invalid or expired, start again from the first page.
Changes to settings, top limits or retained observations may require restarting from the first page. Current top limits also apply to historical observations. A period containing more than 25,000 observations must be shortened.