We pulled rankings for the keyword “emergency plumber” from one point in Brooklyn (40.689199, -73.975035), asking Google the same thing three different ways. Park Slope Plumbing and Heating Services came back at #1 on Google Maps. In the Local Finder it was #8. In the local pack it wasn’t there at all. Same business, same query, same coordinates, same afternoon. If your product reports just one number out of all that, it’s effectively picking which of the three versions counts as true. Below, we’ll show how to use the DataForSEO SERP API parameters that decide where you’re measuring, how to map each endpoint to a Google local search surface, and how to get rankings that reflect what users actually see.
Why one rank number breaks local reporting
Local rank depends on where the searcher is standing. Google’s own documentation puts distance alongside relevance and prominence in what decides local results, and distance is the one that moves when the person moves. That means a business can rank differently from one block, neighborhood, or side of town to the next, even when the keyword stays exactly the same.
A city-level rank check describes a spot on a map. It doesn’t describe a market. The problem is what happens when that single-point measurement gets collapsed into one city-wide rank presented without the location that produced it.
Imagine a business with two branches across one borough opens your dashboard, reads “#4 for emergency plumber in Brooklyn,” then searches from one of its locations and sees something else. Your number may have been perfectly accurate for the coordinates you queried, but the dashboard gave them no reason to interpret it that narrowly. The data isn’t inaccurate. It’s under-specified. So two things need pinning down before a local rank means anything: which surface it came from, and where it was measured.
Local pack, Local Finder and Maps are not the same list
“Local rankings” can refer to three different Google surfaces, and the DataForSEO SERP API gives each one its own endpoint:
- Google Maps SERP API provides up to 100 Google Maps results. Every item carries
place_id,cid,rating,rating_distribution, category, coordinates and work hours. - Google Local Finder SERP API returns data from the expanded “More places” list a searcher reaches by clicking through the local pack. By default it returns up to 20 results for desktop.
- Google Organic SERP API returns the standard Google results page, where local results appear as a
local_pack, next to the organic results and everything else Google returns.
In our Brooklyn pull, the three disagreed. The Local Finder’s top three results were the same businesses in the same order as the local pack results, which is what you’d expect. Maps results were ordered differently. The business at Maps #1 held no local pack slot, and the business at Maps #7 held local pack #3. Two of the three local pack holders never appeared in the top 20 Maps results we asked for.
Those differences are exactly why a single “local rank” is misleading. So when you report a rank, you also need to say which surface it came from. If you want to learn more about why the surfaces behave differently, see Google Maps vs. Local Finder.
Once you’ve chosen the surface you want to measure, the next question is where the search is happening.
Geo-targeting from region down to GPS coordinates
Each of the DataForSEO SERP API endpoints above lets you tell Google where the search should come from. You can do that in three ways, but you use only one per request:
location_nameis a full location string, like"Brooklyn,New York,United States".location_codeis the numeric version, available from the list of Google SERP Locations. Coverage reaches city and ZIP level in supported markets.location_coordinateis alatitude,longitudepair. On Google Maps you can append a zoom level between3zand21z, for example:"40.689199,-73.975035,14z".
Which one you use depends on what you’re trying to measure. City and regional locations work well for broader reporting. Coordinates are useful when you need to know how rankings change from one neighborhood, street, or point on the map to another. If you need that level of detail, our help center explains how to build a grid-based rank tracker.
One thing here matters more than granularity: consistency. Use the same location on every call. Data from different surfaces measured from different points can’t be compared, and that mistake doesn’t show up anywhere in the output.
Use case: find where a business drops out of local search
To see where a business disappears across local search surfaces, run the same keyword from the same coordinate using all three endpoints. Authentication is HTTP Basic with the API login and password from your dashboard. The examples below show cURL requests.
# 1. Google Maps — the widest view, and the only one with place_id, cid and review counts
# Instead of 'login' and 'password' use your credentials from https://app.dataforseo.com/api-access
login="login"
password="password"
cred="$(printf ${login}:${password} | base64)"
curl --location --request POST "https://api.dataforseo.com/v3/serp/google/maps/live/advanced"
--header "Authorization: Basic ${cred}"
--header "Content-Type: application/json"
--data-raw '[
{
"location_coordinate": "40.689199,-73.975035,14z",
"language_code": "en",
"keyword": "emergency plumber",
"depth":20
}
]'
# 2. Local Finder — the list behind the pack
# Instead of 'login' and 'password' use your credentials from https://app.dataforseo.com/api-access
login="login"
password="password"
cred="$(printf ${login}:${password} | base64)"
curl --location --request POST "https://api.dataforseo.com/v3/serp/google/local_finder/live/advanced"
--header "Authorization: Basic ${cred}"
--header "Content-Type: application/json"
--data-raw '[
{
"location_coordinate": "40.689199,-73.975035",
"language_code": "en",
"keyword": "emergency plumber",
"depth":20
}
]'
# 3. Organic SERP — the local_pack results
# Instead of 'login' and 'password' use your credentials from https://app.dataforseo.com/api-access
login="login"
password="password"
cred="$(printf ${login}:${password} | base64)"
curl --location --request POST "https://api.dataforseo.com/v3/serp/google/organic/live/advanced"
--header "Authorization: Basic ${cred}"
--header "Content-Type: application/json"
--data-raw '[
{
"location_coordinate": "40.689199,-73.975035",
"language_code": "en",
"keyword": "emergency plumber",
"depth":20
}
]'
That first call came back in 2.6 seconds and cost $0.002. Here’s its top result.
{
"version": "0.1.20260917",
"status_code": 20000,
"status_message": "Ok.",
"time": "3.1659 sec.",
"cost": 0.002,
"tasks_count": 1,
"tasks_error": 0,
"tasks": [
{
"id": "09181246-1535-0139-0000-82e70a11e123",
"status_code": 20000,
"status_message": "Ok.",
"time": "2.6362 sec.",
"cost": 0.002,
"result_count": 1,
"path": [
"v3",
"serp",
"google",
"maps",
"live",
"advanced"
],
"data": {
"api": "serp",
"function": "live",
"se": "google",
"se_type": "maps",
"depth": 20,
"keyword": "emergency plumber",
"language_code": "en",
"location_coordinate": "40.689199,-73.975035,14z",
"device": "desktop",
"os": "windows"
},
"result": [
{
"keyword": "emergency plumber",
"type": "maps",
"se_domain": "google.com",
"location_code": 2840,
"language_code": "en",
"check_url": "https://google.com/maps/search/emergency+plumber/@40.689199,-73.975035,14z?hl=en&gl=US&uule=w+CAIQIFISCQs2MuSEtepUEUK33kOSuTsc",
"datetime": "2026-09-18 12:46:16 +00:00",
"spell": null,
"refinement_chips": null,
"item_types": [
"maps_search"
],
"se_results_count": 0,
"items_count": 20,
"items": [
{
"type": "maps_search",
"rank_group": 1,
"rank_absolute": 1,
"domain": "parkslopeplumbingandheating.com",
"title": "Park Slope Plumbing and Heating Services",
"original_title": null,
"url": "https://parkslopeplumbingandheating.com/",
"contact_url": null,
"contributor_url": "https://maps.google.com/maps/contrib/112867902021017038378",
"book_online_url": null,
"rating": {
"rating_type": "Max5",
"value": 4.7,
"votes_count": 54,
"rating_max": null
},
"hotel_rating": null,
"price_level": null,
"rating_distribution": {
"1": 3,
"2": 1,
"3": 0,
"4": 1,
"5": 49
},
"snippet": "540 President St 3rd flr, Brooklyn, NY 11215",
"address": "540 President St 3rd flr, Brooklyn, NY 11215",
"address_info": {
"borough": "Gowanus",
"address": "540 President St 3rd flr",
"city": "Brooklyn",
"zip": "11215",
"region": "New York",
"country_code": "US"
},
"place_id": "ChIJ4WmLbVVawokRjAPbuGGP3WU",
"phone": "+1347-305-6444",
"main_image": "https://lh3.googleusercontent.com/gps-cs-s/AHRPTWkUm_JSbAsOjpw0_tH41F11yg5TpkbWUaUOVEIwrigPGFS6VPwCXSNSDa9ZwI5erhSwprFvikr1SRELSISKXyswtHAAgYXnMS-aDmW105ctDlruAAd1xF846D-Uk-X9kud_Uwnu=w408-h544-k-no",
"total_photos": 11,
"category": "Plumber",
"additional_categories": null,
"category_ids": [
"plumber"
],
"work_hours": {
"timetable": {...},
"current_status": "open"
},
"feature_id": "0x89c25a556d8b69e1:0x65dd8f61b8db038c",
"cid": "7340180617559737228",
"latitude": 40.67727,
"longitude": -73.9853289,
"is_claimed": true,
"local_justifications": null,
"is_directory_item": false
}
]
}
]
}
]
}
Match your business by cid or place_id across all three responses, pull rank_absolute out of each, and you have one data row per keyword and location:
| Surface | Park Slope Plumbing and Heating | Brooklyn Plumber |
| Google Maps | 1 | 7 |
| Local Finder | 8 | 3 |
| Local pack | Not present | 3 |
A table like that can say three things.
- Missing from Maps altogether usually isn’t a ranking problem. Categories, service area, or an incomplete Google Business Profile are the first places to look.
- On Maps but outside the Local Finder list means relevance and prominence are thin for the query relative to the field.
- In the Local Finder and outside the pack is the case worth paying attention to. Park Slope is in that state.
Because the Google Maps response includes rating and votes_count for nearby businesses, you can compare Park Slope with the businesses that did make the pack. In our results, the three local pack businesses averaged 4.97 stars and 272 reviews. Park Slope had a 4.7 rating from 54 reviews, roughly a fifth as many reviews. That doesn’t prove reviews are the reason it missed the pack, but it gives you a concrete difference to investigate and something useful to show a client. You get that context from the Maps data, not from the rank alone.
Running it across a client portfolio
At scale the same three API calls don’t get more complicated. Swap the coordinate for a location_code per client location, put the set on a weekly schedule, and compare each new result with the previous one to track movement over time. For example, 20 keywords across five locations means 100 keyword-location combinations. Check all three local surfaces for each one, and that’s 300 API requests per run. On pay-as-you-go pricing the cost stays predictable, since the charge is per request rather than per seat.
Three mistakes that make local rank data look wrong
- Matching businesses by name. Google Business Profile names change, and near-duplicates are everywhere in service categories. Our Brooklyn pull returned “Brooklyn Plumber” and “Brooklyn Plumbers” as two separate businesses at two different ranks.
cidandplace_iddon’t have that problem, and both let you track the same business consistently. - Treating Maps rank and pack rank as one metric. The table above is what that looks like from the inside. They are separate surfaces and can return very different positions for the same business. Keep them in separate fields and report them separately.
- Forgetting device.
devicedefaults todesktop, and mobile SERPs give the pack a bigger share of the screen. If a client’s customers mostly search on their phones, desktop-only tracking measures the wrong experience.
Sometimes the ranking data tells you that the next thing to investigate is the business profile itself. Our Business Data API picks it up from there with full Google Business Profile data and reviews for a given cid.
Get the full picture of local rankings
Local rankings depend on both where the search happens and which Google surface you measure. Running the same search across Maps, Local Finder, and the local pack gives you much more than a single position. You can see where a business appears, where it drops out, and how it compares with the businesses that are still visible. That’s a report a client can act on this week, built on local SEO data nobody on your team has to collect manually. Create a free DataForSEO account and try Google SERP API on your own keywords and locations. New accounts receive a $1 trial credit, which covers around 500 live Maps requests at $0.002 each.