# Local Business Leads + Shopify Store Finder (any city) (`johnveds15/local-business-leads-shopify`) Actor

Lead lists of local businesses in any town or city: name, category, address, phone, email, website, socials, and the platform the site runs on (Shopify, WooCommerce, Squarespace, Wix...). Filter to Shopify stores only. OpenStreetMap data, no login. $0.004 per lead.

- **URL**: https://apify.com/johnveds15/local-business-leads-shopify.md
- **Developed by:** [John Vedovino II](https://apify.com/johnveds15) (community)
- **Categories:** Lead generation, E-commerce
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$4.00 / 1,000 business 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

## Local Business Leads + Shopify Store Finder (any city)

**Build a lead list of local businesses in any town or city in one run, and see which e-commerce platform each one's website runs on.** Ask for "pet stores in Austin, Texas on Shopify" or "every restaurant in Brooklyn with a website" and get name, category, address, phone, email, website, Instagram, Facebook, opening hours, and the platform (Shopify, WooCommerce, Squarespace, Wix, BigCommerce, Square Online, Webflow, GoDaddy, WordPress). No login, no API key, no browser. **$0.004 per lead.**

### Use cases

- **Shopify app and agency prospecting.** Filter `platforms: ["shopify"]` to get the independent Shopify stores in a city, with their own published contact email and socials.
- **Web design and SEO agencies.** Find local businesses on Wix, GoDaddy or Squarespace, or with no website at all (turn `onlyWithWebsite` off).
- **Local B2B sales.** Suppliers, POS vendors, payment and delivery services build a territory list by category in minutes.
- **Market research.** Count businesses per category and platform in a town.

### Where the data comes from (and why it is allowed)

| Source | What we take | Terms |
|---|---|---|
| [OpenStreetMap](https://www.openstreetmap.org/copyright) via the Overpass API | Business name, category, address, phone, email, website, hours, socials | Open Database License (ODbL): commercial reuse is permitted with attribution. Every row carries `source` and an `osmUrl` back to the record. One Overpass query per run. |
| Nominatim | One geocoding call per run (your `location` to an OSM boundary) | Usage policy: at most 1 request per second with an identifying User-Agent, which is what this Actor does. |
| The business's own homepage | Platform fingerprint, published `mailto:` email, Instagram and Facebook links | One GET per website, and only when that site's robots.txt allows it. Nothing behind a login. |

No Google Maps, no Yelp, no LinkedIn, no scraping of sites that forbid it. If you use the emails for outreach, follow the anti-spam law where you operate (CAN-SPAM in the US, GDPR/PECR in the UK and EU).

### A real record

From a test run on 2026-10-28, Asbury Park, New Jersey, retail + food and drink (phone masked here, delivered in full):

```json
{
  "name": "Glide Surf",
  "category": "shop=outdoor",
  "address": "520 Bangs Avenue", "city": "Asbury Park", "state": "NJ", "postcode": "07712",
  "phone": "+1-732-•••-••••",
  "website": "https://www.glidesurfco.com/",
  "platform": "shopify", "isShopify": true, "websiteStatus": 200,
  "instagram": "glidesurfco", "facebook": "glidesurfco",
  "osmUrl": "https://www.openstreetmap.org/node/4898569482",
  "source": "OpenStreetMap contributors (ODbL) + the business's own homepage"
}
```

On that run, 35 businesses with websites came back from OpenStreetMap. Their sites split into 8 Squarespace, 5 Shopify, 4 WordPress, 1 WooCommerce, 1 Square Online, 1 GoDaddy and 11 other, and 19 had a published email.

### Input

| Field | Default | What it does |
|---|---|---|
| `location` | (required) | Any place OpenStreetMap knows: `Austin, Texas`, `Brooklyn, New York`, `Bristol, UK`. |
| `categories` | `retail` | `retail`, `clothing-fashion`, `beauty-salons`, `food-drink`, `home-garden`, `pets`, `gifts-crafts-books`, `health-fitness`, `trades-services`, `automotive`. |
| `platforms` | any | Keep only sites on these platforms, e.g. `["shopify"]`. Others are not charged. |
| `onlyWithWebsite` | true | Skip businesses with no website on OpenStreetMap. |
| `onlyWithContact` | false | Keep only rows with an email or phone. |
| `detectPlatform` | true | Check each website (platform, email, socials). |
| `customTags` | none | Advanced OpenStreetMap tags, e.g. `craft=brewery`, `shop=bicycle`. |
| `maxResults` | 200 | Hard cap on leads, and so on cost. |

### Output fields

`name`, `category` (OSM tag such as `shop=pet`), `brand`, `address`, `city`, `state`, `postcode`, `country`, `phone`, `email`, `website`, `platform`, `isShopify`, `websiteStatus` (HTTP code, `robots-disallowed` or an error), `instagram`, `facebook`, `openingHours`, `lat`, `lon`, `osmUrl`, `source`. JSON, CSV or Excel from the dataset tab.

### Pricing

Pay per event: **$0.004 per lead delivered** after your filters. Businesses filtered out cost nothing. 200 Shopify stores = $0.80.

### Limits

- Coverage is whatever OpenStreetMap volunteers have mapped. Big cities and tourist towns are well covered; some suburbs are thin. Every row links to its OSM record, so you can fix or add data at the source.
- The platform comes from fingerprints in the homepage. A heavily customised site can read as `other`.
- Emails are only the ones a business publishes itself (OSM or a `mailto:` link on its homepage). We never guess addresses.

### More Actors by johnveds15

- [US building permit leads, 6 cities, tagged by trade](https://apify.com/johnveds15/us-building-permit-leads)
- [FMCSA new trucking carrier leads](https://apify.com/johnveds15/fmcsa-new-carrier-leads)
- [SEC Form D funding rounds](https://apify.com/johnveds15/sec-form-d-funding-rounds)

# Actor input Schema

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

Any place name OpenStreetMap knows: 'Austin, Texas', 'Brooklyn, New York', 'Bristol, UK'. Resolved to its boundary once per run.

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

Which kinds of businesses to list.

## `platforms` (type: `array`):

For example Shopify only. Empty = every platform. Turns website checking on.

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

Skip businesses OpenStreetMap lists without a website.

## `onlyWithContact` (type: `boolean`):

Drop rows with neither.

## `detectPlatform` (type: `boolean`):

One request per website (robots.txt respected): platform, mailto email, Instagram, Facebook.

## `customTags` (type: `array`):

Advanced: key=value pairs such as craft=brewery or shop=bicycle. key alone = any value.

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

Hard cap on leads pushed (and charged) this run.

## Actor input object example

```json
{
  "location": "Asbury Park, New Jersey",
  "categories": [
    "retail"
  ],
  "platforms": [],
  "onlyWithWebsite": true,
  "onlyWithContact": false,
  "detectPlatform": true,
  "customTags": [],
  "maxResults": 50
}
```

# Actor output Schema

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

One row per business kept by the filters.

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

Businesses found, websites checked, leads pushed and charged.

# 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": "Asbury Park, New Jersey",
    "categories": [
        "retail"
    ],
    "maxResults": 50
};

// Run the Actor and wait for it to finish
const run = await client.actor("johnveds15/local-business-leads-shopify").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": "Asbury Park, New Jersey",
    "categories": ["retail"],
    "maxResults": 50,
}

# Run the Actor and wait for it to finish
run = client.actor("johnveds15/local-business-leads-shopify").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": "Asbury Park, New Jersey",
  "categories": [
    "retail"
  ],
  "maxResults": 50
}' |
apify call johnveds15/local-business-leads-shopify --silent --output-dataset

```

## MCP server setup

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

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/9cpMifLt2yIJt4xqo/builds/s2e5Ezrcnz0IqHhO0/openapi.json
