# OpenStreetMap Business Scraper: No-Website Leads, Emails (`transparent_meteorite/openstreetmap-business-leads`) Actor

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.

- **URL**: https://apify.com/transparent_meteorite/openstreetmap-business-leads.md
- **Developed by:** [Detroit Web Agent - Open Data](https://apify.com/transparent_meteorite) (community)
- **Categories:** Lead generation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 business lead returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## 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](#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:

1. 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.
2. 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.
3. 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.
4. 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.
5. 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 `noWebsite` flag 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 `email` and `contact:email` tags, 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 `onlyNewSinceLastRun` and 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.** `excludeChains` drops objects with a `brand` tag so you see independent local owners, not franchise branches.
- **Freshness signal.** `lastEditedAt` and `daysSinceEdit` show how recently the listing was touched, and `editedWithinDays` lets 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 `noWebsite` flag 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 `onlyNewSinceLastRun` to 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

1. 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**.
2. Pick one or more **Business categories**. Add extra OSM shop types or raw tag filters if a preset does not cover your niche.
3. Optional: turn on **Only businesses WITHOUT a website**, **Only with a phone number**, **Exclude chains**, or set a **Minimum completeness score**.
4. Set **Maximum leads** (the example uses 25) and click **Start**.
5. 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|electrician)$`. |
| `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

```json
{
  "locations": ["Detroit, Michigan"],
  "categories": ["restaurants", "cafes"],
  "onlyNamed": true,
  "maxItems": 25
}
```

No-website trades in a county, independents only:

```json
{
  "locations": ["Oakland County, Michigan"],
  "categories": ["plumbers", "electricians", "hvac", "roofers"],
  "onlyWithoutWebsite": true,
  "onlyWithPhone": true,
  "excludeChains": true,
  "maxItems": 200
}
```

Radius search with a raw tag filter:

```json
{
  "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

```json
{
  "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](#alternatives-to-this-actor-and-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_shops` across 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 `attribution` field.
- **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](https://apify.com/transparent_meteorite/openstreetmap-business-leads): this actor.
- [Local Business Leads](https://apify.com/transparent_meteorite/local-business-leads): local business lists by city and category from more sources.
- [Google Maps Places Scraper](https://apify.com/transparent_meteorite/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](https://apify.com/transparent_meteorite/no-website-business-email-finder): find contact emails for businesses that have no website.
- [Website Redesign Leads](https://apify.com/transparent_meteorite/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](https://apify.com/transparent_meteorite/openstreetmap-business-leads) 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
```

```json
{
  "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](https://apify.com/transparent_meteorite/openstreetmap-business-leads/reviews) 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.

# Actor input Schema

## `locations` (type: `array`):

Cities, counties, neighbourhoods, states or countries, resolved on OpenStreetMap (for example "Detroit, Michigan", "Wayne County, Michigan", "Austin, Texas", "Leeds, UK"). One Overpass query per place. Cities and counties are the sweet spot; whole states or countries can time out on the public servers.

## `boundingBox` (type: `string`):

south,west,north,east in decimal degrees, for example 42.30,-83.10,42.36,-83.00. Use instead of, or in addition to, place names.

## `latitude` (type: `string`):

Centre point for a radius search, for example 42.3314. Use with longitude and radius.

## `longitude` (type: `string`):

Centre point for a radius search, for example -83.0458.

## `radiusKm` (type: `integer`):

Radius around the latitude/longitude point, 1 to 50 km.

## `categories` (type: `array`):

Friendly presets mapped to OpenStreetMap tags (for example dentists = amenity=dentist or healthcare=dentist). Pick one or more.

## `shopTypes` (type: `array`):

Any OSM shop=\* value not covered by a preset, for example books, music, tobacco, wine, mobile_phone.

## `tagFilters` (type: `array`):

Advanced: your own tag selectors. One per line, conditions joined with &. Supports key=value, key~regex, key!=value, key (exists) and !key (missing). Examples: amenity=dentist, craft~^(plumber|electrician)$, cuisine=pizza\&amenity=restaurant, office=lawyer&!website.

## `onlyNamed` (type: `boolean`):

Skip objects without a name tag (unnamed map features are rarely useful leads).

## `onlyWithoutWebsite` (type: `boolean`):

Web-design and local-SEO leads: keep only businesses with no website, contact:website or url tag.

## `onlyWithWebsite` (type: `boolean`):

Keep only businesses that have a website (ignored when "without a website" is on).

## `onlyWithPhone` (type: `boolean`):

Keep only businesses with a phone or contact:phone tag.

## `onlyWithEmail` (type: `boolean`):

Keep only businesses with an email on a business domain (free-mail addresses are always dropped).

## `excludeChains` (type: `boolean`):

Drop objects with a brand tag (McDonald's, Starbucks, bank branches and similar) to focus on independent local businesses.

## `minCompleteness` (type: `integer`):

0 to 100. For example 45 keeps only listings with most of name, phone, website, address and hours.

## `editedWithinDays` (type: `integer`):

Keep only objects edited in OpenStreetMap in the last N days, for example 365. Leave empty for no limit.

## `onlyNewSinceLastRun` (type: `boolean`):

Remember delivered businesses in a named key-value store and skip them next time, so a scheduled run returns only businesses you have not received before.

## `stateStoreName` (type: `string`):

Named key-value store that remembers delivered businesses. Use a different name per campaign.

## `maxItems` (type: `integer`):

Stop after this many leads. You are charged only for leads delivered.

## `maxRunSeconds` (type: `integer`):

Safety limit; the run stops cleanly and keeps what it found.

## Actor input object example

```json
{
  "locations": [
    "Detroit, Michigan"
  ],
  "radiusKm": 3,
  "categories": [
    "restaurants"
  ],
  "onlyNamed": true,
  "onlyWithoutWebsite": false,
  "onlyWithWebsite": false,
  "onlyWithPhone": false,
  "onlyWithEmail": false,
  "excludeChains": false,
  "minCompleteness": 0,
  "onlyNewSinceLastRun": false,
  "stateStoreName": "openstreetmap-business-leads-seen",
  "maxItems": 25,
  "maxRunSeconds": 300
}
```

# Actor output Schema

## `overview` (type: `string`):

No description

## `summary` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "locations": [
        "Detroit, Michigan"
    ],
    "categories": [
        "restaurants"
    ],
    "maxItems": 25
};

// Run the Actor and wait for it to finish
const run = await client.actor("transparent_meteorite/openstreetmap-business-leads").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "locations": ["Detroit, Michigan"],
    "categories": ["restaurants"],
    "maxItems": 25,
}

# Run the Actor and wait for it to finish
run = client.actor("transparent_meteorite/openstreetmap-business-leads").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "locations": [
    "Detroit, Michigan"
  ],
  "categories": [
    "restaurants"
  ],
  "maxItems": 25
}' |
apify call transparent_meteorite/openstreetmap-business-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,transparent_meteorite/openstreetmap-business-leads"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/6Vqymppdh1tN9C3Wt/builds/utAyw4UcHrjMcWDR3/openapi.json
