Skip to main content

Pagination example with multiple queries

GraphQL Relay pagination is used in queries (see IMPORTANT: Relay pagination). Some queries will return a maximum number of results (for example, queries may return a maximum list of 20 games). Pagination is used to get additional results. You can paginate data with the after and before arguments and a cursor value which is obtained from another query. For example, if we run the query below we will obtain results with details about the first 20 games as well as pageInfo that contains a startCursor and endCursor.

query SteamAppsFirstPage {
steamApps {
pageInfo {
hasNextPage
hasPreviousPage
startCursor
endCursor
}
edges {
node {
name
copiesSold
}
}
}
}

The results of the query will be structured as follows. Notice that we have a endCursor value in the pageInfo structure which can be used to get the next page of results:

{
"data": {
"steamApps": {
"pageInfo": {
"hasNextPage": true,
"hasPreviousPage": false,
"startCursor": "R1BDOk46MTA=",
"endCursor": "R1BDOk46NDQw"
},
"edges": [
{
"node": {
"name": "Counter-Strike",
"copiesSold": 7043046
}
},
{
"node": {
"name": "Team Fortress Classic",
"copiesSold": 328824
}
},
{
"node": {
"name": "Day of Defeat",
"copiesSold": 229992
}
},
{
"node": {
"name": "Deathmatch Classic",
"copiesSold": 142830
}
},
{
"node": {
"name": "Half-Life: Opposing Force",
"copiesSold": 911880
}
},
{
"node": {
"name": "Ricochet",
"copiesSold": 225360
}
},
{
"node": {
"name": "Half-Life",
"copiesSold": 4604813
}
},
{
"node": {
"name": "Counter-Strike: Condition Zero",
"copiesSold": 995148
}
},
{
"node": {
"name": "Half-Life: Blue Shift",
"copiesSold": 675324
}
},
{
"node": {
"name": "Half-Life 2",
"copiesSold": 9313172
}
},
{
"node": {
"name": "Counter-Strike: Source",
"copiesSold": 10561369
}
},
{
"node": {
"name": "Half-Life: Source",
"copiesSold": 811244
}
},
{
"node": {
"name": "Day of Defeat: Source",
"copiesSold": 1141584
}
},
{
"node": {
"name": "Half-Life 2: Deathmatch",
"copiesSold": 270801
}
},
{
"node": {
"name": "Half-Life 2: Lost Coast",
"copiesSold": 3728105
}
},
{
"node": {
"name": "Half-Life Deathmatch: Source",
"copiesSold": 180324
}
},
{
"node": {
"name": "Half-Life 2: Episode One",
"copiesSold": 962640
}
},
{
"node": {
"name": "Portal",
"copiesSold": 12641381
}
},
{
"node": {
"name": "Half-Life 2: Episode Two",
"copiesSold": 1334400
}
},
{
"node": {
"name": "Team Fortress 2",
"copiesSold": 92087587
}
}
]
}
}
}

We can use the endCursor value which is "R1BDOk46NDQw" to get the next page which contains the next 20 games. In the query below, we put the endCursor value in the after argument so that we can obtain the next page of results.

query SteamAppsNextPage {
steamApps(after: "R1BDOk46NDQw") {
pageInfo {
hasNextPage
hasPreviousPage
startCursor
endCursor
}
edges {
node {
name
copiesSold
}
}
}
}

The results of the query will be structured as follows (notice that we have another set of 20 games - this is the next page of games obtained using pagination):

{
"data": {
"steamApps": {
"pageInfo": {
"hasNextPage": true,
"hasPreviousPage": true,
"startCursor": "R1BDOk46NTAw",
"endCursor": "R1BDOk46MTY0MA=="
},
"edges": [
{
"node": {
"name": "Left 4 Dead",
"copiesSold": 3645806
}
},
{
"node": {
"name": "Left 4 Dead 2",
"copiesSold": 39650577
}
},
{
"node": {
"name": "Dota 2",
"copiesSold": 191896636
}
},
{
"node": {
"name": "Portal 2",
"copiesSold": 19478767
}
},
{
"node": {
"name": "Alien Swarm",
"copiesSold": 6830034
}
},
{
"node": {
"name": "Counter-Strike 2",
"copiesSold": 215190504
}
},
{
"node": {
"name": "Rag Doll Kung Fu",
"copiesSold": 3536
}
},
{
"node": {
"name": "Red Orchestra: Ostfront 41-45",
"copiesSold": 91836
}
},
{
"node": {
"name": "Killing Floor",
"copiesSold": 3331175
}
},
{
"node": {
"name": "SiN Episodes: Emergence",
"copiesSold": 36187
}
},
{
"node": {
"name": "SiN: Gold",
"copiesSold": 6460
}
},
{
"node": {
"name": "Darwinia",
"copiesSold": 60076
}
},
{
"node": {
"name": "Uplink",
"copiesSold": 116172
}
},
{
"node": {
"name": "DEFCON",
"copiesSold": 74569
}
},
{
"node": {
"name": "Multiwinia",
"copiesSold": 28260
}
},
{
"node": {
"name": "Dangerous Waters",
"copiesSold": 23414
}
},
{
"node": {
"name": "Space Empires IV Deluxe",
"copiesSold": 13825
}
},
{
"node": {
"name": "Jagged Alliance 2 Gold",
"copiesSold": 1
}
},
{
"node": {
"name": "Disciples II: Rise of the Elves",
"copiesSold": 38646
}
},
{
"node": {
"name": "Disciples II: Gallean's Return",
"copiesSold": 48547
}
}
]
}
}
}

We can continue this process to obtain more pages of data and additional results.