Business Leads Scraper - Phone, Email & Website by City avatar

Business Leads Scraper - Phone, Email & Website by City

Pricing

from $17.00 / 1,000 results

Go to Apify Store
Business Leads Scraper - Phone, Email & Website by City

Business Leads Scraper - Phone, Email & Website by City

Generate local business leads with contact details: phone, email and website plus name, address and coordinates. Search any business category (restaurants, dentists, plumbers, hotels, real estate and more) in any city or map area. Export to JSON, CSV or Excel.

Pricing

from $17.00 / 1,000 results

Rating

0.0

(0)

Developer

Scrapers Lat

Scrapers Lat

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

11 days ago

Last modified

Share

Business Leads Scraper - Phone, Email & Website by City

Business Leads Scraper - Phone, Email & Website by City

Here is one real result, with every field the actor returns:

{
"osmId": "node/530780552",
"name": "The Omelettry",
"category": "restaurant",
"phone": "+1-512-453-5062",
"email": "info@theomelettry.com",
"website": "http://www.theomelettry.com",
"facebook": "https://www.facebook.com/omelettry/",
"street": "4631 Airport Boulevard",
"city": "Austin",
"state": "TX",
"postcode": "78751",
"country": null,
"latitude": 30.3067572,
"longitude": -97.7154666,
"openingHours": "07:00-15:00",
"brand": null,
"mobile": null,
"whatsapp": null,
"fax": null,
"instagram": null,
"twitter": null,
"linkedin": null,
"youtube": null,
"tiktok": null,
"operator": null,
"cuisine": ["breakfast"],
"description": null,
"wikidata": null,
"wikipedia": null,
"suburb": null,
"unit": "131A",
"googleMapsUrl": "https://www.google.com/maps/search/?api=1&query=30.3067572,-97.7154666",
"source": "OpenStreetMap",
"observedAt": "2026-08-10T14:04:22.720Z"
}

The most complete OpenStreetMap business leads scraper available. It returns every contact and location field the community map database exposes for each business, plus derived fields like a ready-to-use Google Maps link, and an optional paid add-on that finds a public contact email and name, so you can build targeted call and email lists by category and city.

📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples

Apify Coverage Output Billing

Table of contents

What it does

The actor takes a business category and a city or map area, queries the OpenStreetMap community map database for matching businesses, and writes one normalized record per business to the run's dataset. Each record carries the published contact details (phone, mobile, WhatsApp, email, website, and social handles), the full address, coordinates, opening hours, and a ready-to-open Google Maps link. Missing source values are returned as null, never invented.

You can target an area with a plain city name or with a custom bounding box (south, west, north, east). An optional paid contact-enrichment add-on tries to find a public business email and a contact person's name for leads that have no email on file.

Quickstart

Open the actor, paste this into the input, and press Run. It returns 10 restaurant leads in Austin, Texas.

{
"maxBusinesses": 10,
"category": "restaurant",
"city": "Austin, Texas",
"withContactOnly": false,
"enrichContacts": false,
"enrichContactsMax": 50
}

Every input field is optional. Use a common category word such as dentist, plumber, hotel, or a precise OpenStreetMap tag such as shop=bakery or office=accountant.

Input reference

FieldTypeRequiredDefaultDescription
maxBusinessesintegerno10Maximum businesses to collect (1 to 10000).
categorystringnorestaurantKind of business to find. A common word (restaurant, dentist, plumber, hotel, real_estate, lawyer, pharmacy, gym) or an OpenStreetMap tag as key=value (shop=bakery, amenity=cafe, office=accountant).
citystringnoAustin, TexasCity, town, or region to search, for example Manchester, UK. Leave empty if you provide a bounding box.
southstringno(empty)Minimum latitude of a custom map area. Provide all four bounding box values to override the city.
weststringno(empty)Minimum longitude of a custom map area.
northstringno(empty)Maximum latitude of a custom map area.
eaststringno(empty)Maximum longitude of a custom map area.
withContactOnlybooleannofalseKeep only businesses that have at least a phone, email, or website.
enrichContactsbooleannofalsePaid add-on. For each lead with no email, attempt to find a public business contact email and a contact person's name. Billed per attempt, plus an extra charge only when an email is found.
enrichContactsMaxintegerno50Cap how many leads the add-on tries to enrich. Leave empty to attempt all. Free Apify accounts are capped at 3.

Output reference

One dataset item per business. Types: string, number, string[], or null when the source value is absent.

FieldTypeDescription
osmIdstringOpenStreetMap element id, for example node/530780552.
namestringBusiness name.
categorystringCategory matched by the search.
phonestringPublished phone number.
emailstringPublished email address.
websitestringPublished website URL.
facebookstringFacebook page URL.
streetstringStreet address.
citystringCity.
statestringState or region code.
postcodestringPostal code.
countrystringCountry.
latitudenumberLatitude of the business.
longitudenumberLongitude of the business.
openingHoursstringOpening hours in OpenStreetMap format.
brandstringBrand name, if tagged.
mobilestringMobile phone number.
whatsappstringWhatsApp contact.
faxstringFax number.
instagramstringInstagram handle or URL.
twitterstringTwitter / X handle or URL.
linkedinstringLinkedIn URL.
youtubestringYouTube URL.
tiktokstringTikTok handle or URL.
operatorstringOperator of the business, if tagged.
cuisinestring[]Cuisine tags (for food businesses). Empty when none.
descriptionstringFree-text description, if tagged.
wikidatastringWikidata identifier, if linked.
wikipediastringWikipedia reference, if linked.
suburbstringSuburb or neighbourhood.
unitstringUnit or suite number.
googleMapsUrlstringReady-to-open Google Maps search link for the coordinates.
sourcestringData source. Always OpenStreetMap.
observedAtstringISO 8601 timestamp of when the record was collected.
enrichedEmailstringContact email found by the paid add-on (only when enrichContacts is on).
enrichedContactNamestringContact person's name found by the add-on.
enrichedJobTitlestringContact person's job title found by the add-on.
enrichedEmailStatusstringDeliverability status of the enriched email.
enrichedSourcestringSource URL the enriched contact was found on.
enrichedConfidencestringConfidence level of the enriched contact.

Example output record

Real record from a live run (input {"category": "restaurant", "city": "Austin, Texas", "maxBusinesses": 10}):

{
"osmId": "node/457485574",
"name": "Galaxy Cafe",
"category": "restaurant",
"phone": null,
"email": null,
"website": "https://www.galaxycafeaustin.com/",
"facebook": null,
"street": "1000 West Lynn St",
"city": null,
"state": null,
"postcode": "78703",
"country": null,
"latitude": 30.2794133,
"longitude": -97.7600581,
"openingHours": "Th-Tu 08:00-21:00; We 08:00-14:00",
"brand": null,
"mobile": null,
"whatsapp": null,
"fax": null,
"instagram": "galaxycafeatx",
"twitter": null,
"linkedin": null,
"youtube": null,
"tiktok": null,
"operator": null,
"cuisine": ["american"],
"description": null,
"wikidata": null,
"wikipedia": null,
"suburb": null,
"unit": null,
"googleMapsUrl": "https://www.google.com/maps/search/?api=1&query=30.2794133,-97.7600581",
"source": "OpenStreetMap",
"observedAt": "2026-08-10T14:04:22.720Z"
}

Run via API and CLI

Start a run and wait for it to finish, then read the dataset. Replace <TOKEN> with your Apify API token.

Run synchronously and get dataset items in one call:

curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~overpass-osm-business-leads-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
-H "Content-Type: application/json" \
-d '{"category":"restaurant","city":"Austin, Texas","maxBusinesses":25}'

Start a run asynchronously:

curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~overpass-osm-business-leads-scraper/runs?token=<TOKEN>" \
-H "Content-Type: application/json" \
-d '{"category":"dentist","city":"Miami, Florida","maxBusinesses":100,"withContactOnly":true}'

Apify CLI:

apify call scrapers_lat/overpass-osm-business-leads-scraper \
--input '{"category":"shop=bakery","city":"Sydney"}'

Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:

# JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"
# CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"
# Paginate large datasets
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"

<DATASET_ID> is returned as defaultDatasetId in the run object. Use offset and limit to page through large result sets. clean=true drops empty and internal fields.

Billing and limits

  • Pay per result. You are charged per business returned (result event). See the pricing tab for the current per-result price.
  • Contact enrichment add-on. When enrichContacts is on, each enrichment attempt is billed, plus an extra charge only when an email is found. Leave it off to pay only for base leads.
  • No charge on failure. Empty runs cost nothing.
  • Spend cap respected. Set maxTotalChargeUsd on the run; once reached, the actor stops emitting and charging further billable results.
  • Free Apify plans are capped at 10 businesses per run, and the enrichment add-on is capped at 3 leads. Upgrade for higher maxBusinesses.

FAQ and troubleshooting

A run returned 0 records. Why? The category or area matched nothing in the source. Loosen the filter (widen the city or bounding box), try a broader category word, or drop withContactOnly. Zero-result runs are not charged.

Which categories can I search? Common words work out of the box: restaurant, cafe, bar, hotel, dentist, doctor, pharmacy, lawyer, accountant, real_estate, plumber, electrician, gym, supermarket, hairdresser, and many more. You can also pass any precise category as key=value.

How do I target an exact area? Use a city name for a quick start, or provide the four bounding box values (south, west, north, east) to cover an exact rectangle on the map.

Do all businesses have a phone, email, and website? No. These fields are filled only when the business has published them. Use withContactOnly to keep just the leads with at least one contact detail.

How does the contact enrichment add-on work? For each lead that has no email, it attempts to find a public business contact email and a contact person's name, writing them to the enriched* fields. It is off by default and billed only when enabled.

How fresh is the data? Records are read live at run time, so each reflects the latest published details. See observedAt for the exact collection time.

Example tasks

Preconfigured templates for common scenarios. Open one and press Run, or use it as a starting point:

More scrapers at scrapers.lat

Built and maintained by scrapers.lat, where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.


Independent tool built on open, publicly available community map data. Use the results in accordance with the source's terms and applicable laws.