# MerchantCircle US Local Business Directory Scraper (`jungle_synthesizer/merchantcircle-us-local-business-directory-scraper`) Actor

Extract US local business leads from MerchantCircle's city-by-city directory: name, phone, address, description, premium flag, and profile URL, filterable by city/state and business category.

- **URL**: https://apify.com/jungle_synthesizer/merchantcircle-us-local-business-directory-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.80 / 1,000 record scrapeds

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

## MerchantCircle US Local Business Directory Scraper

Extract local business leads from [MerchantCircle](https://www.merchantcircle.com), a US small-business directory covering millions of listings city by city. Returns name, phone, address, description, premium-listing status, and profile URL for every business on a city's directory page — filterable by state, city, and 15 top-level business categories.

***

### MerchantCircle Scraper Features

- Pulls every business on a city's directory page — name, phone, address, and description, not just a name and a link.
- Paginates automatically. Point it at a city and it keeps going until the directory runs out.
- Filters by category — autos, legal & financial, real estate, food & dining, and 11 others — so you get leads in the vertical you actually sell to.
- Flags premium/sponsored listings separately from organic ones, which tells you who's already paying to stand out in that market.
- Runs multiple cities and categories in a single job. Feed it a list, get back one combined dataset.

***

### Who Uses Local Business Directory Data?

- **Sales and lead-gen teams** — build city-by-city prospect lists with phone numbers already attached.
- **Marketing agencies** — find businesses in a specific category and metro to pitch services to.
- **Market researchers** — gauge business density and premium-listing adoption by city or category.
- **Franchise and territory planners** — scope competitor and vendor density before entering a market.
- **Data vendors** — merge MerchantCircle records into a broader business-directory dataset.

***

### How MerchantCircle Scraper Works

1. Give it one or more locations as `"City, ST"` strings, and optionally one or more categories.
2. It opens each location's directory page (or each location-category combination, if you selected categories) and extracts every business card on it.
3. It keeps turning pages until the location's directory is exhausted or your `maxItems` cap is hit.
4. You get back a flat dataset — one row per business, ready to filter, dedupe, or load straight into a CRM.

***

### Input

```json
{
  "locations": ["Chicago, IL", "Los Angeles, CA"],
  "categories": ["legal-and-financial"],
  "maxItems": 100
}
```

| Field          | Type    | Default           | Description |
|----------------|---------|-------------------|-------------|
| `locations`    | array   | `["Chicago, IL"]` | US city/state combinations to crawl, one per entry, formatted `"City, ST"`. Each location's full business directory is paginated in full. |
| `categories`   | array   | `[]`              | Optional business categories to filter by (see table below). Leave empty to crawl each location's general top-businesses page instead — output records then carry a `null` category. |
| `maxItems`     | integer | `15`              | Maximum number of business records to return across all locations and categories combined. |
| `resumeCursor` | string  | —                 | Cursor from a previous run's Output. Leave empty for a fresh crawl. |

**Available categories:** `autos`, `home-and-garden`, `legal-and-financial`, `education`, `professional-services`, `real-estate`, `health-and-beauty`, `food-and-dining`, `business-to-business`, `community`, `electronics`, `entertainment-and-arts`, `recreation`, `retail-shopping`, `travel-and-lodging`.

#### Filtering to one category across several cities

```json
{
  "locations": ["Chicago, IL", "Austin, TX", "Denver, CO"],
  "categories": ["real-estate"],
  "maxItems": 200
}
```

### Resuming a large crawl

Every run emits a `resumeCursor` in its Output. If a large crawl stops before it finishes — because it hit `maxItems`, your spend cap (`maxTotalChargeUsd`), or was aborted — start a new run with **the same input** plus that `resumeCursor` to continue from where it left off. The crawl resumes from the queued work the previous run didn't reach.

- You are **not re-charged** for records the earlier run already delivered.
- Resume within your account's run-retention window — on the free tier, roughly your 10 most recent runs. Once the source run is pruned, its `resumeCursor` is no longer valid.
- `resumeCursor` is opaque — supply it unmodified.

***

### MerchantCircle Scraper Output Fields

```json
{
  "business_name": "Gregory K. Stern, P.C.",
  "phone": "3124271558",
  "address": "53 W Jackson Blvd #1442, Chicago, IL, 60604",
  "city": "Chicago",
  "state": "IL",
  "description": "Our attorneys will assist you in exploring Chapter 7, Chapter 11 and Chapter 13 options as well as various bankruptcy alternatives...",
  "category": "legal-and-financial",
  "is_premium": true,
  "profile_url": "https://www.merchantcircle.com/gregory-k-stern-pc2-chicago-il",
  "listing_url": "https://www.merchantcircle.com/il-chicago/legal-and-financial"
}
```

| Field           | Type           | Description |
|-----------------|----------------|-------------|
| `business_name` | string         | Business name |
| `phone`         | string         | Phone number as listed |
| `address`       | string         | Full street address, formatted `street, city, state zip` |
| `city`          | string         | City |
| `state`         | string         | US state abbreviation |
| `description`   | string         | Business description as shown on the listing card |
| `category`      | string | null | Category the record was crawled under — only set when `categories` is used; `null` on a general location crawl |
| `is_premium`    | boolean        | True when MerchantCircle marks the listing as a premium/sponsored placement |
| `profile_url`   | string         | URL of the business's own MerchantCircle profile page |
| `listing_url`   | string         | URL of the directory page this record was scraped from |

***

### FAQ

#### How do I scrape MerchantCircle business listings?

MerchantCircle Scraper needs no account or API key. Give it a city and state — `"Chicago, IL"` works — and it returns every business on that city's directory page, paginated automatically.

#### Can I filter by business category?

Yes. Pass one or more of the 15 category slugs in `categories` (see the Input table above), and every returned record is tagged with the category it came from. Leave it empty to get the general mixed directory instead.

#### Can I scrape multiple cities in one run?

Yes. `locations` takes an array, so a single run can cover as many cities as you want — results come back as one combined dataset.

#### What happens if I misspell a city or state?

That location is skipped and logged as a warning; the run continues with the rest of your `locations`. Nothing fails silently — check the run log for which entries didn't resolve.

#### How much does MerchantCircle Scraper cost to run?

Pay-per-event pricing: a small per-run fee plus a per-record charge. No subscription.

***

### Need More Features?

Need custom fields, a different output shape, or another directory added? [File an issue](https://console.apify.com/actors/issues) or get in touch.

### Why Use MerchantCircle Scraper?

- **Full directory coverage** — not a top-10 preview. It paginates every city's listings until the directory runs out.
- **Category-aware** — tag results by vertical instead of sorting a mixed bag of businesses yourself afterward.
- **Clean, flat JSON** — one row per business, consistent field names, ready for a CRM import or a spreadsheet without cleanup.

# Actor input Schema

## `sp_intended_usage` (type: `string`):

What will this data feed? E.g. lead lists, KYB checks, price tracking.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

We'll personally help with your use case. No spam.

## `resumeCursor` (type: `string`):

Leave empty for a fresh crawl. To CONTINUE a previous run where it stopped — without paying again for records you already received — paste the `resumeCursor` value from that run's Output (the run's OUTPUT key). Resume promptly: the previous run's data expires with your account's retention window (free tier: your ~10 most recent runs).

## `locations` (type: `array`):

US city/state combinations to crawl, one per entry, formatted "City, ST" (e.g. "Chicago, IL", "Los Angeles, CA"). Each location's full business directory is paginated in full.

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

Optional business categories to filter each location by. Leave empty to crawl each location's general top-businesses index (category left unset on output records). Selecting one or more categories crawls each location once per selected category instead, and tags every record with the category it was found under.

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

Maximum number of business records to scrape across all locations/categories

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "locations": [
    "Chicago, IL",
    "Los Angeles, CA"
  ],
  "categories": [],
  "maxItems": 15
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "locations": [
        "Chicago, IL",
        "Los Angeles, CA"
    ],
    "categories": [],
    "maxItems": 15
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/merchantcircle-us-local-business-directory-scraper").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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "locations": [
        "Chicago, IL",
        "Los Angeles, CA",
    ],
    "categories": [],
    "maxItems": 15,
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/merchantcircle-us-local-business-directory-scraper").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 '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "locations": [
    "Chicago, IL",
    "Los Angeles, CA"
  ],
  "categories": [],
  "maxItems": 15
}' |
apify call jungle_synthesizer/merchantcircle-us-local-business-directory-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,jungle_synthesizer/merchantcircle-us-local-business-directory-scraper"
        }
    }
}
```

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/oeC3nCtEraUM7so9i/builds/IFmnYAghCA2wqPBlg/openapi.json
