Google Local Pack Tracker · AI Overview + Rank
Pricing
from $0.016 / local pack check (per keyword × location)
Google Local Pack Tracker · AI Overview + Rank
Track the Google local 3-pack and AI Overview for any keyword and city. One row per keyword x place: who owns the 3-pack, whether an AI Overview is taking the query and who it cites, a 0-100 Local Visibility Score, week-over-week pack changes, and AI takeover alerts. Pay per row, no seat.
Pricing
from $0.016 / local pack check (per keyword × location)
Rating
0.0
(0)
Developer
David S
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
3 days ago
Last modified
Categories
Share
Local Pack AI Tracker
Track the Google local 3-pack and AI Overview for any keyword × location — and know the moment AI starts eating your local visibility.
Give it a list of keywords and the cities you care about. For every keyword × place pair you get one row: who owns the local 3-pack, whether an AI Overview is now answering that query, which domains the AI cites, a 0–100 Local Visibility Score, a week-over-week pack diff, and an AI takeover alert when an AI Overview newly displaces the pack.
Built for local-SEO agencies, franchise networks, and multi-location brands who need a decision — not a raw SERP dump.
What you get per row
One dataset row = one keyword × place pair (keywords × places = the full cartesian list).
| Field | Type | What it tells you |
|---|---|---|
keyword | string | The tracked query (echo of input) |
place | string | The location it was checked in (echo of input) |
checkedAt | ISO 8601 | When this observation was taken |
notFound | boolean | true when there is no local pack for this pair (still a delivered answer) |
localPack | array ≤3 {rank, name, domain, rating, reviewsCount} | The 3-pack, in order. Every key is always present; domain/rating/reviewsCount may be null for a business with no site or ratings |
aioPresent | boolean | Is an AI Overview shown for this keyword? |
aioCitedDomains | string[] | Normalised domains the AI Overview cites |
aioDisplacement | boolean | AI Overview is present and sits above / has pushed out the local pack |
localVisibilityScore | number 0–100 | Your visibility for this query — see below |
packDiff | {added[], dropped[], rankShifts[]} | null | What changed in the pack since the previous run — see below |
aioTakeoverAlert | boolean | An AI Overview newly displaced the pack vs the previous run — see below |
source | "primary" | "fallback" | Which data path filled the row |
Local Visibility Score (0–100)
A single number that answers "how visible am I for this query, right now?"
- Position weights in the pack: rank 1 = 100, rank 2 = 80, rank 3 = 60.
- With
trackedDomainsset: the score is the best weight among your domains found in the pack (not in the pack →0). - Without
trackedDomains: the score reflects the pack surface itself — pack present =100. - An AI Overview that displaces the pack subtracts a −25 penalty; the result is clamped to 0–100.
notFound(no pack) →0.
packDiff — week-over-week 3-pack movement
The actor keeps a snapshot of each keyword × place pack between runs, so on the next run you see exactly what moved:
added— domains that entered the packdropped— domains that fell outrankShifts—{domain, from, to}for domains that changed position
The first run has no prior snapshot, so packDiff is null (the key is always present, never
missing). A missing or corrupt snapshot is never an error — you get null and the run continues.
Domains without a website (domain: null) do not take part in the diff.
aioTakeoverAlert — the signal that matters
true only when an AI Overview newly displaces the local pack for a query that it did not
displace on the previous run. This is your early-warning that AI has started intercepting a
query you used to win in the map pack. No prior snapshot → false.
Input
{"keywords": ["plumber near me", "emergency plumber"],"places": ["Austin, TX", "Dallas, TX"],"languageCode": "en","trackedDomains": ["acmeplumbing.com"]}
| Field | Required | Notes |
|---|---|---|
keywords | yes | Local search queries (min 1). Each is combined with every place. |
places | yes | Locations to check (min 1). keywords × places = the rows tracked this run. US: "Austin, TX". International: a plain city name plus countryCode (e.g. "London" + "GB"), or a fully qualified "City,Region,Country" form. |
languageCode | no | Two-letter language code. Default "en". |
countryCode | no | Two-letter ISO country code of your places (e.g. "GB", "DE", "PL"). Resolves plain city names and picks the Google market for AI Overview checks. Derived from places/language when omitted. |
trackedDomains | no | Your own domains, used to compute the Local Visibility Score. Leave empty to report pack composition only. |
Pricing (pay per row, no seat)
Billing is per delivered row, using Apify's pay-per-event model.
| Event | When | Price |
|---|---|---|
| Run start | Once per run | $0.005 (flat, one-time) |
| Tracked row | Per delivered row | $0.02 per row (volume ladder below) |
Volume ladder for the per-row event across account tiers:
| Tier | Price / row |
|---|---|
| FREE / BRONZE | $0.020 |
| SILVER | $0.018 |
| GOLD | $0.016 |
| PLATINUM | $0.014 |
| DIAMOND | $0.012 |
You are never charged for:
- Cache hits — a keyword × place pair checked in the last 24 hours is served from cache and bills nothing beyond the one-time run start.
- Failures — a row that could not be fetched is skipped and never billed.
A notFound result is a delivered answer and is billed as one row — knowing a query has no
local pack is a result.
Typical cadence: re-run every ~7 days to keep the week-over-week packDiff and takeover
alerts fresh.
How it stays reliable
- Cache (24h): identical keyword × place pairs within 24 hours are served from cache — free, and with the original observation time preserved.
- Snapshots: a per-pair pack snapshot powers
packDiffandaioTakeoverAlert. State is read/written fail-open — a storage hiccup yieldspackDiff: null, never a crashed run. - Fallback path: if the primary source fails twice for a single pair, that one row is retried
through a secondary source (
source: "fallback") so it is still delivered. - Plan-limit guard: on FREE accounts the run stops before the first paid request when the forecast exceeds your plan limit — nothing is charged.
Legal & fair use
- This actor reports publicly visible Google local pack and AI Overview results for the keywords and locations you provide. It stores no personal data beyond public business listing fields (name, domain, rating, review count).
- Output is provided as-is for competitive-intelligence and SEO-monitoring purposes. Search results change constantly; figures are point-in-time observations, not guarantees.
- Google is a trademark of Google LLC. This actor is not affiliated with, endorsed by, or sponsored by Google.
- You are responsible for using the output in line with the terms of the platforms you operate on and applicable law in your jurisdiction.
Related actors
Pair this with the rest of the doesaiknow suite for a full local + listing view. See the publisher page for companion actors (rank tracking, listing audits, keyword research).