# Business Leads List: Google Maps Alternative (`fernandosord/open-places-leads`) Actor

Pull business lists by city, radius or country from Overture Maps open data: 81M places with name, category, address, phone, website, email and social links, plus licence and source on every row. Monthly change tracking. No scraping; no reviews or ratings.

- **URL**: https://apify.com/fernandosord/open-places-leads.md
- **Developed by:** [Plainsource](https://apify.com/fernandosord) (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 $1.50 / 1,000 places

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 Business Leads builds a business list for any city, radius or country from the [Overture Maps Foundation](https://overturemaps.org) open places dataset, about 81 million places in the September 2026 release. Each row has the name, category, address, coordinates and, when the data has them, a phone number, website, email and social links, plus the source dataset and licence of that record.

It is a Google Maps alternative only in the sense of business leads: nothing is scraped from Google or any map site, and there are no reviews, star ratings, opening hours or photos in this data. If you need those, a Google Maps scraper is the right tool. This Actor competes on price, bulk volume, a clear licence and monthly change tracking, and it suits sales prospecting, local market sizing, territory planning and CRM enrichment.

### What data can Open Places Business Leads extract?

| Field | What it contains |
|---|---|
| `name`, `brand`, `brandWikidata` | Business name and brand, when the data has one |
| `category`, `categoryPath`, `alternateCategories` | Overture category (such as `coffee_shop`), its path in the category tree and any other categories |
| `address`, `city`, `region`, `postcode`, `country` | Address split into parts |
| `latitude`, `longitude`, `openStreetMapUrl` | Coordinates and a map link |
| `phone`, `phones` | First phone number and all phone numbers |
| `website`, `websites` | First website and all websites |
| `email`, `emails` | First email and all emails, when listed |
| `socialLinks`, `facebook`, `instagram` | All social links, and the Facebook and Instagram ones on their own |
| `confidence` | Overture's 0 to 1 score for how likely the place exists as described |
| `operatingStatus` | Set only when the data marks a place as closed |
| `overtureId` | Stable place ID, the same across releases |
| `sourceDatasets`, `sourceRecords`, `sourceUpdatedAt` | Which datasets the record came from, with record IDs, licences and update times |
| `dataRelease`, `licenses`, `attribution` | The Overture release used and the licence text to credit |
| `distanceKm` | Distance from your point, in radius searches |
| `changeType`, `changedFields` | `new` or `changed`, and what changed, when you track changes |
| `websiteCheck`, `websiteEnriched` | Result of the optional website check |

How complete are the contact fields? Across Overture places, about 82% have a phone, 58% a website and 37% an email. Coverage is uneven: big cities in North America and Western Europe are well covered, and small towns and some countries are thin. Run a small search for your market first.

### How to use Open Places Business Leads

1. Open the Actor on Apify and click **Try for free**.
2. Choose an area: a **Location name** such as `Toronto, ON` or `Texas`, a **Country code**, a latitude and longitude with a **Radius**, or a **Bounding box**. If you set more than one, coordinates win, then the bounding box, then the location name.
3. Type the business types you want in plain words, such as `dentist`, `plumber` or `coffee shop`. Sub-types come along: `dentist` maps to `dental_clinic`, which also returns general, cosmetic and pediatric dentistry and orthodontics.
4. Add filters if you need them: only places with a phone, website or email, a minimum confidence, skip chains, **Name contains**.
5. Set **Max places** and click **Start**.
6. Download the dataset as JSON, CSV or Excel, or read it through the API.

When more places match than your **Max places**, the run returns the ones with the most contact fields first (phone, website, email, social), then the highest confidence, spread across the whole area.

### How much does it cost to get a business list?

You pay per event.

| Event | Price |
|---|---|
| Actor start | $0.005 per GB of run memory (the default is 2 GB, so $0.01 per run) |
| Place | $0.0015 per place returned |
| Website enriched | $0.003, only when the website check found an email or a new social network |

Worked examples, from the prices above:

- 20 coffee shops in Toronto (the prefilled example): $0.01 + 20 x $0.0015 = $0.04.
- 1,000 places, no website check: $0.01 + 1,000 x $0.0015 = $1.51.
- 1,000 places with the website check on, if every homepage added something new (the most it can cost): $1.51 + 1,000 x $0.003 = $4.51. Pages that fail, are blocked or add nothing new cost nothing extra.

Use **Max places** and Apify's maximum cost per run to cap spend. The run stops when the cap is reached.

### Input

20 coffee shops in Toronto, the Actor's prefilled example:

```json
{ "location": "Toronto, ON", "categories": ["coffee shop"], "maxItems": 20 }
```

Independent dentists in Texas with a phone and website:

```json
{ "location": "Texas", "categories": ["dentist"], "requirePhone": true, "requireWebsite": true, "excludeChains": true, "maxItems": 5000 }
```

Plumbers and electricians within 15 km of a point, with the website check:

```json
{ "latitude": 30.2672, "longitude": -97.7431, "radiusKm": 15, "categories": ["plumber", "electrician"], "enrichFromWebsite": true, "maxItems": 500 }
```

Monthly feed of new or changed restaurants in Lisbon:

```json
{ "location": "Lisbon, PT", "categories": ["restaurant"], "onlyNewOrChanged": true, "maxItems": 10000 }
```

Notes on the options:

- **Location name** can be a city, county, state or province, or country. Names are looked up in Overture's own boundary data and the search is limited to the real outline of that place, not a rectangle around it. Add a region or country after a comma when a name is ambiguous. The `SUMMARY` record says which boundary was used and lists other matches.
- **Radius** goes up to 200 km.
- **Business types** are matched to Overture's category tree of 2,114 categories. You can also give Overture category IDs directly. The run summary shows what each word matched, and a word that matches nothing stops the run before any places are returned.
- **Skip chains and franchises** drops places that carry a brand, and any name that appears 3 or more times among the matches.
- Permanently closed places are left out unless you include them.
- **Website check** (off by default) reads the homepage listed for each place, one page per business and nothing else on the site, skips it if the site's robots.txt disallows it, and pulls out published email addresses and social profile links. They go into `websiteCheck` and are merged into `emails` and `socialLinks`.
- **Only new or changed since the previous monthly release** uses Overture's changelog to return places that were added, or whose name, address, phone, website, email, social links, category, brand, location or status changed. Places removed from Overture are not reported.

### Output

This is a real row from the prefilled run on 2026-10-28 (Overture release `2026-10-21.0`).

```json
{
  "name": "Second Cup Cafe",
  "category": "coffee_shop",
  "categoryPath": [
    "food_and_drink",
    "non_alcoholic_beverage_venue",
    "coffee_shop"
  ],
  "alternateCategories": [],
  "address": "100 St George St",
  "city": "Toronto",
  "region": "ON",
  "postcode": "M5S 2E8",
  "country": "CA",
  "latitude": 43.6626406,
  "longitude": -79.3982679,
  "phone": "+14165934496",
  "phones": [
    "+14165934496"
  ],
  "website": "https://secondcup.com/location/u-t-sidney-smith",
  "websites": [
    "https://secondcup.com/location/u-t-sidney-smith"
  ],
  "email": "secondcupcustomercare@secondcup.com",
  "emails": [
    "secondcupcustomercare@secondcup.com"
  ],
  "socialLinks": [
    "https://www.facebook.com/118470355523924"
  ],
  "facebook": "https://www.facebook.com/118470355523924",
  "instagram": null,
  "brand": "Second Cup Coffee Co",
  "brandWikidata": null,
  "confidence": 1,
  "operatingStatus": null,
  "overtureId": "854a37da-7f86-494b-81bc-ee44596351a8",
  "sourceDatasets": [
    "meta"
  ],
  "sourceRecords": [
    {
      "dataset": "meta",
      "recordId": "118470355523924",
      "license": "CDLA-Permissive-2.0",
      "updatedAt": "2026-10-12T00:00:00.000Z"
    }
  ],
  "sourceUpdatedAt": "2026-10-12T00:00:00.000Z",
  "dataRelease": "2026-10-21.0",
  "licenses": [
    "CDLA-Permissive-2.0"
  ],
  "attribution": "Overture Maps Foundation (overturemaps.org), CDLA-Permissive-2.0",
  "openStreetMapUrl": "https://www.openstreetmap.org/?mlat=43.662641&mlon=-79.398268#map=19/43.662641/-79.398268"
}
```

Every run also writes two records to its key-value store:

- `SUMMARY`: the area and categories used, how many places matched, how many were saved, any warnings, and website-check status counts.
- `LICENSES`: the full CDLA-Permissive-2.0 text, the Foursquare notice, and the Apache-2.0 and CC0 texts. Keep this file with the data if you pass it on.

### What people use this business list for

- Sales prospecting: independent dentists, plumbers or cafes in a region, with phone and website.
- Local market sizing: how many places of a type exist in a city or country.
- Territory planning around a point, using radius searches.
- CRM enrichment: match your records on name, address or coordinates.
- Keeping a lead list current with a monthly changes-only run.

### FAQ

#### Is this a Google Maps alternative?

For business leads, yes. For anything else, no. The data has no reviews, ratings, opening hours, photos, popular times or price levels, and a place that opened last week will not be there yet. It comes from open data files, not from Google.

#### Where does the data come from?

From the places theme of Overture Maps, which merges several sources into one record per place. Each row lists its own sources and licences in `sourceRecords` and `licenses`. Foursquare's open dataset is already inside Overture, so this Actor does not query it separately.

#### How fresh is it?

As fresh as the latest monthly Overture release. Overture keeps only the newest releases on its public bucket, so older ones cannot be queried. You can set **Overture release** to a specific one that is still available.

#### How fast is it?

The prefilled example (20 coffee shops in Toronto) finished in about 20 seconds on 2 GB of memory. City and radius searches read a small part of the data. Whole-country searches scan more files and take longer, and the website check adds time per place.

#### How accurate are the phone numbers and emails?

They are what the sources published. The confidence score helps, but some records are out of date. Check your local rules (CAN-SPAM, CASL, GDPR and others) before you contact anyone.

#### How do I get new and changed places every month?

Turn on **Only new or changed since the previous monthly release**, and schedule the same search monthly in Apify Console. Each row has `changeType` and `changedFields`.

#### How do I use it with the API, Make, Zapier or n8n?

Call it with the Apify API or client, for example `client.actor("fernandosord/open-places-leads").call({ location: "Toronto, ON", categories: ["dentist"] })`. In Make, Zapier or n8n, use the Apify integration to run the Actor and read its dataset.

#### Can an AI agent use it?

Yes. Add the Actor to the Apify MCP server (`https://mcp.apify.com`). The agent sees the input schema and can ask for businesses by place and type.

#### What does not work?

- Reviews, ratings, opening hours and photos are not in the data.
- Coverage and accuracy vary by country and category.
- If no places match, the run says so in `SUMMARY`; try a broader category or a bigger area, or turn off the phone, website and email filters.

### Data sources and licences

Data: Overture Maps Foundation, [overturemaps.org](https://overturemaps.org), places theme. Overture's [attribution page](https://docs.overturemaps.org/attribution/) lists each places source and its licence. Most sources are under [CDLA-Permissive-2.0](https://cdla.dev/permissive-2-0/). Foursquare is [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0) and AllThePlaces is [CC0-1.0](https://creativecommons.org/publicdomain/zero/1.0/).

Every row carries `sourceRecords`, `licenses` and an `attribution` string for its own sources. CDLA-Permissive-2.0 asks that its text travel with shared data, which is why each run saves the `LICENSES` record. This Actor filters and reshapes the data (field names, flattened address, chosen columns) and, with the website check on, adds emails and links from the business's own homepage. It does not change the values Overture published.

Foursquare asks that its notice be included in documentation for data delivered through an API. Here it is in full:

> Foursquare OS Places Notice
>
> © 2026 Foursquare Labs, Inc. All rights reserved.
>
> The Foursquare OS Places dataset (the "Data") is licensed under the Apache License, Version 2.0 (the "License"). You may not use, modify, or distribute the Data except in compliance with the License.
>
> As set forth more fully in the License, if you use, modify, or distribute the Data, you must:
>
> - provide recipients with a copy of the License.
> - if applicable, include prominent notices to the extent you've changed the Data.
> - preserve attribution to Foursquare, including preserving the full content of this NOTICE.txt file.
>
> To ensure appropriate attribution to Foursquare, we recommend the following:
>
> - if using/distributing the Data in flat file form as-is or after making changes/modifications: include this NOTICE.txt file, which may be modified to include an additional notice of your changes/modifications, if any.
> - if using/distributing the Data in API form as-is or after making changes/modifications: include a copy of the content from this NOTICE.txt file prominently in your developer documentation for such API, which may be modified to include an additional notice of your changes/modifications, if any.
>
> You may obtain a copy of the License at: http://www.apache.org/licenses/LICENSE-2.0. Unless required by applicable law or agreed to in writing, the Data distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
>
> See the License for the specific language governing permissions and limitations under the License.

This Actor is not made or endorsed by the Overture Maps Foundation or Foursquare. This is a summary of the licences, not legal advice.

Open an issue on the Issues tab with the input you used (or the run ID) and what you expected. A wrong or missing place is usually a source-data problem; Overture takes corrections through its source partners.

### Other Actors by this developer

- [Website Tech Stack Detector](https://apify.com/fernandosord/website-tech-stack-detector): a BuiltWith alternative. Feed it the websites from your lead list to see which technologies each business uses.
- [WHOIS & DNS Lookup](https://apify.com/fernandosord/domain-profile-whois-dns): domain age, SSL and email security for the same websites.
- [Website Screenshot & URL to PDF](https://apify.com/fernandosord/website-screenshot-pdf): bulk captures of business websites.
- [Career Site Jobs API](https://apify.com/fernandosord/career-site-jobs): open jobs from Greenhouse, Lever and Ashby, a hiring signal for target companies.
- [Telegram Scraper](https://apify.com/fernandosord/telegram-channel-scraper): posts, views and reactions from public Telegram channels.

# Actor input Schema

## `location` (type: `string`):

A city, county, state/province or country, looked up in Overture's own boundaries. Add a region or country after a comma to pick the right one: "Austin, TX", "Toronto, ON", "Lisbon, PT", "Texas", "Portugal". The run summary shows which boundary was used. Ignored when coordinates or a bounding box are set.

## `countryCode` (type: `string`):

Two-letter ISO code (US, CA, GB, DE, MX...). On its own it searches the whole country. With a location name it only keeps matches in that country.

## `latitude` (type: `number`):

Center of a radius search, e.g. 43.6532. Set together with longitude. Takes priority over the location name.

## `longitude` (type: `number`):

Center of a radius search, e.g. -79.3832.

## `radiusKm` (type: `number`):

Distance from the center point. Used only with latitude and longitude. Each row then includes distanceKm.

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

Four numbers: min longitude, min latitude, max longitude, max latitude. Example: -79.42,43.64,-79.37,43.67. Used when no coordinates are set.

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

Plain words such as "dentist", "plumber", "coffee shop", "italian restaurant", or Overture category IDs such as "dental_clinic". Each word is matched to Overture's category tree, and sub-types are included ("dental_clinic" also returns pediatric and cosmetic dentists). The run summary lists what each word matched. Leave empty for every kind of place.

## `nameKeywords` (type: `array`):

Keep places whose name contains any of these words (not case sensitive), e.g. "Tim Hortons" or "dental".

## `requirePhone` (type: `boolean`):

About 82% of Overture places have a phone number.

## `requireWebsite` (type: `boolean`):

About 58% of Overture places have a website.

## `requireEmail` (type: `boolean`):

About 37% of Overture places list an email. The website check below can find more, but this filter runs before it.

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

Overture's 0 to 1 score for how likely the place exists as described. 0.5 removes most stale or doubtful records; 0 keeps everything.

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

Drops places that carry a brand in the data, and any name that appears 3 or more times among the matches (e.g. "Tim Hortons", "Country Style"). Useful when you only want independent businesses. The run summary says how many were skipped.

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

Off by default. Most places have no status at all, so this only drops the ones explicitly marked closed.

## `onlyNewOrChanged` (type: `boolean`):

Uses Overture's changelog (matched by Overture ID) to return places added in this release, or whose name, address, phone, website, email, social links, category, brand, location or status changed. Rows get changeType and changedFields. Schedule a monthly run with this on to track a market.

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

Upper limit on places returned (and charged) per run. When more places match, the ones with the highest confidence come first.

## `enrichFromWebsite` (type: `boolean`):

Paid add-on, off by default. Reads one page (the homepage listed in the data) per place that has a website, and respects robots.txt. You are charged the website-enriched event only when the page adds an email or social link the open data did not have. Adds roughly 1 to 10 seconds per 10 places.

## `release` (type: `string`):

Leave empty for the newest release. Overture keeps only the latest one or two on its public bucket, e.g. 2026-09-23.1.

## Actor input object example

```json
{
  "location": "Toronto, ON",
  "radiusKm": 5,
  "categories": [
    "coffee shop"
  ],
  "requirePhone": false,
  "requireWebsite": false,
  "requireEmail": false,
  "minConfidence": 0,
  "excludeChains": false,
  "includeClosed": false,
  "onlyNewOrChanged": false,
  "maxItems": 20,
  "enrichFromWebsite": false
}
```

# Actor output Schema

## `places` (type: `string`):

One row per business or place, with source datasets, licences and attribution.

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

Area and categories used, match counts, data release and warnings.

## `licenses` (type: `string`):

Full licence texts and the Foursquare notice that must travel with the data.

# 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 = {
    "location": "Toronto, ON",
    "categories": [
        "coffee shop"
    ],
    "maxItems": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("fernandosord/open-places-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 = {
    "location": "Toronto, ON",
    "categories": ["coffee shop"],
    "maxItems": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("fernandosord/open-places-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 '{
  "location": "Toronto, ON",
  "categories": [
    "coffee shop"
  ],
  "maxItems": 20
}' |
apify call fernandosord/open-places-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fernandosord/open-places-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/OCAhI928uiEwolDOo/builds/FnvxJgIx61F8GaYxD/openapi.json
