Local Business Database API
Query the local business database via API. Access millions of businesses with emails, phone numbers, ratings, and location data. Requires $149/mo plan.
Included with $149/mo plan
GET /api/v1/database/local-businessesDatabase APIs are included with the $149/mo plan.
Parameters
| Name | Type | Required | Description |
|---|---|---|---|
page | number | Optional | Page number (default: 1)Default: 1Example: 1 |
limit | number | Optional | Results per page (max: 100)Default: 50Example: 100 |
keyword | string[] | Optional | What the businesses do or are called, as you would type it on Google Maps (multiple allowed; a business matching any keyword is returned). Matched against business names and categories, so "thai food" finds Thai restaurants. A place inside a keyword ("plumbers in Austin TX") is used as the location when no location is sent. searched_as in the response shows how each keyword was read.Example: thai restaurant |
location | string[] | Optional | Cities, states, countries or postal codes, as typed (multiple allowed, up to 2,000; any of them). "Houston TX", "Austin, Texas", "78701", "Ontario", "Germany", "Wien" and "Vienna" all work. searched_as in the response shows where each was found and lists any place that was not found.Example: Houston TX |
category | string[] | Optional | Filter by business category (multiple allowed)Example: Restaurant |
country | string[] | Optional | Filter by country (multiple allowed)Example: US |
state | string | Optional | Filter by state (partial match)Example: Texas |
city | string | Optional | Filter by city (partial match)Example: Austin |
postalCode | string | Optional | Filter by postal/zip codeExample: 78701 |
box | string | Optional | A map area as minLat,minLng,maxLat,maxLng. Only businesses inside it are returned. A box that can't be read returns 400.Example: 30.1,-97.9,30.5,-97.5 |
minRating | number | Optional | Minimum Google rating (1-5)Example: 4 |
maxRating | number | Optional | Maximum Google rating (1-5)Example: 5 |
minReviews | number | Optional | Minimum number of reviewsExample: 50 |
maxReviews | number | Optional | Maximum number of reviewsExample: 1000 |
hasEmail | boolean | Optional | Only return businesses with email addressesDefault: falseExample: true |
hasPhone | boolean | Optional | Only return businesses with phone numbersDefault: falseExample: true |
hasWebsite | boolean | Optional | Only return businesses with websitesDefault: falseExample: true |
hasContact | boolean | Optional | Only return businesses with a named contact personDefault: falseExample: true |
query | string | Optional | Full-text search across business name and descriptionExample: pizza |
title | string | Optional | Filter by business name (partial match). Comma separated for several names.Example: Smile Dental |
notCategory | string[] | Optional | Leave out these business categories (multiple allowed)Example: Fast food restaurant |
url | string | Optional | A Google Maps search URL: the address of a search on Google Maps. Its keyword and place are used as the search, and any other filter you send overrides the matching one. The response lists what was applied, what was made broader, and what is not supported in search_translation. A URL with nothing the database can use returns 400. For a long URL, send the request as a POST with a JSON body (see the example).Example: https://www.google.com/maps/search/dentists+in+Austin,+TX |
excludeDelivered | boolean | Optional | Skip businesses you already have: anything this account got from this API before or unlocked in the dashboard. Use it for daily pulls so each run returns only new businesses. With this on, request page=1 every time (or use after), because the businesses you just received are skipped on the next call.Default: falseExample: true |
after | string | Optional | Cursor paging for large pulls: returns businesses after this id, in id order. Send after=0 on the first call, then send the next_after value from each response until it comes back null. Faster than page numbers deep into a big search. pagination.total is still the whole search.Example: 0 |
Examples
Daily pull of only new businesses (for n8n, Make, Zapier, or a cron job)
curl "https://app.scrapercity.com/api/v1/database/local-businesses?category=Dentist&country=US&hasEmail=true&excludeDelivered=true&limit=100" \ -H "Authorization: Bearer YOUR_API_KEY"
Page through a large search with a cursor
# First call: after=0. Then pass pagination.next_after from each response as after, until it is null. curl "https://app.scrapercity.com/api/v1/database/local-businesses?category=Dentist&country=US&hasEmail=true&after=0&limit=100" \ -H "Authorization: Bearer YOUR_API_KEY"
Keywords and places as you would type them on Google Maps
curl -X POST "https://app.scrapercity.com/api/v1/database/local-businesses" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"keyword": ["thai restaurant", "thai food"], "location": ["Houston TX", "Austin TX", "Dallas TX", "San Antonio TX"], "hasEmail": true, "limit": 100}'
# The response's searched_as shows how each keyword and place was read. A search that finds nothing
# also returns lead_database: the same search in the Lead Database when it has 100+ people.Find restaurants in Austin with 4+ stars
curl "https://app.scrapercity.com/api/v1/database/local-businesses?category=Restaurant&city=Austin&state=Texas&minRating=4&hasEmail=true&limit=100" \ -H "Authorization: Bearer YOUR_API_KEY"
Search with the keyword and place of a Google Maps search URL
curl -G "https://app.scrapercity.com/api/v1/database/local-businesses" \ --data-urlencode "url=YOUR_GOOGLE_MAPS_SEARCH_URL" \ --data-urlencode "limit=100" \ -H "Authorization: Bearer YOUR_API_KEY"
Long search URL or long lists: POST the same parameters as JSON
# A query string over about 16KB is refused, so send long requests as a POST body.
curl -X POST "https://app.scrapercity.com/api/v1/database/local-businesses" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"url": "YOUR_GOOGLE_MAPS_SEARCH_URL", "limit": 100}'Restaurants inside a map area, no fast food
curl "https://app.scrapercity.com/api/v1/database/local-businesses?category=Restaurant&box=30.1,-97.9,30.5,-97.5¬Category=Fast%20food%20restaurant&limit=100" \ -H "Authorization: Bearer YOUR_API_KEY"
Search for dentists with good reviews
curl "https://app.scrapercity.com/api/v1/database/local-businesses?category=Dentist&minReviews=50&minRating=4&country=US&limit=50" \ -H "Authorization: Bearer YOUR_API_KEY"
Use Cases
- •Build local business outreach lists for agencies
- •Power local SEO and marketing campaigns
- •Enrich your CRM with local business data
- •Find businesses by category and location at scale
Best Practices
- •Use category + location filters for targeted results
- •Rate limit: 100 businesses per request, 100,000 new businesses per day. Businesses you already have do not count again
- •Every business the API returns is saved to your account, so excludeDelivered=true can skip it next time. It also shows in your unlocked businesses in the dashboard
- •For big pulls use after + next_after (cursor paging) instead of high page numbers
- •Filter by hasEmail=true to only get businesses with contact info
- •Use minRating to target high-quality businesses
- •Each business includes title, category_name, address, city, state, postal_code, country_code, phone, website, emails, total_score, reviews_count, lat, lng and the contact person's name, title, email and mobile when we have them
- •A search that takes too long to run returns 503. Narrow it (add a category, a city, a state or a postal code) and try again
- •Requires $149/mo plan - upgrade at /dashboard/billing
- •Daily limit resets at midnight UTC
Every scrape returns a runId. Poll GET /api/v1/scrape/status/{runId} until it completes, then download via GET /api/downloads/{runId}?format=csv.
Authenticate every request with Authorization: Bearer YOUR_API_KEY. See the full API reference for authentication, rate limits and error codes.