# Clutch.co Agency Directory & Lead Attributes Scraper (`fanndev/clutch-agency-directory-scraper`) Actor

B2B agency leads from Clutch.co with the attributes buyers filter on: minimum project size, hourly rate, headcount, location, service mix with percentages, rating and reviews, plus each agency's own website URL. Paid placement is labelled, not blended into the rank. No login.

- **URL**: https://apify.com/fanndev/clutch-agency-directory-scraper.md
- **Developed by:** [Faisal Ahdan naufal](https://apify.com/fanndev) (community)
- **Stats:** 2 total users, 1 monthly users, 85.7% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.30 / 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.co Agency Directory Scraper

Pull B2B agency leads from Clutch.co with the attributes buyers actually filter on — minimum project size, hourly rate band, headcount, location, service mix with percentages, rating, review count, and the agency's own website URL — plus full profiles, client reviews, and the list of every directory page on the site.

### Why use this actor

- **No account, no login, no API key.** Point it at a category and run.
- **Lead attributes, not just names.** Every row carries min. project size, hourly rate, headcount, city/region/country, phone, and the agency's real website — the fields that decide whether a lead is worth a call.
- **Paid placement is labelled, not hidden.** Half the rows on a busy category page are sponsors. Each record says `isPaidPlacement`, `isPinnedBlock` and `isRankedResult`, so you can separate the bought slots from the actual ranking. Most tools blend them together.
- **No duplicate rows.** Clutch repeats a "Leaders Matrix" block on every page of a category. This actor recognises it and emits each agency once.
- **Service mix with percentages.** `Web Development 30%, Custom Software Development 30%, AI Agents 5%` — how an agency actually splits its work, on every row.
- **Client reviews with the four sub-scores** (quality, schedule, cost, willing to refer), plus what the project cost and how long it ran.
- **Stable JSON** suitable for a CRM, a database or a spreadsheet, with automatic retries and export to JSON/CSV/Excel.

### How it works

1. You give it a directory slug (`web-developers`, `seo-firms`) or a full Clutch.co URL, including country and city cuts like `id/web-developers` or `web-designers/lagos`.
2. It walks the listing page by page, reading every agency row.
3. It labels each row by why it is on the page — ranked result, sponsor, or a pinned block — and drops the repeats.
4. Optionally it opens profiles for the full detail, or collects the client reviews.
5. Results land in the dataset as they are found.

You do not manage scrapers, browsers, accounts or blocks.

### Modes

| Mode | What you get | Typical cost |
|---|---|---|
| `directory` | One record per agency in a category, with all lead attributes | 1 request ≈ 50 ranked agencies |
| `profile` | One agency in full: founding year, full address, service / focus / industry splits, certifications | 1 request per agency |
| `reviews` | One record per client review, with four sub-scores, project size and length | 1 request ≈ 10 reviews |
| `categories` | Every directory URL on the site (~70,000), split into country and city cuts | 2 requests ≈ 10,000 URLs |
| `reference` | A health check: is the source live and still shaped the way this actor expects | ~17 requests |

### Input

```json
{
  "mode": "directory",
  "categories": ["web-developers"],
  "maxPages": 3,
  "includePinnedRows": false,
  "includePaidPlacements": true,
  "maxItems": 0,
  "proxyConfiguration": { "useApifyProxy": false }
}
```

| Field | Type | Description |
|---|---|---|
| `mode` | string | `directory`, `profile`, `reviews`, `categories` or `reference`. Default `directory`. |
| `categories` | array | Directory slugs or full Clutch.co URLs. `web-developers` is the global ranking, `id/web-developers` the Indonesian cut, `web-designers/lagos` the city cut. |
| `maxPages` | integer | Listing pages to walk per category. A page holds about 50 ranked agencies; `web-developers` alone runs to 1,933 pages. |
| `includePinnedRows` | boolean | Off by default. Clutch repeats a 30-row "Leaders Matrix" and a featured block on every page; turning this on adds them once per category. |
| `includePaidPlacements` | boolean | On by default. Sponsor rows are kept but flagged, so you can filter them out downstream. |
| `profileUrls` | array | Profile slugs or URLs, e.g. `cleveroad`. Required by `profile` and `reviews`. |
| `maxReviewPages` | integer | Review pages per profile, about 10 reviews each. Stops early when a page brings nothing new. |
| `categoryFilter` | string | `categories` mode — keep only URLs containing this text, e.g. `seo` or `/id/`. |
| `maxSitemapShards` | integer | `categories` mode — the index is split into 7 shards of 10,000 URLs. One is usually plenty. |
| `maxItems` | integer | Hard cap on records for the whole run. `0` means no cap. |
| `proxyConfiguration` | object | Optional. Off by default. Turn on Residential proxy if a run is refused. |

### Output

#### `directory` — one agency row

```json
{
  "recordType": "PROVIDER",
  "providerId": "29455",
  "name": "Cleveroad",
  "profileUrl": "https://clutch.co/profile/cleveroad",
  "profileSlug": "cleveroad",
  "website": "https://www.cleveroad.com/offer/?utm_source=clutch.co&utm_medium=referral&utm_campaign=web-developers",
  "websiteDomain": "cleveroad.com",
  "summary": "Cleveroad is a versatile web development company known for its proficiency in Custom Website Development and Web Application Development. With a 100% positive feedback rate, clients commend their responsive project management and high-quality code across diverse projects…",
  "rowType": "Directory",
  "positionOnPage": 44,
  "pageNumber": 1,
  "isPaidPlacement": false,
  "isPinnedBlock": false,
  "isRankedResult": true,
  "rating": 4.9,
  "reviewCount": 81,
  "isVerified": true,
  "minProjectSize": "$10,000+",
  "hourlyRate": "$25 - $49 / hr",
  "priceRange": "$25 - $49",
  "employees": "250 - 999",
  "location": "New York, NY",
  "addressLocality": "New York",
  "addressRegion": "NY",
  "addressCountry": "US",
  "postalCode": "10016",
  "streetAddress": "2 Park Avenue",
  "telephone": "+14152313721",
  "services": [
    { "service": "Web Development", "percent": 30.0 },
    { "service": "Custom Software Development", "percent": 30.0 },
    { "service": "Mobile App Development", "percent": 10.0 },
    "… 6 more"
  ],
  "categoryUrl": "https://clutch.co/web-developers",
  "totalCompaniesClaim": 96607,
  "lastPageInPager": 1933,
  "_input": "web-developers",
  "_source": "clutch-directory",
  "_scrapedAt": "2026-09-18T07:02:03Z"
}
```

| Field | Type | Description |
|---|---|---|
| `providerId` | string | Clutch's own id for the agency, stable across categories and pages. |
| `name` / `profileUrl` / `profileSlug` | string | Agency name and its Clutch profile. The slug feeds straight back into `profile` or `reviews` mode. |
| `website` / `websiteDomain` | string | The agency's real site, and the bare domain for matching against your CRM. |
| `rowType` | string | `Directory` (the ranking), `Sponsor`, `featured`, or `Leaders Matrix`. |
| `isRankedResult` | boolean | True only for rows that are part of the category's actual ranking. |
| `isPaidPlacement` | boolean | True for sponsored and featured rows. |
| `isPinnedBlock` | boolean | True for rows Clutch repeats on every page. |
| `rating` / `reviewCount` / `isVerified` | number / integer / boolean | Reputation on Clutch. |
| `minProjectSize` | string | The floor the agency accepts, e.g. `$10,000+`. |
| `hourlyRate` / `priceRange` | string | Rate band, with and without the `/ hr` suffix. |
| `employees` | string | Headcount band, e.g. `250 - 999`. |
| `location`, `addressLocality`, `addressRegion`, `addressCountry`, `postalCode`, `streetAddress`, `telephone` | string | Where the agency is and how to reach it. |
| `services` | array | Service lines with the share of work each represents. |
| `totalCompaniesClaim` / `lastPageInPager` | integer | How big the category is and how deep it goes. |

#### `profile` — one agency in full

```json
{
  "recordType": "PROFILE",
  "profileUrl": "https://clutch.co/profile/cleveroad",
  "providerUuid": "6b034f73-5ac1-4f6b-a88e-20b3883e6dc7",
  "name": "Cleveroad",
  "website": "https://www.cleveroad.com",
  "description": "Cleveroad is a custom software development and IT consulting company. Since 2011 we have built 300+ web, mobile, and AI-driven products for startups, scaleups, and enterprises across Healthcare, Fintech, Logistics, Education, Sports, and Media…",
  "telephone": "+14152313721",
  "foundingDate": "2011",
  "priceRange": "$25 - $49",
  "rating": 4.9,
  "reviewCount": 81,
  "addressLocality": "New York, United States",
  "minProjectSize": "$10,000+",
  "hourlyRate": "$25 - $49 / hr",
  "employees": "250 - 999",
  "locations": "New York, NY +4",
  "yearFounded": "Founded 2011",
  "languages": "3 Languages",
  "timezones": "38 Timezones",
  "servicesOffered": ["Custom Software Development", "Web Development", "Mobile App Development", "… 6 more"],
  "serviceLines": [
    { "name": "Custom Software Development", "percent": 30.0, "categoryUrl": "https://clutch.co/developers", "isCertified": true },
    { "name": "Web Development", "percent": 30.0, "categoryUrl": "https://clutch.co/web-developers", "isCertified": true }
  ],
  "focusAreas": [
    { "name": "AI Recommendation Systems", "percent": 20.0, "group": "group_ai_focus", "groupLabel": "AI Expertise" },
    { "name": "Angular", "percent": 25.0, "group": "group_pp_fw_group", "groupLabel": "Frameworks and CMS" }
  ],
  "reviewsOnPage": 10
}
```

| Field | Type | Description |
|---|---|---|
| `providerUuid` | string | Clutch's long-form id for the agency. |
| `description` | string | The agency's own pitch. |
| `foundingDate` / `yearFounded` | string | When it started. |
| `locations`, `languages`, `timezones` | string | Coverage, as the profile states it. |
| `servicesOffered` | array | The service catalogue. |
| `serviceLines` | array | Service split with percentages and the Clutch category for each line. |
| `focusAreas` | array | Finer breakdown — frameworks, platforms, AI expertise. Each group is scored out of 100 on its own, and `groupLabel` tells you which group an entry belongs to. |
| `industries` | array | Industry split with percentages. |
| `certification`, `credentials` | string / array | Clutch verification tier and per-service certifications with their dates. |

#### `reviews` — one client review

```json
{
  "recordType": "REVIEW",
  "reviewId": "94870",
  "profileSlug": "cleveroad",
  "providerName": "Cleveroad",
  "title": "Quality Management Software for Medical Device Consultants",
  "isFeatured": true,
  "rating": 5.0,
  "ratingQuality": 5.0,
  "ratingSchedule": 5.0,
  "ratingCost": 5.0,
  "ratingWillingToRefer": 5.0,
  "services": ["Custom Software Development"],
  "projectSize": "$50,000 to $199,999",
  "projectLength": "July 2020 - Ongoing",
  "quote": "\"Cleveroad is fantastic at what they do.\"",
  "datePublished": "Oct 22, 2020",
  "reviewerPosition": "Sr. Solutions Lead, Medical Device Consultants",
  "reviewerName": "Anonymous",
  "isVerifiedReviewer": true,
  "providerReviewCount": 81
}
```

| Field | Type | Description |
|---|---|---|
| `reviewId` | string | Stable id for the review. |
| `ratingQuality`, `ratingSchedule`, `ratingCost`, `ratingWillingToRefer` | number | The four sub-scores behind the headline rating. |
| `projectSize` / `projectLength` | string | What the client spent and how long the engagement ran. `Confidential` when withheld. |
| `reviewerPosition` / `reviewerName` | string | Role and company of the reviewer, as published. `Anonymous` when the client withheld it. |
| `providerReviewCount` | integer | Total reviews the profile claims, so you can check coverage. |

#### `categories` — a directory URL

```json
{
  "recordType": "CATEGORY",
  "categoryUrl": "https://clutch.co/kr/web-developers/seoul",
  "path": "/kr/web-developers/seoul",
  "countryCode": "kr",
  "categorySlug": "web-developers",
  "refinements": ["seoul"],
  "depth": 3,
  "isRootCategory": false
}
```

### Notes and limits

- **Page 1 is the first page of the listing.** Clutch's own `?page=1` link actually shows page 2 — this actor works around it, so `maxPages: 3` really means the first three pages.
- **Page 1 of a busy category is mostly advertising.** `/web-developers` page 1 carries 86 rows of which only 7 are ranked results; from page 2 on it settles at about 50 ranked rows per page. Ranked rows are emitted first, so a run with `maxItems` gets the ranking rather than the sponsors.
- **The Leaders Matrix repeats.** ~30 agencies appear on every page of a category. They are off by default and deduplicated when on.
- **Reviews are paginated about 10 at a time**, and the featured review repeats on each page. Duplicates are removed automatically.
- **Filtered listing URLs are not requested.** Clutch asks crawlers not to fetch its filter URLs (`sort_by`, `hourly_rate`, `industries`, and similar). If you paste one, those parameters are dropped and the run logs it.
- Turn on Residential proxy in the input if a run is refused; it is not needed by default.

### Other actors

| Actor | What it does |
|---|---|
| `shopify-store-analyzer` | Products, themes and apps of any Shopify store |
| `ecommerce-platform-market-share-scraper` | Platform market share and store migration trends |
| `google-maps-lead-generation-scraper` | Business leads with contact details from Maps |

# Actor input Schema

## `mode` (type: `string`):

directory = one record per agency from a category listing, with min project size, hourly rate, headcount, location, service mix, rating and website. profile = one agency in full, from the profile page. reviews = one record per client review, with the four sub-ratings, project size and project length. categories = the list of valid directory URLs, taken from the sitemap, so you can find inputs instead of guessing slugs. reference = check the source is live and report what it returns today.

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

Directory slugs or full clutch.co URLs. A slug such as 'web-developers' or 'seo-firms' is the global ranking; 'id/web-developers' is the Indonesian cut and 'web-designers/lagos' the city cut. Run mode=categories to list what exists (roughly 70,000 directory URLs). Used by directory and reference modes.

## `maxPages` (type: `integer`):

Pages of the listing to walk. A page carries about 50 ranked agencies; /web-developers alone has 1,933 pages. Page 1 is the bare URL - the site's own ?page=1 returns page 2, and this Actor works around that.

## `includePinnedRows` (type: `boolean`):

Off by default. A category page repeats a 30-row Leaders Matrix and a 14-row featured block on EVERY page - the same agencies, identical markup. They are deduplicated anyway, so turning this on adds those rows once per category rather than once per page.

## `includePaidPlacements` (type: `boolean`):

On by default. Sponsor rows are 43 of the 86 rows on page 1 of a busy category. They are kept but labelled with isPaidPlacement=true, so you can tell a bought slot from an earned rank.

## `profileUrls` (type: `array`):

Profile slugs or full URLs, e.g. 'imaginovation' or 'https://clutch.co/profile/imaginovation'. Required by the profile and reviews modes.

## `maxReviewPages` (type: `integer`):

Reviews mode only. A profile page shows about 10 reviews per page. The run stops early once a page carries no new review.

## `categoryFilter` (type: `string`):

Categories mode only. Keep only URLs containing this text, e.g. 'seo' or '/id/'. Leave empty for everything in the shard.

## `maxSitemapShards` (type: `integer`):

Categories mode only. The sitemap is split into 7 shards of 10,000 URLs each. One shard is usually plenty.

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

Hard cap on records pushed for the whole run. 0 means no cap beyond the page limits above.

## `tlsProfile` (type: `string`):

Leave empty. The actor tries several connection profiles and remembers the one the source accepts, which differs between your own network and Apify's. Set this only to force one while debugging.

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

Optional, off by default - the source answers direct connections from both your own network and Apify. Turn it on and pick Residential only if a run starts getting refused.

## Actor input object example

```json
{
  "mode": "directory",
  "categories": [
    "web-developers"
  ],
  "maxPages": 3,
  "includePinnedRows": false,
  "includePaidPlacements": true,
  "profileUrls": [
    "imaginovation"
  ],
  "maxReviewPages": 3,
  "maxSitemapShards": 1,
  "maxItems": 0,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

All agency, profile, review, category, reference and error records produced by this run.

# 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 = {
    "categories": [
        "web-developers"
    ],
    "maxPages": 3,
    "profileUrls": [
        "imaginovation"
    ],
    "maxReviewPages": 3,
    "categoryFilter": "",
    "maxSitemapShards": 1,
    "maxItems": 0,
    "tlsProfile": ""
};

// Run the Actor and wait for it to finish
const run = await client.actor("fanndev/clutch-agency-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 = {
    "categories": ["web-developers"],
    "maxPages": 3,
    "profileUrls": ["imaginovation"],
    "maxReviewPages": 3,
    "categoryFilter": "",
    "maxSitemapShards": 1,
    "maxItems": 0,
    "tlsProfile": "",
}

# Run the Actor and wait for it to finish
run = client.actor("fanndev/clutch-agency-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 '{
  "categories": [
    "web-developers"
  ],
  "maxPages": 3,
  "profileUrls": [
    "imaginovation"
  ],
  "maxReviewPages": 3,
  "categoryFilter": "",
  "maxSitemapShards": 1,
  "maxItems": 0,
  "tlsProfile": ""
}' |
apify call fanndev/clutch-agency-directory-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fanndev/clutch-agency-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/ezciQR9VzUaK4AeYd/builds/zFPg1CWQhA8DpLWyO/openapi.json
