Clutch.co Scraper - Agency Directory & B2B Company Data avatar

Clutch.co Scraper - Agency Directory & B2B Company Data

Pricing

from $5.00 / 1,000 returned rows

Go to Apify Store
Clutch.co Scraper - Agency Directory & B2B Company Data

Clutch.co Scraper - Agency Directory & B2B Company Data

Scrape B2B agencies from Clutch.co by category and location. Returns rating, reviews, hourly rate, min project size, employees and services. Pay only for rows returned.

Pricing

from $5.00 / 1,000 returned rows

Rating

0.0

(0)

Developer

Marknetic

Marknetic

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Clutch.co Scraper — Agency Directory & B2B Company Data

Extract B2B agencies from Clutch.co by category and location — ratings, review counts, hourly rates, minimum project sizes, headcount, and service mix — as structured JSON, CSV, or Excel.

Built for lead lists, competitor research, and market mapping.


Three guarantees

1. You pay per row returned. Nothing else.

No charge to start a run. No charge for a failed request, a blocked page, or a URL that turns out not to exist. If a run returns nothing, it costs you nothing — and the run summary says so in plain words.

2. Every field matches the page, or it is null.

A value is never inferred, never estimated, and never borrowed from a different field that happened to look similar. If Clutch shows an agency's minimum project size as Undisclosed, you get null and a reason — not a number invented from somewhere else on the page.

This is enforced in code, not by good intentions: every field declares which source keys may legally populate it, and each row ships with a _provenance block recording where each value came from.

3. Nothing is dropped silently.

Every requested URL is accounted for. If one cannot be fetched, it appears in the run summary with a reason (not_found, blocked, transient, permanent) instead of vanishing from your results. A short record and a missing record are different things, and you can tell them apart.


What you get

FieldExample
nameIgnite Visibility
profileUrlhttps://clutch.co/profile/ignite-visibility
rating4.8
reviewCount173
minProjectSize$1,000+
hourlyRate$100 - $149 / hr
employees250 - 999
locationSan Diego, CA
services[{ "service": "Search Engine Optimization", "percent": 40 }, …]
sourceUrlthe page the agency was found on
_provenancewhere each field came from, or why it is null

Real sample output

{
"name": "Ignite Visibility",
"profileUrl": "https://clutch.co/profile/ignite-visibility",
"rating": 4.8,
"reviewCount": 173,
"minProjectSize": "$1,000+",
"hourlyRate": "$100 - $149 / hr",
"employees": "250 - 999",
"location": "San Diego, CA",
"services": [
{ "service": "Search Engine Optimization", "percent": 40 },
{ "service": "Advertising", "percent": 10 },
{ "service": "Email Marketing", "percent": 10 },
{ "service": "Pay Per Click", "percent": 10 },
{ "service": "Social Media Marketing", "percent": 10 },
{ "service": "Web Design", "percent": 10 },
{ "service": "Web Development", "percent": 10 }
],
"sourceUrl": "https://clutch.co/us/agencies/digital-marketing",
"_provenance": {
"name": { "source": "dom", "key": "h3 a", "reason": null, "conflict": null },
"profile_url": { "source": "dom", "key": "a[href*=\"/profile/\"]", "reason": null, "conflict": null },
"rating": { "source": "dom", "key": ".sg-rating__number", "reason": null, "conflict": null },
"review_count": { "source": "dom", "key": ".sg-rating__reviews", "reason": null, "conflict": null },
"min_project_size": { "source": "dom", "key": ".min-project-size", "reason": null, "conflict": null },
"hourly_rate": { "source": "dom", "key": ".hourly-rate", "reason": null, "conflict": null },
"employees": { "source": "dom", "key": ".employees-count", "reason": null, "conflict": null },
"location": { "source": "dom", "key": ".location", "reason": null, "conflict": null },
"services": { "source": "dom", "key": ".provider__services-list-item", "reason": null, "conflict": null }
}
}

Every field is accounted for — that is the full block, not an excerpt.

An agency that withholds its numbers

The row keeps every key, and each null says why:

{
"name": "MAXIMUS",
"profileUrl": "https://clutch.co/profile/maximus",
"rating": null,
"reviewCount": null,
"minProjectSize": null,
"hourlyRate": "$100 - $149 / hr",
"employees": "1,000 - 9,999",
"location": "Reston, VA",
"services": [],
"sourceUrl": "https://clutch.co/profile/maximus",
"_provenance": {
"name": { "source": "dom", "key": "h1", "reason": null, "conflict": null },
"min_project_size": { "source": null, "key": null, "reason": "undisclosed", "conflict": null },
"hourly_rate": { "source": "dom", "key": "label \"Hourly rate\"", "reason": null, "conflict": null },
"rating": { "source": null, "key": null, "reason": "absent", "conflict": null },
"review_count": { "source": null, "key": null, "reason": "absent", "conflict": null },
"services": { "source": null, "key": null, "reason": "absent", "conflict": null },
"employees": { "source": "dom", "key": "label \"Employees\"", "reason": null, "conflict": null },
"location": { "source": "dom", "key": "label \"Locations\"", "reason": null, "conflict": null }
}
}

Read those two lines together — they are the guarantee in miniature:

  • min_project_size is null with reason undisclosed, because the page shows Undisclosed. This agency's page also carries a machine-readable priceRange of $100 - $149. That number is the hourly rate, so it is not eligible to fill the project minimum, and it does not. You get null, not a plausible-looking $100.
  • hourly_rate is populated from label "Hourly rate" — the value a human reads on the page — and the provenance names that source, so you can check it.

absent means Clutch publishes no value (this agency has no reviews yet). undisclosed means Clutch explicitly shows Undisclosed. Both are null — and you can tell which is which.


Reliability

Measured over 300 consecutive requests (26,361 agencies) through the same path this actor uses in production:

Requests succeeded300 of 300
Retries needednone — 1.00 attempts per request
Trend across the runflat — no drop-off from the first 30 requests to the last 30

Stated conservatively: at least a 99% success rate, with 95% confidence. The observed rate was 100%, but 300 requests cannot prove 100% — so the published number is the bound the evidence actually supports, not the number that reads best.

This is a snapshot from one run, not a promise about every future run.


Speed

Measured on the Apify platform, not estimated:

500 agencies25–61 seconds (two runs: 25.2 s and 60.9 s)
Per directory page74–95 agencies, ~3.6 s median
Memory used80–103 MB peak, at a 512 MB setting

Speed varies with how quickly Clutch responds, so the range above is both runs as measured rather than the better one.

Directory pages are read directly, so one request yields dozens of agencies rather than one. No browser is launched, which is why the runs are fast and the memory footprint is small.


Input

FieldDescription
Clutch.co URLsDirectory pages or agency profile URLs. Filter on Clutch.co, then paste the address bar.
Maximum agenciesStop after N agencies. Defaults to 500 (about $5.00). Pagination is followed automatically. 0 = no limit, but a full category can exceed 35,000 agencies.
{
"startUrls": [
{ "url": "https://clutch.co/us/agencies/digital-marketing" },
{ "url": "https://clutch.co/uk/agencies/social-media-marketing" }
],
"maxResults": 500
}

Both directory and profile URLs work:

  • https://clutch.co/us/agencies/digital-marketing — a whole category
  • https://clutch.co/us/agencies/digital-marketing/chicago — narrowed by city
  • https://clutch.co/profile/ignite-visibility — one specific agency

Category URLs are validated before the run starts

Clutch's category and location paths are not uniformly shaped — some city and industry combinations exist, and many do not. Rather than discovering that mid-run, directory URLs are checked against Clutch's own sitemap before any billable work.

A URL Clutch does not publish is reported in the run summary with a list of close matches, and costs you nothing. One bad URL does not sink the run — the valid ones are still scraped. If none of your URLs are valid there is nothing to scrape, so the run stops immediately and still charges nothing.


Typical uses

  • Agency lead lists — pull every digital marketing agency in a city with their rate band and headcount
  • Competitor tracking — monitor ratings and review counts across a category over time
  • Market research — service-mix percentages across hundreds of agencies in one export
  • Vendor shortlists — filter by minimum project size and hourly rate to match a budget

Notes

Only publicly visible directory information is collected — the same pages any visitor can browse. Query-parameter filter URLs that Clutch disallows in its robots.txt are not requested; filter by choosing the right category or location page instead.

A single category can hold 35,000+ agencies across 700+ pages. Maximum agencies defaults to 500 (about $5.00) precisely so a full category cannot run away with your budget by accident. It doubles as your cost ceiling, since you are charged per agency returned.


FAQ

What happens if the run finds nothing? It costs you nothing, and the run summary states that explicitly.

What if I mistype one of my URLs? The other URLs are still scraped. The bad one is listed in the run summary with suggested corrections, and you are not charged for it.

Why is a field null? Because Clutch does not show a value for it. Check _provenance for the reason: absent (not published), undisclosed (explicitly withheld), or unparseable (present but unreadable). The scraper will not guess.

Do I get the full service breakdown? Yes. Clutch visually collapses long lists behind a "+4 services" link; all of them are extracted, with percentages.

Are sponsored listings duplicated? No. Promoted placements repeat agencies that also appear organically; results are deduplicated by profile URL.

Can I set a spending cap? Two ways, and they work together. Maximum agencies in the input is your row ceiling — 500 rows is about $5.00. Apify's maximum cost per run is a hard currency cap, and the run reads it before it starts: it scrapes only as many agencies as your cap can cover, tells you that number in the log, and stops immediately without scraping anything if the cap will not cover even one row. You are never cut off mid-write, and never charged beyond the cap.

How fast is it? 500 agencies in 25–61 seconds across two measured runs. Directory pages carry 74–95 agencies each and take roughly 3.6 seconds apiece; the spread reflects Clutch's own response time.