Skip to content

New Official SDKs for TypeScript, Python and Go

SerpKite
Get API key
Docs menu / Pagination and depth

Pagination and depth

Page through Google results with page, or fetch up to the top 100 in one call with num. num=100 is a depth bundle that costs 7 credits instead of 10.

View as Markdown

Google serves results ten at a time. SerpKite gives you two ways to go deeper: request pages one by one with page, or ask for up to 100 results in a single call with num.

page

page selects the results page, from 1 (default) to 10. Each page is a separate Google fetch and a separate credit.

curl https://api.serpkite.com/v1/search \
  -H "Authorization: Bearer $SERPKITE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"q":"espresso grinder","country":"us","page":2}'

page works on every paged endpoint (search, news, images, videos, maps, places, shopping, scholar, patents).

num and the depth bundle

On /v1/search and /v1/news, num above 10 fetches several pages in one request and merges them into one results list. SerpKite fetches ceil(num / 10) pages and bills one credit per page that returned results, capped at 7:

num Pages fetched Credits (at most)
1–10 1 1
20 2 2
30 3 3
50 5 5
70 7 7
100 10 7

So the top 100 costs 7 credits instead of the 10 you would pay with ten page calls, and it comes back in one response with consistent positions. Pages that come back empty are free: a long-tail query with results on only two pages costs 2 credits, whatever num you asked for. A cache hit with max_age costs half of what the cached result cost.

curl https://api.serpkite.com/v1/search \
  -H "Authorization: Bearer $SERPKITE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"q":"espresso grinder","country":"us","num":100}'

Rules:

  • num must be between 1 and 100. Values up to 10 behave like 10.
  • num above 10 requires page: 1 (or no page). Combining them returns 400 invalid_request.
  • On other endpoints num above 10 is treated as 10; use page to go deeper. /v1/reviews is the exception: num up to 50 reviews, billed 1 credit per 10 reviews actually returned.
  • Google sometimes returns fewer than num results for a query. You are billed for the pages actually fetched, and a page that comes back empty is refunded.

Batch it for rank tracking

The depth bundle combines with the batch lane: num: 100 in a POST /v1/batches request costs 3.5 credits for the top 100. See Batch requests and Rank tracking.

Custom Search pagination

The CSE-compatible /customsearch/v1 keeps Google’s CSE paging: start is the index of the first result (1, 11, 21 … up to 91) and num is 1 to 10 per call. Each call is one credit.

curl "https://api.serpkite.com/customsearch/v1?q=asyncio&start=11&num=10" \
  -H "Authorization: Bearer $SERPKITE_API_KEY"

Paging through reviews

/v1/reviews uses a cursor instead of page numbers. Each response includes next_page_token; send it back as page_token to get the next batch, and stop when it is absent.

  • The token is opaque and bound to the place and sort it came from. Send it unchanged with the same place_id (or cid/fid) and sort; anything else is a 400.
  • Paging reaches the first 100 reviews of a place per sort order. The page that reaches review 100 has no next_page_token.
  • A page can hold fewer than num reviews when Google stops loading early. Its next_page_token resumes right after it, and you’re billed for the reviews returned.
from serpkite import SerpKite

sk = SerpKite()
reviews, token = [], None
while True:
  res = sk.reviews(place_id="ChIJLU7jZClu5kcR4PcOOO6p3I0", sort="newest", num=50, page_token=token)
  reviews += res.results
  token = res.next_page_token
  if not token:  # absent on the last page (at most 100 reviews)
      break
print(len(reviews), "reviews")

Related: Credits and billing, Common parameters.

Last updated: 2026-09-29