Businesses Without Websites (OpenStreetMap): Local Leads avatar

Businesses Without Websites (OpenStreetMap): Local Leads

Pricing

Pay per event

Go to Apify Store
Businesses Without Websites (OpenStreetMap): Local Leads

Businesses Without Websites (OpenStreetMap): Local Leads

Find local businesses without websites using OpenStreetMap open data, or list every business of a chosen type. Returns name, phone, website, email, address, hours, socials and coordinates. Supports 75+ business types and filters, with optional email enrichment.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Detroit Web Agent - Open Data

Detroit Web Agent - Open Data

Maintained by Community

Actor stats

0

Bookmarked

12

Total users

2

Monthly active users

2 days ago

Last modified

Share

Local business leads from OpenStreetMap open data: pick a category and a city (for example dentists in Austin, TX) and get each place's phone, website, email, address, opening hours and social links, or keep only businesses that have no website.

Free sample: download a CSV of real rows from recent runs of this Actor (up to 50 rows, refreshed weekly, no account needed).

Local Business Leads: features, price and a real output row

Run it free on Apify

Turn "dentists in Austin, TX" into a lead list with phone, website, email, address, opening hours and social links, from OpenStreetMap open data. $3 per 1,000 places. No Google scraping, no proxies, no login.

Built for web designers, SEO and marketing freelancers, local agencies and B2B sales teams who sell to small businesses. Its main job: find local businesses with no website on record, so you can offer them one.

What is Businesses Without Websites (OpenStreetMap): Local Leads?

Find local businesses without websites using OpenStreetMap open data, or list every business of a chosen type. Returns name, phone, website, email, address, hours, socials and coordinates. Supports 75+ business types and filters, with optional email enrichment. Run it from the Apify Console, the API or a schedule, and export the results as JSON, CSV, Excel or HTML.

Features

  • No-website filter. Turn on onlyWithoutWebsite to get only businesses whose OpenStreetMap entry has no website. That usually means the business has no site, but a mapper may simply not have added it, so check before you pitch.
  • Contact filters. Keep only places with a website, a phone number or an email. Filtered-out places are not charged.
  • Website enrichment (optional). With enrichFromWebsite on, the Actor visits each business's homepage and contact page and adds the emails, phone numbers and social links published there. No guessing and no third-party email databases.
  • Real boundaries. "Austin, TX" means inside the official city boundary, not a rough rectangle.
  • Licensed data. Everything comes from OpenStreetMap under the Open Database License (ODbL). Each row carries the attribution in its source field.
  • De-duplicated. A business mapped twice (for example as a point and a building) is returned and charged once.

Output

One real row from a recent run of the input above:

{
"name": "Castle Dental",
"category": "dentist",
"osmCategory": "amenity=dentist",
"brand": "Castle Dental",
"phone": "+1-512-458-3600",
"website": "https://www.castledental.com/dentist-near-me/austin-dentist/35080",
"email": null,
"fullAddress": "1000 East 41st Street, Unit 230, Austin, TX 78751",
"street": "1000 East 41st Street",
"unit": "230",
"city": "Austin",
"state": "TX",
"postcode": "78751",
"openingHours": "Mo 08:00-17:00; We-Fr 08:00-17:00; Sa 07:00-13:00",
"lat": 30.3000118,
"lon": -97.7211043,
"googleMapsUrl": "https://www.google.com/maps/search/?api=1&query=30.3000118,-97.7211043",
"osmType": "node",
"osmId": 2920762431,
"osmUrl": "https://www.openstreetmap.org/node/2920762431",
"lastEdited": "2023-10-26T18:42:51Z",
"source": "OpenStreetMap contributors, ODbL 1.0 (https://www.openstreetmap.org/copyright)",
"searchLocation": "Austin, Travis County, Texas, United States"
}

(Some null fields omitted here for space.)

FieldDescription
name, category, osmCategoryBusiness name, the type you asked for, and the raw OpenStreetMap tag
brand, operatorChain or operating company, when mapped
phone, website, emailContact details from the map record
fullAddress, street, houseNumber, streetName, unit, city, state, postcode, countryAddress, whole and split
openingHours, cuisine, wheelchair, descriptionExtra details, when mapped
socials, facebook, instagram, linkedinSocial profile links
lat, lon, googleMapsUrl, mapUrlCoordinates and a map link
osmType, osmId, osmUrl, lastEditedOpenStreetMap record and its last edit date
source, searchLocationODbL attribution and the resolved search area
enrichment, websiteEmails, websiteSocialsAdded only when Enrich from website is on

The dataset has two ready views, Business leads and Contacts only. A RUN_SUMMARY record in the key-value store lists places returned, duplicates, filtered-out places, enriched sites and any warnings, such as an unknown business type or a location that could not be found.

Sample output table (real run data)

Rows from a real past run (Apify run ua6hxqaVQXasawRfD, Oct 20, 2026; restaurants in Royal Oak, MI, all 3 rows it returned). Phone numbers are left out here; your dataset includes them when OpenStreetMap has one. A dash in city or state means OpenStreetMap has no value for that place.

NameCategoryCityStateWebsiteSource
Tania's PizzarestaurantRoyal Oak-https://www.taniaspizza.com/OSM
Penn's Thai Kitchenrestaurant--https://www.pennsthai.com/OSM
Noodles & CompanyrestaurantRoyal OakMIhttps://locations.noodles.com/mi/royal-oak/420-s-...OSM

How to use it

  1. Click Try for free.
  2. Enter one or more Business types, e.g. dentist, plumber, restaurant.
  3. Enter one or more Locations, e.g. Austin, TX, Travis County, Texas or 78701, USA. Or use a bounding box, or a latitude/longitude plus radius.
  4. Set Max places, and turn on the filters or Enrich from website if you need them.
  5. Click Start, then download the results as CSV, Excel, JSON or HTML, or read them through the API.

Example inputs from real runs

Each input below was used in a real run of this Actor in October 2026. Paste one into the Input tab (JSON view) to start from it.

1. Dentists, plumbers, restaurants with no website, Dearborn MI (that run returned 82 rows)

{
"categories": [
"dentist",
"plumber",
"restaurant"
],
"locations": [
"Dearborn, MI"
],
"onlyWithoutWebsite": true,
"maxItems": 200,
"requireWebsite": false,
"requirePhone": false,
"requireEmail": false,
"enrichFromWebsite": false,
"radiusKm": 5
}

2. Plumbers and dentists without a website, Dearborn and Detroit (that run returned 15 rows)

{
"categories": [
"plumber",
"dentist"
],
"locations": [
"Dearborn, MI",
"Detroit, MI"
],
"onlyWithoutWebsite": true,
"maxItems": 15,
"requireWebsite": false,
"requirePhone": false,
"requireEmail": false,
"enrichFromWebsite": false,
"radiusKm": 5
}

3. Dentists in Austin, TX (that run returned 10 rows)

{
"maxItems": 10,
"categories": [
"dentist"
],
"locations": [
"Austin, TX"
],
"requireWebsite": false,
"onlyWithoutWebsite": false,
"requirePhone": false,
"requireEmail": false,
"enrichFromWebsite": false,
"radiusKm": 5
}

4. Restaurants in Royal Oak, MI (that run returned 3 rows)

{
"categories": [
"restaurant"
],
"locations": [
"Royal Oak, MI"
],
"maxItems": 3,
"requireWebsite": false,
"onlyWithoutWebsite": false,
"requirePhone": false,
"requireEmail": false,
"enrichFromWebsite": false,
"radiusKm": 5
}

5. Plumbers without a website in Detroit, MI (that run returned 1 row)

{
"categories": [
"plumber"
],
"locations": [
"Detroit, MI"
],
"onlyWithoutWebsite": true,
"maxItems": 2,
"requireWebsite": false,
"requirePhone": false,
"requireEmail": false,
"enrichFromWebsite": false,
"radiusKm": 5
}

Input

FieldTypeDefaultWhat it does
categoriesarray["dentist"]Business types, in plain words or as OpenStreetMap key=value tags
locationsarray["Austin, TX"]City, county, state, ZIP or postal code, neighbourhood, any country
city, state, countrystringnoneStructured location instead of a free-text one
bboxstringnoneBounding box for a precise area
latitude, longitude, radiusKmstring, string, integerradius 5Point plus radius (max 50 km)
maxItemsinteger25Max places for the whole run (up to 50,000)
onlyWithoutWebsitebooleanfalseOnly places with no website listed
requireWebsitebooleanfalseOnly places with a website
requirePhonebooleanfalseOnly places with a phone number
requireEmailbooleanfalseOnly places with an email
enrichFromWebsitebooleanfalseRead emails, phones and socials from each business website

Input from a real run (dentists in Austin, TX):

{
"categories": ["dentist"],
"locations": ["Austin, TX"],
"maxItems": 10,
"requireWebsite": false,
"onlyWithoutWebsite": false,
"requirePhone": false,
"requireEmail": false,
"enrichFromWebsite": false
}

For a no-website call list, this real test input returned 15 listings with no website on OpenStreetMap:

{"categories": ["plumber", "dentist"], "locations": ["Dearborn, MI", "Detroit, MI"], "onlyWithoutWebsite": true, "maxItems": 15}

Synonyms such as attorney, cpa, realtor, mechanic, salon, daycare and coffee shop work too. Anything else: use an OpenStreetMap tag like key=value.

Example

Input example

{
"categories": [
"dentist"
],
"locations": [
"Austin, TX"
],
"maxItems": 5
}

Sample output

Three real rows from a recent run of this Actor. Personal data is masked, some fields are left out and long values are shortened for readability.

[
{
"name": "Tania's Pizza",
"category": "restaurant",
"phone": "+1 248 288-4774",
"website": "https://www.taniaspizza.com/",
"email": null,
"fullAddress": "3204 Crooks Road, Royal Oak, 48073, US",
"city": "Royal Oak",
"postcode": "48073",
"openingHours": null
},
{
"name": "Penn's Thai Kitchen",
"category": "restaurant",
"phone": "+*********78",
"website": "https://www.pennsthai.com/",
"email": null,
"fullAddress": null,
"city": null,
"postcode": null,
"openingHours": "Mo-Fr 11:00-21:00; Sa 12:00-21:00; Su 12:00-20:00"
},
{
"name": "Noodles & Company",
"category": "restaurant",
"phone": null,
"website": "https://locations.noodles.com/mi/royal-oak/420-s--main-street.html",
"email": null,
"fullAddress": "410 South Main Street, Royal Oak, MI",
"city": "Royal Oak",
"postcode": null,
"openingHours": null
}
]

Pricing

Pay per event, no monthly fee:

EventPrice
Actor start$0.00005 per run
Place returned$0.003 per business row ($3 per 1,000)
Website enriched (only if you turn it on)$0.002 per website that loaded

Duplicates and places removed by your filters are never charged. Unreachable websites are not charged for enrichment.

Worked example: 1,000 restaurants with Enrich from website on, where 700 have a website that loads: 1,000 x $0.003 + 700 x $0.002 = $4.40. Without enrichment: $3.00. Set a maximum charge on the run and the Actor stops cleanly when it is reached. Apify's free plan credit covers a first test.

What does Local Business Leads do?

You give it business types (dentist, plumber, restaurant, lawyer, hair salon and 75+ others) and places (a city, county, state, ZIP code, a map rectangle, or a point plus radius). It returns one row per business with:

  • name, category, brand and operator
  • phone, website and email, when the business or a mapper has published them
  • full address plus street, house number, unit, city, state, postcode, country
  • opening hours, cuisine, wheelchair access, description
  • Facebook, Instagram, LinkedIn and other social links
  • latitude and longitude, a Google Maps link to the coordinates, and the OpenStreetMap ID, URL and last-edited date

When to use this vs the Google Maps Scraper by benthepythondev

Use this actor for lead lists built on OpenStreetMap open data, where you want to spot businesses that list no website. Use the Google Maps Scraper by benthepythondev when you need Google's ratings, review counts and place ids, which its store page lists and OpenStreetMap rows do not have. OpenStreetMap coverage differs by area, so spot-check a city before you buy a large list. Checked against its public store page on Oct 24, 2026.

Use it with AI agents and the API

Add this URL to any MCP client (Claude Desktop, Claude Code, Cursor, VS Code):

https://mcp.apify.com/?actors=transparent_meteorite/local-business-leads

Then ask, for example: "Find dentists in Austin, TX that have no website listed."

Run it and get the rows in one HTTP call:

curl -X POST "https://api.apify.com/v2/acts/transparent_meteorite~local-business-leads/run-sync-get-dataset-items" \
-H "Authorization: Bearer $APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"categories": ["dentist"], "locations": ["Austin, TX"], "maxItems": 2}'

It also works from the Python and JavaScript Apify clients and in Make, Zapier and n8n.

Use cases and n8n automation ideas

Run this actor from an n8n workflow with the Apify node or an HTTP Request node, then read the dataset items in the next step. Ideas:

  • No-website outreach. Find local businesses listed in OpenStreetMap with a phone number but no website and send them to a sales list.
  • Territory lead lists. Pull one category in one city, such as dentists or plumbers, with address, phone and hours into a spreadsheet.
  • Scheduled refresh. Run it weekly from n8n for the same area and append new rows to Google Sheets or a CRM.

Use cases

Web designers and freelancers. Turn on onlyWithoutWebsite and search for the trades near you: dentists, restaurants, hair salons, plumbers, lawyers. Each row gives you the name, phone, fullAddress and opening hours, enough to write a specific first message ("I noticed your shop on Main Street has no website").

SEO and local marketing agencies. Pull every business of one type in a city, then use website, facebook and instagram to see who has a web presence and who only has a social page. The set with a social page and no site is a natural pitch list.

B2B sales to small businesses. Selling payroll, POS, insurance or supplies? List every business of a type inside a county and keep only rows with phone or email. Add enrichFromWebsite to collect emails published on each homepage and contact page.

Franchise and expansion research. Count competitors by type inside an exact boundary. Because "Austin, TX" means the official city limits, counts are not distorted by a rough rectangle. brand and operator separate chains from independents.

Territory planning. Use a latitude and longitude plus radius, or a bounding box, to build a route-ready list around a depot or an office. Each row has lat, lon and a googleMapsUrl.

Example: no-website leads for one city

{
"categories": ["dentist", "plumber", "restaurant"],
"locations": ["Dearborn, MI"],
"onlyWithoutWebsite": true,
"maxItems": 200
}

Rows with no website are the ones to pitch. Open a few on the map or the business's own social page first, because OpenStreetMap is edited by volunteers and a site may exist but not be mapped.

Cost examples

Straight multiplication of the prices in the Pricing section. The start event is a fraction of a cent per run.

JobPlacesWithout enrichmentWith enrichment, if 70% of sites load
First test20$0.06$0.088
One type in one city200$0.60$0.88
Several types in a county1,000$3.00$4.40
State-wide pull10,000$30.00$44.00

The 70% figure is only an assumption to show the arithmetic. Enrichment is charged only for websites that actually load.

Tips for a cleaner list

  • Search narrower, not wider. "dentist" in a city returns a tidy set, while a broad type over a state returns volume you may not need.
  • Use the Contacts only dataset view when you only want name, phone, email and website for a mail merge.
  • Check lastEdited: a record last edited many years ago can describe a business that has since closed or moved.
  • Keep the source field with every row you share or publish, because the ODbL license requires attribution.
  • A run that returns fewer places than expected usually means thin OpenStreetMap coverage in that area, not a bug. The RUN_SUMMARY record lists warnings such as an unknown business type.

How this differs from scraping Google results

The data comes from OpenStreetMap, an open map database, not from Google. That means no ratings, reviews or photos, but it also means clear licensing, no proxy costs and no blocking. It is strongest for storefronts, restaurants, clinics and dentists in cities, and weaker for home-based trades. Plan to verify before you pitch.

OpenStreetMap data is licensed under the Open Database License. You may use and share it, with attribution and under the same license for the database. Phone numbers and emails are business details published by the business or a mapper; still follow the TCPA for calls and texts, CAN-SPAM and GDPR for email, and keep a suppression list. This is general information, not legal advice.

Limitations

  • Results depend on OpenStreetMap coverage, which is built by volunteers. It is often good for shops, restaurants, clinics and dentists in big cities, and weaker for home-based trades (plumbers, roofers, cleaners) and small towns, where many entries carry only a name and address.
  • No reviews, ratings or photos.
  • Up to 50 locations and 50,000 places per run. Max places applies to the whole run; types and locations are processed in the order you enter them.
  • The public Overpass servers are shared and sometimes busy. The Actor retries and falls back across several public instances, but a large area can take longer on a busy day.
  • Website enrichment reads at most two pages per site, skips private network addresses and does not run JavaScript.
  • Geocoding follows the Nominatim usage policy of one request per second.

FAQ

How do I find local businesses that have no website? Turn on onlyWithoutWebsite. A missing website in OpenStreetMap usually, but not always, means the business has none, so check before outreach. Add requirePhone if you need a callable list.

Are these leads from Google Maps? No. They come from OpenStreetMap open data, so there is no Google scraping and no proxy cost. Some businesses that are on Google Maps are not mapped in OpenStreetMap.

How many leads will I get for a city? As many as OpenStreetMap has mapped for that type and area, up to maxItems. Run a small test first: 5 places cost about $0.015.

Why did I get fewer results than expected? Only named businesses mapped in OpenStreetMap are returned. Try a related type (for example builder as well as roofer), a wider area such as the county, or a raw tag like craft=*. The run summary shows how many places your filters removed.

Where do emails come from? From the OpenStreetMap record (email or contact:email) or, with Enrich from website on, from the business's own homepage and contact page. Placeholder addresses from website builders are filtered out.

Is this legal? The data is published under the Open Database License (ODbL 1.0). You may use it commercially if you credit "OpenStreetMap contributors" and share any database you publish from it under the same terms. Enrichment reads only public pages of the business's own site. Outreach is still subject to your local rules (for example CAN-SPAM, GDPR or TCPA).

How fresh is the data? Queries run live against the public Overpass API, usually minutes behind OpenStreetMap. Each row has lastEdited.

Does it include reviews or ratings? No. OpenStreetMap has no reviews or ratings. If you need those, use a Google Maps scraper.

This Actor vs santhej/nowebsite-lead-finder: that one reads Google Maps and adds an opportunity score. This one uses OpenStreetMap open data, so it needs no Google access, and adds opening hours, social links and coordinates, with optional email enrichment from each website.

Pairs well with


Built and maintained by Detroit Web Agent - Open Data (Detroit, Michigan). Questions, bugs or a field you need: open an issue on this Actor's Issues tab. Data © OpenStreetMap contributors, available under the Open Database License (ODbL).

More from DWA Open Data

Browse all 69 data Actors, with live prices and sample output, at open-data-actors.pages.dev.


Feedback: if this Actor was useful, or if it fell short, an honest review on the Reviews tab helps other users decide. Problems or feature requests: please open an Issue and we usually reply within one business day.

Changelog

  • 2026-10-08: Initial release.
  • 2026-10-16: Pricing update announced, effective 2026-10-30: Tiered pay-per-event: lower prices on every paid plan, free-plan price never higher than before.
  • 2026-10-24: Documentation updated: README refreshed.
  • 2026-10-25: Documentation updated: README refreshed.
  • 2026-10-25: Listing refresh: new Store icon, README reorganised (overview, data fields, pricing, FAQ) and changelog tab added. No code change.