# Local Business Leads from Open Map Data (Overture) (`battles_2026/overture-leads`) Actor

Business leads by city and category: name, phone, website, socials, address. 81M+ open Overture places, licence-clean. 25 free/run.

- **URL**: https://apify.com/battles_2026/overture-leads.md
- **Developed by:** [Jonathan D Battles](https://apify.com/battles_2026) (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 $2.00 / 1,000 leads

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

## Overture Maps Business Leads (Open Places Data)

**Get local business leads for any city or map area: name, full address, phone, website, social links, brand, category and coordinates, from the open Overture Maps places dataset (81 million+ places worldwide, release 2026-09-23.1). No Google Maps scraping, no proxies, no login: every row comes from openly licensed data and carries its attribution. The first 25 leads of every run are free.**

### Who uses it

- Agencies and SaaS sales teams building prospect lists by niche and city (dentists in Austin, cafés in London, plumbers in Sydney)
- Local-SEO and listing-management tools checking which businesses have a website or phone
- Market researchers counting and mapping businesses by category
- Teams that want a licence-clean alternative to Google Maps scrapers

### How it works

1. You give a **city** (plus country and radius) or an exact **bounding box**, and one or more **categories**.
2. The actor finds the latest Overture release and queries its public GeoParquet files on Amazon S3 with DuckDB. Only the map tiles and columns it needs are read (bbox and category filters are pushed down), so a city query takes about 10 seconds.
3. Rows are validated, de-duplicated by Overture ID and filtered by your options (`requireWebsite`, `requirePhone`, `minConfidence`). Closed places are dropped.
4. Optional: `enrichWebsite` visits each business's own homepage (respecting robots.txt and rate limits; a site that shows a captcha is skipped and marked `blocked_by_antibot`, never bypassed and never charged; only public internet addresses on ports 80/443 are contacted) and adds its schema.org data: opening hours, price range, social profiles, rating.

### Input

| field | example | notes |
|---|---|---|
| `city`, `country`, `radiusKm` | `"Austin"`, `"US"`, `5` | city resolved offline from Natural Earth (public domain) |
| `bbox` | `[-0.15, 51.49, -0.10, 51.52]` | min lon, min lat, max lon, max lat; overrides city; max 4 sq. degrees |
| `categories` | `["dental_clinic", "coffee_shop"]` | Overture category slugs; a parent like `health_care` matches all children |
| `maxLeads` | `100` | 1-5000 |
| `requireWebsite`, `requirePhone` | `true` | |
| `minConfidence` | `"0.7"` | Overture's 0-1 existence confidence |
| `enrichWebsite` | `false` | extra charge per site with data found |

Category slugs follow the Overture taxonomy (e.g. `dental_clinic`, `coffee_shop`, `restaurant`, `plumbing`, `hair_salon`, `real_estate_agent`, `lawyer`, `gym`): https://docs.overturemaps.org/schema/concepts/by-theme/places/

### What data does it return?

`name`, `categories`, `primaryCategory`, `basicCategory`, `address`, `street`, `locality`, `postcode`, `region`, `country`, `phone`, `phones`, `website`, `websites`, `socials`, `brand`, `brandWikidata`, `confidence`, `operatingStatus`, `lon`, `lat`, `overtureId`, `release`, `sourceDatasets`, `licences`, `attribution`, `enrichment`.

### Output example

```json
{"name": "BLVD Dentistry Austin", "primaryCategory": "dental_clinic",
 "address": "1920 E Riverside Dr Ste A140, Austin, TX, 78741, US",
 "phone": "+15126408747", "website": "https://www.blvddentistry.com/austin-riverside/",
 "socials": ["https://www.facebook.com/1603911256555032"], "brand": "BLVD Dentistry Heights",
 "confidence": 1.0, "lon": -97.7282867, "lat": 30.2427959,
 "overtureId": "4ef9a744-d408-4bc0-89bb-3cda49864fca", "release": "2026-09-23.1",
 "sourceDatasets": ["meta", "Overture", "Overture-signals"], "licences": ["CDLA-Permissive-2.0"],
 "attribution": "© Overture Maps Foundation, overturemaps.org (CDLA Permissive 2.0)"}
```

### How much does it cost?

Pay per event, no subscription. Current prices:

- **Lead:** $0.002 per unique, valid lead ($2 per 1,000). **The first 25 leads of every run are free.**
- **Website enrichment** (only if `enrichWebsite` is on): $0.003 per unique website where business data was found (a chain's shared site is fetched and charged once). Sites with no data, errors or blocks are not charged.
- Duplicates and invalid rows are never charged, and your run's maximum charge is always respected (the actor trims the list before it would go over).

**Example:** 1,000 dentists across a metro area = 975 paid leads × $0.002 = **$1.95**. With enrichment and data found on 400 sites: + $1.20 = $3.15 (fewer sites if many leads belong to chains). Platform compute is small: a 100-lead city run takes about 10-20 seconds at 1 GB memory.

### Sources & licences

- **Overture Maps Foundation, places theme** (https://overturemaps.org, https://docs.overturemaps.org/attribution/). Required attribution: **"© Overture Maps Foundation, overturemaps.org"**. The places theme is **mostly CDLA-Permissive-2.0** (Community Data License Agreement – Permissive, Version 2.0); per-source licences below (as listed by Overture on 2026-10-12):
  - Meta, Microsoft, PinMeTo, Krick, RenderSEO, DAC, BrightQuery: *Available under CDLA Permissive 2.0.*
  - Foursquare: *Copyright 2024 Foursquare Labs, Inc. All rights reserved. Available under Apache 2.0. Foursquare data was transformed to the Overture schema. Changed: 2026-03-18.* See Foursquare's NOTICE.txt (linked from the Overture attribution page).
  - AllThePlaces: *Available under CC0 1.0.*
- The places theme contains **no OpenStreetMap (ODbL) data**. The actor still checks every row: a place is returned only if all its contributing sources are CDLA-Permissive-2.0, Apache-2.0 or CC0-1.0. Overture's ODbL themes (divisions, transportation) are not used.
- **City names** are resolved with **Natural Earth** populated places (public domain, https://www.naturalearthdata.com/about/terms-of-use/), embedded in the actor. No Nominatim or other geocoding service is called.
- Every row repeats its `licences`, `sourceDatasets` and `attribution`. Keep the attribution when you redistribute the data.

### Personal data and marketing rules

Rows describe businesses. Overture's `emails` field is deliberately not exported, and website enrichment never reads person, founder, employee, author or email fields. Some small businesses (sole traders, practices named after a doctor) are a person, so names and phone numbers can still be personal data. **You are responsible for how you use the leads.** Key rules (not legal advice):

- **EU/UK GDPR:** you need a lawful basis (e.g. legitimate interests with a balancing test). Because you did not collect the data from the person, **Article 14** requires you to tell them who you are, why you hold their data and where it came from (Overture Maps), within one month or at first contact, and to honour objections and erasure requests.
- **UK PECR:** screen numbers against the **TPS** (individuals and sole traders) and **CTPS** (companies) before live sales calls; unsolicited marketing texts/emails to individuals and sole traders need prior consent.
- **US CAN-SPAM:** commercial email must have accurate headers and subject lines, identify itself as an ad, include your physical postal address and a working opt-out honoured within 10 business days.
- **US TCPA and the National Do Not Call Registry:** scrub numbers against the National DNC Registry (and state lists) before telemarketing calls; autodialled or prerecorded calls and marketing texts to mobile numbers need prior express written consent; respect calling-hour limits and internal do-not-call requests.

### FAQ

**Is this scraping Google Maps?** No. It reads Overture's open dataset, which is published for reuse. Nothing is taken from Google, Yelp or social networks.

**How fresh is the data?** Overture publishes a new release roughly monthly; each row shows its `release`. The actor always uses the latest one.

**Why did I get 0 results?** Check the category slug (e.g. `dental_clinic`, not `dentist`). The run summary (`RUN_SUMMARY`) lists the area searched and why rows were dropped.

**Can I search a whole country?** Split it into areas of up to 4 square degrees per run (for example one run per city).

**Is it legal?** The data is openly licensed and every row is attributed; website enrichment honours robots.txt, skips any site showing a captcha (never bypassed) and refuses private or internal network addresses. Not legal advice.

# Changelog

This Actor's version history is a separate document: https://apify.com/battles_2026/overture-leads/changelog.md

# Actor input Schema

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

City or town name (resolved offline with Natural Earth, public domain). Ignored when a bounding box is given.

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

ISO-2 code or country name to disambiguate the city, e.g. US or United Kingdom.

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

Search square of this half-width around the city point.

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

Optional exact area in WGS84 degrees. Max 4 square degrees per run.

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

Overture place category slugs, e.g. dental_clinic, coffee_shop, plumbing, restaurant. Matches the basic, primary or parent category.

## `maxLeads` (type: `integer`):

Stop after this many unique valid leads (1-5000).

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

Drop places without a website.

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

Drop places without a phone number.

## `minConfidence` (type: `string`):

Drop places below this existence confidence, e.g. 0.7.

## `enrichWebsite` (type: `boolean`):

Reads the homepage's JSON-LD (opening hours, price range, sameAs links). Obeys robots.txt and rate limits; stops on any captcha. Charged once per unique website with data found.

## Actor input object example

```json
{
  "city": "Austin",
  "country": "US",
  "radiusKm": 5,
  "categories": [
    "dental_clinic"
  ],
  "maxLeads": 100,
  "requireWebsite": false,
  "requirePhone": false,
  "minConfidence": "0",
  "enrichWebsite": false
}
```

# Actor output Schema

## `leads` (type: `string`):

All leads in the overview view.

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

Release used, bbox, query time, dropped rows, enrichment stats, charges.

# 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": [
        "dental_clinic"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("battles_2026/overture-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 = {
    "city": "Austin",
    "country": "US",
    "categories": ["dental_clinic"],
}

# Run the Actor and wait for it to finish
run = client.actor("battles_2026/overture-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 '{
  "city": "Austin",
  "country": "US",
  "categories": [
    "dental_clinic"
  ]
}' |
apify call battles_2026/overture-leads --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,battles_2026/overture-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/kGteeIhvyaWQ4GutV/builds/Y5WpZdZgee9pLDsr8/openapi.json
