ScraperCity logo

Local Business Database API API Documentation

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 planGET /api/v1/database/local-businesses

Database APIs are included with the $149/mo plan.

Parameters

NameTypeRequiredDescription
pagenumberOptionalPage number (default: 1)Default: 1Example: 1
limitnumberOptionalResults per page (max: 100)Default: 50Example: 100
keywordstring[]OptionalWhat 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
locationstring[]OptionalCities, 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
categorystring[]OptionalFilter by business category (multiple allowed)Example: Restaurant
countrystring[]OptionalFilter by country (multiple allowed)Example: US
statestringOptionalFilter by state (partial match)Example: Texas
citystringOptionalFilter by city (partial match)Example: Austin
postalCodestringOptionalFilter by postal/zip codeExample: 78701
boxstringOptionalA 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
minRatingnumberOptionalMinimum Google rating (1-5)Example: 4
maxRatingnumberOptionalMaximum Google rating (1-5)Example: 5
minReviewsnumberOptionalMinimum number of reviewsExample: 50
maxReviewsnumberOptionalMaximum number of reviewsExample: 1000
hasEmailbooleanOptionalOnly return businesses with email addressesDefault: falseExample: true
hasPhonebooleanOptionalOnly return businesses with phone numbersDefault: falseExample: true
hasWebsitebooleanOptionalOnly return businesses with websitesDefault: falseExample: true
hasContactbooleanOptionalOnly return businesses with a named contact personDefault: falseExample: true
querystringOptionalFull-text search across business name and descriptionExample: pizza
titlestringOptionalFilter by business name (partial match). Comma separated for several names.Example: Smile Dental
notCategorystring[]OptionalLeave out these business categories (multiple allowed)Example: Fast food restaurant
urlstringOptionalA 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
excludeDeliveredbooleanOptionalSkip 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
afterstringOptionalCursor 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&notCategory=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.