Local Pack Rank Checker - Google Maps by City or ZIP
Pricing
from $3.00 / 1,000 location checks
Local Pack Rank Checker - Google Maps by City or ZIP
Local rank checker for Google Maps: where a business ranks for each keyword in each city, ZIP or postal code you list, its rank (top 20 or 40), the map pack (3-pack) and who holds #1 in every place, with a summary and the competitors that beat it. Local SEO data as CSV, JSON or API. No login.
Pricing
from $3.00 / 1,000 location checks
Rating
0.0
(0)
Developer
Steady Scrape
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 days ago
Last modified
Categories
Share
Local Pack Rank Checker — Google Maps rankings by city, ZIP or postal code
Check where a business ranks on Google Maps for each keyword in every city, town, ZIP or postal code you list — the way a customer searching from each of those places sees it. For each keyword in each place you get the business's rank, whether it is in the local 3-pack, who holds #1 there and the whole 3-pack with ratings. For each keyword you get a summary across all the places: where it is found, where it is in the pack, its average rank, its share of local voice and the competitors that beat it most often.
A pay-per-check local rank checker: no subscription, no login, no browser, no Google API key, no geocoding key — a city or a ZIP is placed by Google Maps itself.
What it is for
- Service-area businesses (plumbers, roofers, HVAC, cleaners, movers): one run tells you in which of the fifteen towns you serve you show up in the map pack, and who takes the customers where you do not.
- Local SEO agencies: a city-by-city or ZIP-by-ZIP map pack report per client and keyword, ready for a spreadsheet.
- Multi-location brands and franchises: one keyword, every market, one table.
- Competitor tracking: add up to nine competitors as extra businesses; one search ranks all of them, each with its own row and summary.
- Before / after: run the same list before and after a Google Business Profile change, a review push or a new page.
Need a grid around one location instead (a 7×7 heatmap of a neighbourhood)? Use our Google Maps Rank Tracker (Geo-Grid).
How it works
- You give the business (its Google Maps link, a
maps.app.goo.glshare link, its place id or its CID), one or more keywords, and the locations: city names (Austin, TX), ZIP or postal codes (78704,LS1 4AP,M5V 2T6) or coordinates (30.2672, -97.7431). - The Actor looks the business up on Google Maps, and places each location where Google Maps' first result for it lies (coordinates are used as given).
- In every location it runs each keyword the way Google Maps does for someone looking at the map there (zoom 13 by default: part of a city), and finds the business by its place id among the results — never by its name, so a branch or a namesake is never mistaken for it.
- It writes one row per business × keyword × location, one summary per business × keyword, and a free row for each input it could not place.
Ranks 1–20 by default. Google Maps lists twenty places a page. Turn on Look down to rank 40 to read a second page in the locations where the business is not in the first twenty.
Input example
{"businesses": ["https://www.google.com/maps/place/Swish+Dental+Downtown/data=!4m2!3m1!1s0x8644b5b434046875:0x644e6eb422388b7a"],"keywords": ["dentist", "cosmetic dentist"],"locations": ["Austin, TX", "78704", "Round Rock, TX", "30.2672, -97.7431"],"checkTop40": false,"zoom": 13,"language": "en","country": "us"}
Output
Every row has a rowType: check (one keyword in one location for one business), summary (one keyword over all the
locations), business or location (an input that could not be used, free).
A check
{"rowType": "check","status": "ok","businessName": "Swish Dental Downtown","placeId": "ChIJdWgENLS1RIYReos4IrRuTmQ","cid": "7227836171923524474","keyword": "dentist","location": "Austin, TX","locationName": "Austin","locationAddress": "Austin, TX","locationCategory": null,"lat": 30.267153, "lng": -97.7430608,"rank": 1,"inLocalPack": true,"inTop20": true,"searchedDepth": 20,"resultsSeen": 20,"leaderName": "Swish Dental Downtown","localPack": [{ "position": 1, "name": "Swish Dental Downtown", "placeId": "ChIJdWgENLS1RIYReos4IrRuTmQ", "cid": "7227836171923524474", "rating": 4.5, "reviewCount": 992, "category": "Dentist" },{ "position": 2, "name": "Breeze Dental", "placeId": "ChIJrTahjN-0RIYRchMKUA6urbg", "cid": "13307483850445296498", "rating": 4.8, "reviewCount": 1002, "category": "Dentist" },{ "position": 3, "name": "Toothbar", "placeId": "ChIJO0xN0RG1RIYRIDFDZYJkYjA", "cid": "3486459572745613600", "rating": 4.9, "reviewCount": 735, "category": "Dentist" }],"mapsUrl": "https://www.google.com/maps/search/dentist/@30.267153,-97.743061,13z"}
| field | meaning |
|---|---|
status, reason | ok, or blocked with why nothing was measured |
business, businessName, placeId, cid | the business as you gave it, its name on Google Maps and its ids |
keyword | the keyword searched |
searchedDepth, zoom, scrapedAt | how deep it looked (20 or 40), the map zoom, and when |
location | the location as you wrote it |
locationName, locationAddress, lat, lng | where Google Maps placed it, and where the search was made |
locationCategory | null for a city, an area or coordinates; Postal code for a ZIP; a category (such as Museum) when a name led to a single place — write the state or country to be precise |
rank | the business's position among Google Maps' places there; null when it is not within searchedDepth — never a made-up number |
inLocalPack, inTop20 | rank 1–3, rank 1–20 |
leaderName | who is #1 in that location |
localPack | the top three there, with place id, CID, rating, review count and category |
resultsSeen | how many places the search listed (fewer than 20 where Google Maps lists fewer) |
mapsUrl | the same search on Google Maps, to look at it yourself |
On a blocked check nothing was measured, so rank, inLocalPack and inTop20 are all null and it is not charged.
A summary (free)
| field | meaning |
|---|---|
business, businessName, businessAddress, placeId, cid, keyword | which business and keyword it sums up |
plannedLocations, blockedLocations | locations placed on the map, and those where Google refused or did not answer (free) |
reason | what was left out, if anything: locations past your spending limit or blocked |
checkedLocations, foundLocations | locations searched, and those where the business appears |
localPackLocations, firstPlaceLocations | locations where it is in the 3-pack, and where it is #1 |
averageRank | average rank over the locations where it appears |
averageRankWithMisses | average rank counting a location where it does not appear as one past the depth searched (21 or 41) |
shareOfLocalVoice | % of locations where the business is in the 3-pack |
bestLocation, localPackIn, notFoundIn | its best location and rank, the locations where it is in the pack, and the ones where it is invisible |
competitors | up to 10 places, ranked by how often they are #1 and in the 3-pack across your locations, with their average rank |
Pricing
Pay per event, no start fee:
| event | price |
|---|---|
location-check — one business's rank for one keyword in one location (with the 3-pack and the leader) | US$0.003 |
extra-depth-check — ranks 21–40 for that check, only when you ask for it and only where the business is not in the first twenty | US$0.002 |
One business, 3 keywords and 15 towns is 45 checks = US$0.135. Summaries, unresolved businesses and locations, and blocked checks are free. The spending limit of your run is respected before any search is sent: the Actor plans only the checks your limit pays for (counting the second page where you asked for it) and says in the summary which locations it left out.
Stops when Google asks for verification
The Actor reads the same answers Google Maps gives its own web page, at a moderate pace. If Google ever asks for
verification — its "unusual traffic" page, a CAPTCHA, a JavaScript check, or any answer that is not Google Maps'
normal data — the run stops sending requests and every check left is a free blocked row that says so. It never
solves, bypasses or replays a challenge, and it does not hide where it searches from: the location travels in the map
view, as it does when you move the map yourself. Plain overloads (HTTP 429 or 5xx without a challenge) are retried
through Apify's datacenter proxy; checks that still get no answer are free.
Limits
- Up to 10 businesses, 20 keywords and 100 locations per run.
- A location name is placed where Google Maps' first result for it lies:
Springfieldalone lands on one Springfield's landmark,Springfield, ILon the city.locationNameandlocationCategoryshow what it resolved to. - Ranks are those of Google Maps' place list for the search in each location (the "Places" list a customer scrolls). Paid ads are not counted.
- Results depend on the zoom and on Google's personalisation; this Actor sees them as a signed-out visitor.
Is it legal?
It reads publicly visible search results, at a pace a person browsing the map could produce, without logging in and without collecting personal data: the places are businesses as they present themselves on Google Maps. Use the data in line with Google's terms and the laws that apply to you. This Actor is not affiliated with, endorsed by or sponsored by Google.