# Open Places Lead Finder: Local Business List (Overture) (`atesen-software/open-places-lead-finder`) Actor

Local business list by city or map area and category, with name, address, phone and website. Built from the open Overture Maps places dataset, no scraping. Closed, duplicate and low-confidence rows are filtered out. A Google Maps scraper alternative for B2B lead lists.

- **URL**: https://apify.com/atesen-software/open-places-lead-finder.md
- **Developed by:** [Atesen Software](https://apify.com/atesen-software) (community)
- **Categories:** Lead generation, Business
- **Features:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$1.50 / 1,000 business results

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

## Open Places Lead Finder: local business list by city and category

Build a **local business leads list** in seconds: pick a city (or a map area) and a business type, and get a clean list of businesses with **name, address, phone number and website**. The data comes from the open **Overture Maps** places dataset, so there is **no scraping, no proxy and no login**.

Use it as an open-data **Google Maps alternative** for B2B prospecting: a **business list by city and category** that you can send to your CRM, a cold outreach tool or a spreadsheet.

### Three ways to use it

**1. Local B2B sales list.** You sell to accountants, dentists or plumbers in one city. Run one search per city, keep the default filters (phone and website present, confidence 0.8 or higher) and load the rows into your CRM or outreach tool.

```json
{ "city": "Manchester", "country": "GB", "categories": ["accountant"], "maxItems": 200 }
```

**2. Area analysis.** You want to know what kind of businesses a neighbourhood has before you open a shop or place a campaign. Draw a map box (`bbox`), ask for several categories and switch the phone and website filter off, so you count businesses and not only reachable ones. Results are balanced across the categories you list.

```json
{ "bbox": [-97.78, 30.24, -97.70, 30.30], "categories": ["restaurant", "cafe", "gym"], "requirePhoneAndWebsite": false, "maxItems": 500 }
```

**3. Competitor density.** You run a dentist or hair salon and want to see how crowded each part of a city is. Pull one category with the filters relaxed, then count rows per `postalCode` in a spreadsheet or your own script.

```json
{ "city": "Austin", "country": "US", "categories": ["dentist"], "minConfidence": 0.7, "requirePhoneAndWebsite": false, "maxItems": 1000 }
```

Overture lists places that exist or existed, so treat counts as a good estimate and not as a census.

### Data source and permission

Source: **Overture Maps Foundation "places" theme** (overturemaps.org), read from the public Overture GeoParquet files on Amazon S3. The data is published under an open license: **CDLA-Permissive-2.0** for most contributors, **Apache-2.0** for the Foursquare data and **CC0** for AllThePlaces. These licenses allow commercial use of the data; when you share it, keep the license notice (the attribution text below). Nothing is scraped from Google, Yelp, Facebook or any other website, and no website's terms are bypassed.

Every run writes an `attribution` text to the run summary (key-value store record `SUMMARY`). Keep it with your data when you share or resell the list:

`Overture Maps Foundation, overturemaps.org (places, <release>), CDLA-Permissive-2.0 (https://cdla.dev/permissive-2-0/); includes Foursquare data under Apache-2.0`

Foursquare data is Copyright Foursquare Labs, Inc., licensed under Apache-2.0 and transformed to the Overture schema (notice: docs.overturemaps.org/attribution).

This Actor is not affiliated with or endorsed by the Overture Maps Foundation, Google or any listed business.

### What you get

One row per business. Rows are sorted by Overture's confidence score, best first.

| Field | Meaning |
|---|---|
| `overtureId` | Stable Overture place ID |
| `name` | Business name |
| `category` | Overture primary category, for example `dental_clinic` |
| `street`, `city`, `region`, `postalCode`, `country` | Address as listed in Overture |
| `latitude`, `longitude` | Location |
| `phone` | First phone number that passed the filters, as listed (formats vary) |
| `website` | The business's own website (social media and listing pages are skipped) |
| `brand` | Brand name when the place belongs to a chain |
| `confidence` | Overture score from 0 to 1 that the place exists |
| `operatingStatus` | `open`, `permanently_closed`, `temporarily_closed` or empty when unknown |
| `sourceDatasets` | Datasets Overture merged for this place |
| `release` | Overture release used (the newest one is looked up at run time) |

#### Example input

```json
{
  "city": "Austin",
  "country": "US",
  "categories": ["dentist"],
  "minConfidence": 0.8,
  "maxItems": 50
}
```

#### Example output row (from a real run)

```json
{
  "overtureId": "00870586-96a5-439c-a7fd-c6998589bee1",
  "name": "Kunik Orthodontics Austin",
  "category": "orthodontics",
  "street": "11821 Rock Rose Ave",
  "city": "Austin",
  "region": "TX",
  "postalCode": "78758-0063",
  "country": "US",
  "latitude": 30.404297,
  "longitude": -97.720406,
  "phone": "+15123277575",
  "website": "http://www.kunikorthodontics.com/",
  "brand": "Kunik Orthodontics",
  "confidence": 1,
  "operatingStatus": "open",
  "sourceDatasets": ["Overture", "Overture-signals", "meta"],
  "release": "2026-10-21.0"
}
```

### Input

| Field | Default | What it does |
|---|---|---|
| `city` + `country` | none | City name and two-letter country code (US, GB, CA, DE, FR, AU ...). The Actor finds the city boundary in Overture and keeps only places inside it. If the city has no boundary polygon, it uses a circle of 8 km around the city centre. Add `region` (for example `TX`) when several cities share a name. |
| `bbox` | none | Alternative to city: `[minLon, minLat, maxLon, maxLat]`, at most 2.5 degrees on a side. Everything inside the box is searched. |
| `categories` | all | Plain business types (see the table below). A name that is not in the table is tried as an Overture category value, for example `pizza restaurant`. With several categories the results are balanced across them. |
| `minConfidence` | 0.8 | Overture's own existence score. Raise it for cleaner data, lower it for more rows. |
| `requirePhoneAndWebsite` | true | Keep only businesses that have both a phone number and a website of their own. |
| `dropMobileNumbers` | true | Remove mobile numbers in GB, IE, DE, AT, CH, FR, ES, IT, NL, BE, PT, AU and NZ. |
| `maxItems` | 100 | 1 to 5,000 rows per run. Split a big city into several `bbox` runs to get more. |
| `includeClosed` | false | Include places Overture marks as permanently or temporarily closed. |

Duplicates (same name and phone number) are always removed. If you set a maximum cost per run, the Actor stops cleanly when it is reached and never writes a row you are not charged for.

### Business categories

| Say this | Matches Overture categories (sub-categories included) |
|---|---|
| dentist | dental_clinic, general_dentistry, orthodontics, cosmetic_dentistry, pediatric_dentistry, endodontics, periodontics, oral_and_maxillofacial_surgery |
| plumber | plumbing |
| restaurant | restaurant (every cuisine) |
| lawyer | attorney_or_law_firm |
| accountant | accountant, bookkeeper, tax_service |
| real estate agent | real_estate_agent |
| gym | gym, fitness_studio |
| hair salon | hair_salon |
| barber | barber |
| beauty salon | beauty_salon |
| nail salon | nail_salon |
| spa | spa, day_spa, medical_spa |
| electrician | electrician |
| auto repair | automotive_repair, auto_body_shop |
| car dealer | auto_dealer |
| hotel | hotel |
| lodging | lodging (hotels, motels, hostels, bed and breakfasts) |
| cafe | cafe, coffee_shop |
| bakery | bakery |
| insurance agency | insurance_agency |
| chiropractor | chiropractic |
| doctor | doctors_office |
| veterinarian | veterinarian, veterinary_care |
| pharmacy | pharmacy |
| bank | bank_or_credit_union |
| roofer | roofing |
| hvac | hvac_service |
| cleaning service | cleaning_service, home_cleaning, office_cleaning, carpet_cleaning |
| landscaper | landscaping |
| contractor | contractor |
| painter | painting |
| locksmith | key_and_locksmith |
| pest control | pest_control_service |
| marketing agency | marketing_agency |
| photographer | photography_service |
| florist | florist |
| yoga studio | yoga_studio |

Common alternatives such as `lawyers`, `attorney`, `realtor`, `mechanic` or `vet` are understood too.

### What it does and does not do

- **Does:** return businesses with a phone number and their own website, inside the city you choose, best confidence first, without duplicates, without places Overture marks as closed, and without email addresses, social media links or contact person names.
- **Several categories are balanced.** If you ask for more than one category, the results are balanced across the categories: the rows alternate between them, best confidence first inside each one, so one big category cannot fill the whole list. A category with few matches gives its rows and the others fill the rest up to `maxItems`.
- **Closed businesses can still appear.** Overture often has no opening status (it is empty for most Toronto and many Manchester places), so a business that closed recently may be in the list. Check before you call.
- **Websites are not all alive.** In a sample of 240 rows we measured about 80% of the websites answering. Higher `minConfidence` gives a higher share (about 86% at 0.9 and above).
- **No phone or no website means no row** while `requirePhoneAndWebsite` is on. Switch it off if you want every business, with empty fields where data is missing.
- **No email addresses.** The Actor does not collect or guess emails. Use an email finder on the website if you need them.
- **Not a Google Maps replacement.** There are no reviews, ratings, opening hours or photos. Coverage depends on Overture: we tested cities in the US, the UK, Canada, Germany and Spain, and some small businesses are missing everywhere.
- **Personal data note.** A phone number of a one-person business can be personal data. Mobile numbers are dropped by default in the countries listed above, but you remain responsible for GDPR, PECR, CAN-SPAM, TCPA or local marketing rules and for having a legal basis or permission before you contact anyone.
- **City areas.** The area is the Overture boundary of the city, which can differ from what you call "downtown" or from a postal city. Use `bbox` for exact control.

### Use it with Make, Zapier or n8n

Run the Actor from any automation tool and read the dataset rows.

- **Make:** add the Apify module "Run an Actor", choose this Actor, paste the JSON input, then add "Get Dataset Items" with the run's default dataset.
- **Zapier:** use the Apify app action "Run Actor" and then "Fetch Dataset Items".
- **n8n:** use the Apify node, operation "Run actor and get dataset", with this Actor and the JSON input.
- **API:** `POST https://api.apify.com/v2/acts/atesen-software~open-places-lead-finder/run-sync-get-dataset-items` with your Apify token in the `Authorization: Bearer` header and the JSON input as the body. Keep the token in a secret variable, never in a shared scenario.

Example input for a weekly "plumbers in Toronto" list refresh:

```json
{
  "bbox": [-79.65, 43.58, -79.30, 43.80],
  "categories": ["plumber"],
  "maxItems": 500
}
```

### FAQ

**How fresh is the data?** Overture publishes a new release about once a month. Each run looks up the newest release; the release name is in every row and in the summary.

**How long does a run take?** Usually 5 to 30 seconds for one city. The Actor reads only the part of the Overture files that covers your area; nothing is downloaded in full.

**How many businesses can I get?** Up to 5,000 per run. A big city has far more places than that, so use several runs with different categories or smaller `bbox` areas.

**Why is a business I know missing?** Overture is a merged open dataset, not a complete directory. Lower `minConfidence`, switch off `requirePhoneAndWebsite`, or check the category name.

**What do I pay?** You pay per business row written to the dataset. The price is shown on the Pricing tab of this Actor. Empty results, invalid input and failed runs are free, and you can set a maximum cost per run.

**Is it legal to use the list?** The data license allows commercial use with attribution. Contacting businesses is regulated in many countries, so check the rules that apply to you.

# Actor input Schema

## `city` (type: `string`):

City, town or village, for example Austin, Manchester or Toronto. Use it together with Country. Only places inside the city boundary in Overture Maps are kept (a circle of 8 km around the centre when the city has no boundary). Ignored when you fill in Bounding box.

## `country` (type: `string`):

Two-letter country code of the city, for example US, GB, CA, DE, FR, AU.

## `region` (type: `string`):

Only needed when several cities share a name. Use the state or region code, for example TX or US-TX.

## `bbox` (type: `array`):

Map area as \[minLongitude, minLatitude, maxLongitude, maxLatitude], for example \[-79.65, 43.58, -79.30, 43.80] for Toronto. Use it instead of City and Country. At most 2.5 degrees on a side.

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

Plain business types such as dentist, plumber, restaurant, lawyer, accountant, real estate agent, gym, hair salon, electrician, auto repair, hotel. See the README for the full list. Other names are tried as Overture category values. Leave empty to get every category.

## `minConfidence` (type: `number`):

Overture's own 0 to 1 score that the place really exists. Higher means fewer rows and cleaner data. 0.8 is a good starting point.

## `requirePhoneAndWebsite` (type: `boolean`):

Keep a business only when it has a phone number and a website of its own (social media and listing pages do not count).

## `dropMobileNumbers` (type: `boolean`):

In countries where mobile numbers can be recognised (for example GB, DE, FR, ES, IT, NL, AU) remove them. A mobile number often belongs to a one-person business, which makes it personal data.

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

Stop after this many businesses. You are charged only for the rows written.

## `includeClosed` (type: `boolean`):

By default places that Overture marks as permanently or temporarily closed are left out.

## Actor input object example

```json
{
  "city": "Austin",
  "country": "US",
  "categories": [
    "dentist"
  ],
  "minConfidence": 0.8,
  "requirePhoneAndWebsite": true,
  "dropMobileNumbers": true,
  "maxItems": 50,
  "includeClosed": false
}
```

# Actor output Schema

## `businesses` (type: `string`):

The business list: name, address, phone, website and more

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

Overture release, area used, rows returned and skipped, and the attribution text

# 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 = {
    "city": "Austin",
    "country": "US",
    "categories": [
        "dentist"
    ],
    "maxItems": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("atesen-software/open-places-lead-finder").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 = {
    "city": "Austin",
    "country": "US",
    "categories": ["dentist"],
    "maxItems": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("atesen-software/open-places-lead-finder").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 '{
  "city": "Austin",
  "country": "US",
  "categories": [
    "dentist"
  ],
  "maxItems": 50
}' |
apify call atesen-software/open-places-lead-finder --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,atesen-software/open-places-lead-finder"
        }
    }
}
```

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/rLdpQ5VTD4vSvlbTc/builds/t0mvwTkDyGU3OaecR/openapi.json
