How-to
How to run Restaurant, Cafe & Bar Scraper: Email, Phone & Address
Step-by-step: the exact input, what each field does, and the rows that come back from Google Maps.
You sell to restaurants (ordering or POS software, food and drink supplies, payments, insurance) and you need every restaurant, cafe, bar and bakery in a territory, with a phone number, the website, and where the place publishes one, an email. The manual route is Google Maps: search “restaurant in Walnut Creek”, scroll, copy each place into a spreadsheet, then do it again for “cafe”, “bar” and “bakery”, because each of those finds places the others miss, and again for every town. Google also stops one search at about 150 places. In a downtown that is a small slice: a search for “restaurant in 10001” in Manhattan returned 147 places, and only 61 of them were in that ZIP code. This actor does the searching, the de-duplicating and the website lookup in one run.
What you’ll need
Nothing but an Apify account. The actor talks to Google Maps directly.
There is no API key to get and nothing to configure. Searches go through Apify’s datacenter proxy, which is already on in the input. Apify bills that as ordinary platform usage on your plan, like compute.
Step 1 — Open the actor
Open Restaurant, Cafe & Bar Scraper: Email, Phone & Address on the Apify Store and press Try for free. The actor’s own page on this site lists its live health and pricing.
Step 2 — Fill in the input
| Field | Type | Required | What it does |
|---|---|---|---|
state | string | no | The US state to search. On its own it searches the whole state; add counties, cities or ZIP codes below to narrow it. |
counties | array | no | Only these counties of the state, e.g. Contra Costa or Harris. “County” is optional and spelling is forgiving. A name that is not in the state is skipped and a free row lists… (default []) |
cities | array | no | Only these cities, by their postal name, e.g. Lafayette or Houston. A big city is searched ZIP code by ZIP code, and a busy ZIP code is split into smaller map areas, so nothing… (default []) |
zipCodes | array | no | Only these 5-digit ZIP codes. Combined with counties and cities if you fill more than one. (default []) |
placeType | string | no | ”All restaurants, cafes, bars & bakeries” returns every food and drink place. Pick one of the others to get only that kind. (default restaurant) |
includeEmails | boolean | no | On by default: visit each place’s own website, return the email published there and the online-ordering platforms it links to. The email is charged separately, only for places… (default True) |
maxResults | integer | no | Cap on the number of places returned for the WHOLE run (not per city or county). A spend cap: the run stops once it has this many. (default 1000) |
maxPagesPerSite | integer | no | How many pages of each place’s website the email lookup reads: the homepage plus its contact and about pages. (default 6) |
Three fields decide what you get back. The area: a state on its own means the whole state, so pick a state and then narrow it with counties, cities or ZIP codes; they add together. Type of place: the default, “All restaurants, cafes, bars & bakeries”, is every food and drink place; pick “Cafes & coffee shops”, “Bars & pubs”, “Bakeries & desserts” or “Fast food” to get only that kind, which is also faster because the actor runs fewer searches. Maximum places is a cap for the whole run, not per city: leave it at 1,000 for a town or two, raise it for a county, and lower it to a few dozen for a first look at the rows. Turn Look up each place’s email off if phone and address are all you need; the run is faster, there is no email charge, and the ordering-platform column stays empty except where Google’s own website link is an ordering page.
A working input:
{
"state": "CA",
"cities": [
"Lafayette"
],
"placeType": "restaurant",
"includeEmails": true
}
Step 3 — Run it
Press Start. Rows are pushed to the dataset as they’re found, so the run log fills in as it works.
In our runs on 2026-10-30, Lafayette, CA (one ZIP code) returned 91 places in about 80 seconds, email lookup included. Manhattan’s 10001, the densest ZIP code we know of, returned 636 places in about 4 minutes of searching, because the actor split that ZIP code into smaller map squares wherever a search ran into Google’s limit. All of Contra Costa County (52 ZIP codes) returned 3,387 places in about 21 minutes of searching, before the email lookup. The log reports how many ZIP codes were searched, how many were split, and how many places were found. If a search is refused, or the run reaches its time limit, you still get every place found so far plus a free row naming the ZIP codes to run again. An empty result with no such row means Google lists no place of that type there; check the spelling of the city or county first.
Step 4 — Read the output
Each run returns a labelled table, not raw JSON:
Every row looks like this — a real row from a real run:
{
"name": "360 Gourmet Burritos",
"business_type": "restaurant",
"phone": "(925) 299-1270",
"email": null,
"emails": [],
"website": "https://www.360burrito.com/",
"online_ordering": [
"ChowNow"
],
"reservation_platform": null,
"reservation_url": null,
"address": "3655 Mount Diablo Blvd, Lafayette, CA 94549",
"street": "3655 Mount Diablo Blvd",
"city": "Lafayette",
"county": "Contra Costa",
"state": "CA",
"zip_code": "94549",
"categories": [
"Mexican restaurant",
"Burrito restaurant"
],
"rating": 4.5,
"review_count": 122,
"opening_hours": {
"Monday": "10:30 AM-7:30 PM",
"Tuesday": "10:30 AM-7:30 PM",
"Wednesday": "10:30 AM-7:30 PM",
"Thursday": "10:30 AM-7:30 PM",
"Friday": "10:30 AM-7:30 PM",
"Saturday": "10:30 AM-6:30 PM",
"Sunday": "Closed"
},
"description": null,
"badges": [],
"latitude": 37.8906477,
"longitude": -122.1277167,
"place_id": "ChIJ19DWkldihYARuoIvQ2paBt0",
"google_maps_url": "https://www.google.com/maps/search/?api=1&query=360%20Gourmet%20Burritos&query_place_id=ChIJ19DWkldihYARuoIvQ2paBt0",
"source_url": "https://www.google.com/maps/search/?api=1&query=360%20Gourmet%20Burritos&query_place_id=ChIJ19DWkldihYARuoIvQ2paBt0"
}
| Field | Example value | Meaning |
|---|---|---|
name | 360 Gourmet Burritos | The place’s name on Google Maps |
business_type | restaurant | restaurant, cafe, bar, bakery or fast_food, from Google’s categories |
phone | (925) 299-1270 | Phone number as Google Maps lists it |
email | — | The place’s email from its own website (null when none was found or the lookup is switched off) |
emails | [] | Every address of the place’s own found on its website |
website | https://www.360burrito.com/ | The website the place lists on Google Maps |
online_ordering | ["ChowNow"] | Ordering, delivery and POS platforms the website is on or links to (Toast, DoorDash, Uber Eats, ChowNow, Square, …) |
reservation_platform | — | Where Google Maps’ booking link goes: OpenTable, Resy, Tock, Toast Tables, or “Own website” |
Phone is the field you can count on: 86 of Lafayette’s 91 places had one, and 74 listed a website.
Email is the scarce one: 29 of the 91. online_ordering filled for 19 and reservation_platform
for 11; a blank there means the place’s site showed no platform we recognise, not that it takes no
orders online. Chain locations often publish only the chain’s head-office address (a Starbucks
row carries Starbucks’ partnerships inbox), so treat a chain’s email as the chain’s. Use place_id
as the key when you merge runs: it is Google’s own ID and is unique per row.
Step 5 — Export it
Open the Dataset tab and export to CSV, JSON, or Excel — or pull the same rows from the API, which is what you want if this is going to run on a schedule.
What it costs
$0.003 per place returned, plus $0.002 per place where the email lookup finds an email. A place with no email found costs nothing extra, the ordering-platform check is free, and the free notice rows are never charged. Lafayette’s 91 places with 29 emails come to $0.33. Set Maximum places to cap a run’s spend. A county is thousands of places (Contra Costa: 3,387, so $10.16 before emails), and the default cap of 1,000 stops well short of that, so raise it before you start one.
Where the data comes from
This reads Google Maps directly, the same listings you see when you search there, and each place’s own website for the email and the ordering platforms. Every night a canary runs this actor against that live source and diffs the result against a frozen fixture — what “verified” means.
Google Maps is the most complete public list of restaurants, because nearly every place claims its listing for walk-in traffic. Two things make pulling from it more work than it looks: no single search term covers the trade (in our 6-ZIP test, “bakery” alone added 31 to 92 places per ZIP code that “restaurant” never returned, and “cafe” 12 to 49), and Google’s per-search limit cuts busy areas short. The actor runs every term and splits busy ZIP codes, then removes the duplicates both of those create.
See it used
For a worked territory list, see Find restaurants by the ordering platform they use: one city’s restaurants sorted into Toast, DoorDash and the rest, ready for a switch campaign.
Already have a list of restaurant websites from somewhere else? The Business Email, Phone & Contact Details Scraper takes a list of URLs and returns email, phone and social links for each.
Last updated 2026-10-30