Business Email Scraper avatar

Business Email Scraper

Pricing

from $3.50 / 1,000 results

Go to Apify Store
Business Email Scraper

Business Email Scraper

Find local businesses by niche and city and get name, address, category, website, public emails and phone numbers. Built on OpenStreetMap plus each business's own website, up to 50 businesses per run. Emails are found for some businesses, not all. No login or API key needed.

Pricing

from $3.50 / 1,000 results

Rating

0.0

(0)

Developer

Kyle Adkins

Kyle Adkins

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

an hour ago

Last modified

Categories

Share

What does Business Email Scraper do?

Business Email Scraper finds local businesses for a niche and a city, then collects each business's website, public email addresses and phone numbers. Enter a niche such as "coffee" or "dentist" and a location such as "Austin, TX", and you get one dataset row per business with name, address, coordinates, category, website, emails and phones. Export the result as JSON, CSV or Excel. The input is a niche and a city; the Actor does not accept a list of website URLs.

The business list comes from OpenStreetMap (through the Photon geocoder and the Overpass API), not from Google Maps. The Actor reads the website, phone and email tags that OpenStreetMap contributors have added to each place. When a business has no website tag, it tries to find one with a web search, and then reads the homepage and the /contact and /contact-us pages for public emails and phone numbers. No login, cookies or API key are needed.

Typical users are agencies, freelancers, sales teams and researchers who want a small, quick list of local businesses to contact. Because the data is OpenStreetMap-based, coverage varies by city and niche (see the FAQ for details).

What data can you get?

FieldDescriptionExample
idStable id: OpenStreetMap element type and idnode/11111850805
sourceUrlPage the row was read from: the business website when found, otherwise its OpenStreetMap pagehttps://www.cuppaaustin.com/
nameBusiness name from OpenStreetMap (max 150 characters)Cuppa Austin Coffee
streetStreet name, without house number. Null if unknownWest Parmer Lane
houseNumberHouse number from OpenStreetMap. Null if unknown9225
cityCity, or county as fallback. Null if unknownAustin
postcodePostal code. Null if unknown78717
countryCountry name. Null if unknownUnited States
latitudeLatitude in decimal degrees30.4780176
longitudeLongitude in decimal degrees-97.7664202
categoryOpenStreetMap category as key / valueamenity / cafe
osmUrlOpenStreetMap page of the businesshttps://www.openstreetmap.org/node/11111850805
websiteBusiness website from OpenStreetMap or found by web search. Null if nonehttps://www.cuppaaustin.com/
websiteSourceHow the website was found: osm or search. Null if no websiteosm
emailsPublic contact emails, max 10, from OpenStreetMap tags and the website["info@cuppaaustin.com"]
phonesPublic phone numbers, max 5, normalised to E.164 where possible["+15123826729"]
phonesRawThe same phone numbers exactly as found["+1-512-382-6729"]
queryThe niche you searched forcoffee
locationThe location you searchedAustin, TX
scrapedAtISO 8601 UTC timestamp of the run2026-09-30T18:09:11.915559+00:00

The dataset has three views in the Console: "Businesses" (main columns), "Contacts" (name, website, emails, phones and website source) and "Full data" (every field including coordinates and the OpenStreetMap link).

How to use Business Email Scraper

  1. Open the Actor in Apify Console and go to the Input tab.
  2. Type a business niche into "Business niche", for example coffee, pizza, plumber or dentist. One or two words work best.
  3. Type a city or area into "Location", for example Austin, TX.
  4. Set "Max results" (1 to 50). Each returned business counts as one result.
  5. Decide on the filters: turn on "Only businesses with an email" to keep only rows with a public email, or "Include businesses with no contact info" to also keep rows where nothing was found.
  6. Click Start. A small run usually takes under a minute.
  7. Open the Output tab, pick a view, and export the dataset as JSON, CSV, Excel, XML or HTML.

Input

FieldTypeDefault / prefillDescription
querystringprefill coffeeThe kind of business to find. The search matches business names and OpenStreetMap categories. One or two words work best. Required for the run to do anything.
locationstringprefill Austin, TXCity or area to search. Results are filtered to businesses whose address matches this location.
maxItemsinteger, 1 to 50default 10, prefill 5Maximum number of businesses to return.
requireEmailbooleandefault false, prefill trueOnly businesses with an email: return and charge only businesses where at least one public email was found.
includeWithoutContactbooleandefault falseBy default only businesses with at least a website, an email or a phone number are returned. Turn on to also return businesses where nothing was found.
proxyConfigurationobjectprefill Apify Proxy onOptional. Used for the web search that discovers business websites, which can be rate-limited from datacenter IPs.

If query or location is empty, the run fails right away with a clear message ("input 'query' is required" or "input 'location' is required").

Complete input example:

{
"query": "coffee",
"location": "Austin, TX",
"maxItems": 20,
"requireEmail": true,
"includeWithoutContact": false,
"proxyConfiguration": {
"useApifyProxy": true
}
}

Output

These are 2 of the items from a real run with query set to coffee, location set to Austin, TX and maxItems set to 5:

[
{
"id": "node/11111850805",
"sourceUrl": "https://www.cuppaaustin.com/",
"name": "Cuppa Austin Coffee",
"street": "West Parmer Lane",
"houseNumber": "9225",
"city": "Austin",
"postcode": "78717",
"country": "United States",
"latitude": 30.4780176,
"longitude": -97.7664202,
"category": "amenity / cafe",
"osmUrl": "https://www.openstreetmap.org/node/11111850805",
"website": "https://www.cuppaaustin.com/",
"websiteSource": "osm",
"emails": ["info@cuppaaustin.com"],
"phones": ["+15123826729"],
"phonesRaw": ["+1-512-382-6729"],
"query": "coffee",
"location": "Austin, TX",
"scrapedAt": "2026-09-30T18:09:11.915559+00:00"
},
{
"id": "way/42874326",
"sourceUrl": "https://joscoffee.com/red-river",
"name": "Jo's Coffee Red River",
"street": "East 41st Street",
"houseNumber": "1000",
"city": "Austin",
"postcode": "78751",
"country": "United States",
"latitude": 30.2998339,
"longitude": -97.7219121,
"category": "amenity / cafe",
"osmUrl": "https://www.openstreetmap.org/way/42874326",
"website": "https://joscoffee.com/red-river",
"websiteSource": "osm",
"emails": ["info@joscoffee.com", "catering@joscoffeetx.com", "redriver@joscoffeetx.com"],
"phones": ["+15123835211"],
"phonesRaw": ["+1 512 383 5211"],
"query": "coffee",
"location": "Austin, TX",
"scrapedAt": "2026-09-30T18:09:11.915559+00:00"
}
]

When a business has no website, email or phone that could be verified, those fields are null or empty arrays. That is normal: the Actor never guesses or fabricates contact details. websiteSource is osm when the website came from the OpenStreetMap listing and search when it was discovered by web search.

How much does it cost?

The Actor uses pay-per-event pricing: you are charged for each business that is returned in the dataset, and businesses that are skipped are not charged. Turn on "Only businesses with an email" to pay only for rows that have an email. Apify's free plan includes monthly platform credit that covers small runs and testing. See the Pricing tab of the Actor page for the current per-result price. A run of a few results typically finishes in around 30 seconds to a couple of minutes.

Use with the API

Python, using the apify-client package:

from apify_client import ApifyClient
client = ApifyClient("YOUR_API_TOKEN")
run = client.actor("axiomworks/business-email-extractor").call(run_input={
"query": "coffee",
"location": "Austin, TX",
"maxItems": 10,
})
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
print(item["name"], item["emails"])

JavaScript, using the apify-client package:

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });
const run = await client.actor('axiomworks/business-email-extractor').call({
query: 'coffee',
location: 'Austin, TX',
maxItems: 10,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

cURL, running the Actor synchronously and returning the dataset items:

curl -X POST "https://api.apify.com/v2/acts/axiomworks~business-email-extractor/run-sync-get-dataset-items" \
-H "Authorization: Bearer YOUR_API_TOKEN" \
-H "Content-Type: application/json" \
-d '{"query": "coffee", "location": "Austin, TX", "maxItems": 10}'

You can send the results to other tools with Apify integrations: Zapier, Make, n8n, Google Sheets, and webhooks that fire when a run finishes. Schedule the Actor to run for different niches or cities and append the results to a sheet or CRM.

Use with AI agents (MCP)

You can call Business Email Scraper from any MCP-capable client through Apify's MCP server at mcp.apify.com. The server exposes the tools search-actors and call-actor, so an agent can find this Actor and run it. To load only this Actor as a tool, use this configuration in Claude Desktop, Cursor, VS Code or another MCP client:

{
"mcpServers": {
"apify": {
"url": "https://mcp.apify.com?tools=axiomworks/business-email-extractor"
}
}
}

Example prompts you could type to an agent:

  • "Find 10 coffee shops in Austin, TX and give me their websites and contact emails."
  • "Get contact details for plumbers in Denver and list the ones that have a public email address."
  • "Search for dentists in Leeds and export their phone numbers and websites to a table."

The Actor has typed input and output schemas, so the agent knows the exact fields (query, location, maxItems, requireEmail, includeWithoutContact) and the structure of each returned business.

FAQ

Where does the data come from, and how complete is it? The business list comes from OpenStreetMap, a community-maintained map, plus the business websites themselves. Coverage varies by city and niche. It tends to be good for restaurants, cafes and shops in larger cities, and thinner for some trades, professional services and small towns, because it depends on what volunteers have mapped. This is not a Google Maps scraper. If you need the most complete list of businesses in a niche or city, a Google Maps based tool may find more businesses than this Actor. This Actor is a good fit when you want a quick, low-cost list without a Google account or API key.

How many results can I get per search? Up to 50 per run. The data source returns a limited number of matches per query, and the Actor filters out results that do not match your location or niche, so narrow niches in small towns can return fewer. Run several queries or nearby locations to get more.

Why does a chain location list several emails? For multi-location businesses the website often lists every branch's address. The Actor returns the public emails it finds on the linked site, preferring generic mailboxes and addresses that match the branch, so check which one belongs to the branch you need.

Why do some businesses have no email? Many small businesses do not publish an email address, or only use a contact form. The Actor returns only addresses that are publicly visible on OpenStreetMap or on the website's homepage and contact pages. It does not guess or verify addresses. Third-party addresses such as ordering platforms and placeholder emails are dropped.

Do I need a proxy? The proxy is optional and only affects the web search that finds websites for businesses without an OpenStreetMap website tag. That search can be rate-limited from datacenter IPs, so Apify Proxy is prefilled. The Actor still runs if the proxy is unavailable.

Are phone numbers international? Phone numbers are normalised to E.164 where the country code or a North American 10-digit number makes that possible; phonesRaw keeps the original text. Numbers found on websites are matched in US and Canada format only, so businesses outside North America may show OpenStreetMap phone numbers but few website phone numbers.

Why is my run sometimes slow? Photon and Overpass are free shared community services. The Actor makes few requests, retries with backoff when they are busy, and falls back to a mirror Overpass server. A busy service slows the run down rather than failing it.

How fresh is the data? Contact details from OpenStreetMap are as recent as the last edit by a contributor. Website contacts are read live at run time. Schedule runs if you want to refresh a list.

The Actor collects publicly available business information from OpenStreetMap and public website pages, and it does not log in to anything. You are responsible for how you use the data. Email marketing and cold outreach are regulated in many places (for example CAN-SPAM, GDPR and the ePrivacy rules), and some business contact details can be personal data. Respect privacy and data protection law, honor opt-outs, follow each website's terms, and comply with the OpenStreetMap data license terms. Seek legal advice if you are unsure about your use case.

Feedback

If a search returns too few results or wrong contacts, open an issue from the Issues tab of this Actor with the niche and location you used. Concrete examples make problems much easier to fix.