Google Maps / Local Business Search
Find any local business in any geography, then let AI agents identify the owners and their contact info.
Local Business Search lets you search over Google Maps data to find local businesses, then uses AI agents to find the owners of those businesses and their contact info. It's one of Fiber's most differentiated capabilities, and everything below works the same from the dashboard or the API.
Why it's unique. Most B2B data competitors are LinkedIn-only, so they struggle with local/SMB businesses that have little or no LinkedIn presence: restaurants, contractors, repair shops, clinics, retailers. Fiber searches Google Maps directly and layers owner/contact discovery on top.
What it does
Given a search query (what kind of business) and a geography (where):
- Finds matching businesses on Google Maps: name, address, and business details Maps exposes (including phone numbers where available).
- Identifies the owners: AI agents work to find the owner/decision-maker behind each business.
- Finds their contact info: surfacing how to actually reach them.
In the dashboard, inputs are simple:
- Project name: a label so you can find it later.
- Search query: the business type (e.g., "Book stores", "Car Repair Shop").
- Search strategy: how to cover geography (below).
- Max locations to find: a cap on how many places come back (cost control).
Search strategies
Specific regions search over one or more areas, combined for coverage. Five region types can be mixed freely:
| Region type | What it searches | Example |
|---|---|---|
| USA Cities | Within one or more US cities | San Francisco, CA |
| USA Counties | Within one or more US counties | New Hanover County, NC |
| USA Metro Areas | Within one or more metros | Select any metros |
| Circle | Radius around a center point | San Francisco + within N miles |
| Rectangle | Bounding box | NW corner + SE corner coordinates |
Entire USA sweeps the whole United States automatically, no extra config. It's the maximal-coverage option for nationwide enumeration.
The API exposes circles and rectangles directly, plus the whole-USA sweep and a world-cities strategy for searching by country and city size outside the US. See Regional sweep for the request shapes.
Detail at scale
Naive map search forces a bad trade: go deep on a small area, or cast a wide net and get back only a handful of top results. Fiber's proprietary sweeping algorithms eliminate that trade — you get detailed coverage across the whole map at once, capturing the long tail of local businesses even on "Entire USA" projects, not just the densest spots.
Coverage also goes meaningfully deeper than Maps alone: cross-referencing additional company data during owner discovery means even businesses with thin online footprints resolve to reachable owners.
Delivery & export
Dashboard searches run asynchronously (large sweeps take time). Results land in the web app under Advanced Scrapes → Scrape Google Maps with immediate CSV export, and the matching webhooks fire when a job finishes (see Webhooks).
Using the API
We built the API in two speeds. Synchronous lookups answer in one call: a page of places for a query, one place's full detail, or its reviews. Async jobs cover the heavy work: a regional sweep that can return up to 10,000 businesses, and an AI agent run that finds owners and contact details for up to 500 businesses per request.
Sync or async?
| You want | Use | Why |
|---|---|---|
| A quick answer for one query near one place ("dentists in Austin, TX") | Places search (sync) | Up to 20 places per page, 2 credits per page, inline |
| Everything matching a query across a region, a country, or the whole USA | Regional sweep (async) | Up to 10,000 businesses per job, paged results |
| Full detail on a place you already have | Place details (sync) | Hours, attributes, rating breakdown, sample reviews |
| Every review on a place | Place reviews (sync) | Paged, sortable by relevance or newest |
| Owners, decision-makers, and contact details for businesses you already have | Owner & contact discovery (async) | AI agent research, up to 500 businesses per request |
| The website domain for a list of companies | Domain lookup (async) | Up to 400 companies per request |
A common pipeline chains them: a regional sweep for the list, then owner & contact discovery on the businesses you want to reach.
Regional sweep (async)
Start a sweep with a query plus a strategy, or a googleMapsUrl copied
from the address bar after searching on Google Maps (the search term and area
are read from the link). Use one or the other, never both. Keep location out
of query: "dominos pizza", not "dominos pizza in Chicago".
| Field | Notes |
|---|---|
query | The search term, without location |
strategy | whole-usa, specific-areas, or world-cities (below) |
googleMapsUrl | Alternative to query + strategy |
maxResults | 1–10,000, default 100 |
name | Optional project label |
The three strategies:
| Strategy | What it covers | Shape |
|---|---|---|
whole-usa | A broad search across cities in the United States. Less exhaustive than a city-specific search | { "strategy": "whole-usa" } |
specific-areas | The union of circles (center + radiusMiles, 1–250, default 25) and rectangles (northwestCorner + southeastCorner) | unionAll array of regions |
world-cities | Cities in the countries and regions you pick, filtered by size tier | countriesAndRegions with unionAll / subtractAll; optional smallestCityTierID / largestCityTierID |
For world-cities, countries use ISO alpha-3 codes (USA, GBR, FRA) and
regional groups carry an X- prefix (X-EUROPE, X-LATAM). City tiers, from
largest to smallest: mega, major, large, medium, minor, small,
tiny.
curl -X POST https://api.fiber.ai/v1/google-maps-search/start \
-H "Content-Type: application/json" \
-d '{
"apiKey": "YOUR_API_KEY",
"name": "Bay Area car repair",
"query": "car repair shop",
"maxResults": 500,
"strategy": {
"strategy": "specific-areas",
"unionAll": [
{
"regionType": "circle",
"center": { "latitude": 37.7749, "longitude": -122.4194 },
"radiusMiles": 30
}
]
}
}'The response carries output.searchID. From there:
- Check progress. Send the
searchIDto the progress check. You getstatus(NOT_STARTED,RUNNING,COMPLETED,FAILED),totalPlacesFound,totalPlacesRequested, andpercentageCompleted. - Read results. The results read takes the same
searchIDpluspageSize(1–1,000, default 25) andcursor. Pass each response'snextCursorback ascursor; when it comes backnull, you have everything.
curl -X POST https://api.fiber.ai/v1/google-maps-search/poll \
-H "Content-Type: application/json" \
-d '{ "apiKey": "YOUR_API_KEY", "searchID": "SEARCH_ID", "pageSize": 1000 }'Each result includes placeId, name, address, latitude, longitude,
description, website, rating, numReviews, primaryType, allTypes,
priceLevel, phoneNumber, countryIsoCode, and googleMapsURL.
Rather than polling, you can subscribe to google_maps_search.completed and
read results when it fires.
Places search, details, and reviews (sync)
Places search takes a query (a business name or a place type like
"coffee shop") and an optional location: a city and state, a full address,
or a ZIP code. Leave location out for unbiased results. Each call returns up
to 20 places plus a nextPageToken for the next page.
curl -X POST https://api.fiber.ai/v1/google-maps/search \
-H "Content-Type: application/json" \
-d '{ "apiKey": "YOUR_API_KEY", "query": "coffee shop", "location": "Austin, TX" }'Each place carries placeId, name, url, rating, reviewCount,
phoneNumber, websiteUrl, address, categories, openingHours,
coordinates, and thumbnailUrl.
Place details takes a placeId from any search result and adds the
description, ratingBreakdown, attributes, and a sample of reviews to
the fields above.
Place reviews takes a placeId and returns reviews (author, 1–5
rating, publishedAt, text, likeCount, photoUrls, reviewUrl) plus
totalReviewCount and a nextPageToken. Set sortBy to relevance (the
default) or newest on the first page; later pages keep the sort the first
page used.
curl -X POST https://api.fiber.ai/v1/google-maps/reviews \
-H "Content-Type: application/json" \
-d '{ "apiKey": "YOUR_API_KEY", "placeId": "ChIJN1t_tDeuEmsRUsoyG83frY4", "sortBy": "newest" }'Owner & contact discovery (async)
Hand our AI agent a list of businesses and it comes back with who runs them and how to reach them: business emails and phones, social links, and the people in the roles you ask for, with their own emails and phones.
Send up to 500 businesses per request in companies. Only companyName
is required; companyWebsite, companyCity, companyState,
companyCountryName, companyCountryCode, companyAddress, and context
all sharpen the match, and context is the place to tell apart businesses
with similar names. Then shape the output:
jobTitles: up to 6 titles to look for (e.g., "Owner", "CEO"). Omit it to skip the person search and get business-level contacts only.strictJobTitleMatch:trueto require exact role matches (defaultfalse).contactPreferences: switch off any ofcompanyEmails,companyPhones,personEmails,personPhones(all defaulttrue).
curl -X POST https://api.fiber.ai/v1/local-business-search/start \
-H "Content-Type: application/json" \
-d '{
"apiKey": "YOUR_API_KEY",
"companies": [
{
"companyName": "Mission Auto Repair",
"companyCity": "San Francisco",
"companyState": "CA"
}
],
"jobTitles": ["Owner"]
}'The response returns a researchRunId. Runs take time: the reference
estimates about 30 minutes. Read results with pageSize (default 25, max
1,000) and cursor/nextCursor; each read reports status (PENDING,
RUNNING, COMPLETED, FAILED) and progress (completed out of total).
Records arrive in data.observations:
| Level | Fields |
|---|---|
| Business | companyName, domain, city, state, stateCode, countryName, country3LetterCode, address, context |
| Business contacts | businessEmails, businessPhones, socialMediaLinks |
| People | name, role, otherInfo, emailAddress, phoneNumber, socialMediaLinks |
Subscribe to local_business_search.completed to skip polling.
We charge 4 credits per business when the run starts, and businesses the run can't complete are refunded. Businesses that share a website domain are counted and charged once.
Domain lookup (async)
Domain lookup finds the website domain for each company in a list, and optionally its email domains. It's a general company-research tool rather than a Maps feature, and it fits a company-enrichment page better; it sits here for now because filling in missing websites is a common step before owner & contact discovery.
Send 1–400 companies in companyInfo (each needs a name; domain,
country, state, city, address, description, and otherContext are
optional, and findEmailDomains defaults to false) plus a required
overAllContext describing what the companies have in common. The reference
estimates about an hour for 150 companies. Poll with the returned
domainAgentRunId, pageSize (1–100, default 10), and cursor; status
moves through NOT_STARTED, STARTED, DONE, or FAILED, and each match
carries a 0–10 confidence score with a rationale. domain_lookup.completed
fires when the run finishes.
Webhooks
| Event | Fires when |
|---|---|
google_maps_search.completed | A regional sweep finishes |
local_business_search.completed | An owner & contact discovery run finishes |
domain_lookup.completed | A domain lookup finishes |
Setup, signatures, and retries live on Webhooks.
Operations
| Operation | What it does | Reference |
|---|---|---|
| Regional sweep (start) | Starts an async search across circles, rectangles, the whole USA, or world cities | google-maps-search |
| Regional sweep (check progress) | Status, places found so far, and percent complete | check-google-maps-results |
| Regional sweep (read results) | Pages through the places a sweep found | poll-google-maps-results |
| Places search | Up to 20 places per page for a query and optional location | googleMapsSearch |
| Place details | Full detail for one place ID | googleMapsPlace |
| Place reviews | Paged reviews for one place ID | googleMapsReviews |
| Owner & contact discovery (start) | Starts an AI agent run for up to 500 businesses | startLocalBusinessSearch |
| Owner & contact discovery (poll) | Status, progress, and paged business and people records | pollLocalBusinessSearch |
| Domain lookup (start) | Starts a domain search for up to 400 companies | domainLookupTrigger |
| Domain lookup (poll) | Paged domain matches with confidence scores | domainLookupPolling |
Cost and rate limits
| Operation | Cost | Rate limit |
|---|---|---|
| Regional sweep (start) | 3 credits per business with a phone number | 30/min |
| Regional sweep (check progress, read results) | See chargeInfo | 120/min each |
| Places search | 2 credits per search | 120/min |
| Place details | 2 credits per place | 120/min |
| Place reviews | 2 credits per page | 120/min |
| Owner & contact discovery (start) | 4 credits per business | 10/min |
| Owner & contact discovery (poll) | See chargeInfo | 120/min |
| Domain lookup (start) | 3 credits per company | 30/min |
| Domain lookup (poll) | See chargeInfo | 120/min |
Every response carries chargeInfo, the authoritative record of what a call
cost. Going over a limit returns HTTP 429.
In the dashboard, every location with a phone number is charged, so set
Max locations to find deliberately, especially on broad strategies like
Entire USA or big multi-region projects. On the API, maxResults plays the
same role: a sweep bills per business with a phone number, and the default of 100 keeps a
first run small.
See Billing for credits and top-ups.
Credit amounts are defaults — custom pricing is available for bulk use cases.
Tips
- Test your query on Google Maps first to confirm it returns what you expect. If the results look right, copy the URL and start a sweep from it.
- Start with a small region and a modest cap (
maxResultsor Max locations to find), inspect results, then widen. - Prefer specific cities, metros, or circles over Entire USA unless you need national coverage. Whole-USA is broad but less exhaustive than a targeted area.
- Poll async jobs about every 30 seconds, or use webhooks instead. Polling faster doesn't finish the job sooner and burns rate limit.
- Pace sweep starts to 30 per minute and owner & contact discovery starts to 10 per minute; batch up to 500 businesses into each discovery request rather than sending them one at a time.
- Read sweep results with
pageSize: 1000to page through large jobs in fewer calls. - Pass
jobTitlesonly when you need people; without it, discovery skips the person search and returns business-level contacts.
Use cases
- Local/SMB sales: lists of every qualifying business in a territory with owner contact info, which LinkedIn-only tools can't produce.
- Field sales & franchising: map every business within a radius or set of metros.
- Nationwide sweeps: enumerate an entire business category across the US.
- Market sizing: count and compare density of a business type across cities, counties, and metros.
- International expansion: sweep the major cities of a country or region before entering it.
- Reputation monitoring: pull the newest reviews for a set of locations and watch what customers say.
Related: Webhooks, Using the UI, Billing.
Reference lists
Free lists of every valid value for search filters — industries, NAICS codes, regions, metros, skills, technologies, tags, languages, and more.
Stealth Tracking
Find people in stealth mode on LinkedIn, and the ones who just came out of it — a signature capability, especially popular with VCs.