# Manta Business Directory Scraper (`devilscrapes/manta-business-directory-scraper`) Actor

Search manta.com's US business directory by category/keyword and city or state — one row per business with name, phone, address, category, SIC code, employee-count and revenue estimates, website, and founding year. Built for SMB lead-gen and local-market research.

- **URL**: https://apify.com/devilscrapes/manta-business-directory-scraper.md
- **Developed by:** [DevilScrapes](https://apify.com/devilscrapes) (community)
- **Categories:** Lead generation
- **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.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
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.
Actors are written with capital "A".

## 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.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

<div align="center">
  <img src=".actor/icon.svg" width="160" alt="Devil Scrapes mark" />

## Manta Business Directory Scraper

**💰 $1.25 / 1 000 results**  ·  pay only for results  ·  no credit card to try

*We do the dirty work so your dataset stays clean.* 😈

Search manta.com's US business directory by category/keyword and city or state — one row per business with name, phone, address, category, SIC code, employee-count and revenue estimates, website, and founding year.

</div>

***

### 🎯 What this scrapes

manta.com aggregates US small/mid-size business listings into a free public directory searchable by category and location. This Actor wraps its search-results pages directly, writing one structured row per listing: name, phone, full address, category, SIC code, employee-count and revenue estimates, website, and founding year — firmographic signal most directory scrapers don't carry alongside contact data.

### 🔥 What we handle for you

- 🛡️ **A real browser, not a script** — Manta fronts its directory with a bot wall, so we drive a hardened Firefox (Camoufox) with a genuine fingerprint rather than an HTTP client pretending to be one.
- 🌐 **Residential proxy rotation** via Apify Proxy — fresh session and exit IP on every block.
- 🔁 **Two separate retry budgets** — a bot wall (429 / 403) and a dead proxy tunnel are different problems, so we retry them independently on fresh exits. A flaky proxy can no longer burn the budget reserved for real blocks, and the failure message names whichever actually gave out.
- 🧱 **Rate-limit-aware pacing** — when the target pushes back, we slow down instead of getting banned.
- 🧊 **Clean, typed dataset rows** — Pydantic-validated, ISO-8601 timestamps, stable IDs, JSON / CSV / Excel export straight from the Apify Console.
- 💰 **Pay-Per-Event pricing** — you only pay for results that hit your dataset. No data, no charge.

### 💡 Use cases

- **Sales/SDR prospecting** — build a call or email list of SMBs in a category and city or state, with phone and address ready to dial.
- **Local-market research** — gauge how many businesses of a category operate in a metro, with firmographic (size/revenue/founding-year) signal alongside contact data.
- **Agency lead lists** — marketing agencies pulling fresh local-business leads by vertical without paying for a directory subscription.
- **Competitive landscape mapping** — see who else serves a category+location before entering a market.

### ⚙️ How to use it

1. Click **Try for free** at the top of the page.
2. Fill in the input form — most fields have sensible defaults.
3. Click **Start**. Output streams into the run's dataset.
4. Export from **Storage → Dataset** as JSON, CSV, or Excel — or fetch via the API.

### 📥 Input

| Field | Type | Required | Default | Notes |
|---|---|:--:|---|---|
| `searchTerm` | `string` | **yes** | 'plumbers' | Category or free-text keyword, e.g. "plumbers" or "marketing agencies". |
| `location` | `string` | **yes** | 'Austin, TX' | US city+state ("City, ST") or a bare 2-letter state code. |
| `maxResults` | `integer` | no | 300 | Cap on total rows emitted for the run. |
| `proxyConfiguration` | `object` | no | {'useApifyProxy': True, 'apifyProxyGroups': \['RESIDENTIAL']} | Mandatory-by-default RESIDENTIAL proxy — manta.com is a confirmed Cloudflare Managed Challenge target (live-verified 202 |

#### Example input

```json
{
  "searchTerm": "plumbers",
  "location": "Austin, TX",
  "maxResults": 10,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

### 📤 Output

Every row is one dataset item.

| Field | Type | Notes |
|---|---|---|
| `business_name` | `string` | Business name from the result card. |
| `phone` | `['string', 'null']` | Phone number, verbatim. |
| `street_address` | `['string', 'null']` | Street address, best-effort parsed. |
| `city` | `['string', 'null']` | City, best-effort parsed. |
| `state` | `['string', 'null']` | State, best-effort parsed. |
| `zip_code` | `['string', 'null']` | ZIP code, best-effort parsed. |
| `category` | `['string', 'null']` | Primary category/industry label. |
| `sic_code` | `['string', 'null']` | SIC code, when exposed on the listing. |
| `employee_count_estimate` | `['string', 'null']` | Employee-count bucket as displayed, e.g. '1-4'. |
| `revenue_estimate` | `['string', 'null']` | Revenue bucket as displayed, e.g. 'Less than $500,000'. |
| `website` | `['string', 'null']` | Outbound website link, verbatim. |
| `year_established` | `['integer', 'null']` | 4-digit founding year, when shown. |
| `listing_url` | `string` | Absolute URL to the business's Manta profile page. |
| `search_term` | `string` | Echo of the run's searchTerm input. |
| `location_query` | `string` | Echo of the run's location input. |
| `scraped_at` | `string` | ISO-8601 UTC timestamp when this row was recorded. |

#### Example output

```json
{
  "business_name": "Austin Plumbing Pros LLC",
  "phone": "(512) 555-0134",
  "street_address": "4210 S Lamar Blvd",
  "city": "Austin",
  "state": "TX",
  "zip_code": "78704",
  "category": "Plumbing Contractors",
  "sic_code": "1731",
  "employee_count_estimate": "1-4",
  "revenue_estimate": "Less than $500,000",
  "website": "https://austinplumbingpros.example.com",
  "year_established": 2011,
  "listing_url": "https://www.manta.com/c/mabc1234/austin-plumbing-pros-llc",
  "search_term": "plumbers",
  "location_query": "Austin, TX",
  "scraped_at": "2026-08-01T12:00:00Z"
}
```

### 💰 Pricing

Pay-Per-Event — you pay only when these events fire:

| Event | USD | What it is |
|---|---:|---|
| `actor-start` | $0.05 | One-off warm-up charge per run |
| `result` | $0.0012 | Per dataset item |

Example: 1 000 results at the rates above ≈ **$1.25**. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.

### 🚧 Limitations

v1 scrapes search-results (list) pages only — individual company profile pages (full description, additional contacts, social links) are out of scope for this build. Employee-count and revenue fields ship as displayed bucket text, never coerced to numeric ranges. `website` may be Manta's own tracked redirect rather than the business's final domain. Each run is a full fresh scrape — no cross-run deduplication or incremental crawling.

### ❓ FAQ

**Are employee count and revenue exact figures?**

No — Manta displays these as ranges (e.g. "1-4 employees", "Less than $500,000"). We capture the bucket text verbatim rather than fabricating a precise number.

**Does `website` always point to the business's own domain?**

Not always — it may be Manta's own tracked redirect rather than the business's final domain. We capture the link verbatim; resolving redirects is a documented v2 candidate.

**Why does this default to a residential proxy?**

manta.com is a confirmed site-wide Cloudflare Managed Challenge (live-verified 403 + Cf-Mitigated: challenge across homepage, search-results, and profile pages). We default `proxyConfiguration` to Apify's RESIDENTIAL group so runs clear the challenge without you tuning anything.

**What happens if a search hits a bot wall?**

We relaunch the browser on a fresh residential exit and try again. If Manta is still walling us after the retry budget is spent, we fail the run loud with a message naming the actual cause — never a silent empty dataset wearing a green status.

### 💬 Your feedback

Spotted a bug, hit a weird edge case, or need a new field? Open an
issue on the Actor's **Issues** tab on Apify Console — we ship
fixes weekly and we read every report.

***

<div align="center">

Built by **[Devil Scrapes](https://apify.com/DevilScrapes)** 😈 — a small fleet of
opinionated public-data Actors. Honest pricing, real engineering, zero fine print.

</div>

# Actor input Schema

## `searchTerm` (type: `string`):

Category or free-text keyword, e.g. "plumbers" or "marketing agencies".

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

US city+state ("City, ST") or a bare 2-letter state code (state-only broadens the search to the whole state). Not geocoded — format-shape validation only.

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

Cap on total rows emitted for the run.

## `proxyConfiguration` (type: `object`):

Mandatory-by-default RESIDENTIAL proxy — manta.com is a confirmed Cloudflare Managed Challenge target (live-verified 403 + Cf-Mitigated: challenge on 2026-08-01) on every probed path.

## Actor input object example

```json
{
  "searchTerm": "plumbers",
  "location": "Austin, TX",
  "maxResults": 300,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

All dataset items as JSON.

## `datasetItemsCsv` (type: `string`):

Same data exported to CSV.

## `datasetView` (type: `string`):

Open the run dataset in the Console.

# 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 = {
    "searchTerm": "plumbers",
    "location": "Austin, TX",
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("devilscrapes/manta-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 = {
    "searchTerm": "plumbers",
    "location": "Austin, TX",
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("devilscrapes/manta-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 '{
  "searchTerm": "plumbers",
  "location": "Austin, TX",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}' |
apify call devilscrapes/manta-business-directory-scraper --silent --output-dataset

```

## MCP server setup

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