# Clutch Real-Time Data: Agencies, Rates & Reviews (`b2b_leads/clutch-real-time-data-scraper`) Actor

Collect Clutch B2B agency and vendor data at scale: companies by service and market, full profiles with hourly rates, minimum project size and team size, published client reviews, and lead enrichment with websites, emails, and social profiles. Structured JSON streamed to your dataset in real time.

- **URL**: https://apify.com/b2b_leads/clutch-real-time-data-scraper.md
- **Developed by:** [Emmanuel](https://apify.com/b2b_leads) (community)
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.50 / 1,000 results

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

## Clutch Real-Time Data

Collect **Clutch** B2B agency and vendor data at scale. Point it at a service and a market — software developers in New York, marketing agencies in Chicago, SEO firms in the UK — and get a clean, structured stream of companies with their rates, minimum project size, team size, location, ratings, and verification status. Turn on the detail pass and the same rows gain the company's full profile: description, website, complete service list, credentials, founding year, every office, and the published rating breakdown. Turn on reviews and each company carries its published client reviews — title, rating, date, reviewer role, metric scores, services bought, project size and length, plus the client summary and pull quote. Turn on lead details and each company gains contact emails and social profiles for outreach.

Everything streams to your dataset as it is collected, so rows appear in seconds and you can wire the same stream to your CRM with a webhook.

> **Free-trial notice:** on a free Apify plan this Actor exports a **2-result sample per run** so you can verify the output before paying. Upgrade to any paid Apify plan for full, unlimited results. Owners can change the sample size or switch to a hard block with `FREE_TIER_MAX_ITEMS` and `FREE_TIER_MODE`.

***

### Who this is for

- **B2B sales and outbound teams** building agency/vendor prospect lists with verified contact routes.
- **Marketing and procurement teams** shortlisting agencies by rate, engagement size, team size, and rating.
- **B2B market researchers** mapping who serves which service in which market, and how the market is priced.
- **Local SEO and directory agencies** comparing vendor density and positioning city by city.
- **Review and reputation analysts** studying client sentiment, project outcomes, and vendor quality signals.
- **AI agents and data pipelines** that need a fresh, structured vendor feed on demand.

### What you can do with it

1. **Vendor shortlisting** — pull 100 software development firms in Texas with hourly rates, minimum project size, team size, and ratings, then sort by cost and score.
2. **Territory mapping** — run the same service across 20 cities and see where vendor density and pricing differ.
3. **Outreach at scale** — add lead details to get company websites, contact emails, and LinkedIn/Instagram/Facebook/X/YouTube profiles, then push straight into your CRM.
4. **Review intelligence** — collect published client reviews per vendor and track ratings, project sizes, and the services clients actually bought.
5. **Competitive benchmarking** — compare a set of vendors on verification level, credentials, founding year, and service mix.
6. **Enrich an existing list** — paste company links you already have and get the same rows back, fully detailed, in seconds.

***

### Feature matrix

| Checkbox | What it does | Default | Adds time per run |
|---|---|---|---|
| **Company search** | Finds companies by service and market | **On** | — |
| **Company URLs** | Collects full details for specific company links | Off | Fast per company |
| **Full company details** | Adds description, website, services, credentials, founding year, offices, rating breakdown | Off | Adds a little extra time per company |
| **Client reviews** | Adds published client reviews, with a per-company depth control | Off | Adds a little extra time per company |
| **Lead details (email discovery)** | Adds contact emails and social profiles from the company's own website | Off | Adds a little extra time per company |
| **Webhook delivery** | Pushes every row to your own URL as it is collected | Off | None |

All three enrichments are independent and **fill the same row**. They never create a second row and never drop a partial result. Companies with no published website are still exported.

***

### Input reference

#### Company search

| Field | Type | Default | Notes |
|---|---|---|---|
| `enableCompanySearch` | boolean | `true` | Primary discovery feature. |
| `searchTasks[].service` | string | — | What to browse. A service path like `developers`, `agencies/digital-marketing`, or a full Clutch directory link. The Console shows 35 suggestions with friendly names; any service path is accepted. |
| `searchTasks[].location` | string | — | Optional market. City, state, province or country as a plain name (`New York`, `Texas`, `Chicago`, `London`, `India`, `uk`). Industry and ownership segments work too (`healthcare-industry`, `women-owned`, `startups`, `enterprise`, `small-business`). |
| `searchTasks[].maxResults` | integer | `10` | Rows this one lookup may return. Larger numbers are collected across further directory pages. |

Prefilled on first run:

```json
{
  "enableCompanySearch": true,
  "searchTasks": [{ "service": "developers", "location": "New York", "maxResults": 10 }]
}
```

A multi-market run — lookups run side by side, so it takes as long as the slowest lookup rather than the sum:

```json
{
  "enableCompanySearch": true,
  "searchTasks": [
    { "service": "developers", "location": "Texas", "maxResults": 60 },
    { "service": "web-designers", "location": "Chicago", "maxResults": 60 },
    { "service": "seo-firms", "location": "uk", "maxResults": 20 }
  ]
}
```

> If a service or market does not exist in the directory, that lookup reports it by name and the others continue.

#### Company URLs

| Field | Type | Default | Notes |
|---|---|---|---|
| `enableScrapeByUrl` | boolean | `false` | Collect specific company pages. |
| `scrapeUrls` | string\[] | `[]` | Company links: `https://clutch.co/profile/simform`. Extra tracking parameters and anchors are stripped for you. |

```json
{
  "enableCompanySearch": false,
  "enableScrapeByUrl": true,
  "scrapeUrls": ["https://clutch.co/profile/simform", "https://clutch.co/profile/bairesdev"]
}
```

#### Details & enrichment

| Field | Type | Default | Notes |
|---|---|---|---|
| `enableCompanyDetails` | boolean | `false` | Full company profile. |
| `enableReviews` | boolean | `false` | Published client reviews on the same row. |
| `reviewsPerCompany` | integer | `10` | Review depth per company (1–200). |
| `enableLeadDetails` | boolean | `false` | Contact emails and social profiles from the company's own website. |

```json
{
  "enableCompanySearch": true,
  "searchTasks": [{ "service": "agencies/digital-marketing", "location": "Chicago", "maxResults": 25 }],
  "enableCompanyDetails": true,
  "enableReviews": true,
  "reviewsPerCompany": 25,
  "enableLeadDetails": true,
  "concurrency": 3
}
```

#### Output & limits

| Field | Type | Default | Notes |
|---|---|---|---|
| `concurrency` | integer | `2` | How many company pages are enriched in parallel (1–4). |

#### Webhook delivery

| Field | Type | Default | Notes |
|---|---|---|---|
| `webhookUrl` | string | `""` | Every record is always saved to the dataset; a webhook is an **additional** real-time push. |
| `webhookFormat` | `json` | `slack` | `json` | `json` posts the full record object; `slack` posts a Slack-friendly message payload. |

#### Connection

| Field | Type | Default | Notes |
|---|---|---|---|
| `proxyConfiguration` | object | Apify **Residential**, US | Change only if you need another country or your own proxy links. |

***

### Output

Each row is one company. Every field is optional except the identity fields, because enrichment fills only what exists.

| Field | Type | Description |
|---|---|---|
| `type` | `"company"` | Record type. |
| `platform` | `"clutch"` | Always `clutch`. |
| `featureType` | `"company_search"` | `"scrape_by_url"` | Which feature produced the row. |
| `name` | string | Company name. |
| `profileUrl` | string | Company link. |
| `profileId` | string | The directory's own company identifier — the dedupe key. |
| `tagline` | string | Headline the company publishes above its description. *(details)* |
| `description` | string | Company description, or the listing summary when details are off. |
| `website` | string | Company website. *(details)* |
| `phone` | string | Published phone. |
| `email`, `emails` | string, string\[] | Contact emails. *(lead details)* |
| `socials`, `linkedin`, `facebook`, `instagram`, `twitter`, `youtube` | string\[] / string | Social profiles. *(lead details)* |
| `hourlyRate`, `hourlyRateMin`, `hourlyRateMax` | string, number, number | Published average hourly rate, e.g. `$25 - $49 / hr` → 25 / 49. |
| `minProjectSize`, `minProjectSizeValue` | string, number | Published minimum engagement, e.g. `$25,000+` → 25000. |
| `employees`, `employeesMin`, `employeesMax` | string, number, number | Team-size band, e.g. `10 - 49` → 10 / 49. |
| `rating`, `reviewCount` | number, integer | Aggregate client rating and how many reviews it is based on. |
| `reviewBreakdown` | object | `overall`, `quality`, `schedule`, `cost`, `willingToRefer`. *(details)* |
| `services` | string\[] | Services the company is listed under. |
| `certifications` | string\[] | Verification and service credentials. *(details)* |
| `verified`, `verificationLevel` | boolean, string | e.g. `"Premier Verified"`. |
| `sponsored` | boolean | Whether the row appeared as a paid placement. |
| `address` | object | `street`, `city`, `state`, `postalCode`, `country`. *(details)* |
| `location` | string | Headline location, e.g. `Orlando, FL`. |
| `offices` | object\[] | Every office: `city`, `state`, `country`, `postalCode`, `address`, `phone`, `employees`, `isHeadquarters`. *(details)* |
| `foundedYear` | integer | Founded year. *(details)* |
| `logoUrl` | string | Company logo. |
| `reviews` | object\[] | Published client reviews — see below. *(reviews)* |
| `detailsFetched` / `reviewsFetched` / `leadDetails` | boolean | Which passes ran for this row. |
| `searchService`, `searchLocation`, `searchTaskIndex`, `searchTaskLabel` | string / integer | Which lookup produced the row. |
| `source` | `"search"` | `"url"` | Row origin. |
| `scrapedAt` | string | ISO-8601 collection time. |

Each entry in `reviews`:

| Field | Type | Description |
|---|---|---|
| `reviewId` | string | Review identifier when published. |
| `title` | string | Review headline. |
| `rating` | number | Overall score (0–5). |
| `date` | string | Publication date. |
| `reviewer` | string | Reviewer's role and company, e.g. `CTO, Fintech Startup`. |
| `reviewerName` | string | Reviewer name when published. |
| `verified` | boolean | Whether the review carries a verification badge. |
| `metrics` | object | `quality`, `schedule`, `cost`, `willingToRefer`. |
| `services` | string\[] | Services the client bought. |
| `projectSize` | string | Published project budget band. |
| `projectLength` | string | Published project timeline. |
| `summary` | string | Client's summary of the engagement. |
| `quote` | string | Pull quote. |

Example row (trimmed):

```json
{
  "type": "company",
  "platform": "clutch",
  "featureType": "company_search",
  "name": "Simform",
  "profileUrl": "https://clutch.co/profile/simform",
  "profileId": "17572",
  "location": "Orlando, FL",
  "hourlyRate": "$25 - $49 / hr",
  "hourlyRateMin": 25,
  "hourlyRateMax": 49,
  "minProjectSize": "$25,000+",
  "minProjectSizeValue": 25000,
  "employees": "1,000 - 9,999",
  "rating": 4.8,
  "reviewCount": 88,
  "verificationLevel": "Premier Verified",
  "services": ["AI Development", "Custom Software Development", "Mobile App Development"],
  "website": "https://www.simform.com",
  "detailsFetched": true,
  "searchTaskLabel": "developers | New York",
  "scrapedAt": "2026-10-02T11:43:49.186Z"
}
```

***

### Webhooks

Set `webhookUrl` and every row is POSTed the moment it is collected — in addition to the dataset. Delivery is best-effort: a URL that does not answer never stops the run and never blocks a dataset write.

#### JSON

`webhookFormat: "json"` posts the full record object as the request body.

```json
{ "webhookUrl": "https://hooks.zapier.com/hooks/catch/123/abc", "webhookFormat": "json" }
```

#### Slack

`webhookFormat: "slack"` posts a Slack incoming-webhook payload:

```json
{
  "text": ":office: *Simform*\n*Location:* Orlando, FL\n*Services:* AI Development, Custom Software Development\n*Hourly rate:* $25 - $49 / hr\n*Min. project:* $25,000+\n*Team size:* 1,000 - 9,999\n*Rating:* 4.8 (88 reviews)\n*Website:* https://www.simform.com\n<https://clutch.co/profile/simform|View company>"
}
```

```json
{ "webhookUrl": "https://hooks.slack.com/services/T000/B000/XXXX", "webhookFormat": "slack" }
```

***

### Use it from an AI agent (MCP)

This Actor is a standard Apify Actor, so any MCP-capable client can call it through the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp). Add the server, point your client at `clutch-real-time-data`, and ask in plain language.

Example questions an agent can answer with it:

- *"Find 40 digital marketing agencies in Chicago with hourly rates and review scores, and tell me which three are the best value."*
- *"Which software development firms in Texas charge under $100/hour and have at least 20 published reviews?"*
- *"Collect the 25 most recent client reviews for these five agencies and summarise what clients complain about."*
- *"Give me a list of UK SEO firms with a verified listing and a contact email."*

A typical MCP call passes the same input object documented above:

```json
{
  "enableCompanySearch": true,
  "searchTasks": [{ "service": "agencies/digital-marketing", "location": "Chicago", "maxResults": 40 }],
  "enableCompanyDetails": true,
  "enableReviews": true,
  "reviewsPerCompany": 10
}
```

***

### FAQ

**Do I need a proxy?** No. Apify's residential proxy is configured by default because it keeps results reliable at volume. Leave the Connection section alone unless you specifically need another country or your own proxy links.

**How fresh is the data?** Every run collects live data at the moment it runs. Servings, rates, ratings, and reviews reflect what is published right now — schedule the Actor to keep a feed current.

**Why is a free run only 2 results?** That is the free-trial sample, so you can verify the output shape before paying. Change `FREE_TIER_MAX_ITEMS` (owner setting) or upgrade to any paid plan for full output.

**Why did a company come back without an email?** Not every company publishes one. Lead details only add what the company's own website actually carries; the row is still exported with everything else.

**Why are some rows missing details or reviews?** Those passes add what exists. A company with no published description, no offices, or no client reviews simply contributes fewer fields — the row is never dropped.

**What happens if a market does not exist?** That lookup reports it by name and the other lookups continue. Check the service and market spelling — markets use plain names like `Austin` or `texas`, and countries use their short form where the directory does (`uk`, not `united-kingdom`).

**Can I cap the cost of a run?** Yes. Per-lookup `maxResults` is the main control, and the Actor always respects your Apify spending limit — it stops cleanly and writes its summary rather than overshooting.

**How many rows can one run produce?** Thousands. Rows stream to the dataset as they are collected, so memory stays flat on long runs.

***

### Notes on fairness

This Actor collects only information the directory publishes publicly. Respect the target site's terms, your local regulations, and any applicable outreach and privacy law when you use the data — especially for contact details.

# Actor input Schema

## `enableCompanySearch` (type: `boolean`):

Browse Clutch by service and market — a ready-to-run demo lookup is pre-filled below. NOTE: free Apify plans are limited to a 2-result sample per run — upgrade to a paid plan for full, unlimited data.

## `searchTasks` (type: `array`):

One row per lookup. "Service" is what to browse (e.g. developers, web-designers, agencies/digital-marketing). "Market" narrows it to a city, state, country, industry, or ownership segment. Click "+ Add" for every additional lookup. "Max results" governs that one row.

## `enableScrapeByUrl` (type: `boolean`):

Collect full details for specific Clutch company pages instead of (or in addition to) directory lookups.

## `scrapeUrls` (type: `array`):

Clutch company links (https://clutch.co/profile/...).

## `enableCompanyDetails` (type: `boolean`):

Fill each result with its full profile: company description and tagline, website, complete service list, verification and credentials, founding year, full address, every office with its team size, and the published rating breakdown (quality, schedule, cost, willingness to refer). Every result is still exported without it — enrichment adds fields to the same row, it never filters or drops rows.

## `enableReviews` (type: `boolean`):

Add published client reviews to each company row: review title, rating, date, reviewer role and company, verification badge, per-review metric scores (quality, schedule, cost, willingness to refer), services bought, project size and length, plus the client summary and pull quote. Set the depth you want per company below.

## `reviewsPerCompany` (type: `integer`):

How many published client reviews to collect per company (1–200). Each extra batch adds a little time per company.

## `enableLeadDetails` (type: `boolean`):

Visit each company's own website and add contact emails plus social profiles (LinkedIn, Facebook, Instagram, X, YouTube) — the reliable outreach option. Works on its own, without full company details, so you can keep runs fast and still get emails. Companies with no published website are still exported, just without contact fields.

## `concurrency` (type: `integer`):

How many company pages are enriched in parallel (1–4). Higher is faster but a bit harder on rate limits.

## `webhookUrl` (type: `string`):

Every record is always saved to the run's dataset — a webhook is an ADDITIONAL real-time push. When set, each new record is also POSTed to this URL (CRM, Slack incoming webhook, Zapier, Make, Google Sheets).

## `webhookFormat` (type: `string`):

json = full record object; slack = Slack-friendly message payload.

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

Apify residential proxy (US) is enabled by default for reliable results.

## Actor input object example

```json
{
  "enableCompanySearch": true,
  "searchTasks": [
    {
      "service": "developers",
      "location": "New York",
      "maxResults": 10
    }
  ],
  "enableScrapeByUrl": false,
  "scrapeUrls": [],
  "enableCompanyDetails": false,
  "enableReviews": false,
  "reviewsPerCompany": 10,
  "enableLeadDetails": false,
  "concurrency": 2,
  "webhookUrl": "",
  "webhookFormat": "json",
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}
```

# Actor output Schema

## `allResults` (type: `string`):

Complete dataset with every company row from all enabled features in this run.

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

Outreach-ready companies with contact details.

## `vendors` (type: `string`):

Companies with rates, project size, team size, and ratings — built for procurement and vendor shortlisting.

## `reviews` (type: `string`):

Companies with their published client reviews inlined.

## `runSummary` (type: `string`):

Run metadata: totals, duration, errors, spending-limit and free-tier (paywall) status.

# 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 = {
    "enableCompanySearch": true,
    "searchTasks": [
        {
            "service": "developers",
            "location": "New York",
            "maxResults": 10
        }
    ],
    "enableCompanyDetails": false,
    "enableReviews": false,
    "reviewsPerCompany": 10,
    "enableLeadDetails": false,
    "concurrency": 2,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "RESIDENTIAL"
        ],
        "apifyProxyCountry": "US"
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("b2b_leads/clutch-real-time-data-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 = {
    "enableCompanySearch": True,
    "searchTasks": [{
            "service": "developers",
            "location": "New York",
            "maxResults": 10,
        }],
    "enableCompanyDetails": False,
    "enableReviews": False,
    "reviewsPerCompany": 10,
    "enableLeadDetails": False,
    "concurrency": 2,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["RESIDENTIAL"],
        "apifyProxyCountry": "US",
    },
}

# Run the Actor and wait for it to finish
run = client.actor("b2b_leads/clutch-real-time-data-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 '{
  "enableCompanySearch": true,
  "searchTasks": [
    {
      "service": "developers",
      "location": "New York",
      "maxResults": 10
    }
  ],
  "enableCompanyDetails": false,
  "enableReviews": false,
  "reviewsPerCompany": 10,
  "enableLeadDetails": false,
  "concurrency": 2,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ],
    "apifyProxyCountry": "US"
  }
}' |
apify call b2b_leads/clutch-real-time-data-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,b2b_leads/clutch-real-time-data-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/Cz39QdHr7QxE2Ktx0/builds/VFMGpDy9bIzrDc6Lg/openapi.json
