cloro
Local Rank Tracking

Track rankings across ~100,000 locations — the same Google SERP your customers see

Local SEO is a city-level game. "Best dentist near me" returns one set of results in Austin and a different set in Brooklyn. Pass a `location` value (any of Google's ~100,000 canonical geotargets) on a `/v1/monitor/google` call and you get the SERP that city actually sees, at the same per-call price as a country-level call.

4.7 · 53 reviewsG2.com software review platform logo
Multi-location brands and local SEO agencies running city-level rank-tracking pipelines on cloro
1,000,000,000 monthly API calls

What is local rank tracking?

Local rank tracking is measuring where a business ranks in Google results scoped to aspecific city, not the country default. Google re-ranks by searcher location: "best dentist near me" returns one Local Pack and one organic list in Austin and a different set in Brooklyn. A national-average position is a fiction for local-intent queries — the ranking only exists per location.

That per-city measurement is the job of alocal rank tracker: request the SERPas if from a device in the target city — one call per keyword × location pair — and track two ranking systems at once: the organic list and the Local Pack, the map 3-pack with its own positions, ratings, and review counts. cloro is the API version of that tool: a `location` parameter on the standard SERP call, drawing on Google's ~100,000 canonical geotargets, at the same per-call price as a country-level run.

One API for the cities where your customers actually search

Pass any Google canonical location name (`City,Region,Country`) on any call and cloro renders the SERP as if the search came from a device in that location. The location list draws on Google's full geotargeting set, about 100,000 entries spanning cities, metros, regions, and countries worldwide, so every store you run has a ranking you can measure rather than estimate.

Why local SEO teams build city-level tracking on cloro

Most rank-tracking products charge extra for city-level data, or push you toward a separate Google Business Profile module. On cloro it is just a parameter on the standard SERP call, so adding cities changes your call count, not your pipeline or your price.

Three-way SERP comparison showing different Local Pack businesses for 'personal injury lawyer' in Houston, Brooklyn, and Phoenix

Country-level rankings hide local-pack divergence

Run "personal injury lawyer" from cloro with three different location values and the Local Pack changes completely. Houston returns Adams Law and Husain; Brooklyn returns Block O'Toole and Belluck & Fox; Phoenix returns Lerner & Rowe and Phillips. A country-default ranking collapses all three into whichever firm dominates the national long tail. With the `location` parameter set, cloro renders the SERP the way a device in that city would receive it: city-specific Local Pack, Maps Pack, and organic results, so the ranking you track is the one your customers in that city actually see, not a national average that hides it. We put a number on the divergence: 100 keywords across 20 US cities, 2,000 geo-targeted SERPs a day for three days, scored 0 to 1 per keyword. Local-intent keywords averaged 0.84, with 47 of 50 above 0.7, and for terms like emergency dentist 17 to 19 of the 20 cities returned a different number one. Generic keywords averaged 0.22 and mostly returned the same winner everywhere, so intent alone sorts what must be tracked per city (full study).

Multi-city ranking dashboard showing per-store organic and Local Pack positions

Multi-location brands need per-store ranking visibility

An 80-location franchise needs 80 city-specific rankings, not one national approximation. Hosted trackers charge per-city upcharges. cloro is flat per-call: 80 cities × 30 keywords × daily costs the same per-call rate as a single national run. Every store manager sees the keywords their own market is losing, not a national average.

Mobile vs desktop local SERP comparison showing different module ordering and Local Pack placement

Mobile is where local search happens

Local-intent queries skew 75%+ mobile. Mobile SERPs put the AI Overview at position 0 and the Local Pack at position 1; desktop is structurally different. Pass `device: "mobile"` per call at the same price and report the ranking your customers actually see.

Local Pack 3-pack response with parsed business name, address, rating, and review count fields

Local Pack tracking needs the structured Maps response

The Local Pack (the 3-pack of map results above organic) runs on its own ranking system, so winning organic tells you nothing about who owns the pack. cloro returns each entry tagged by position, business name, address, rating, and review count: the metadata for Local Pack share of voice on any keyword × city pair.

Use cases

Four city-level tracking workflows local SEO teams ship on top of cloro.

Franchise ranking grid

80 locations × 30 keywords × daily — one async batch per run, one row per store per keyword, per-store visibility without per-city upcharges.

Async batcheslocation paramWarehouse
Best for: Multi-location brands

Local Pack share of voice

Diff the 3-pack per keyword × city between runs: which businesses entered or left, who moved positions, who gained reviews. The Local Pack runs on its own ranking system, so this catches competitive moves organic-only tracking would miss.

Local Pack fieldsDaily diffBigQuery
Best for: Local SEO pros

White-label client reporting

Per-tenant API keys plus your own templates → agency-branded per-city ranking reports emailed weekly from your domain.

Per-tenant keysPython + JinjaScheduled email
Best for: Local SEO agencies

Market-entry SERP research

Sweep the same keyword set across candidate cities before opening a location — who owns the Local Pack, how entrenched the organic incumbents are, what the ad auction looks like.

City sweepOne-off batchNotebook
Best for: Expansion & strategy teams

Track 100 keywords across 50 cities in one batch

One loop: walk your keyword list against your city list, one call per query × city × device, and cloro returns each city's SERP as JSON. The geo parameter is the only difference from country-level tracking: same auth, same response shape, same per-call pricing.

Batch-track a keyword set across multiple cities

python
from cloro import Cloro

client = Cloro(api_key="sk_live_your_api_key_here")

# Multi-location brand: 50 locations × 20 keywords × daily.
# Use Google canonical location names: "City,Region,Country".
keywords = ["best running shoes near me", "running shoe store", "athletic footwear"]
locations = [
    "Austin,Texas,United States",
    "Brooklyn,New York,United States",
    "Phoenix,Arizona,United States",
    # ... your full location list (drawn from Google's ~100,000 geotargets)
]

results = []
for query in keywords:
    for location in locations:
        response = client.monitor.google(
            query=query,
            country="US",
            location=location,
            device="mobile",  # local intent skews mobile
        )
        data = response["result"]
        for r in data["organicResults"]:
            results.append({
                "query": query,
                "location": location,
                "position": r["position"],
                "url": r["link"],
            })

# 1 row per (query, location, ranked URL). Roll up by location for per-store reports.
print(f"{len(results)} location-tagged rows captured")

Response example

200 OKapplication/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.

Free
$0.00
per 1,000 credits
  • $0/mo
  • 500 credits
  • 1 concurrent job
  • 1 seat
  • Documentation assistant
Lite
$0.80
per 1,000 credits
  • $30/mo
  • 37,500 credits
  • 10 concurrent jobs
  • Unlimited seats
  • Email support
Hobby
$0.40
per 1,000 credits
  • $100/mo
  • 250,000 credits
  • 20 concurrent jobs
  • Unlimited seats
  • Email support
Starter
$0.39
per 1,000 credits
  • $250/mo
  • 650,000 credits
  • 50 concurrent jobs
  • Unlimited seats
  • Email support
Scale
$500+/mo
More credits
  • Volume discounts
  • More concurrency
  • Unlimited seats
  • Faster support
Compare all 11 tiers
PlanPrice / moCreditsPer 1kConcurrencySeatsSupport
Free$050011Documentation assistant
Lite$3037,500$0.8010UnlimitedEmail
Hobby$100250,000$0.4020UnlimitedEmail
Starter$250650,000$0.3950UnlimitedEmail
GrowthPopular$5001,350,000$0.3775UnlimitedPriority email
Business$1,0002,800,000$0.36100UnlimitedPriority email
Enterprise 2K$2,0005,871,025$0.34135UnlimitedSlack
Enterprise 3K$3,0009,306,606$0.32175UnlimitedSlack
Enterprise 4K$4,00012,756,261$0.31215UnlimitedSlack
Enterprise 5K$5,00016,391,783$0.31255UnlimitedSlack
Enterprise$5,000+Increased concurrency, overages on credits and credit discounts for annual contracts.Know more

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

ChatGPT (full response) 7 credits
ChatGPT (web search) 5 credits
Perplexity 4 credits
Grok 4 creditsUnavailable
Copilot 5 credits
AI Mode 4 credits
AI Overview (incl. SERP) 5 credits
Gemini 4 credits
Google Search 3 credits +2/page
Google News 3 credits +2/page

ChatGPT full response includes query fan-out, ads, and shopping data. Google News uses the same pricing as Google Search. Grok is temporarily unavailable — requests to it fail, so do not size a plan around it.

Estimate your monthly cost and plan

7 credits each
5 credits each
4 credits each
4 credits each
5 credits each
4 credits each
4 credits each
3 credits / 1 page
3 credits / 1 page
Monthly requests
0
Credits needed
0
Recommended plan:

Local Rank Tracking, answered

Which locations does the API support?

cloro accepts any Google canonical location name in the format `City,Region,Country` — for example, `"Austin,Texas,United States"` or `"Manchester,England,United Kingdom"`. The full set draws on Google's geotarget list, which contains ~100,000 entries spanning cities, metros, regions, and countries worldwide. Power users can also pass a pre-encoded `uule` string instead of a location name when they need a UULE Google has but isn't in the canonical list.

What's the difference between local rank tracking and Google Business Profile rank tracking?

Local rank tracking measures organic + Local Pack positions for a query in a target city. GBP rank tracking measures one business listing's position across a grid of points around its location. Different products. cloro covers the first; for GBP grid-tracking, compose grid points using cloro plus your own coordinate logic.

Why does mobile-vs-desktop matter more for local?

~75% of local-intent queries are mobile. Mobile renders the Local Pack at position 1, shoves AI Overview to position 0, and compresses organic, so a country-level tracker defaulting to desktop reports a page most of your customers never see. cloro's `device` parameter is per-call, same price.

How do you handle locations outside the US?

Pass `country` (ISO 3166-1 alpha-2) plus the canonical location string — e.g., `{country: "GB", location: "Manchester,England,United Kingdom"}` for Manchester, or `{country: "JP", location: "Shibuya,Tokyo,Japan"}` for Shibuya. Anywhere in Google's geotarget list (~100,000 locations, all major countries) works the same way.

Pricing for multi-location at scale?

Per-call: 3 credits per SERP call (n=10) regardless of geo specificity, +2 per additional results page, +2 with AI Overview enrichment. 50 cities × 20 keywords × daily = 30k calls/month = 90k credits, comfortably inside the Hobby plan's 250k. Typically ~10× cheaper than per-city upcharges in bundled trackers.

How do I diff Local Pack rankings between two days?

Persist the `result` envelope per call (the Local Pack ships in the SERP response). Diff between adjacent runs in your warehouse: which businesses entered or left the 3-pack, which moved positions, which gained or lost reviews. No diff endpoint needed. You keep every SERP you pull, so the history is yours.

Start tracking local Google rankings

City-level geo on every call, drawing on ~100,000 Google geotargets. The auth, response shape, and per-call price are unchanged from country-level tracking. The only difference is the `location` value you send: adding a city is a list entry, not a plan upgrade.