Datasets API endpoint
Searches Google Maps business records stored in a search index. Sort enum: `relevance`, `updated_at_desc`, `rating_desc`, `review_count_desc`, `distance_asc`. `category` is the exact Google Maps category label returned for the business locale; it can be localized, non-ASCII, or contain punctuation, so use the category facet to discover exact filter values. A `rating` of `null` means no aggregate rating is available. A `review_count` of `null` means Google did not return a count; numeric `0` means Google confirmed zero reviews. `rating_desc` sorts unrated businesses last, and `min_rating` above 0 excludes them. Use `has_geo=false` to isolate locationless service-area businesses (which have a `null` `geo`). A `permanently_closed` of `true` means Google marks the business permanently closed; `false` means a crawl confirmed it does not; `null` means the business has not been status-checked since capture shipped on 2026-08-31 and is UNKNOWN, not open — so any total computed from this dataset includes an unknown number of closed businesses. Use `permanently_closed=false` to exclude the confirmed-closed ones. Billing: this search costs 1 credit per record returned, with a minimum of 2 (an empty result costs 2, a full page of 100 costs 100).
/datasets/google-map-businesses/searchDataset id enum:
google-map-businessesQuery parameters:
q: optional full-text business search query, max 256 characters.category: optional exact category filter, max 128 characters. Values are the locale-specific labels returned by Google Maps and can be localized, non-ASCII, or contain punctuation. Use facet=category to discover exact values and pass the selected value unchanged.country: optional exact country filter, max 128 characters.state: optional exact state filter, max 128 characters.county: optional exact county filter, max 128 characters.state_code: optional exact ISO 3166-2 state/region code filter, e.g. US-CA or FR-HDF, max 128 characters. Use facet=state_code to discover values.county_code: optional exact ISO 3166-2 county/district code filter, e.g. FR-59 or IT-RM, max 128 characters. Use facet=county_code to discover values.city: optional exact city filter, max 128 characters.town: optional exact town filter, max 128 characters.min_rating: optional minimum rating from 0 through 5. Businesses with no aggregate Google rating are returned with rating null, so any min_rating above 0 excludes them.min_review_count: optional minimum review count.has_website: optional website presence filter.has_phone: optional phone presence filter.has_geo: optional location presence filter. true keeps only mappable businesses with coordinates; false isolates locationless service-area businesses (online/mobile/home-based) that Google assigns no map location, which are also returned with a null geo.lat: optional latitude for radius filtering or distance sort.lon: optional longitude for radius filtering or distance sort.radius_m: optional radius in meters, from 1 through 50000; requires lat and lon when supplied.sort: optional sort enum: relevance, updated_at_desc, rating_desc, review_count_desc, distance_asc.page: optional page number, defaults to 1.page_size: optional page size, defaults to 20 and maxes at 100.Response behavior:
relevance sort when q is supplied.updated_at_desc sort when no q is supplied.lat and lon must be supplied together. distance_asc requires lat and lon, but does not require radius_m.10000; page * page_size must not exceed 10000.null rating in a result means no aggregate rating is available for that business (too few reviews, or a place type Google does not rate) — it is never a literal zero-star score. A present rating is always between 1.0 and 5.0.null review_count means Google did not return a count for that business. Numeric 0 means Google confirmed zero reviews; positive values are confirmed counts. review_count_desc sorts missing counts last.state and county keep each country's own administrative vocabulary (Provincia de Madrid, Département du Nord, Regierungsbezirk Köln, plain ___ County in the US). state_code and county_code are the matching ISO 3166-2 codes (ES-MD, FR-59) and are the stable key for grouping or ranking across countries. They are filled by reverse geocoding and are omitted from a row that has not been resolved yet.1 credit per record returned, minimum 2. A search that returns 20 records costs 20 credits, a full page of 100 costs 100, and an empty or one-record result costs 2. You are charged for what comes back, not for the page_size you ask for, but your balance must cover the requested page_size for the call to be accepted. The response header x-credit-cost shows what a call was charged.
| Field | Filled in, of 20 checked | Values in the sample |
|---|---|---|
| id | 20 | |
| url | 20 | google.com |
| name | 20 | |
| place_id | 20 | |
| category | 20 | median 1 entry |
| address | 20 | |
| rating | 18 | 2.5 to 4.3, median 3.3 |
| review_count | 20 | 0 to 3,085, median 128 |
| permanently_closed | 3 | true in 0 of 3 |
| website | 14 | yalehotel-littlesaigon.us and 13 other hosts |
| phone | 18 | |
| description | 10 | |
| image | 0 | |
| geo | 20 | |
| country | 20 | |
| state | 20 | |
| county | 20 | |
| city | 20 | |
| geo_is_updated | 20 | true in 0 of 20 |
| contact_is_updated | 20 | true in 0 of 20 |
| created_at | 20 | 2024-11-04 to 2026-10-02 |
| updated_at | 20 | 2026-07-23 to 2026-10-06 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| q | string | No | Full-text business search query, max 256 characters | ||
| category | string | No | Exact locale-specific Google Maps category label; use the category facet to discover values, max 128 characters | ||
| country | string | No | Country filter. Accepts the full English name (\ | ||
| state | string | No | Exact state filter, max 128 characters | ||
| county | string | No | Exact county filter, max 128 characters | ||
| state_code | string | No | Exact ISO 3166-2 state/region code filter, e.g. US-CA or FR-HDF, max 128 characters; use facet=state_code to discover values | ||
| county_code | string | No | Exact ISO 3166-2 county/district code filter, e.g. FR-59 or IT-RM, max 128 characters; use facet=county_code to discover values | ||
| city | string | No | Exact city filter, max 128 characters | ||
| town | string | No | Exact town filter, max 128 characters | ||
| min_rating | number | No | Minimum rating, 0 through 5. Businesses with no aggregate Google rating are returned with rating null, so any min_rating above 0 excludes them. | ||
| min_review_count | integer | No | Minimum review count | ||
| has_website | boolean | No | Filter by website presence | ||
| has_phone | boolean | No | Filter by phone presence | ||
| has_geo | boolean | No | Filter by location presence: true keeps only mappable businesses with coordinates; false isolates locationless service-area businesses that have no map location | ||
| permanently_closed | boolean | No | Closure filter. true keeps only businesses Google marks Permanently closed; false excludes them, keeping every business not known to be closed. Most rows have never been status-checked and are returned with permanently_closed null, which means unknown, not open. | ||
| lat | number | No | Latitude for radius filtering or distance sort | ||
| lon | number | No | Longitude for radius filtering or distance sort | ||
| radius_m | integer | No | Radius in meters, 1 through 50000; requires lat and lon when supplied | ||
| sort | string | No | Sort enum: relevance, updated_at_desc, rating_desc, review_count_desc, distance_asc Allowed values: relevance, updated_at_desc, rating_desc, review_count_desc, distance_asc. | ||
| page | integer | No | 1 | Page number, defaults to 1 | |
| page_size | integer | No | 20 and maxes at 100 | Page size, defaults to 20 and maxes at 100; page * page_size must be <= 10000 | |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/datasets/google-map-businesses/search?q=coffee&country=us&has_website=true&has_phone=true&has_geo=true&permanently_closed=true&sort=relevance&page=1" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"dataset": "google-map-businesses",
"items": [
{
"place_id": "ChIJ99URUeOAhYAR0J5ZUxTesDQ",
"name": "Hotel Zephyr San Francisco",
"category": [
"hotel"
],
"rating": 4.1,
"review_count": 3213
}
],
"page": 1,
"page_size": 20,
"total": 1,
"sort": "relevance"
}
}Request schema
No body schema
Response schema
#/definitions/datasets.googleMapBusinessesSearchResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | datasets.GoogleBusinessSearchResponse | No | ||||
| data.dataset | string | No | Identifier of the dataset queried (`google-map-businesses`). | |||
| data.items | array | No | Matching Google Maps business records on this page. | |||
| data.items[].address | string | No | 250 Beach St, San Francisco, CA 94133 | Full street address as shown on Google Maps. | ||
| data.items[].amenities | array | No | ['Free Wi-Fi', 'Air-conditioned', 'Wi-Fi', 'Parking'] | List of amenities Google Maps shows for the business, for example `Free Wi-Fi`. | ||
| data.items[].category | array | No | ["hotel"] | Categories Google Maps lists for the business. Labels can be in the local language. | ||
| data.items[].city | string | No | San Francisco | Name of the city the business is in. | ||
| data.items[].contact | object | No | 🆕 Contact information | |||
| data.items[].contact.emails | array | No | ["john.doe@example.com","jane.doe@example.com"] | Email addresses found on the website. | ||
| data.items[].contact.socials | object | No | Social media profile links found on the website, one per network: `facebook`, `instagram`, `youtube`, `tiktok`, `twitter` and `linkedin`. | |||
| data.items[].contact.socials.facebook | string | No | https://facebook.com/johndoe | |||
| data.items[].contact.socials.instagram | string | No | https://instagram.com/johndoe | |||
| data.items[].contact.socials.linkedin | string | No | https://linkedin.com/in/johndoe | |||
| data.items[].contact.socials.tiktok | string | No | https://tiktok.com/@johndoe | |||
| data.items[].contact.socials.twitter | string | No | https://twitter.com/johndoe | |||
| data.items[].contact.socials.youtube | string | No | https://youtube.com/channel/UC123456789 | |||
| data.items[].contact.url | string | No | https://example.com | Website URL the contact details were found for. | ||
| data.items[].contact_is_updated | boolean | No | Whether the business's contact details have been collected. | |||
| data.items[].country | string | No | United States | 🆕 Geographic hierarchy | ||
| data.items[].county | string | No | San Francisco County | Administrative area below state level, named as the country itself names it. | ||
| data.items[].county_code | string | No | FR-59 | ISO 3166-2 code for the `county` value, for example `FR-59`. | ||
| data.items[].created_at | string | No | 🆕 Timestamps | |||
| data.items[].description | string | No | A 3-minute walk from Pier 41 in the Fisherman's Wharf district... | Business description shown on Google Maps. | ||
| data.items[].distance_m | number | No | Distance from the query point in metres. Set when results are sorted by distance. | |||
| data.items[].geo | object | No | Coordinates of the business. Omitted when no map location is available for it. | |||
| data.items[].geo.lat | number | No | Latitude in decimal degrees. | |||
| data.items[].geo.lon | number | No | Longitude in decimal degrees. | |||
| data.items[].geo_is_updated | boolean | No | Whether the country, state, county, city and town fields have been filled in from the coordinates. | |||
| data.items[].id | string | No | ChIJ99URUeOAhYAR0J5ZUxTesDQ | Unique id of the business record in the dataset. | ||
| data.items[].image | string | No | https://lh5.googleusercontent.com/p/AF1QipP_O55x7gOwR3AaM09CVmzEUude9wMHMPwc--yp | URL of the business's main photo on Google Maps. | ||
| data.items[].locations | array | No | ['San Francisco', 'Los Angeles'] | Place names Google Maps lists with the business, for example `San Francisco`. | ||
| data.items[].name | string | No | Hotel Zephyr San Francisco | Business name as shown on Google Maps. | ||
| data.items[].permanently_closed | boolean | No | false | PermanentlyClosed reports Google's "Permanently closed" marker: true when Google marks the business permanently closed, false when a crawl confirmed it does not, and null when the business has not been re-crawled since status capture shipped (2026-08-31) — which is most of the dataset. null therefore means UNKNOWN, never "open": a count that treats null as operational is counting an unknown number of dead businesses. Use permanently_closed=false to exclude the confirmed-closed ones. | ||
| data.items[].phone | string | No | 14156176565 | Business phone number as listed on Google Maps. | ||
| data.items[].place_id | string | No | ChIJ99URUeOAhYAR0J5ZUxTesDQ | Google place id of the business. | ||
| data.items[].rating | number | No | 4.1 | Rating is the aggregate Google rating (1.0–5.0). It is a pointer so a business with NO aggregate Google rating serializes as `rating: null` rather than a misleading 0 — Google never assigns a 0.x average, so 0 always meant "unrated". Consumers computing an average must skip nulls; use min_rating>0 to exclude them. | ||
| data.items[].review_count | integer | No | 3213 | ReviewCount is the aggregate Google review count. A null value means Google did not return a count; numeric zero means Google confirmed zero reviews. | ||
| data.items[].similarweb | object | No | Website traffic profile of the business website from SimilarWeb. | |||
| data.items[].similarweb.AiTrafficDetails | object | No | AiTrafficDetails carries SimilarWeb's AI-chatbot traffic insights (the extension's "AI Traffic" feature set): which AI platforms send traffic to this domain, how that mix changed over recent months, and the top prompts users asked those chatbots that referred visits here. Left at its zero value when DataSource is "public_page" because that source doesn't expose it. | |||
| data.items[].similarweb.AiTrafficDetails.ReferralTraffic | number | No | ||||
| data.items[].similarweb.AiTrafficDetails.TopPrompts | object | No | ||||
| data.items[].similarweb.AiTrafficDetails.TopPrompts.ErrorMessage | string | No | ||||
| data.items[].similarweb.AiTrafficDetails.TopPrompts.Prompts | array | No | ||||
| data.items[].similarweb.AiTrafficDetails.TopPrompts.Status | integer | No | ||||
| data.items[].similarweb.AiTrafficDetails.TotalVisits | number | No | ||||
| data.items[].similarweb.AiTrafficDetails.Traffic | object | No | ||||
| data.items[].similarweb.AiTrafficDetails.Traffic.Distribution | object | No | ||||
| data.items[].similarweb.AiTrafficDetails.Traffic.Distribution.Boundary | string | No | ||||
| data.items[].similarweb.AiTrafficDetails.Traffic.Distribution.Chart | array | No | ||||
| data.items[].similarweb.AiTrafficDetails.Traffic.Distribution.Chart[].History | array | No | ||||
| data.items[].similarweb.AiTrafficDetails.Traffic.Distribution.Chart[].History[].Date | string | No | ||||
| data.items[].similarweb.AiTrafficDetails.Traffic.Distribution.Chart[].History[].Value | number | No | ||||
| data.items[].similarweb.AiTrafficDetails.Traffic.Distribution.Chart[].Icon | string | No | ||||
| data.items[].similarweb.AiTrafficDetails.Traffic.Distribution.Chart[].Name | string | No | ||||
| data.items[].similarweb.AiTrafficDetails.Traffic.Distribution.Chatbots | array | No | ||||
| data.items[].similarweb.AiTrafficDetails.Traffic.Distribution.Chatbots[].Icon | string | No | ||||
| data.items[].similarweb.AiTrafficDetails.Traffic.Distribution.Chatbots[].Name | string | No | ||||
| data.items[].similarweb.AiTrafficDetails.Traffic.Distribution.Chatbots[].Value | number | No | ||||
| data.items[].similarweb.AiTrafficDetails.Traffic.Split | array | No | ||||
| data.items[].similarweb.AiTrafficDetails.Traffic.Split[].Icon | string | No | ||||
| data.items[].similarweb.AiTrafficDetails.Traffic.Split[].Name | string | No | ||||
| data.items[].similarweb.AiTrafficDetails.Traffic.Split[].Rank | integer | No | ||||
| data.items[].similarweb.Category | string | No | Category SimilarWeb places the site in. | |||
| data.items[].similarweb.CategoryRank | object | No | Rank of the site within its category, with the category name. | |||
| data.items[].similarweb.CategoryRank.Category | string | No | ||||
| data.items[].similarweb.CategoryRank.Rank | string | No | ||||
| data.items[].similarweb.Competitors | object | No | Sites SimilarWeb lists as most similar to the domain. | |||
| data.items[].similarweb.Competitors.TopSimilarityCompetitors | array | No | ||||
| data.items[].similarweb.Countries | array | No | Countries SimilarWeb returns with the site's data, each with a code, URL code and name. | |||
| data.items[].similarweb.Countries[].Code | string | No | ||||
| data.items[].similarweb.Countries[].Name | string | No | ||||
| data.items[].similarweb.Countries[].UrlCode | string | No | ||||
| data.items[].similarweb.CountryRank | object | No | Rank of the site within one country, with that country's code. | |||
| data.items[].similarweb.CountryRank.Country | integer | No | ||||
| data.items[].similarweb.CountryRank.CountryCode | string | No | ||||
| data.items[].similarweb.CountryRank.Rank | integer | No | ||||
| data.items[].similarweb.DataSource | string | No | extension_api | DataSource reports which upstream this response was populated from. "extension_api" is the full-coverage source (SimilarWeb's undocumented browser-extension API); "public_page" is a narrower, credential-free fallback (see website.go) used only when the extension API is unreachable -- some fields above are left at their zero value when DataSource is "public_page" because this source doesn't expose them. See docs/similarweb-web.md for the full field-availability breakdown. | ||
| data.items[].similarweb.Description | string | No | Site description as SimilarWeb shows it. | |||
| data.items[].similarweb.Engagments | object | No | Engagement figures for the latest month: bounce rate, pages per visit, visits, time on site, month and year. | |||
| data.items[].similarweb.Engagments.BounceRate | string | No | ||||
| data.items[].similarweb.Engagments.Month | string | No | ||||
| data.items[].similarweb.Engagments.PagePerVisit | string | No | ||||
| data.items[].similarweb.Engagments.TimeOnSite | string | No | ||||
| data.items[].similarweb.Engagments.Visits | string | No | ||||
| data.items[].similarweb.Engagments.Year | string | No | ||||
| data.items[].similarweb.EstimatedMonthlyVisits | object | No | Estimated visits per month, keyed by the first day of the month (YYYY-MM-DD). | |||
| data.items[].similarweb.EstimatedMonthlyVisits.2024-09-01 | integer | No | ||||
| data.items[].similarweb.EstimatedMonthlyVisits.2024-10-01 | integer | No | ||||
| data.items[].similarweb.EstimatedMonthlyVisits.2024-11-01 | integer | No | ||||
| data.items[].similarweb.GlobalCategoryRank | unknown | No | Rank of the site within its category across all countries, when SimilarWeb provides it. | |||
| data.items[].similarweb.GlobalRank | object | No | Global traffic rank of the site, in `Rank`. | |||
| data.items[].similarweb.GlobalRank.Rank | integer | No | ||||
| data.items[].similarweb.IsDataFromGa | boolean | No | Whether SimilarWeb reports the site's data as coming from Google Analytics. | |||
| data.items[].similarweb.IsSmall | boolean | No | Whether SimilarWeb treats the site as a small site. | |||
| data.items[].similarweb.LargeScreenshot | string | No | URL of a large screenshot of the site. | |||
| data.items[].similarweb.Notification | object | No | Notice SimilarWeb attaches to the site's data, in `Content`. | |||
| data.items[].similarweb.Notification.Content | unknown | No | ||||
| data.items[].similarweb.Policy | integer | No | Numeric policy value SimilarWeb returns with the site's data. | |||
| data.items[].similarweb.SiteName | string | No | Domain name of the site. | |||
| data.items[].similarweb.SnapshotDate | string | No | Date and time of the SimilarWeb data snapshot. | |||
| data.items[].similarweb.Title | string | No | Site title as SimilarWeb shows it. | |||
| data.items[].similarweb.TopCountryShares | array | No | Countries that send the most visits, each with its country code and share of traffic. | |||
| data.items[].similarweb.TopCountryShares[].Country | integer | No | ||||
| data.items[].similarweb.TopCountryShares[].CountryCode | string | No | ||||
| data.items[].similarweb.TopCountryShares[].Value | number | No | ||||
| data.items[].similarweb.TopKeywords | array | No | Top search keywords bringing visits to the site, each with estimated value, volume and cost per click. | |||
| data.items[].similarweb.TopKeywords[].Cpc | number | No | ||||
| data.items[].similarweb.TopKeywords[].EstimatedValue | number | No | ||||
| data.items[].similarweb.TopKeywords[].Name | string | No | ||||
| data.items[].similarweb.TopKeywords[].Volume | number | No | ||||
| data.items[].similarweb.TrafficSources | object | No | Share of traffic from each source: social, paid referrals, mail, referrals, search and direct. | |||
| data.items[].similarweb.TrafficSources.Direct | number | No | ||||
| data.items[].similarweb.TrafficSources.Mail | number | No | ||||
| data.items[].similarweb.TrafficSources.Paid Referrals | number | No | ||||
| data.items[].similarweb.TrafficSources.Referrals | number | No | ||||
| data.items[].similarweb.TrafficSources.Search | number | No | ||||
| data.items[].similarweb.TrafficSources.Social | number | No | ||||
| data.items[].similarweb.Version | integer | No | Version number SimilarWeb returns with the site's data. | |||
| data.items[].state | string | No | California | State, region or province, named as the country itself names it. | ||
| data.items[].state_code | string | No | US-CA | StateCode and CountyCode are the ISO 3166-2 subdivision codes behind `state` and `county` (e.g. US-CA / FR-HDF for a state or region, FR-59 / IT-RM for a county, département or province). `state` and `county` deliberately keep each country's own administrative vocabulary ("Regierungsbezirk Köln", "Provincia de Madrid"), so these codes are the stable, country-agnostic join key for cross-country grouping or ranking. Filled by reverse geocoding since 2026-09-07; empty for rows not yet resolved. | ||
| data.items[].town | string | No | Fisherman's Wharf | Name of the town or neighbourhood the business is in. | ||
| data.items[].updated_at | string | No | Time the record was last updated, in UTC (RFC 3339). | |||
| data.items[].url | string | No | https://www.google.com/maps/place/?q=place_id:ChIJ99URUeOAhYAR0J5ZUxTesDQ | Google Maps link to the business. | ||
| data.items[].website | string | No | https://www.hotelzephyrsf.com/ | 🆕 Website and status | ||
| data.items[].website_status | object | No | Result of the last reachability check of the business website. | |||
| data.items[].website_status.checked_at | string | No | Time the website was checked, in UTC (RFC 3339). | |||
| data.items[].website_status.dns_resolvable | boolean | No | Whether the website's domain name resolved. | |||
| data.items[].website_status.error | string | No | Error message from the check. Omitted when the check raised no error. | |||
| data.items[].website_status.http_reachable | boolean | No | Whether the website answered an HTTP request. | |||
| data.items[].website_status.status_code | integer | No | HTTP status code the website returned. | |||
| data.items[].website_status.url | string | No | Website address that was checked. | |||
| data.page | integer | No | Page number returned. | |||
| data.page_size | integer | No | Number of items per page. | |||
| data.sort | string | No | Sort order applied. | |||
| data.total | integer | No | Total number of records matching the filters. | |||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Bad Request | #/definitions/app.Response |
| 429 | Too Many Requests | #/definitions/app.Response |
| 500 | Internal Server Error | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/datasets/google-map-businesses/search?q=coffee&country=us&has_website=true&has_phone=true&has_geo=true&permanently_closed=true&sort=relevance&page=1" \
-H "x-api-key: $CRAWLORA_API_KEY"