# Clutch.co Agency Reviews Scraper (`morkerr/clutch-co-agency-reviews-scraper`) Actor

Scrape client reviews posted on Clutch.co agency profiles. Collect review ratings, text, project details, reviewer information, and company ratings, with filters for location, review score, and company size.

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

## Pricing

from $10.00 / 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 Reviews Scraper — Company Profiles, Client Reviews & Project Details

Scrape Clutch.co directory and company profile pages to collect agency profiles and client reviews. Each dataset row represents one review and includes available company ratings, project details, reviewer information, and profile links. Filter results by company rating, review count, hourly rate, employee range, location, and individual review rating.

### Run on Apify

1. Open the actor in Apify Console and select **Run**.
2. Add one or more URLs under **Clutch URLs**. You can mix directory and company profile URLs in a single run.
3. Set any company or review filters, page limits, and proxy options.
4. Start the run, then view or export the default dataset as JSON, CSV, or Excel.

Apify's automated test environment is detected automatically. In that environment, the actor writes one clearly labeled synthetic record and exits without opening a browser or requesting Clutch pages. Regular runs continue to scrape the supplied URLs.

Example inputs:

- Directory: `https://clutch.co/agencies/digital-marketing`
- Company profile: `https://clutch.co/profile/ignite-visibility`
- Review section: `https://clutch.co/profile/ignite-visibility#reviews`
- Specific review page: `https://clutch.co/profile/ignite-visibility?page=2#reviews`

The actor identifies company profile URLs by the `/profile/` path. Other Clutch URLs are treated as directory pages. It follows each page’s **Next** link and honors the configured page limits.

### Input options

| Input | Default | Description |
| --- | ---: | --- |
| Clutch URLs | Digital Marketing directory and Ignite Visibility profile | Directory pages and/or company profile pages. |
| Maximum directory pages | 100 | Upper limit per directory. The actor can stop earlier when it has queued the maximum number of companies. Range: 1–500. |
| Maximum companies | 100 | Maximum number of unique company profiles to visit in a run. Range: 1–10,000. |
| Maximum reviews per company | 100 | Maximum matching review rows emitted per company. Set to `0` to remove this row limit; review-page limits still apply. |
| Maximum review pages per company | 100 | Upper limit on review pages visited for each company. Range: 1–500. |
| Page timeout | 60 seconds | Maximum navigation time for each page. Range: 10–300 seconds. |
| Wait for CAPTCHA or security challenge | 10 seconds | How long to wait for a detected Clutch/Cloudflare challenge to clear automatically. Range: 0–120 seconds. The actor does not solve CAPTCHAs. |
| Proxy configuration | Disabled | Optional Apify Proxy configuration. Proxy use may incur charges on your Apify account. |

#### Company filters

Company filters are optional and are combined with **AND** logic:

- **Minimum company rating**: Clutch’s overall company rating, from 0 to 5.
- **Minimum company review count**: total Clutch reviews for the company.
- **Minimum and maximum hourly rate**: a company passes when its published hourly-rate range overlaps the selected range. A maximum of `0` means no upper limit.
- **Minimum and maximum employees**: a company passes when its published employee range overlaps the selected range. A maximum of `0` means no upper limit.
- **Company location contains**: case-insensitive text match, such as `United States`, `San Diego`, or `London`.

When a company filter is active but Clutch does not provide the value needed to evaluate it, that company does not pass the filter.

#### Review filters

- **Minimum and maximum individual review rating**: only matching review rows are output. Ratings range from 0 to 5; a maximum of `0` means no upper limit.
- Company filters are evaluated before reviews are output. Review-rating filters apply to reviews across all pages visited for that company.

**Maximum companies** limits how many profile pages are visited, not how many companies pass the filters. For a directory with narrow company filters, raise this limit if you want the actor to evaluate more listings. It stops discovering additional listings once the limit is queued, so the actor does not crawl a very large directory just to find later matches.

### Output

The dataset contains one row per matching review. Fields not provided on Clutch are empty or `null`.

The dataset item fields and the `Clutch Company Reviews` table view are defined in [`.actor/dataset_schema.json`](.actor/dataset_schema.json). The actor output link is defined in [`.actor/OUTPUT_SCHEMA.json`](.actor/OUTPUT_SCHEMA.json) and points to the run's default dataset.

#### Company fields

- `companyName`, `profileUrl`
- `companyRating`, `companyReviewCount`
- `hourlyRate`, `employeeRange`, `companyLocation`

#### Review and project fields

- `reviewId`, `reviewUrl`, `reviewTitle`, `reviewRating`, `reviewDate`, `reviewText`
- `projectServices`, `projectFocusAreas`, `projectSize`, `projectLength`
- `projectSummary`, `feedbackSummary`
- `qualityRating`, `scheduleRating`, `costRating`, `willingToReferRating`

#### Reviewer fields

- `reviewerName`, `reviewerTitle`, `reviewerCompany`
- `reviewerIndustry`, `reviewerLocation`, `reviewerClientSize`
- `reviewerType`, `reviewerVerified`

Service and focus-area values are returned as comma-separated strings. `reviewText` combines the visible review quote with the project and feedback summaries when available; it is not a transcription of every question and answer in the expanded review interview.

### Local development and deployment

From this folder:

```bash
npm install
npm start
```

To publish a build with the included deployment script, set `APIFY_TOKEN` in your environment and run:

```bash
node deploy.js
```

The script creates or updates the `clutch-reviews-actor` actor and builds its `latest` tag.

### Troubleshooting

- **No companies found on a directory**: inspect the run log for the page title, heading, and detected card/link counts. If Clutch served a security challenge, the log will show that and the actor will continue with the listings already collected.
- **A company has no review rows**: check the log for challenge messages, `No review cards found`, active company filters, and review-rating filters. A profile can pass company filters but produce no output if no reviews match or Clutch blocks the page.
- **Partial results**: the run log reports companies attempted, companies with matching reviews, and companies with none or an inaccessible page. Clutch may block individual pages or change its markup, so a successful run can still contain partial data.
- **Slow run**: reduce **Maximum companies**, **Maximum reviews per company**, or **Maximum review pages per company**. Large directories and companies with many reviews require more page loads.

### Scraping notes

The actor reads publicly displayed directory and review-page data rendered by Clutch. Clutch can change its HTML structure, pagination, or anti-bot behavior, which may affect coverage. A configured proxy and CAPTCHA wait can help with access, but they do not guarantee that every page will be available.

# Actor input Schema

## `startUrls` (type: `array`):

Mix directory URLs and company profile URLs. The actor detects /profile/ URLs and scrapes their reviews; directory URLs are paginated to discover company profiles. #reviews and page query parameters are supported.

## `maxPagesPerDirectory` (type: `integer`):

Maximum listing pages to visit for each directory URL. Set lower to limit runtime; the actor stops early when a page has no companies.

## `maxCompanies` (type: `integer`):

Maximum company profiles to visit in one run.

## `maxReviewsPerCompany` (type: `integer`):

Set to 0 to collect every matching review across the pages allowed below.

## `maxReviewPagesPerCompany` (type: `integer`):

Maximum paginated review pages to visit for each company profile. Review rating filters apply across all visited pages; scraping stops at this page limit or the review-count limit.

## `minCompanyRating` (type: `number`):

Only include companies with at least this overall Clutch rating. 0 disables this filter.

## `minCompanyReviews` (type: `integer`):

Only include companies with at least this many Clutch reviews. 0 disables this filter.

## `minHourlyRate` (type: `integer`):

A company passes when its published hourly range overlaps this value.

## `maxHourlyRate` (type: `integer`):

A company passes when its published hourly range overlaps this value. 0 means no upper limit.

## `minEmployees` (type: `integer`):

A company passes when its published employee range overlaps this value.

## `maxEmployees` (type: `integer`):

A company passes when its published employee range overlaps this value. 0 means no upper limit.

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

Case-insensitive text match against the company location, e.g. United States or San Diego.

## `minReviewRating` (type: `number`):

Only output review records with at least this rating. 0 disables this filter.

## `maxReviewRating` (type: `number`):

0 means no upper limit.

## `pageTimeoutSecs` (type: `integer`):

Maximum navigation time for each Clutch page.

## `captchaWaitSecs` (type: `integer`):

When Clutch shows a CAPTCHA or browser verification challenge, wait this long for it to clear automatically before continuing. The actor does not solve CAPTCHAs.

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

Optional Apify Proxy. Enable it and choose available proxy groups or a country. Proxy usage may incur charges on your Apify account.

## Actor input object example

```json
{
  "startUrls": [
    "https://clutch.co/agencies/digital-marketing",
    "https://clutch.co/profile/ignite-visibility"
  ],
  "maxPagesPerDirectory": 100,
  "maxCompanies": 100,
  "maxReviewsPerCompany": 100,
  "maxReviewPagesPerCompany": 100,
  "minCompanyRating": 0,
  "minCompanyReviews": 0,
  "minHourlyRate": 0,
  "maxHourlyRate": 0,
  "minEmployees": 0,
  "maxEmployees": 0,
  "location": "",
  "minReviewRating": 0,
  "maxReviewRating": 0,
  "pageTimeoutSecs": 60,
  "captchaWaitSecs": 10,
  "proxyConfiguration": {
    "useApifyProxy": false,
    "apifyProxyGroups": []
  }
}
```

# Actor output Schema

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

Dataset containing one row per matching review, including company, project, and reviewer fields.

# 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 = {};

// Run the Actor and wait for it to finish
const run = await client.actor("morkerr/clutch-co-agency-reviews-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 = {}

# Run the Actor and wait for it to finish
run = client.actor("morkerr/clutch-co-agency-reviews-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 '{}' |
apify call morkerr/clutch-co-agency-reviews-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,morkerr/clutch-co-agency-reviews-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/TnHwH1JlmctHL8WKA/builds/4P1ceVtnDEdWEjVut/openapi.json
