Clutch Scraper - Companies, Ratings, Reviews & Pricing
Pricing
from $1.00 / 1,000 company results
Clutch Scraper - Companies, Ratings, Reviews & Pricing
Scrape Clutch company directories and profiles. Get names, ratings, review counts, hourly rate, min project size, employees, location, services, full reviews with reviewer details and per-criterion scores. Search and URL mode, 40+ fields per company.
Pricing
from $1.00 / 1,000 company results
Rating
0.0
(0)
Developer
Abot API
Maintained by CommunityActor stats
2
Bookmarked
11
Total users
6
Monthly active users
3 days ago
Last modified
Categories
Share
Clutch Scraper: Companies, Ratings, Reviews & Pricing
Clutch Scraper turns Clutch.co into structured company data. Point it at any Clutch directory, from web developers and SEO firms to marketing agencies and app developers, and get back rating, review count, hourly rate, minimum project size, employee range, location, services and reviews (up to a configurable limit) with reviewer details and per-criterion scores. Search by filters or paste directory links, then export to JSON, CSV or Excel, or pull the results straight into your app through the API.
Why This Scraper?
- Any Clutch directory in one actor. Pass a plain category name or a directory slug (web-developers, seo-firms, app-developers, it-services, pr-firms and more) and the actor builds the right listing URL for you.
- Full company profiles on demand. The base search already returns 20+ fields per company; turning on full profile details adds founding year, languages, office locations, reviews (up to the Max reviews limit, default 20) and the rating breakdown by criterion.
- Deep, structured reviews. Each review carries its quote, date, per-criterion scores (Quality, Schedule, Cost, Willing to Refer), the reviewer's role, industry, location and company size, the project size and length, and the full background, challenge, solution and results write-up.
- Two ways to start. Pick filters (directory, location, company size, service line, sort) or paste any Clutch directory URL. Minimum rating and minimum reviews narrow the results either way, since both are applied after fetching.
- Walks a whole directory on its own. Leave the page limit at its default and the actor keeps paging until the site runs out of results or a page repeats companies already seen, so you never have to guess how many pages exist.
- Resume and recurring monitoring. Continue an interrupted run without paying twice, or turn on incremental mode to get only the companies that are new, changed or gone on a repeat schedule.
- Refusals are handled for you. If the connection can't be established at all, the run stops with a clear message instead of quietly finishing empty; a refusal hit mid-run is retried automatically on a different connection.
Use Cases
- Agency and vendor selection: procurement and marketing teams comparing agencies by rating, hourly rate, minimum project size and location before requesting proposals.
- Competitive intelligence: agencies tracking their own and competitors' review counts, ratings and service mix over time.
- Lead generation: sales teams building outreach lists of service providers filtered by size, location or specialty.
- Market research: analysts studying pricing bands, review sentiment and service trends across a directory or industry.
- Review analytics: researchers and tool builders aggregating detailed review text and per-criterion scores for sentiment or NLP analysis.
Data You Get
Sample shape: values are illustrative placeholders, not from a live company.
| Field | Example |
|---|---|
id | "1963983" |
name | "Sample Agency LLC" |
slug | "sample-agency" |
clutchUrl | "https://clutch.co/profile/sample-agency" |
website | "https://example.com" |
rating | 4.8 |
reviewCount | 42 |
minProjectSize | "$25,000+" |
hourlyRate | "$100 - $149 / hr" |
employeeCount | "50 - 249" |
location | "New York, NY" |
verified | true |
services | ["45% Web Development", "45% Web Design", "10% Branding"] |
description | "Sample Agency builds websites and digital products for mid-market clients." |
yearFounded | 2010 |
contact.address | { "street": "1 Example St", "city": "New York", "region": "NY", "postal_code": "10000", "country": "US" } |
contactDetails | { "emails": ["hello@example.com"], "phone_numbers": ["1-000-000-0000"], "social_media": ["https://www.linkedin.com/company/example"] } |
detailedRatings | { "Quality": 4.8, "Schedule": 4.7, "Cost": 4.8, "Willing to Refer": 4.9 } |
insights | { "industries": { "industries": ["eCommerce", "Financial services"] }, "service_line_reviews": [ ... ] } |
reviews | [{ "quote": "Great team to work with.", "rating": 5.0, "reviewer": { ... }, "projectSize": "$10,000 to $49,999" }] |
sourceUrl | "https://clutch.co/web-developers" |
Each entry inside reviews is its own rich record: a quote, a date, a star rating, per-criterion scores (Quality, Schedule, Cost, Willing to Refer), the services covered and the project size and length, plus the reviewer's position, verification badge, industry, location and company size, and, when the profile page provides it, the full background, challenge, solution and results write-up.
How to Use
- Pick a mode: search (use filters) or url (paste Clutch directory links).
- For search mode, set the directory and any filters you want (location, company size, service line, sort). For URL mode, paste one or more Clutch directory URLs.
- Optionally set Min rating and Min reviews to narrow the results in either mode, and turn Fetch full profile details on or off.
- Set Max records (and optionally Max pages per list) to control run size and cost, then click Start.
Basic search (web developers worldwide):
{"mode": "search","directory": "web-developers","maxListings": 50}
Search filtered by location, company size, rating and review count:
{"mode": "search","directory": "seo-firms","location": "united-states","agencySize": "50_-_249","minRating": 4,"minReviews": 5,"maxListings": 100}
URL mode (paste any Clutch links -- directory, profile, or search):
{"mode": "url","urls": ["https://clutch.co/web-developers","https://clutch.co/profile/railsware"],"fetchDetails": true,"maxListings": 100}
URL shapes supported
Every shape below is routed correctly -- a URL that doesn't match any of them (a dead slug, a genuine 404) gets a loud warning in the run log naming the exact URL, never a silently empty result.
| Shape | Example | Behavior |
|---|---|---|
| Directory listing | https://clutch.co/web-developers | Walked as a normal paginated listing. |
| Nested directory | https://clutch.co/developers/php | Same listing walk, just a more specific category. |
| Country-scoped directory | https://clutch.co/us/web-developers | Most countries are a leading path segment. |
| Country-scoped directory (UK/India) | https://clutch.co/web-developers/uk | These two are a trailing segment instead of the ISO code -- handled automatically. |
| Filter query params + page | https://clutch.co/web-developers?agency_size=50%20-%20249&page=1 | Query params pass through; page continues from that page. |
| Company profile | https://clutch.co/profile/railsware | Returned as one fully enriched record (full profile fetch), not a listing. |
| Company profile, reviews anchor | https://clutch.co/profile/railsware?verified=true#reviews | Same as above -- the query/fragment is cosmetic; reviews are still collected up to Max reviews, reading extra pages if needed. |
| Clutch keyword search | https://clutch.co/search?q=web+design | A different, sparser template than a directory listing -- each resolved profile link is fetched and enriched individually. |
www host / utm_* params | https://www.clutch.co/web-developers?utm_source=newsletter | Normalised/ignored harmlessly; same listing as the bare host. |
| Dead slug / genuine 404 | https://clutch.co/us/new-york/web-developers | Loud NOT_FOUND warning naming the URL -- never a silent empty result. |
Recurring monitoring (schedule this and get only what changed):
{"mode": "search","directory": "web-developers","location": "united-states","maxListings": 0,"incrementalMode": true}
Run it from your code
Python:
from apify_client import ApifyClientclient = ApifyClient("<YOUR_APIFY_TOKEN>")run = client.actor("abotapi/clutch-directory-scraper").call(run_input={"mode": "search", "directory": "web-developers", "maxListings": 50})for company in client.dataset(run["defaultDatasetId"]).iterate_items():print(company["name"], company["rating"], company["reviewCount"])
JavaScript:
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: '<YOUR_APIFY_TOKEN>' });const run = await client.actor('abotapi/clutch-directory-scraper').call({mode: 'search',directory: 'web-developers',maxListings: 50,});const { items } = await client.dataset(run.defaultDatasetId).listItems();
Or connect it to Make, Zapier, n8n, Google Sheets or webhooks from the Integrations tab.
Result caps: maxListings and maxPages
Max records (maxListings, default 20) is the only real cap on a run: it stops once this many companies have been scanned (deduped and filter-passed), whether or not each one ends up being returned. Set it to 0 to remove the cap entirely. Max pages per list (maxPages) does not cap the run by itself, it only limits how many result pages are read per directory or URL; left at its default of 0, the actor walks every page of a directory until the site runs out of results or a page repeats companies already seen, then stops on its own. Set maxPages only if you want to additionally bound the pagination depth.
Resume and recurring updates
- Resume (
resumeFromRunId) continues one earlier run: give it a previous run id or dataset id from your account and the actor skips every company already collected there, so this run returns only the delta and you don't pay twice. Combine both datasets afterward for the full set. - Incremental mode (
incrementalMode) is for scheduling this actor repeatedly against the same search. Each company is classifiedNEW,UPDATED(withchangedFieldslisting what changed), orUNCHANGED(suppressed and not billed unlessemitUnchangedis on). A company is only markedEXPIREDon a run that completes a full, uncapped, non-resumed scan of the tracked search withemitExpiredturned on; a capped, interrupted or resumed run skips that detection for the run and keeps the previous state as is. Only a company previously markedEXPIREDthis way can later come back asREAPPEARED, on any later incremental run that finds it again. A company's rank on the directory page is ignored for change detection, since it shifts whenever an unrelated company is added or removed above it, so it never counts as a real change on its own; add more fields to ignore withignoreFieldsForChanges.stateKeynames or shares the tracked state; leave it empty and the actor derives one automatically from your active filters, so two different searches never share a baseline. With incremental mode off, output is exactly as before.
Send results into your apps (MCP connectors)
Optionally pipe the scraped results into the apps you already use, via Model Context Protocol (MCP) connectors. This is an extra delivery step after the scrape, the Apify dataset is never changed.
What gets written to the connector: a condensed, human-readable summary of each record, not the full JSON. Each item becomes one entry with a title and its key fields flattened to plain text. The complete record always stays in the Apify dataset.
- Authorize a connector once under Apify → Settings → Integrations (Notion, Linear, Airtable, or Apify).
- Select it in the "Pipe results into your apps" input field. (If the picker is empty, you haven't authorized a connector yet.)
- For Notion, also set
notionParentPageUrlto the page where items should be created.
The connection is mediated by Apify's MCP proxy, so this actor never sees your third-party credentials. Leave the field empty to skip.
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
mode | string | search | search builds a directory URL from the filters below; url uses the pasted links instead. |
directory | string | web-developers | A plain category name ("Web Developers", "SEO", "Mobile App Development") or a Clutch directory slug directly, including a nested one (developers/php). Live-verified slugs: web-developers, web-designers, developers, agencies, seo-firms, app-developers, it-services, pr-firms, call-centers, bpo, accounting, translation. Search mode only. |
location | string | none (prefill: empty) | Optional location to narrow results -- a plain name ("united states", "London", "India") or the exact Clutch path segment. Most countries are a leading segment; the UK and India are a handled exception, and New York, Los Angeles, Houston, Chicago, Ontario, London, Sydney and Dubai are recognised by name. Leave empty for worldwide. Search mode only. |
agencySize | string | none (prefill: empty) | Optional company-size filter -- one of Clutch's buckets: 2 - 9, 10 - 49, 50 - 249, 250 - 999, 1,000 - 9,999 employees (underscore/plain forms like 50_-_249 also work; the thousands comma is added automatically if left out). Leave empty for any size. Search mode only. |
relatedServices | string | none (prefill: empty) | Optional service-line filter -- a plain name ("Mobile App Development", "SEO", "Ecommerce Development") or the raw value directly, for example field_pp_sl_ecommerce. Leave empty for all services. Search mode only. |
sortBy | string | default | Result ordering: default, review_rating, reviews or date. Search mode only, since it reorders results the site returns. |
urls | array | none (prefill: one URL per supported shape) | One or more Clutch URLs -- see URL shapes supported below. URL mode only; the filter fields above are ignored. If a URL already includes a page number, results continue from that page. |
minRating | integer | none | Keep companies with at least this overall rating (0 to 5). Applied after fetching, so it narrows results in both search mode and URL mode. |
minReviews | integer | none | Keep companies with at least this many reviews. Applied after fetching, so it narrows results in both search mode and URL mode. |
fetchDetails | boolean | true | Open each company profile to add founding year, languages, locations, reviews (up to Max reviews) and the rating breakdown. Adds one request per record, plus one more per extra review page (see Max reviews). |
maxReviews | integer | 20 | How many reviews to collect per company (Clutch shows ~10-11 per profile page, so this may fetch one or more extra pages). Only applies when fetchDetails is on, in both search mode and URL mode (incl. a pasted company-profile URL). 0 skips extra review pages and keeps just the reviews already on the profile's first page. |
maxPages | integer | 0 | How many result pages to read per directory or URL. 0 walks the whole catalogue, stopping on its own at the site's last page or a repeat-page guard. Does not cap the run; use Max records for that. |
maxListings | integer | 20 | The sole cap on the run: stop after this many companies are scanned. 0 for unlimited. |
resumeFromRunId | string | none | Optional id of a previous run (or dataset) of this actor. Companies already in that dataset are skipped, so this run returns only new companies (a delta). |
incrementalMode | boolean | false | Turn on for recurring or scheduled monitoring: classifies each company NEW or UPDATED against the previous run's state for the same search; UNCHANGED is suppressed unless Emit unchanged is on, and EXPIRED, then later REAPPEARED, only occur on a run that completes a full, uncapped, non-resumed scan with Emit expired on. |
stateKey | string | none | Only used when Incremental mode is on. Leave empty to auto-derive the tracked scope from your search filters, or set a value to share state across setups or run separate campaigns. |
emitUnchanged | boolean | false | Only used when Incremental mode is on. Also return (and bill) UNCHANGED companies every run. |
emitExpired | boolean | false | Only used when Incremental mode is on. Also return (and bill) an EXPIRED row for companies no longer found, but only on a complete, uncapped, non-resumed scan. |
ignoreFieldsForChanges | array | none | Only used when Incremental mode is on. Output field names (or dotted paths, e.g. metadata.scraped_at) that should never make a company count as UPDATED. The directory-rank fields and this page's own URL are already ignored by default; add more here if a field changes in a way you don't care about. Ignored fields are still returned in the output. |
proxy | object | Apify Proxy | Connection settings. The default works out of the box. |
mcpConnectors | array | none | Optional MCP connectors to pipe a copy of each record into (Notion, Linear, Airtable, Apify). Authorize one under Apify → Settings → Integrations, then pick it here. |
notionParentPageUrl | string | none | Notion connector only: URL or id of the page under which item pages are created. Required to enable the Notion export; ignored by other connectors. |
maxNotifyListings | integer | 50 | Cap on items written to each connector per run. Does not affect the dataset. |
Output Example
Sample shape: values are illustrative placeholders, not from a live company.
{"id": "1963983","name": "Sample Agency LLC","slug": "sample-agency","clutchUrl": "https://clutch.co/profile/sample-agency","website": "https://example.com","logo": "https://img.shgstatic.com/clutch-static-prod/image/scale/50x50/logos/000000.jpg","rating": 4.8,"reviewCount": 42,"minProjectSize": "$25,000+","hourlyRate": "$100 - $149 / hr","employeeCount": "50 - 249","location": "New York, NY","verified": true,"services": ["45% Web Development", "45% Web Design", "10% Branding"],"description": "Sample Agency builds websites and digital products for mid-market clients.","yearFounded": 2010,"contact": {"phone": "1-000-000-0000","location": "New York, NY","address": {"street": "1 Example St","city": "New York","region": "NY","postal_code": "10000","country": "US"}},"contactDetails": {"emails": ["hello@example.com"],"phone_numbers": ["1-000-000-0000"],"social_media": ["https://www.linkedin.com/company/example"]},"detailedRatings": { "Quality": 4.8, "Schedule": 4.7, "Cost": 4.8, "Willing to Refer": 4.9 },"insights": {"industries": { "industries": ["eCommerce", "Financial services"] },"service_line_reviews": [{ "service_line": "Web Development", "reviews_count": 17, "price_range": "0" }]},"reviews": [{"quote": "Great team to work with.","date": "Jan 1, 2026","rating": 5.0,"summary": "Sample Agency built a new marketing website.","projectSize": "$10,000 to $49,999","projectLength": "Jan. to June 2026","services": ["Web Design", "Web Development"],"detailedRatings": { "Quality": 5.0, "Schedule": 5.0, "Cost": 5.0, "Willing to Refer": 5.0 },"reviewer": {"position": "Director of Marketing, Sample Client Inc","verified": true,"industry": "Financial services","location": "Lynchburg, Virginia","clientSize": "11-50 Employees"}}],"sourceUrl": "https://clutch.co/web-developers"}
Plan Requirement
The default connection setting works out of the box, and the actor automatically retries with a different connection whenever one is refused, so a temporary refusal does not end the run early. For very large or frequent runs, the residential connection option gives more headroom; switch to it under Connection.
FAQ
How much does it cost?
You pay a one-time charge when the run starts, a charge per company returned, and an extra detail-enrichment charge that applies only to a company whose profile page was fetched and that is actually returned this run; a suppressed UNCHANGED row in incremental mode pays neither charge, even if its page was fetched. The Pricing tab shows the current rates. Use Max records to cap the cost of any run.
Is it legal to scrape Clutch.co?
This actor collects only publicly available company and review information. You are responsible for how you use it: follow Clutch's terms and the laws that apply to you, and get legal advice before any commercial redistribution of review content, since reviews and their authors may carry additional rights.
Can I get only new or changed companies on a schedule?
Yes. Schedule the actor from the Schedules tab and turn on Incremental mode. Each run then returns only new and updated companies (and removed ones if you also turn on Also return expired companies, on a complete scan) since the last run for that same search, and unchanged companies are not billed unless you turn that on too.
Why did my run return fewer companies than I expected?
Max records is the only real cap: the run stops once that many companies have passed your filters and been scanned, or suppressed as unchanged in incremental mode. Raise it, or set it to 0, to scan the whole directory. Max pages per list only limits how many pages are read per directory or URL and does not need to be touched for most runs.
Why did my run fail instead of returning an empty dataset?
The run fails outright only when it cannot start at all: URL mode with no URLs pasted, a connection that could not be established, a pasted resumeFromRunId that cannot be read, or a Resume / Incremental-mode combination that would overwrite an existing monitoring baseline. If the run starts but the connection is later refused, or the site refuses every page, the run finishes with zero records and a status message explaining which of those happened, so "nothing matched your filters" is never confused with "nothing could be read".
Can I use it with AI agents or MCP?
Yes. Call it from any Apify integration or MCP client, and use the connector field to push a summary of each company into Notion, Linear or Airtable.
🔗 Want more social media data?
Pair this actor with these related scrapers from the same team:
| 💼 Jobsite UK From $1/1K. Collect UK job listings from Jobsite.co.uk at scale. Search by keyword... | 💼 Totaljobs Scraper Scrape UK job listings from Totaljobs.com by keyword, location, filters, or URL. Extract... |
| 📇 BizQuest Scraper From $1/1K. Extract business-for-sale, franchise, and asset listings from BizQuest... | 🛒 Depop Scraper From $1/1K. Scrape Depop search results, listings, shops, and reviews to JSON, CSV, or... |
| 📇 Houzz Pro Scraper From $1/1K. Pull Houzz pro listings across global sites. Search by category and location... | 🏠 Auction.com Scraper From $1/1K. Extract foreclosure, REO, short-sale, and auction listings from Auction.com... |
💬 Support & custom scrapers
- 🐞 Found a bug or a missing field? Open a ticket on the Issues tab. We usually reply within hours.
- 🛠️ Need another site, extra fields or a private build? Email contact@abotapi.com or message Telegram @abotapi.
- ⭐ Enjoying it? A quick review on the actor page helps other users find it.