cloro
Rank Tracking

Rank Tracking API: Google SERP positions, parsed and pay-per-call

A rank tracking API for SEO teams that would rather work in JSON than in a dashboard. One call gives you the whole SERP for a query: organic, ads, PAA, related searches, AI Overview. Billing is per call, with no fixed keyword bundle to plan around.

4.7 on G2 G2.com software review platform logo
Try 500 credits for free

No credit card required.

Rank Tracking API example
Live

Example Request

POST
curl -X POST https://api.cloro.dev/v1/monitor/google \
  -H "Authorization: Bearer sk_live_your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "query": "best project management software",
    "country": "US",
    "device": "desktop"
  }'

Response

~30 s
{
  "success": true,
  "result": {
    "organicResults": [],
    "peopleAlsoAsk": [],
    "relatedSearches": [],
    "ads": []
  }
}
SEO teams running production rank-tracking pipelines on cloro every day
500M+ monthly API calls

One API for the SERP elements rank trackers actually need

Organic positions are the headline metric, but the modern SERP is layered: sponsored ads above the fold, an AI Overview block consuming the top of mobile results, People Also Ask in the middle, related searches at the bottom. cloro returns all of them in one response, parsed and position-tagged.

Why SEO teams build rank tracking on cloro, not on bundled tools

Rank-tracking products come in two shapes: hosted dashboards (pre-built UI, opaque scraper underneath, monthly bundle pricing) and APIs (raw structured response, you compose the dashboard, pay-per-call). Teams that need their data in their warehouse and their methodology under their control pick the API. Here's why.

Google organic results panel showing position-tagged result list

Bundled credits leave money on the table

Hosted trackers price by tracked-keywords-per-month, capped regardless of cadence. cloro is pay-per-call — sample at the cadence your question demands, not the cadence the bundle enforces.

Google sponsored ads block showing parsed ad position and URL

Dashboard products lock the SERP shape inside

Most rank trackers expose `position` and `URL` and stop. cloro returns the full envelope per call — `ads[]`, `peopleAlsoAsk[]`, `aioverview` with sources, `relatedSearches[]`. Compute AI Overview citation rate, track ad rotation, diff PAA over time — it's already in the response.

Side-by-side SERP comparison showing mobile and desktop layout differences for the same query

Mobile and desktop SERPs are structurally different

In 2026, mobile shoves the AI Overview to position 0, compresses ads, hides PAA below the fold. Hosted trackers default to desktop and surface mobile as an upcharge. cloro takes `device: "mobile"` or `"desktop"` per call at the same price.

Position-tagged SERP source list showing rank_group, rank_absolute, and full SERP envelope fields

Methodology lock-in undermines reporting

Different rank trackers count "position" differently: rank-1 vs rank-absolute, organic-only vs SERP-feature-included, desktop-primary vs mobile-primary. Switch tools and a competitor appears to "move" even when the SERP did not. cloro returns both rank_group and rank_absolute per result alongside the full SERP envelope, so your reporting math stays the same when you switch tools.

Track 100 keywords across 3 countries in one batch

One API call per query × country × device combination. Results land in JSON. Roll up to your warehouse, BigQuery, dbt, or whatever already runs your reporting.

Batch-track a keyword set across countries and devices

python
import requests

# Your tracked-keyword set, country list, and device matrix.
keywords = ["best project management software", "asana alternatives", "remote team tools"]
countries = ["US", "GB", "DE"]
devices = ["desktop", "mobile"]

results = []
for query in keywords:
    for country in countries:
        for device in devices:
            response = requests.post(
                "https://api.cloro.dev/v1/monitor/google",
                headers={
                    "Authorization": "Bearer sk_live_your_api_key_here",
                    "Content-Type": "application/json",
                },
                json={"query": query, "country": country, "device": device},
            )
            data = response.json()["result"]
            for r in data["organicResults"]:
                results.append({
                    "query": query,
                    "country": country,
                    "device": device,
                    "position": r["position"],
                    "url": r["link"],
                    "title": r["title"],
                })

# Now you have 1 row per (query, country, device, ranked URL).
# Push to BigQuery, dbt, or your rank-tracker warehouse.
print(f"{len(results)} ranked rows captured")

Response example

200 OK application/json
{
  "success": true,
  "result": {
    "organicResults": [],
    "peopleAlsoAsk": [],
    "relatedSearches": [],
    "ads": []
  }
}

Pricing that scales with you

Pick a plan that fits your volume. Price per credit drops as you scale.

Hobby
$0.40
per 1,000 credits
  • $100/month
  • 250,000 credits
  • 10 concurrent jobs
  • Email support
Starter
$0.36
per 1,000 credits
  • $250/month
  • 694,444 credits
  • 25 concurrent jobs
  • Email support
Most Popular
Growth
$0.32
per 1,000 credits
  • $500/month
  • 1,562,500 credits
  • 50 concurrent jobs
  • Priority email support
Business
$0.30
per 1,000 credits
  • $1,000/month
  • 3,333,333 credits
  • 100 concurrent jobs
  • Priority email support
Enterprise
$1,500+
Large volumes
  • Volume discounts
  • Larger concurrency
  • Slack support

Credit cost per request varies by provider. The figures below are for async/batch requests; sync requests add a +2 credit surcharge.

ChatGPT (query fan-out) 7 credits
ChatGPT (web search) 5 credits
Perplexity 3 credits
Grok 3 credits
Copilot 5 credits
AI Mode 4 credits
AI Overview (incl. SERP) 5 credits
Gemini 4 credits
Google Search (n=10) 3 credits
Google Search (n=30) 4 credits
Google Search (n=100) 5 credits

Google News uses the same pricing as Google Search.

Rank Tracking API, answered

What's a rank tracking API and how is it different from a rank tracker?+

A rank tracker is a product (dashboard, alerting, scheduled jobs). A rank tracking API is the data layer underneath. Teams hit the limits of hosted trackers within a year — custom metrics, warehouse export, internal-tool integration — and migrate. cloro returns organic positions, ads, AI Overview, PAA, and related searches in one JSON response per query × country × device.

Does cloro support the AI Overview position?+

Yes. Pass `include: {"aioverview": {"markdown": true}}` and the response includes the full AI Overview block — text, markdown, HTML, source URLs with citation positions, embedded sponsored ads, and videos. AI Overview rank-tracking is the same call as organic rank-tracking, with one extra include flag and +2 credits.

How does pricing compare to bundled rank trackers?+

1 credit per Google SERP call, +2 if you enable AI Overview enrichment. The Hobby plan ($100/month) includes 250k credits, which covers 1,000 keywords across 3 countries on both desktop and mobile, run daily, with room left over. You're not stuck paying for capacity you didn't use, and you don't hit a bundle ceiling during launch weeks.

Can I diff SERPs between two timestamps?+

The API returns the SERP for each call. Diffing is your code, our response. Most teams persist the full `result` envelope per call (organicResults + ads + PAA + aioverview), then compare adjacent runs in their warehouse. Common diffs: organic position change per URL, AI Overview source list churn, sponsored-ad advertiser rotation, PAA question turnover. For SERP-wide change detection beyond rank deltas (AI Overview drift, new advertisers entering the auction, PAA churn), see the dedicated SERP monitoring use case — same `/v1/monitor/google` endpoint, framed around watching every SERP element rather than a single position over time.

What about local / city-level rank tracking?+

For city-level rank tracking, see /local-rank-tracking/ — the same `/v1/monitor/google` endpoint with a `location` parameter accepting any of Google's ~100,000 canonical geotargets. Same auth, same response shape, same per-call pricing.

How do I scale to 50k+ tracked keywords?+

Use the async endpoint (`POST /v1/monitor/google/async`) which delivers via webhook rather than burning sync concurrency. For a 50k-keyword × 3-country × daily run, async is the right pattern: submit batches, let the webhook handler write to your warehouse as results land. Sync is for ad-hoc queries; async is for the production cadence.

Start tracking Google rankings via API

Per-call billing. Organic positions, sponsored ads, AI Overview, People Also Ask, and related searches all come back in one JSON response, scoped to a query, country, and device. Push the rows into your existing reporting stack and run your usual numbers on them.