OpenStreetMap Business Scraper: No-Website Leads, Emails
Pricing
from $0.80 / 1,000 business lead returneds
OpenStreetMap Business Scraper: No-Website Leads, Emails
OpenStreetMap scraper for local business leads by city, county, bounding box or radius: name, category, address, phone, website, business email, opening hours and socials, with a no-website flag, completeness score and last-edit date. Keyless, new-only monitor mode.
Pricing
from $0.80 / 1,000 business lead returneds
Rating
0.0
(0)
Developer
Detroit Web Agent - Open Data
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
2 hours ago
Last modified
Categories
Share
OpenStreetMap Business Leads: No-Website Lead Finder
Turn OpenStreetMap into a clean local business lead list. Give it a city, county, neighbourhood, bounding box or a point with a radius, pick one or more business categories (restaurants, dentists, plumbers, salons, lawyers and 48 more presets, or your own raw OSM tag filters), and get one row per business with name, category, full address, coordinates, phone, website, business email, opening hours, social profiles, a no-website flag, a completeness score and the date the listing was last edited.
No API key, no proxy, no login, no browser. The actor reads the public Overpass API and the Nominatim geocoder, both run by the OpenStreetMap community, and it follows their fair-use rules: one query per area, sequential requests, a clear User-Agent and automatic fallback between public Overpass servers.
Data (c) OpenStreetMap contributors, available under the Open Database License (ODbL 1.0). See Data source and license.
What does OpenStreetMap Business Leads do?
OpenStreetMap (OSM) is the free, editable map of the world. Millions of volunteers and local businesses have mapped shops, restaurants, clinics, offices and trades, and many of those map objects carry contact tags: phone, website, email, opening_hours, contact:instagram and so on. This actor turns those tags into a sales-ready table.
For every area you give it, the actor:
- Resolves place names (for example "Detroit, Michigan" or "Wayne County, Michigan") to an OpenStreetMap boundary with Nominatim, at most one request per second, cached between runs.
- Builds one Overpass query per area that unions all the categories you picked, pushes your lead filters into the query itself (only named, no website, has a phone, no chains, edited since a date) and caps the number of results inside the query, so the server never sends more than you need.
- Normalises every matching node, way or relation: address parts, centre coordinates for building outlines, phone, website (with
https://added when it was missing), business email, opening hours and seven social networks. - Scores each listing 0 to 100 for completeness, flags the gaps worth pitching (
noWebsite,noPhone,noBusinessEmail,noOpeningHours,noSocials,staleListing,chainOrBrand) and sorts the best leads first. - Validates every row, then pushes and charges only valid rows.
What makes it different from a generic OSM POI extractor:
- Built for lead generation, not GIS. A plain point-of-interest export gives you every bench and bus stop with raw tags. This actor gives you businesses only, with contact fields already parsed, a
noWebsiteflag for web-design and local SEO prospecting, a completeness score to rank who to call first, and lead flags that tell you what each business is missing. - Business emails only, fail closed. Emails come only from the
emailandcontact:emailtags, and free-mail or ISP addresses (gmail, yahoo, outlook, hotmail, icloud, aol, proton and about 120 others) are always dropped. Mobile-only phone tags (phone:mobile,contact:mobile) are never read. - No mapper data. OpenStreetMap returns the user name and user id of the last editor with every object. This actor never outputs them, and a test fails the build if one ever slips through.
- Monitor mode. Turn on
onlyNewSinceLastRunand schedule the actor: each run returns only businesses you have not received before, and you are never charged twice for the same business. - Chain filter.
excludeChainsdrops objects with abrandtag so you see independent local owners, not franchise branches. - Freshness signal.
lastEditedAtanddaysSinceEditshow how recently the listing was touched, andeditedWithinDayslets you keep only recently edited businesses.
Use cases
- Web design and local SEO agencies: pull every plumber, roofer, electrician, salon or restaurant in a county that has a phone number but no website, sorted by completeness, and start calling. The
noWebsiteflag is the whole pitch. - Sales territory lists: export restaurants, cafes, bars, gyms or clinics across several cities with address, phone, hours and socials, drop chains, and load the CSV into your CRM.
- New-business monitoring: schedule a weekly run with
onlyNewSinceLastRunto receive only newly mapped or newly delivered businesses in your region. - Market research and site selection: count and map competitors by category in a radius around a location, with coordinates for every business.
- Data enrichment: add OSM opening hours, wheelchair access and social profiles to an existing list of local businesses.
- Listing-management and review-software vendors: find businesses with stale or incomplete listings (
staleListing,noOpeningHours) that need help with their online presence.
How to use it
- Open the actor and enter one or more Locations (for example
Detroit, Michigan). You can also give a Bounding box or a Latitude / Longitude with a Radius. - Pick one or more Business categories. Add extra OSM shop types or raw tag filters if a preset does not cover your niche.
- Optional: turn on Only businesses WITHOUT a website, Only with a phone number, Exclude chains, or set a Minimum completeness score.
- Set Maximum leads (the example uses 25) and click Start.
- Download the results as CSV, JSON, Excel or XML, or connect them to Make, n8n, Zapier or Google Sheets through the Apify API.
Input
| Field | Type | Default | What it does |
|---|---|---|---|
locations | array of strings | ["Detroit, Michigan"] (prefill) | Place names resolved with Nominatim: cities, counties, neighbourhoods, states, countries. Up to 10. One Overpass query per place. |
boundingBox | string | none | south,west,north,east in decimal degrees, for example 42.30,-83.10,42.36,-83.00. Up to 25 square degrees. |
latitude, longitude | string | none | Centre point for a radius search. |
radiusKm | integer | 3 | Radius around the point, 1 to 50 km. |
categories | array | ["restaurants"] (prefill) | 53 presets mapped to OSM tags. See the list below. |
shopTypes | array of strings | none | Any OSM shop=* value not covered by a preset, for example books, wine, mobile_phone. |
tagFilters | array of strings | none | Raw OSM selectors, conditions joined with &: key=value, key~regex, key!=value, key (exists), !key (missing). Example: `craft~^(plumber |
onlyNamed | boolean | true | Skip unnamed map objects. |
onlyWithoutWebsite | boolean | false | Keep only businesses with no website, contact:website or url tag. |
onlyWithWebsite | boolean | false | Keep only businesses that have a website. |
onlyWithPhone | boolean | false | Keep only businesses with a phone or contact:phone tag. |
onlyWithEmail | boolean | false | Keep only businesses with an email on a business domain. |
excludeChains | boolean | false | Drop objects with a brand tag. |
minCompleteness | integer | 0 | Keep only rows with at least this completeness score (0 to 100). |
editedWithinDays | integer | none | Keep only objects edited in OSM in the last N days. |
onlyNewSinceLastRun | boolean | false | Monitor mode: skip businesses delivered in earlier runs. |
stateStoreName | string | openstreetmap-business-leads-seen | Named key-value store that remembers delivered businesses. Use one per campaign. |
maxItems | integer | 100 | Stop after this many leads (1 to 10,000). You pay only for leads delivered. |
maxRunSeconds | integer | 300 | Safety limit. The run stops cleanly and keeps what it found. |
Example input
{"locations": ["Detroit, Michigan"],"categories": ["restaurants", "cafes"],"onlyNamed": true,"maxItems": 25}
No-website trades in a county, independents only:
{"locations": ["Oakland County, Michigan"],"categories": ["plumbers", "electricians", "hvac", "roofers"],"onlyWithoutWebsite": true,"onlyWithPhone": true,"excludeChains": true,"maxItems": 200}
Radius search with a raw tag filter:
{"latitude": "51.5072","longitude": "-0.1276","radiusKm": 2,"tagFilters": ["cuisine=pizza&amenity=restaurant"],"maxItems": 50}
Category presets
Food and drink: restaurants, fast_food, cafes, bars_pubs, bakeries, caterers.
Health: dentists, doctors_clinics, physiotherapists, pharmacies, opticians, veterinarians.
Professional services: lawyers, accountants, insurance_agents, real_estate_agents, architects, it_services, marketing_agencies.
Trades and home services: plumbers, electricians, hvac, roofers, carpenters, painters, builders, locksmiths, gardeners, photographers.
Beauty and fitness: hair_salons, beauty_salons, massage_spas, tattoo, gyms.
Automotive: car_repair, car_dealers, car_wash, driving_schools.
Retail and other: childcare, hotels, florists, clothing_stores, jewelry, furniture, hardware, pet_shops, bicycle_shops, laundry, travel_agencies, grocery.
Broad: all_shops, all_offices, all_crafts.
Each preset maps to the usual OSM tagging, including the common alternatives. For example dentists matches amenity=dentist and healthcare=dentist, and plumbers matches craft=plumber. If your niche is tagged differently in your region, add it as a raw tag filter.
Output
One row per business. Every field can be null when OpenStreetMap does not have the value.
| Field | Meaning |
|---|---|
osmId, osmType, osmUrl | OpenStreetMap object id, type (node, way, relation) and a link to it on openstreetmap.org. |
name, brand | Business name and brand tag (set for chains). |
category, categoryLabel, rawTags | The preset the business matched, its label, and the OSM type tags (amenity, shop, craft, office, healthcare, tourism, leisure, cuisine, sport). |
street, housenumber, city, postcode, state, country, fullAddress | Address parts from the addr:* tags and an assembled address line. |
lat, lon | Coordinates; building outlines use their centre. |
phone | From phone or contact:phone only (first number when several are listed). |
website, hasWebsite, noWebsite | Normalised website URL and the two lead flags. |
email | Business-domain email from email or contact:email. Free-mail is dropped. |
openingHours, wheelchair | opening_hours and wheelchair tags. |
facebook, instagram, twitter, linkedin, youtube, tiktok | Social profile URLs. |
lastEditedAt, daysSinceEdit | When the object was last edited in OSM. |
completenessScore | 0 to 100: name 15, phone 15, website 15, email 10, street and number 15, city or postcode 5, opening hours 10, any social 5, edited in the last 2 years 10. |
leadFlags | noWebsite, noPhone, noBusinessEmail, noOpeningHours, noSocials, staleListing, chainOrBrand. |
searchArea, attribution, scrapedAt | The area the lead came from, the ODbL credit, and when the row was produced. |
Sample output row
{"osmId": 900000002,"osmType": "way","osmUrl": "https://www.openstreetmap.org/way/900000002","name": "Sample Street Coffee","category": "cafes","categoryLabel": "Cafes and coffee shops","rawTags": { "amenity": "cafe" },"brand": null,"street": "Cass Avenue","housenumber": "4200","city": "Detroit","postcode": "48201","state": null,"country": null,"fullAddress": "4200 Cass Avenue, Detroit, 48201","lat": 42.3482,"lon": -83.0601,"phone": "+1 313 555 0142","website": "https://samplestreetcoffee.example/","hasWebsite": true,"noWebsite": false,"email": "hello@samplestreetcoffee.example","openingHours": "Mo-Fr 07:00-17:00; Sa,Su 08:00-16:00","facebook": null,"instagram": "https://www.instagram.com/samplestreetcoffee","twitter": null,"linkedin": null,"youtube": null,"tiktok": null,"wheelchair": null,"lastEditedAt": "2026-03-02T10:05:44.000Z","daysSinceEdit": 247,"completenessScore": 100,"leadFlags": [],"searchArea": "Detroit, Michigan","attribution": "(c) OpenStreetMap contributors, ODbL 1.0","scrapedAt": "2026-11-04T15:00:00.000Z"}
The sample uses placeholder names and 555 numbers. Real runs return real OpenStreetMap businesses.
The run also writes an OUTPUT record to the key-value store with counts: areas searched, Overpass queries and attempts, rate-limit responses, objects read, rows delivered and charged, rows filtered out by each filter, and businesses skipped as already delivered.
Pricing
Pay per result, no subscription:
- $0.80 per 1,000 business leads ($0.0008 per lead).
- A tiny start fee of $0.00005 per run.
- You are charged only for valid rows delivered to your dataset. Rows dropped by your filters, duplicates across areas, invalid objects and businesses already delivered in monitor mode are never charged.
Examples: 25 leads cost about $0.02. 500 leads cost about $0.40. 10,000 leads cost about $8.00.
Worst case: a run that finds nothing costs you only the $0.00005 start fee. Your own maximum cost per run setting is respected exactly; the actor checks the remaining budget before every charge and stops when it is reached.
How the price compares: the main OSM POI extractors on Apify charge about the same per row but add a larger per-run start fee, and they return raw POIs rather than parsed, scored leads. We price at or below the cheapest established alternative.
Why the price is sustainable for us: Overpass and Nominatim are free, so our only cost is Apify compute. A typical city query finishes in 20 to 60 seconds at 256 MB, which is well under half of what the leads in that run earn, and a cost guard stops any slow, empty run after about $0.006 of compute.
FAQ
Do I need an API key or an OpenStreetMap account? No. The actor uses the public Overpass API and Nominatim, which are keyless.
How complete is OpenStreetMap business data?
It varies by region. City centres in North America and Europe are usually well mapped with names and addresses; phone numbers and websites are present for a good share of businesses, and emails for fewer. That gap is exactly why the noWebsite, completenessScore and leadFlags fields exist. For the densest phone coverage, combine this actor with a Google Maps source (see Related actors).
Why do I get fewer leads than I asked for?
OSM may simply have fewer businesses of that type in the area, or your filters removed them. The OUTPUT record tells you how many objects were read and how many each filter removed. Widen the area, add categories, or turn off a filter.
Are the emails personal?
No. Emails come only from the business's own email / contact:email tag, and any free-mail or ISP domain (gmail, yahoo, outlook, hotmail, icloud, aol, proton and similar) is dropped. If OSM lists only a free-mail address, the email field is null and the row carries the noBusinessEmail flag.
Does it output who edited the map?
Never. OpenStreetMap includes the editor's user name and id with every object; this actor discards them. Only lastEditedAt (a date) is kept.
What happens if the Overpass server is busy?
The actor retries on other public Overpass instances, backs off on HTTP 429 and 504 (honouring Retry-After), and stops cleanly at the deadline. Busy servers can mean a run delivers fewer rows or none; you are not charged for rows that were not delivered.
Can I search a whole state or country? You can, but the public servers limit each query to 60 seconds, so very large areas with broad categories may time out. Cities and counties are the sweet spot. For a state, list its largest cities or counties as separate locations.
How does monitor mode work?
With onlyNewSinceLastRun on, the actor stores the ids of delivered businesses in a named key-value store and skips them next time. Use a different stateStoreName per campaign. Schedule it weekly in Apify Schedules.
Can I use the results commercially? Yes, under the terms of the ODbL. You must credit OpenStreetMap contributors and, if you publicly share a database derived from OSM, share it under the ODbL too. See the next section.
Can I export to Google Sheets, a CRM or n8n? Yes. Use the dataset export (CSV, Excel, JSON) or the Apify integrations for Google Sheets, Make, Zapier, n8n and webhooks.
Limits
- Results reflect what is mapped in OpenStreetMap. Some businesses are missing, some contact details are out of date, and coverage varies by country.
- Each area is one Overpass query with a 60-second server limit and a 25 MB response cap. Very large areas with broad categories (
all_shopsacross a state) may hit these limits; the actor tells you when, and you are not charged for undelivered rows. - Up to 10 locations, 120 tag selectors and 10,000 leads per run.
- Nominatim is used at most once per second and results are cached, per the OSMF usage policy.
- Phone numbers are passed through as mapped (lightly cleaned); they are not validated against a carrier database.
- The actor does not visit business websites. To find emails on websites, use a website email finder on the rows that have a
website.
Data source and license
All business data comes from OpenStreetMap. (c) OpenStreetMap contributors. OpenStreetMap data is available under the Open Database License (ODbL) 1.0 (https://opendatacommons.org/licenses/odbl/1-0/). See https://www.openstreetmap.org/copyright.
What this means for you:
- Attribution: when you use or display the data, credit "(c) OpenStreetMap contributors". Every row carries this credit in the
attributionfield. - Share-alike: if you publicly distribute a database derived from this data (for example, a public directory built from it), that database must be offered under the ODbL as well. Using the data internally (sales outreach, analysis, a private CRM) does not trigger share-alike.
- Keep it open: you may not apply technical restrictions that prevent others from using an ODbL database you publish.
Geocoding uses Nominatim (https://nominatim.org/) and queries use the Overpass API (https://overpass-api.de/), both community services. This actor follows their usage policies: a descriptive User-Agent, sequential requests, one query per area, Nominatim at most once per second, and automatic backoff when a server is busy. This actor is not affiliated with or endorsed by the OpenStreetMap Foundation.
Privacy: the actor outputs business data only. It never outputs OSM editor user names or ids, drops free-mail email addresses, and never reads mobile-phone tags.
Alternatives to this actor and related actors
- OpenStreetMap Business Leads: this actor.
- Local Business Leads: local business lists by city and category from more sources.
- Google Maps Places Scraper: Google Maps places with phone, website, rating and reviews; pairs well with OSM for higher phone coverage.
- No-Website Business Email Finder: find contact emails for businesses that have no website.
- Website Redesign Leads: businesses whose websites look outdated, for web-design outreach.
Questions or a category preset you need? Open an issue on the actor page and we will add it. If the actor helps you, a review on the OpenStreetMap Business Leads page helps others find it.
Use it from AI assistants (MCP)
OpenStreetMap Business Leads: No-Website Lead Finder works as a tool for AI assistants through the official Apify MCP server. Add this URL to any MCP client (Claude Desktop, Claude Code, Cursor, ChatGPT connectors, VS Code):
https://mcp.apify.com/?actors=transparent_meteorite/openstreetmap-business-leads
{"mcpServers": {"apify": {"url": "https://mcp.apify.com/?actors=transparent_meteorite/openstreetmap-business-leads","headers": { "Authorization": "Bearer <YOUR_APIFY_TOKEN>" }}}}
Then ask, for example: "Find dentists in Austin, Texas that have no website and list their phone numbers."
Changelog
- 0.2 (November 2026): first release. 53 category presets plus raw OSM tag filters, place name / bounding box / radius areas, no-website and completeness lead flags, business-email-only output (free-mail dropped), monitor mode, chain filter, Overpass server fallback with backoff, and a cost guard that ends slow empty runs early.
Did this actor do the job? If it saved you time, a short honest review on the Reviews tab helps other people judge it. If something was off, open an Issue on this page with the input you used. I read every one and fix real bugs, usually the same day.