# Clutch.co Agency Scraper — B2B Leads with Emails (`samstorm/clutch-agency-scraper`) Actor

Scrape agency listings from Clutch.co by service category. Get company details, ratings, hourly rates, and verified contact emails. The only Clutch scraper with built-in email enrichment and verification.

- **URL**: https://apify.com/samstorm/clutch-agency-scraper.md
- **Developed by:** [Sam Kleespies](https://apify.com/samstorm) (community)
- **Categories:** Lead generation
- **Stats:** 107 total users, 24 monthly users, 97.1% runs succeeded, 2 bookmarks
- **User rating**: No ratings yet

## Pricing

from $5.00 / 1,000 agency lead with details

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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

## Clutch Agency Scraper — B2B Digital Agency Leads with Verified Emails

Scrape any Clutch.co agency directory page and get a clean, enriched lead list — including verified contact emails — ready for CRM import or cold outreach. This Clutch.co scraper extracts agency name, Clutch rating, review count, hourly rate, employee count, location, service focus, website, and primary contact emails in one automated pipeline.

***

### What It Does

Point the actor at any Clutch.co category URL — digital marketing agencies, web developers, SEO firms, IT services companies, PR agencies — and it returns a structured list of every agency on those pages. With email enrichment enabled (the default), it also visits each agency's own website, finds contact emails, and runs DNS MX + SMTP verification to confirm deliverability before they hit your dataset.

**The full pipeline:**

1. Crawls the Clutch.co category page and follows pagination through all results
2. Extracts profile data for each agency (rating, reviews, hourly rate, employees, location, service focus)
3. Visits the agency's website and crawls contact pages (homepage, /contact, /about, /contact-us, /about-us) for emails
4. Verifies each email via DNS MX lookup and SMTP handshake — with catch-all server detection
5. Exports a clean, CRM-ready dataset in Full, HubSpot, or Salesforce format

***

### How It Differs from Other Clutch.co Scrapers

Most Clutch scrapers stop at the directory listing: you get an agency name and a website, and you're on your own for contacts. This actor goes further:

- **Built-in email enrichment** — crawls each agency's own website to find real contact addresses
- **DNS + SMTP verification** — filters dead addresses, catch-all traps, and typos before they reach your list
- **Catch-all detection** — probes servers that accept any address to flag unreliable results separately
- **CRM-ready output** — export in Full, HubSpot, or Salesforce format without reformatting

***

### Inputs

| Field | Type | Default | Description |
|-|-|-|-|
| `categoryUrls` | array | `["https://clutch.co/agencies/digital-marketing"]` | Clutch.co category or search URLs to scrape |
| `maxResults` | integer | 100 | Maximum number of agencies to return (1–5000) |
| `enrichEmails` | boolean | `true` | Visit each agency's website to find contact emails |
| `verifyEmails` | boolean | `true` | Verify found emails via DNS MX + SMTP handshake |
| `outputFormat` | string | `"full"` | Output structure: `full`, `hubspot`, or `salesforce` |

**Example category URLs:**

- `https://clutch.co/agencies/digital-marketing`
- `https://clutch.co/web-developers`
- `https://clutch.co/agencies/seo`
- `https://clutch.co/agencies/social-media-marketing`
- `https://clutch.co/it-services`
- `https://clutch.co/agencies/content-marketing`
- `https://clutch.co/agencies/pr`

You can also paste a filtered search URL directly from Clutch.co — location, budget, and service filters are preserved in the URL.

***

### Output Fields

Each record in the dataset represents one agency.

| Field | Type | Example |
|-|-|-|
| `agencyName` | string | `WebFX` |
| `clutchUrl` | string | `https://clutch.co/profile/webfx` |
| `website` | string | `https://www.webfx.com` |
| `rating` | number | `4.9` |
| `reviewCount` | integer | `345` |
| `hourlyRate` | string | `$100 - $149/hr` |
| `minProjectSize` | string | `$10,000+` |
| `employees` | string | `250 - 999` |
| `location` | string | `Harrisburg, PA` |
| `serviceFocus` | string | `SEO, PPC, Web Design` |
| `description` | string | `WebFX is a full-service digital marketing agency...` |
| `email` | string | `info@webfx.com` |
| `emailVerified` | boolean | `true` |
| `emailStatus` | string | `deliverable` |
| `allEmails` | array | `[{"address":"info@webfx.com","verified":true,"status":"deliverable"}]` |
| `phone` | string | `(888) 256-9448` |
| `scrapedAt` | string | `2026-03-19T12:00:00.000Z` |

Email status values: `deliverable`, `undeliverable`, `catch_all`, `dns_verified`, `no_mx_records`, `rate_limited`, `unknown`.

Output is available as JSON, CSV, or Excel from the Apify dataset viewer.

#### Sample Output

```json
{
  "agencyName": "Ignite Digital",
  "clutchUrl": "https://clutch.co/profile/ignite-digital",
  "website": "https://ignitedigital.com",
  "rating": 4.8,
  "reviewCount": 42,
  "hourlyRate": "$100 - $149/hr",
  "minProjectSize": "$5,000+",
  "employees": "10 - 49",
  "location": "Mississauga, Canada",
  "serviceFocus": "SEO, PPC, Social Media Marketing",
  "description": "Ignite Digital is a full-service digital marketing agency...",
  "email": "info@ignitedigital.com",
  "emailVerified": true,
  "emailStatus": "deliverable",
  "allEmails": [
    { "address": "info@ignitedigital.com", "verified": true, "status": "deliverable" }
  ],
  "phone": "(888) 888-1932",
  "scrapedAt": "2026-03-19T14:22:10.000Z"
}
```

***

### Use Cases

**SaaS companies selling to agencies.** If your product targets digital agencies — project management, client reporting, white-label software, rank tracking, or analytics — Clutch is one of the best-curated directories of your exact buyers. Filter by service focus, employee size, or hourly rate tier and reach decision-makers directly with a verified email already in hand.

**White-label service providers.** Agencies on Clutch actively take on client work and often subcontract SEO, PPC, development, or content production. Use this actor to build a pipeline of potential reseller or white-label partners, segmented by size and service focus.

**Agency partnership outreach.** Find complementary agencies for co-marketing, referral arrangements, or strategic partnerships. Filter by service category to target agencies whose clients overlap with yours.

**B2B lead generation and cold email.** Build targeted lists of digital agency contacts for cold email, LinkedIn outreach, or account-based marketing. The verified email field means you can start sending without an additional enrichment step.

**Market research.** Analyze the competitive landscape in a service category — average hourly rates, review distributions, geographic concentration, minimum project sizes, and service focus breakdowns.

**Agency directories and aggregators.** Pull structured Clutch data across multiple categories to build or refresh your own agency finder.

***

### Pricing

This actor runs on a Pay-Per-Event model. You are charged per agency record returned, not per run. A typical run of 100 agencies with full email enrichment and verification costs less than $1.

Check the Pricing tab on the Apify Store listing for the current per-record rate.

***

### Use via Apify API

```javascript
import { ApifyClient } from 'apify-client';

const client = new ApifyClient({ token: 'YOUR_API_TOKEN' });

const run = await client.actor('samstorm/clutch-agency-scraper').call({
    categoryUrls: [
        'https://clutch.co/agencies/digital-marketing',
        'https://clutch.co/agencies/seo',
    ],
    maxResults: 100,
    enrichEmails: true,
    verifyEmails: true,
    outputFormat: 'full',
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

***

### FAQ

**How many agencies can I scrape?**
Up to 5,000 per run using the `maxResults` input. For larger datasets, pass multiple category URLs or run multiple times against filtered Clutch search pages.

**Does this include email addresses?**
Yes — with `enrichEmails` enabled (the default), the actor visits each agency's website to find contact emails and optionally verifies them via DNS MX and SMTP handshake. Agencies that use contact forms, obfuscated addresses, or fully JavaScript-rendered pages may return an empty `email` field.

**What does `emailStatus: catch_all` mean?**
Some mail servers accept any recipient address without checking whether the mailbox actually exists. The actor detects these servers by probing a random address — if the server accepts that too, the result is flagged as `catch_all`. The email format is valid but deliverability is unconfirmed.

**Can I filter by service type, location, or budget?**
Yes — filtering happens at the URL level. Use Clutch.co's own category, location, and budget filters in your browser, then paste the resulting URL into `categoryUrls`. The actor preserves all query parameters.

**Can I export directly to HubSpot or Salesforce?**
Set `outputFormat` to `hubspot` or `salesforce` and the output columns will match those CRM import formats for direct upload without reformatting.

**How often is the data updated?**
The actor scrapes Clutch.co live at the time of each run, reflecting whatever is currently published. Scheduling the actor weekly or monthly is a good way to keep your list fresh as new agencies join Clutch and existing ones update their profiles.

**Is this compliant with Clutch.co's terms of service?**
This actor scrapes publicly visible listing data — the same information visible to any visitor without logging in. It is your responsibility to review Clutch.co's terms and ensure your intended use case is permitted. The actor does not bypass authentication or access any private or gated content.

***

### Limitations

- **Clutch.co layout changes** — Clutch periodically updates its page structure. If the site redesigns its listing or profile pages, selectors may need updating. Open an issue or contact support if you see empty results.
- **Email enrichment coverage** — agencies that use contact forms, obfuscated addresses, or JavaScript-only rendered emails will return an empty `email` field. Enrichment success rates vary by site.
- **SMTP blocking on cloud** — cloud infrastructure commonly blocks outbound port 25. When SMTP is unreachable, the actor falls back to DNS MX verification and marks the email as `dns_verified`.
- **Data freshness** — data reflects Clutch at the moment of the run. Agency details can lag if Clutch itself hasn't updated a profile recently.

# Actor input Schema

## `categoryUrls` (type: `array`):

One or more Clutch.co category or search result URLs to scrape. Navigate to any Clutch directory page (e.g., clutch.co/agencies/digital-marketing, clutch.co/web-developers, clutch.co/agencies/seo) and paste the URL here. You can include multiple categories at once — the actor will scrape agencies from each URL.

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

Maximum number of agencies to scrape across all provided category URLs. The prefill is set to 3 for a quick test run — increase to 100–500 for a full prospecting batch. Clutch categories can contain thousands of agencies; use this to control run time and dataset size.

## `enrichEmails` (type: `boolean`):

When enabled, the actor visits each agency's own website (linked from their Clutch profile) and scans contact pages, footers, and about pages to extract email addresses. This is the core enrichment step for cold outreach — disable only if you need Clutch profile data without email addresses.

## `verifyEmails` (type: `boolean`):

When enabled, each extracted email is validated via DNS MX record lookup and SMTP handshake — confirming the mailbox exists before it reaches your list. Recommended for cold outreach campaigns where bounce rates affect sender reputation. Only applies when 'Find Agency Emails' is also enabled.

## `outputFormat` (type: `string`):

Controls the structure of the output dataset. 'Full' returns all available fields including Clutch rating, review count, hourly rate, and social links. 'HubSpot Import' reformats columns to match HubSpot's CSV import format for direct upload. 'Salesforce Import' aligns fields to the Salesforce Lead object.

## Actor input object example

```json
{
  "categoryUrls": [
    "https://clutch.co/agencies/seo",
    "https://clutch.co/web-developers"
  ],
  "maxResults": 100,
  "enrichEmails": true,
  "verifyEmails": true,
  "outputFormat": "hubspot"
}
```

# 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 = {
    "categoryUrls": [
        "https://clutch.co/agencies/digital-marketing"
    ],
    "maxResults": 3,
    "enrichEmails": true,
    "verifyEmails": true
};

// Run the Actor and wait for it to finish
const run = await client.actor("samstorm/clutch-agency-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 = {
    "categoryUrls": ["https://clutch.co/agencies/digital-marketing"],
    "maxResults": 3,
    "enrichEmails": True,
    "verifyEmails": True,
}

# Run the Actor and wait for it to finish
run = client.actor("samstorm/clutch-agency-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "categoryUrls": [
    "https://clutch.co/agencies/digital-marketing"
  ],
  "maxResults": 3,
  "enrichEmails": true,
  "verifyEmails": true
}' |
apify call samstorm/clutch-agency-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=samstorm/clutch-agency-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/acts/WEFSTXSL5EuSNxBuh/builds/KH5ORQ0sA96Yh0Xml/openapi.json
