# Local Business Leads: Google Maps Alternative (OpenStreetMap) (`pandadad0214/local-business-leads`) Actor

Use this to list local businesses by category and city, e.g. dentists in Tempe AZ. Output: one row per business with address, phone, email, website, opening hours and socials from OpenStreetMap (open license), plus Excel and CSV.

- **URL**: https://apify.com/pandadad0214/local-business-leads.md
- **Developed by:** [Panda Federation](https://apify.com/pandadad0214) (community)
- **Categories:** Lead generation, Business, Marketing
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Local Business Leads: Google Maps Alternative (OpenStreetMap)

> **Local business lead scraper and Google Maps alternative** on Apify: pick a category and a city (dentists in Tempe, restaurants in Austin, plumbers within 15 km of a point) and get one row per business with **address, phone, email, website, opening hours and socials** from **OpenStreetMap**, exported to Excel, CSV and JSON. Open license, no Google terms to worry about, no API key. Apify's free plan includes $5 of monthly platform credit, enough for roughly 5,000 businesses at $0.001 each (pricing below).

**Build a local prospect list in a minute: every business of a type in an area, with the contact details the business or the community published on the map.**

Google Maps scrapers break Google's terms and get blocked. **Local Business Leads** reads **OpenStreetMap**, the open map used by Apple Maps, Meta, Microsoft and thousands of apps, whose data you may use commercially under the ODbL license. It:

- 🗂️ **Understands plain words:** about 150 built-in categories (dentist, chiropractor, plumber, electrician, HVAC, roofer, lawyer, accountant, real estate, insurance, restaurant, coffee shop, bakery, bar, hotel, gym, yoga, hair salon, nail salon, car repair, veterinarian, daycare…), and matches other words against OpenStreetMap tags and names. Power users can enter tags like `shop=florist`
- 📍 **Finds the area for you:** a city, county, ZIP, neighborhood or state boundary, or a radius around a point
- ☎️ **Returns contact details:** phone, email, website, street address, ZIP, opening hours, Facebook / Instagram / other socials, brand, cuisine, wheelchair access, coordinates and a map link
- ✅ **Filters to what you need:** only businesses with a website, phone or email
- 🥇 **Most complete leads first** by default
- 📊 **Excel + CSV export** with clickable links, plus the required OpenStreetMap attribution
- 💸 **$0.001 per business.** 1,000 businesses cost $1.00. Searches with no results cost nothing

### Who it's for

- **Agencies and freelancers** selling websites, SEO, marketing, reviews or IT to local businesses
- **Sales teams** building territory lists for field or phone outreach
- **Franchise, real estate and market researchers** counting competitors in an area
- **Data and app builders** who need clean, licensed local POI data

> Coverage depends on how well an area is mapped. Big cities and popular categories (restaurants, cafes, shops, hotels) are usually well covered with phone and website; some trades and medical offices have addresses but fewer contact details. Use **Only businesses with a phone / website** to get outreach-ready rows.

### How to use the local business lead scraper

1. Click **Try for free**.
2. Enter **business categories** (one per line) and a **location** such as `Austin, Texas`.
3. Optional: tick **Only businesses with a website / phone / email**, or set a **radius**.
4. Set **Maximum businesses**. You pay per returned business, so this also caps the cost.
5. Click **Start**. Most city searches finish in about a minute. Download **BUSINESSES_XLSX** from **Storage → Key-value store**, or use the dataset via API.

#### Input examples

Restaurants in Austin that list a website:

```json
{
  "categories": ["restaurant"],
  "location": "Austin, Texas",
  "requireWebsite": true,
  "maxResults": 500
}
```

Plumbers and electricians within 15 km of a point, with a phone number:

```json
{
  "categories": ["plumber", "electrician"],
  "latitude": "33.4255",
  "longitude": "-111.94",
  "radiusKm": 15,
  "requirePhone": true
}
```

### Output example

![Example output table from a real local-business-leads run](https://api.apify.com/v2/key-value-stores/0eeXxTD8eJjgE6yTA/records/shot-local-business-leads)

One row per business. A real row from the Austin example:

```json
{
  "rank": 1,
  "name": "24 Diner",
  "category": "restaurant",
  "osmTag": "amenity=restaurant",
  "street": "600 North Lamar Boulevard, Ste 200",
  "city": "Austin",
  "state": "TX",
  "postcode": "78703",
  "phone": "+1-512-472-5400",
  "email": "info@24diner.com",
  "website": "https://www.24diner.com/",
  "openingHours": "07:00-23:00",
  "socials": {"facebook": "https://www.facebook.com/24Diner"},
  "cuisine": "diner",
  "lat": 30.2720726,
  "lon": -97.7541298,
  "lastEdited": "2025-03-29",
  "osmUrl": "https://www.openstreetmap.org/node/919419079",
  "agentSummary": "24 Diner (restaurant); 600 North Lamar Boulevard, Ste 200, Austin, TX, 78703; +1-512-472-5400; info@24diner.com; https://www.24diner.com/; open 07:00-23:00"
}
```

#### Fields

| Field | What it is |
|---|---|
| `name`, `category`, `osmTag`, `brand` | Business name, your category word, the OpenStreetMap tag it matched, chain/brand |
| `street`, `city`, `state`, `postcode`, `country` | Address as mapped |
| `phone`, `email`, `website`, `socials` | Contact details published on OpenStreetMap |
| `openingHours`, `cuisine`, `wheelchair`, `description` | Extra details when mapped |
| `lat`, `lon`, `osmUrl`, `osmId`, `lastEdited` | Location, map link and when the entry was last edited |
| `agentSummary` | One plain-English line per business |

#### Files in the key-value store

| Key | What it is |
|---|---|
| `BUSINESSES_XLSX` | Excel workbook: **Businesses** with clickable links, **Run log** (with attribution) and **Read me** |
| `BUSINESSES_CSV` | Same table as CSV |
| `SUMMARY` | JSON: counts with phone / website / email, the area searched, a one-line `takeaway` and `nextStep` |

### For AI agents

Use this Actor to list local businesses of a type in a place, with contact details, from OpenStreetMap. Call it with Apify's MCP server (`https://mcp.apify.com`, tool `call-actor`, Actor `pandadad0214/local-business-leads`) or the API (`POST https://api.apify.com/v2/acts/pandadad0214~local-business-leads/run-sync-get-dataset-items`).

Minimal input:

```json
{"categories": ["dentist"], "location": "Denver, Colorado", "requirePhone": true, "maxResults": 50}
```

Each dataset item includes `agentSummary` (name, category, address, phone, email, website, hours in one line), `name`, `phone`, `email`, `website`, `street`, `city` and `osmUrl`. The `SUMMARY` record has `withPhone`, `withWebsite`, `withEmail`, a one-line `takeaway` and `nextStep`. An unknown location fails fast with a plain-English message and no charge.

### Local business leads pricing

**Apify paid-plan discounts:** Bronze members pay 10% less, Silver 20% less and Gold 30% less per business. Free-plan prices are shown below; the discount applies automatically.

**$0.001 per business** returned to the dataset (pay-per-event), plus a tiny Actor-start fee of $0.00005. Excel, CSV and the summary are included. Searches with no results cost nothing. Your **maximum charge per run** is respected.

### FAQ

**Is there a free way to try this Google Maps alternative?** Yes. Apify's free plan includes $5 of monthly platform credit, enough for roughly 5,000 businesses.

**Can I use the data commercially?** Yes. OpenStreetMap data is under the Open Database License (ODbL): credit "© OpenStreetMap contributors", and if you publish a database built from it, share that database under the ODbL too. Every row carries the attribution.

**Why are some phone numbers or websites missing?** OpenStreetMap only has what mappers and businesses added. Nothing is guessed. Use the "Only businesses with…" filters to keep outreach-ready rows, then enrich missing ones elsewhere.

**Does it include reviews or ratings?** No. OpenStreetMap doesn't store reviews.

**How big an area can I search?** A city or county is ideal. A whole large state or country may time out; use a radius or split it into cities.

**Can I use it from code or an AI agent?** Yes, via the Apify API, the Python/JS clients, or as a tool through Apify's MCP server.

### More Panda Federation tools

- [Email Domain Security Checker](https://apify.com/pandadad0214/email-domain-security-checker): check these businesses' SPF, DKIM and DMARC
- [AI Search & SEO Audit](https://apify.com/pandadad0214/ai-search-seo-audit): audit their websites
- [Podcast Leads Finder](https://apify.com/pandadad0214/podcast-leads-finder)
- [NPI Provider Lists](https://apify.com/pandadad0214/npi-provider-lists): US healthcare providers from the official NPI registry

[All Panda Federation Actors on Apify](https://apify.com/pandadad0214)

Questions or a custom data feed? Open an issue on this Actor's **Issues** tab.

### Changelog

- **2026-11-01:** First public release: about 150 plain-word categories plus raw tags, city / boundary / radius search, website / phone / email filters, most-complete-first sorting, Excel/CSV exports with ODbL attribution, agent-friendly `agentSummary` and `takeaway`, pay-per-event pricing with Bronze/Silver/Gold discounts.

Data © OpenStreetMap contributors, ODbL 1.0. This Actor is not affiliated with or endorsed by the OpenStreetMap Foundation.

# Actor input Schema

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

Plain words, one per line: dentist, plumber, restaurant, coffee shop, lawyer, hair salon, gym, real estate, car repair… (about 150 built in). Other words are matched against OpenStreetMap tags and names. Power users can enter a tag like shop=florist or craft=hvac.

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

City, county, state, ZIP or neighborhood, e.g. "Tempe, Arizona", "Austin, TX", "London", "90210". Smaller areas are faster; whole US states or countries may time out (use a radius or a city).

## `maxResults` (type: `integer`):

You pay per returned business, so this also caps the cost. Whole number, 1 to 10,000; default 200.

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

Keep only businesses that list a website on OpenStreetMap.

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

Keep only businesses that list a phone number.

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

Keep only businesses that list an email address (fewer results: most businesses publish phone and website, fewer publish email).

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

Optional. Search a circle of this many km around the location's center instead of its official boundary. 1 to 100.

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

Optional. Instead of a location name: center latitude, e.g. 33.4255 (used with longitude and radius; radius defaults to 5 km).

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

Optional. Center longitude, e.g. -111.9400.

## `sortBy` (type: `string`):

Most complete = businesses with phone, email, website, address and hours first. Name = A to Z.

## Actor input object example

```json
{
  "categories": [
    "coffee shop",
    "bakery"
  ],
  "location": "Tempe, Arizona",
  "maxResults": 200,
  "requireWebsite": false,
  "requirePhone": false,
  "requireEmail": false,
  "sortBy": "mostComplete"
}
```

# Actor output Schema

## `table` (type: `string`):

No description

## `xlsx` (type: `string`):

No description

## `csv` (type: `string`):

No description

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

Run-level summary record. Agent-friendly keys: `takeaway`, `withPhone`, `withWebsite`, `withEmail`, `nextStep` and `nextSteps`.

# 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 = {
    "categories": [
        "coffee shop"
    ],
    "location": "Tempe, Arizona"
};

// Run the Actor and wait for it to finish
const run = await client.actor("pandadad0214/local-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 = {
    "categories": ["coffee shop"],
    "location": "Tempe, Arizona",
}

# Run the Actor and wait for it to finish
run = client.actor("pandadad0214/local-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 '{
  "categories": [
    "coffee shop"
  ],
  "location": "Tempe, Arizona"
}' |
apify call pandadad0214/local-business-leads --silent --output-dataset

```

## MCP server setup

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