# Clutch Agency Lookup: agency directory & ratings API from $3/1k (`accountable_eel/clutch-agency-lookup`) Actor

Clutch.co agency profile lookup by URL or slug: rating, review count, min. project size, hourly rate, employee count, founding year, location, and service-line breakdown, straight from the agency's own Clutch profile. One row per agency. Never charged for a miss.

- **URL**: https://apify.com/accountable\_eel/clutch-agency-lookup.md
- **Developed by:** [Adrian Voss](https://apify.com/accountable_eel) (community)
- **Categories:** Lead generation, Developer tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.28 / 1,000 agency profile founds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

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

## Clutch Agency Lookup: agency directory & ratings API from $3/1k

You give this actor a list of Clutch.co agency profile URLs (or bare slugs). For each one, it
fetches the agency's own Clutch profile and returns rating, review count, minimum project size,
hourly rate band, employee count, founding year, headquarters location, and the service-line
breakdown Clutch itself shows on the page — one flat row per agency, straight from the profile,
no third-party database in between.

### Who it's for

You're building a vetted shortlist of agencies — a marketing lead pulling comparison data on ten
SEO firms before a pitch, an agency ops team tracking how its own Clutch rating and review count
move month to month, or a procurement analyst screening vendors by hourly rate and minimum project
size before a call gets booked. Any of those is normally a copy-paste-by-hand job across a dozen
open tabs; here it's a list in, a table out.

### Why this one

- **Reads the live profile, not a cached snapshot.** Every run fetches the agency's current
  Clutch page — a rating that moved last week or a hourly-rate band the agency just updated
  shows up on the next run, not next quarter.
- **The full stat block in one row.** Rating, review count, minimum project size, hourly rate,
  employee count, founding year, headquarters, and service-line mix — the same numbers Clutch
  puts in its own profile-summary widget, parsed straight out of it.
- **Never charged for a miss.** A slug that doesn't resolve to a real profile, or a request that
  gets blocked, still returns a row explaining why — and costs nothing.
- **Bare slug or full URL, your choice.** Paste `thrive-internet-marketing-agency` or
  `https://clutch.co/profile/thrive-internet-marketing-agency` — both normalize to the same
  lookup.

### What you get

| Field | Type | Description |
|---|---|---|
| `query` | text | The URL or slug you submitted, echoed back |
| `found` | boolean | `true` if a real agency profile was found |
| `status` | text | `OK` on a match; `NOT_FOUND` or `BLOCKED` on a miss |
| `message` | text | Plain-English reason for a miss — only present when `found` is `false` |
| `scrapedAt` | ISO 8601 datetime | When the profile was fetched |
| `name` | text | Agency name |
| `url` | link | Agency's own website (as declared on its Clutch profile) |
| `rating` | number | Overall Clutch rating (out of 5) |
| `reviewCount` | number | Number of Clutch reviews behind that rating |
| `minProjectSize` | text | Minimum project size Clutch lists for this agency, e.g. `$1,000+` |
| `hourlyRate` | text | Hourly rate band, e.g. `$100 - $149 / hr` |
| `employees` | text | Employee count band, e.g. `10 - 49` |
| `founded` | number | Founding year |
| `location` | text | Headquarters city/country, as shown on the profile |
| `services` | array | Service-line breakdown Clutch shows for this agency, e.g. `["Search Engine Optimization", "Pay Per Click"]` |
| `clutchUrl` | link | The canonical clutch.co profile URL that was fetched |

Deselect any field in the Input tab's column picker to drop it from every row — `query`, `found`,
`status`, `message`, and `scrapedAt` always stay.

### Price

Pay-per-event. A flat per-run fee covers session/proxy warmup; you're billed
per item only when data is actually found and returned — see
`.actor/pay_per_event.json` for exact prices. A miss is never charged.

1,000 agency lookups: **~$3** if every profile resolves, less for any misses, less again on a
paid Apify plan. A miss — a bad slug, a profile that no longer exists, a blocked request — is
never billed.

### How to use

1. **In the Apify Console.** Open the actor page and click **Start** — the `profiles` field is already pre-filled with a working example. Results land in the run's dataset as soon as each item is found.
2. **Via the API.** Call it directly with a POST request — no Console needed once you have an API token:
   ```bash
   curl "https://api.apify.com/v2/acts/accountable_eel~clutch-agency-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
     -X POST \
     -H "Content-Type: application/json" \
     -d '{"profiles":["thrive-internet-marketing-agency"]}'
   ```
3. **On a schedule.** Save this actor as an Apify **Task** with the input you want, then add a **Schedule** (hourly, daily, weekly) so it runs on its own — no server of your own required.

1) Open the Input tab and paste your list of Clutch profile URLs or slugs into "Clutch.co agency
   profile URLs or slugs" — one per line.
2) Leave "Try it first" on for your first run — it caps the run at 5 agencies so you can check the
   output shape before spending on the full list.
3) Optionally narrow "Which columns do you want?" to just the fields you need, or set "Only keep
   rows containing" / "Skip rows containing" to filter by keyword (e.g. a service name or city).
4) Turn "Try it first" off and press Start to run the full list.

### Input

```json
{
  "profiles": [
    "thrive-internet-marketing-agency"
  ]
}
```

One agency per line — a full clutch.co profile URL, or just the slug from it (the part after /profile/). Accepted formats: https://clutch.co/profile/thrive-internet-marketing-agency, thrive-internet-marketing-agency.

### Sample output

| query | found | status | name | url | rating | reviewCount | minProjectSize | hourlyRate | employees | founded | location | services | clutchUrl | scrapedAt |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| thrive-internet-marketing-agency | true | OK | <agency name> | <agency website> | <clutch rating> | <review count> | \<min. project size> | <hourly rate> | <employees> | <founded> | <location> | <services> | \<clutch.co profile url> | 1970-01-01T00:00:00.000Z |

A slug that doesn't resolve to a real profile gets a row with `found: false` and a `status`/
`message` explaining why, and is never charged.

### Use it from Clay, n8n, Make, or an AI agent

This actor runs synchronously over plain HTTP — call it directly from a script, a workflow tool, or an AI agent, no Apify Console needed once you have an API token.

```bash
curl "https://api.apify.com/v2/acts/accountable_eel~clutch-agency-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>" \
  -X POST \
  -H "Content-Type: application/json" \
  -d '{"profiles":["thrive-internet-marketing-agency"]}'
```

**n8n.** Add an HTTP Request node: Method `POST`, URL `https://api.apify.com/v2/acts/accountable_eel~clutch-agency-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>`, Body Content Type `JSON`, JSON Body `{"profiles":["thrive-internet-marketing-agency"]}` (swap in an expression from an earlier node for a real value).

**Clay.** Add an "HTTP API" column: Method `POST`, URL `https://api.apify.com/v2/acts/accountable_eel~clutch-agency-lookup/run-sync-get-dataset-items?token=<YOUR_TOKEN>`, Body `{"profiles":["{{agency}}"]}`, mapping the row's agency into the `profiles` array.

**MCP.** In Claude, Cursor, or any MCP client with the Apify MCP server, ask for "Clutch Agency Lookup: Ratings API from $3/1k" — the agent will find and run this actor.

### Tips

- Paste the bare slug (the part of the URL after `/profile/`) if you already have it — it saves
  nothing on price, but it's one less thing to copy correctly.
- If a well-known agency comes back `NOT_FOUND`, double-check the slug against the agency's actual
  Clutch URL — Clutch slugs don't always match a company's common name (e.g. an agency doing
  business as "Foo Marketing" might be listed under a legal-entity-derived slug).
- Run "Try it first" on a handful of agencies you already know the numbers for, to sanity-check
  the output against what you can see on the profile page yourself.
- `services` reflects Clutch's own service-line percentages for that agency — useful for a quick
  "is this primarily an SEO shop or a web-design shop" read without opening the page.

### vs. alternatives

| | What it costs | What you get | Trade-off |
|---|---|---|---|
| **This actor** (`clutch-agency-lookup`) | $0.003 per found row (FREE tier, less on paid tiers), plus a $0.00005 actor start, nothing for a miss | One row per agency — rating, reviews, minimum project size, hourly rate, employees, founded year, location, and service-line mix, read live from the agency's own Clutch profile | Only what the agency's own profile page shows; no historical rating trend and no full review text |
| **memo23/apify-clutch-cheerio** | Not publicly priced per row (n/d) | The closest existing Clutch scraper on Apify Store, 191 users, 4.60 rating | Established incumbent — this actor is the same category of extraction, priced per row instead |
| Doing it yourself | Your time + working around Clutch's Cloudflare gate on every request | The same data | Rate limits, a Cloudflare wall on a bare fetch, and re-testing selectors as Clutch's markup shifts are the maintenance burden this actor absorbs |

Prices for third-party tools are their published list prices as of September 2026 and are not
tracked here — check the vendor before relying on the comparison.

### FAQ

**Why is a row empty, or why does `found` say `false`?**
Either the slug doesn't match a real Clutch profile (`status: NOT_FOUND`) or the request was
blocked (`status: BLOCKED`, usually a Cloudflare challenge). Check the `message` column for the
specific reason. Neither is billed.

**Am I charged for a miss?**
No. `Actor.charge()` only fires when a real agency profile is parsed. A bad slug or a blocked
request produces a row (unless you turn on "Hide rows with no result") and costs nothing.

**Is this a live check or a stored database?**
Live. Every run fetches the agency's current Clutch profile — there's no cached snapshot behind
it. A rating or review count that changed since your last run will show the new value.

**Do I need to configure proxies?**
No. Clutch fronts its profile pages with Cloudflare, so this actor ships with the UNBLOCKER proxy
group as its default — there's nothing to set up unless you want to override it.

**Can an AI agent call this directly?**
Yes. It's registered on the Apify MCP server — an agent in Claude, Cursor, or another MCP client
can find and run it by name ("Clutch Agency Lookup"), or you can call the REST endpoint shown
above from any script or workflow tool.

### Related actors

- [Shopify Store Lookup](https://apify.com/accountable_eel/shopify-store-lookup) — confirm whether
  a company runs Shopify and pull its storefront catalogue.
- [LinkedIn Ads Presence Lookup](https://apify.com/accountable_eel/linkedin-ads-presence-lookup) —
  check whether a company or brand is currently running LinkedIn Ads.
- [Tech Stack Lookup](https://apify.com/accountable_eel/tech-stack-lookup) — detect a website's
  CMS, framework, analytics, and marketing stack from its own HTML and headers.

# Actor input Schema

## `profiles` (type: `array`):

One agency per line — a full clutch.co profile URL, or just the slug from it (the part after /profile/). Accepted formats: https://clutch.co/profile/thrive-internet-marketing-agency, thrive-internet-marketing-agency. You're only charged for the ones we actually find — a miss costs nothing.

## `testRun` (type: `boolean`):

Turn this on to test your input on a small sample before running the full list. Turn it off to process everything.

## `onlyFound` (type: `boolean`):

Only keep rows where something was actually found. Misses are always free, whether or not you show them here.

## `includeKeywords` (type: `array`):

Optional. Only keep results that mention at least one of these words (e.g. a job title, a city, a product name). Leave empty to keep everything.

## `excludeKeywords` (type: `array`):

Optional. Drop any result that mentions one of these words. Leave empty to skip nothing.

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

Optional. Stop the run once this many results have been found — useful for a quick, cheap sample. Leave blank for no limit.

## `columns` (type: `array`):

Choose which pieces of information to include in each result row. All are included by default.

## `maxConcurrency` (type: `integer`):

Parallel requests. Keep conservative — this target has no browser fallback, so getting blocked costs more than slow-and-steady.

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

Apify Proxy config. Residential recommended for anti-bot-sensitive targets.

## Actor input object example

```json
{
  "profiles": [
    "thrive-internet-marketing-agency"
  ],
  "testRun": false,
  "onlyFound": false,
  "includeKeywords": [],
  "excludeKeywords": [],
  "columns": [
    "name",
    "url",
    "rating",
    "reviewCount",
    "minProjectSize",
    "hourlyRate",
    "employees",
    "founded",
    "location",
    "services",
    "clutchUrl"
  ],
  "maxConcurrency": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}
```

# 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 = {
    "profiles": [
        "thrive-internet-marketing-agency"
    ],
    "includeKeywords": [],
    "excludeKeywords": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("accountable_eel/clutch-agency-lookup").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 = {
    "profiles": ["thrive-internet-marketing-agency"],
    "includeKeywords": [],
    "excludeKeywords": [],
}

# Run the Actor and wait for it to finish
run = client.actor("accountable_eel/clutch-agency-lookup").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 '{
  "profiles": [
    "thrive-internet-marketing-agency"
  ],
  "includeKeywords": [],
  "excludeKeywords": []
}' |
apify call accountable_eel/clutch-agency-lookup --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,accountable_eel/clutch-agency-lookup"
        }
    }
}
```

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/Cxx9JucKVC3abbsnF/builds/rqfqqhEBzB1LwqUet/openapi.json
