Skip to main content

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.

SettingCurrent queryResult type
onlineserversOnline(gameServerIds: [Int!])[ServerOnline!]
charactersserversCharacters(gameServerIds: [Int!])[ServerCharacterCount!]
accountssiteAccountCountSiteAccountCount

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.

QuerydocumentId: serversCharactersauth: public

serversCharacters​

Character population for one, several or all servers in the current project. This counts server characters, not registered cabinet users.

Input fieldTypeDescription
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:

FieldTypeDescription
gameServerIdInt!Game server ID.
stateServerOnlineState!FRESH, STALE, MISSING or UNAVAILABLE.
countUnsignedIntMeasured character count: a JSON number from 0 to 4,294,967,295.
observedAtStringObservation time in UTC RFC3339.
staleAtStringUTC RFC3339 time after which the observation is stale.
Request
documentId: serversCharacters
{
"documentId": "serversCharacters",
"variables": {
"gameServerIds": [
1,
2
]
}
}
Response
200 OK: character publication enabled
{
"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.

QuerydocumentId: siteAccountCountauth: public

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:

FieldTypeDescription
countSiteAccountPopulation!Integer JSON number from 0 through 9,007,199,254,740,991 inclusive. It is not restricted to the signed 32-bit Int range.
observedAtString!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.

Request
documentId: siteAccountCount
{
"documentId": "siteAccountCount",
"variables": {}
}
Response
200 OK: account publication enabled
{
"data": {
"siteAccountCount": {
"count": 0,
"observedAt": "2026-09-08T13:30:00.000000Z"
}
}
}
QuerydocumentId: siteStatisticsauth: public

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
}
}
VariableTypeWhen to pass
gameServerIds[Int!]Optional server selection for online and characters. Does not affect accounts.
includeServersBoolean!true when online or characters are needed. Required.
includeAccountsBoolean!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.

Request
documentId: siteStatistics
{
"documentId": "siteStatistics",
"variables": {
"gameServerIds": [
1
],
"includeServers": true,
"includeAccounts": true
}
}
Response
200 OK: all three metrics enabled
{
"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.

QuerydocumentId: serverRatingVisibilityauth: public

serverRatingVisibility​

Currently available statistics sections. Use the response for navigation and tools. Read it again after settings change.

Input​

FieldTypeRequiredDescription
gameServerIdInt!YesPositive server ID within the current project.

Result​

ServerRatingVisibility!. Every field is Boolean!.

FieldSection
recordsOnline records.
onlineChartHistory chart; false when all series are disabled.
generalSummaryGeneral summary.
raceDistributionRace distribution.
genderDistributionGender distribution.
activityHeatmapActivity by day and hour.
classPopularityClass popularity.
risingStarsRising players.
serverTimelineRanking-change timeline.
searchRating search and character profile.
comparisonCharacter comparison.
snapshotRating 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​

Request
documentId: serverRatingVisibility
{
"documentId": "serverRatingVisibility",
"variables": {
"gameServerId": 1
}
}
Response
200 OK
{
"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​

QuerydocumentId: serverRankingSnapshotauth: public

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​

FieldTypeRequiredDescription
gameServerIdInt!YesPositive ID of a server in the current project.
typeStringFor continuationOne permitted type. Omit it to request all permitted tables.
atStringNoRFC3339 with a timezone, not in the future. For example, 2026-09-08T12:00:00Z. Responses normalize it to UTC milliseconds.
firstIntNo1..100 rows per table, default 50. The configured top limit can restrict the result further.
afterStringNoNon-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!.

FieldTypeMeaning
generatedAtStringResponse preparation time.
observedAtStringObservation boundary; matches at for a dated request.
snapshots[RankingSnapshot!]!Permitted tables only. Empty when none are enabled.
crestRankingSnapshotCrestOptional 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:

FieldTypeMeaning
typeString!Table identifier.
stateRankingSnapshotState!State described below.
snapshotIdStringOpaque observation identifier for this table.
capturedAtStringIts actual collection time.
staleAtStringObservation freshness boundary.
entriesJSON!Array of rows on this page, not an encoded JSON string.
pageInfo.hasNextPageBoolean!Whether this table has a next page.
pageInfo.endCursorStringContinuation cursor; null when no page follows.
StateRows and metadata
FRESHCurrent observation. Empty entries means collection succeeded but there were no participants.
STALEOutdated observation; rows, ID and actual times remain available. For dated requests, freshness is evaluated at the selected time.
MISSINGNo observation exists at that point in the available history. Empty rows; null ID and times.
SOURCE_ERRORThe latest collection attempt failed. Attempt time and ID remain, but rows are empty.
UNAVAILABLEThe 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​

Request
documentId: serverRankingSnapshot
{
"documentId": "serverRankingSnapshot",
"variables": {
"gameServerId": 1,
"type": "top_exp",
"at": "2026-09-08T12:00:00Z",
"first": 50
}
}
Response
200 OK: one participant, no next page
{
"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.

Character History​

QuerydocumentId: rankingCharacterHistoryauth: public

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.

FieldTypeDescription
gameServerIdInt!Positive ID of a server in the current project.
nameString!Character name, 1-128 characters, without control characters or surrounding whitespace.
typeString!An enabled character ranking, such as top_pvp.
daysInt1-90 days; defaults to 30.
firstInt1-100 observations; defaults to 50.
afterStringThe previous response's pageInfo.endCursor; omit on the first page.

The RankingCharacterHistoryReport! result contains:

FieldDescription
type, nameRequested ranking and name.
stateREADY, MISSING or UNAVAILABLE.
generatedAtResponse generation time in UTC RFC3339.
observedAt, fromUpper and lower period bounds in UTC RFC3339.
summarySummary of the entire period, not just this page.
entriesObservations ordered newest first.
pageInfohasNextPage: 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 stateMeaning
RANKEDA rank and exact score represented as a string.
NOT_RANKEDCollection succeeded but the character is outside the permitted top. Rank and score are null.
SOURCE_ERRORCollection 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.

Request
documentId: rankingCharacterHistory
{
"documentId": "rankingCharacterHistory",
"variables": {
"gameServerId": 1,
"name": "AriaDawn",
"type": "top_exp",
"days": 7,
"first": 50
}
}
Response
200 OK
{
"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.

QuerydocumentId: searchRankingCharactersauth: public

searchRankingCharacters​

Search character names in the selected server's latest available rankings. Each match includes its name, rank, exact score and position change.

FieldTypeDescription
gameServerIdInt!Positive ID of a server in the current project.
nameString!1-128 characters, without control characters or surrounding whitespace.
matchModeRankingCharacterMatchModeCONTAINS for a partial name (default), or EXACT for a full name. Case-insensitive.
typeStringOne enabled character ranking. Omit to select all available rankings.
firstInt1-100 matches per ranking; defaults to 50.
afterStringContinuation 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.

Request
documentId: searchRankingCharacters
{
"documentId": "searchRankingCharacters",
"variables": {
"gameServerId": 1,
"name": "AriaDawn",
"matchMode": "EXACT",
"type": "top_exp",
"first": 50
}
}
Response
200 OK
{
"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​

QuerydocumentId: rankingRisingCharactersauth: public

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.

FieldTypeMeaning
gameServerIdInt!Positive server ID belonging to the current project.
typeStringOne enabled character ranking; omitted means all enabled character rankings. Required with after.
firstInt1..100 rows per ranking; default 50.
afterStringOpaque continuation from that ranking, up to 4096 characters.

The RankingRisingCharactersReport! response contains generatedAt, observedAt and snapshots.

Snapshot fieldMeaning
type, stateRanking and its availability: FRESH, STALE, MISSING, SOURCE_ERROR or UNAVAILABLE.
snapshotId, capturedAt, staleAtObservation identity and UTC timestamps, or null when unavailable.
movementAvailableBoth current and previous observations provide valid movement evidence.
entriesExact name, current rank, decimal-string value, nullable positionChange and boolean isNew.
pageInfohasNextPage 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.

Request
documentId: rankingRisingCharacters
{
"documentId": "rankingRisingCharacters",
"variables": {
"gameServerId": 1,
"type": "top_exp",
"first": 50
}
}
Response
200 OK
{
"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​

QuerydocumentId: compareRankingCharactersauth: public

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.

FieldTypeDescription
gameServerIdInt!Positive server ID in the current project.
firstNameString!First character's full name, 1..128 characters.
secondNameString!Second character's full name, 1..128 characters.
typeStringOne 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:

FieldMeaning
type, stateRating and state: FRESH, STALE, MISSING, SOURCE_ERROR or UNAVAILABLE.
snapshotId, capturedAt, staleAtObservation ID, capture time and freshness boundary. Different ratings have their own observations. Fields are null when the corresponding metadata is unavailable.
first, secondThe 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.

Request
documentId: compareRankingCharacters
{
"documentId": "compareRankingCharacters",
"variables": {
"gameServerId": 1,
"firstName": "AriaDawn",
"secondName": "KaelDawn",
"type": "top_exp"
}
}
Response
200 OK
{
"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​

QuerydocumentId: rankingCharacterComparisonHistoryauth: public

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.

FieldTypeDescription
gameServerIdInt!Server in the current project.
firstName, secondNameString!Two different full names with the same constraints as comparison.
typeString!One enabled character rating.
daysIntPeriod of 1..90 days; default 30.
firstInt1..100 observations per page; default 50.
afterStringShared 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:

staterank and value
RANKEDObserved position and exact score as a string.
NOT_RANKEDBoth are null: the character is outside the published rows for this observation.
SOURCE_ERRORBoth are null: rating collection failed. This state applies to both participants.
Request
documentId: rankingCharacterComparisonHistory
{
"documentId": "rankingCharacterComparisonHistory",
"variables": {
"gameServerId": 1,
"firstName": "AriaDawn",
"secondName": "KaelDawn",
"type": "top_exp",
"days": 7,
"first": 50
}
}
Response
200 OK
{
"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.