cloro
Local Rank Tracking

Local Rank Tracking 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 on G2 G2.com software review platform logo
Try 500 credits for free

No credit card required.

Local 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 dentist near me",
    "country": "US",
    "location": "Austin,Texas,United States",
    "device": "mobile"
  }'

Response

~30 s
{
  "success": true,
  "result": {
    "organicResults": [],
    "peopleAlsoAsk": [],
    "relatedSearches": [],
    "ads": []
  }
}
Multi-location brands and local SEO agencies running city-level rank-tracking pipelines on cloro
500M+ monthly API calls

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.

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.

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.

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.

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 — track what 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 — is a separate ranking system. 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.

Track 100 keywords across 50 cities in one batch

One API call per query × city × device combination. 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
import requests

# 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 = 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": "US",
                "location": location,
                "device": "mobile",  # local intent skews mobile
            },
        )
        data = response.json()["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 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.

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 — country-level trackers defaulting to desktop miss what most customers 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: 1 credit per SERP call regardless of geo specificity. 50 cities × 20 keywords × daily = 30k calls/month, covered 8× by the Hobby plan. 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/left the 3-pack, which moved positions, which gained or lost reviews. No diff endpoint needed — the SERP is yours to keep.

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.