Skip to content

New Official SDKs for TypeScript, Python and Go

SerpKite
Get API key

POST /v1/search · num=100

Google Rank Tracker API

Find where a domain ranks in Google's top 100 for any keyword, country, city and device. num=100 returns all 100 positions in one call for 7 credits, and the batch lane halves that for overnight tracking jobs.

Get a free API key Try in playground
7 credits per keyword, top 100 (3.5 in batch) 2,500 free credits, no card Failed calls are free

Overview

What the Google Rank Tracker API does

Rank tracking is built on /v1/search. Since Google removed num=100 from its own URLs, getting the top 100 means ten page requests. SerpKite does that for you and bills it as a depth bundle: 7 credits instead of 10.

Positions are only useful if you can match them. Every result carries the resolved destination link (no /goto or /url?q= redirects) and a canonical domain without www., so matching your site is a string comparison. If you only need one domain's position, POST /v1/rank returns just that. For scheduled jobs, POST /v1/batches queues requests at half price and delivers each result to your webhook.

What you get

results[].position integer
1-based organic position across all 100 results.
results[].link string
Resolved destination URL, never a Google redirect.
results[].domain string
Canonical host without www., for exact matching.
places[] / top_stories[] array
SERP features that push organic results down, when present.
meta object
request_id, credits_used, cached, engine, latency_ms, resolved_urls and parse_quality. parse_quality=empty means the call was not billed.

Request

curl https://api.serpkite.com/v1/search \
  -H "Authorization: Bearer $SERPKITE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"q":"best crm for startups","country":"us","language":"en","num":100,"fields":"results.position,results.link,results.domain"}'

Response (illustrative, placeholder domains)

200 OK · trimmed with fields= (100 results in the real response)
{
  "results": [
    {
      "position": 1,
      "link": "https://www.example.com/best-crm-startups",
      "domain": "example.com"
    },
    {
      "position": 2,
      "link": "https://crm.example.org/blog/startup-crm-guide",
      "domain": "crm.example.org"
    },
    {
      "position": 3,
      "link": "https://reviews.example.net/crm",
      "domain": "reviews.example.net"
    },
    {
      "position": 37,
      "link": "https://yourapp.example.io/blog/crm-for-startups",
      "domain": "yourapp.example.io"
    }
  ],
  "meta": {
    "request_id": "req_01J8ZK4M6Q2V7",
    "credits_used": 7,
    "engine": "google",
    "cached": false,
    "latency_ms": 812,
    "resolved_urls": true,
    "parse_quality": "ok"
  }
}

Every response also carries X-Credits-Used, X-Credits-Remaining, X-Cache and X-Tokens-Estimate headers. Run this query in the playground

Find a domain's position

Top 100 in one call, matched by domain

Request num=100, project only the three fields you need, and scan for your domain. Because domain is canonical (no www.) and link is the real destination, there's no redirect decoding or URL normalizing on your side.

1

credit, top 10

7

credits, top 100 realtime

3.5

credits, top 100 batch lane

from serpkite import SerpKite

sk = SerpKite()  # reads SERPKITE_API_KEY

# POST /v1/rank checks the top 100 by default (7 credits, like num=100 on /v1/search)
res = sk.rank("best crm for startups", "yourapp.example.io", country="us", device="desktop")
if res.position is None:
    print(f"not in the top {res.checked}")
else:
    print(res.position, res.matches[0].link)

Overnight jobs: the batch lane

Send up to 100 queries to POST /v1/batches and they are queued at half price. You get 202 with a batch id per query right away; the finished result is posted to your webhook_url, signed with X-SerpKite-Signature (HMAC-SHA256 of <timestamp>.<body>), or you poll GET /v1/batches/{id}. Results are kept for 24 hours.

Check one keyword with the free rank checker

POST /v1/batches
# Queue keywords on the batch lane: 3.5 credits for the top 100 instead of 7.
curl https://api.serpkite.com/v1/batches \
  -H "Authorization: Bearer $SERPKITE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"endpoint":"search",
       "requests":[{"q":"best crm for startups","country":"us","num":100},
                   {"q":"crm for small business","country":"us","num":100}],
       "webhook_url":"https://yourapp.example.io/hooks/serpkite"}'

# → 202 Accepted, one job per request, in order
# {"batches":[{"id":"0f8c…","status":"queued","endpoint":"/v1/search",
#              "poll_url":"https://api.serpkite.com/v1/batches/0f8c…", …}, …]}

# Poll (free), or wait for the signed webhook (X-SerpKite-Signature, event batch.completed)
curl https://api.serpkite.com/v1/batches/0f8c… -H "Authorization: Bearer $SERPKITE_API_KEY"
# {"id":"0f8c…","status":"done","credits_used":3.5,"result":{"results":[…]}, …}

Reference

Parameters

The parameters /v1/search accepts, in the JSON body or the query string.

Google Rank Tracker API parameters
Name Type Default Description
q required string – The search query. Required. Up to 2,048 characters.
country string us Country to search from, as a two-letter ISO code (us, gb, de, in…).
language string en Interface language, as a language code (en, de, fr, pt-BR…).
location string – Canonical location for local results, e.g. "Austin, Texas, United States". Overrides country for geo.
uule string – Google-encoded location string. Use instead of location if you already have it.
num integer 10 Results per call. 10 per page; 100 fetches the top 100 as a depth bundle for 7 credits instead of 10. Values: 10, 20, 30, 50, 100.
device string desktop Which SERP layout to fetch. Values: desktop, mobile.
fields string – Comma-separated projection, e.g. results.title,results.link,knowledge_graph. Cuts tokens.

Full reference, error codes and headers are in the API docs. Send a JSON array of up to 100 request objects to run them in one call.

Use cases

What people build with the Google Rank Tracker API

01

Daily rank tracking

Track thousands of keywords per client, per market and device.

02

Local rankings

Use location or uule to track city-level positions.

03

Overnight batch jobs

Queue keywords with POST /v1/batches and receive results by webhook.

04

SERP volatility

Diff the top 100 day over day to detect Google updates.

Pricing

Google Rank Tracker API pricing

Cost per call

7 credits

per keyword, top 100 (3.5 in batch)

  • From $4.20 per 1,000 calls at volume.
  • Credits never expire. No subscription.
  • Failed, empty and blocked calls are refunded.
  • 2,500 free credits = 357 calls, then 1,000 credits a month.

For reference: Serper lists Google searches at $1.00 per 1k on its entry tier and $0.30 at its best tier, and its credits expire after 6 months. SerpKite credits cost $1.00 to $0.60 per 1k.

See all pricing
Google Rank Tracker API cost per pack
Pack Price Per 1k credits Per 1k keywords (top 100) Batch lane Keywords per pack
Starter $10 $1.00 $7.00 $3.50 1,428
Growth $50 $0.80 $5.60 $2.80 8,928
Pro $300 $0.60 $4.20 $2.10 71,428

FAQ

Google Rank Tracker API: common questions

Start building

Start with the Google Rank Tracker API

2,500 free credits, then 1,000 every month. No credit card.