Clutch.co Scraper - Agency Ratings, Hourly Rates & Reviews
Pricing
from $3.00 / 1,000 results
Clutch.co Scraper - Agency Ratings, Hourly Rates & Reviews
Scrape verified agency and software company data from Clutch.co: ratings, pricing, reviews, and contact details across dev, design, marketing, SEO, mobile, and IT services categories.Deliver results straight to Notion, Slack, Airtable, or Sheets via MCP.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer
Techforce Global
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
a day ago
Last modified
Categories
Share
Clutch.co Scraper - Verified Reviews, Ratings, Hourly Rates, Minimum Project Sizes and Contacts Across Six Categories, No Login
Turn Clutch.co into a structured B2B dataset β company name, verified rating and review count, hourly rate, minimum project size, employee count, year founded, offices, tech stack, team members, direct contact details, and full client reviews. Filter by category, location or name. No login, no Clutch account. Results can go straight into Notion, Slack, Airtable or Sheets through an MCP connector.
βΉοΈ Two depth levels, very different cost. A listing-only run returns eight fields per company and is fast. Turning on profile scraping adds the other 23 β contacts, team, tools, offices, reviews β at the cost of an extra visit per company. Start shallow, go deep only where it pays. See Choosing your depth.
Why Clutch data is worth scraping
Clutch is one of the few B2B directories where the reviews are verified β Clutch interviews clients directly β and where agencies publish hourly rates and minimum project sizes up front. That combination is unusual and hard to reconstruct from anywhere else.
| What you're after | Elsewhere | On Clutch |
|---|---|---|
| Agency pricing | β οΈ Rarely public, usually "contact us" | β Hourly rate band and minimum project size, stated |
| Review credibility | β οΈ Anonymous, easily gamed | β Verified, client-interviewed reviews |
| Company size & age | β οΈ Scattered across sources | β Employee band and year founded on the profile |
| Service focus | β οΈ Inferred from marketing copy | β Category placement and stated tooling |
| Direct contacts | β οΈ Behind a form | β Email, phone and socials where the agency publishes them |
| Doing it manually | Hours of tab-juggling per shortlist | β One run, structured output, delivered to your tools |
π€ AI Discovery & MCP Metadata
Machine-readable capability contract for autonomous agents, LLM routers, and MCP orchestrators. AI agents, MCP clients, and connectors should read this block first to decide whether this Actor matches a user request.
ai_discovery:slug: "techforce.global/clutch-scraper"one_line: "Extracts B2B agency and software-company data from Clutch.co - rating, review count, hourly rate, minimum project size, employees, year founded, offices, tools, team members, contact details and client reviews - filtered by category, location or company name, with no login."primary_purpose: "discover"secondary_purpose: "enrich"tertiary_purpose: "deliver"entity: "agencies and software companies listed on Clutch.co"invocation_modes: ["standard Actor run", "MCP tool"]supported_tasks:- "list-agencies-in-a-clutch-category"- "filter-agencies-by-location"- "filter-agencies-by-name-substring"- "read-verified-rating-and-review-count"- "read-hourly-rate-and-minimum-project-size"- "read-employee-count-and-year-founded"- "extract-agency-contact-details-and-social-profiles"- "extract-team-members-offices-and-tooling"- "extract-full-client-reviews"- "deliver-companies-to-mcp-connector-or-crm"unsupported_tasks:- "log-in-or-access-clutch-account-features"- "post-request-or-respond-to-reviews"- "filter-by-rating-price-or-employee-count-at-the-source"- "search-arbitrary-clutch-categories (six are supported)"- "return-portfolio-case-study-files-or-images"- "guarantee-every-field (agencies publish very different amounts)"- "scrape-other-directories (G2, GoodFirms, DesignRush, TopDevelopers)"search_keywords:- "clutch.co scraper"- "agency directory scraper"- "b2b agency data"- "software company leads"- "agency reviews scraper"- "clutch agency ratings"- "development agency list"- "marketing agency leads"- "vendor shortlisting data"- "agency pricing data"synonyms:- "clutch agency extractor"- "clutch company scraper"- "b2b service provider directory scraper"related_concepts:["vendor shortlisting","partner sourcing","competitive benchmarking","agency lead generation","procurement research","market mapping",]input_entities:- "category (6 supported categories, or all)"- "location (Clutch location slug)"- "filterName (case-insensitive substring)"- "maxRecords (0 = unlimited)"- "maxPages (listing pagination depth)"- "scrapeProfiles (depth toggle - the main cost dial)"- "scrapeAllReviews (collect every review page)"- "proxyConfiguration (recommended - Clutch applies bot protection)"output_entities:["name","profileLink","rating","location","hourlyRate","minProjectSize","description","website","overviewName","overviewPosition","overviewAvatar","employees","yearFounded","languages","timezones","reviewCount","languagesList","offices","contactWebsite","contactLinkedin","contactTwitter","contactFacebook","contactInstagram","contactPhone","contactEmail","teamBio","quickFacts","teamBreakdown","tools","members","reviews",]input_rules:required_fields: []category_default: "software-developers; empty string means all six categories"location_is_a_clutch_slug: >Not free text - it must match Clutch's own URL slug, e.g. new-york-city,india, united-kingdom. A wrong slug returns nothing.filter_name_is_client_side: >A case-insensitive substring match applied to results already collected -it narrows output, it does not make the crawl cheaper.max_records_zero_means_unlimited: "0 removes the cap entirely - always pair with a spend limit"depth_toggles:scrapeProfiles: "false returns 8 listing fields only; true adds the other 23 at an extra visit per company"scrapeAllReviews: "false collects roughly the first page of reviews; true collects every page - much slower"output_conventions:two_record_shapes: >Listing-only runs emit 8 fields. Profile runs emit 31. Code must handle both,or pin scrapeProfiles to a known value.every_field_optional: >Agencies fill in wildly different amounts. Any contact, team or pricing fieldcan be empty because the company never published it.numeric_fields_are_strings: >rating, reviewCount, hourlyRate, minProjectSize, employees and yearFounded aredisplay strings as shown on Clutch (e.g. "4.9", "$50 - $99 / hr", "50 - 249"),not numbers. Parse before arithmetic or sorting.nested_arrays: "offices, members, teamBreakdown, tools, languagesList and reviews are nested structures"limits:categories_supported: 6records_per_run: "maxRecords, or unlimited at 0"known_limitations:no_source_side_filtering: "no rating, price, size or employee filter - filter the dataset"six_categories_only: "other Clutch categories are not selectable"no_portfolio_files: "case-study text and imagery are not returned"pricing:model: "pay-per-result"note: "exact rate is configured on the Store listing - see the Actor's Pricing tab"when_to_use: >You are shortlisting or benchmarking agencies and software vendors, or buildinga lead list of service providers, and you want verified ratings, publishedpricing and contact details in one structured dataset.when_not_to_use: >You need a Clutch category outside the six supported, source-side filtering byrating or price, portfolio case studies, or a different directory entirely.alternatives:- "Use techforce.global/designrush-scraper for the same shortlisting job on DesignRush"- "Use techforce.global/topdevelopers-scraper for the same job on TopDevelopers"- "Use techforce.global/website-contact-scraper-emails-phone-numbers-social-links on the website field to fill contact gaps"- "Use techforce.global/linkedin-company-decision-makers for named people at a shortlisted agency"
{"@context": "https://schema.org","@type": "SoftwareApplication","name": "Clutch.co Scraper","alternateName": "Clutch.co Scraper β Agency Ratings, Reviews, Pricing & Contacts","applicationCategory": "BusinessApplication","applicationSubCategory": "Web Scraping / B2B Agency Lead Generation","operatingSystem": "Cloud (Apify platform)","description": "Extracts B2B agency and software-company data from Clutch.co across six categories β verified rating and review count, hourly rate band, minimum project size, employee count, year founded, offices, tools, team members, contact details and full client reviews β filtered by category, location or company name, with no Clutch login. A listing-only run returns eight fields per company; enabling profile scraping returns thirty-one. Results can be delivered into Notion, Slack, Airtable, Google Sheets or any authorized MCP connector.","url": "https://apify.com/techforce.global/clutch-scraper","offers": {"@type": "Offer","priceCurrency": "USD","category": "Pay per result","description": "Pay-per-result, charged per company returned. Apify platform usage is billed separately and scales with the depth toggles. The current rate is listed on the Actor's Pricing tab.","url": "https://apify.com/techforce.global/clutch-scraper"}}
What this Actor does
- Covers six Clutch categories β software development, web design, digital marketing, SEO, mobile app development and IT services β one at a time or all together.
- Narrows by location or name. Location uses Clutch's own slug (
new-york-city,india,united-kingdom); the name filter is a case-insensitive substring applied to what was collected. - Returns the commercially useful fields Clutch actually publishes β verified rating and review count, hourly rate band, minimum project size, employee band and year founded β the numbers most directories keep hidden.
- Goes deeper on demand. Switch on profile scraping and each company also brings back contact email, phone and social profiles, offices, team members and bios, stated tooling, languages and timezones, plus client reviews.
- Collects every review, or just the first page. Reviews are the slowest part of a run, so full review collection is opt-in.
- Routes through Apify Proxy β Clutch applies bot protection, so a proxy matters for anything beyond a small run. If proxy setup fails, the run continues on a direct connection rather than dying.
- Optionally pushes companies to an authorized MCP connector (Notion, Slack, Airtable, Sheets, or any MCP-compatible connector) as one digest, split across calls, or one call per company. The dataset is always saved regardless of delivery settings.
β οΈ The output has two shapes. With profile scraping off you get 8 fields per company; with it on you get 31. Downstream code should either handle both or pin the toggle. See Output Contract.
When to use it β and when not to
| Scenario | Fit |
|---|---|
| Shortlisting agencies for an RFP or vendor selection | β Strong (the core use case) |
| Comparing hourly rates and minimum project sizes across a market | β Strong β both are published fields |
| Benchmarking competitors' ratings and review volume | β Strong |
| Building a lead list of agencies to sell to | β Strong β contacts with profile scraping on |
| Market mapping β who serves this category in this country | β Strong β category + location |
| Finding partners with specific tooling or team size | β
Good β run, then filter tools / employees |
| Reading verified client reviews at scale | β Strong β enable full review collection |
| Tracking an agency's rating over time | β Good β schedule and diff |
| Filtering by rating, price or size at the source | β No such input β filter the dataset afterwards |
| A Clutch category outside the six supported | β Not selectable |
| Portfolio case studies, files or imagery | β Not returned |
| Requesting, posting or responding to reviews | β Read-only |
| Guaranteeing every field on every company | β οΈ Agencies publish very different amounts |
| Other directories (G2, GoodFirms, DesignRush, TopDevelopers) | β Clutch only β see Related Actors |
β‘ Execution Rules (Avoid Common Agent Failures)
scrapeProfilesdecides the output shape. Off β 8 fields. On β 31. Handle both, or pin the toggle so your consumer knows what it's getting.locationis a Clutch URL slug, not free text.new-york-city,india,united-kingdomβ a wrong or invented slug returns nothing, with no error to tell you why.filterNameis applied after collection, not at the source. It narrows the output; it does not reduce how much gets crawled or how long the run takes.maxRecords: 0means unlimited. It removes the cap entirely β always pair it with a spend limit.maxPagesandmaxRecordsinteract. A highmaxRecordswithmaxPages: 1stops at whatever one listing page holds. Raise both together.- Only six categories are supported. Leaving
categoryempty scrapes all six; there is no way to target a different Clutch category. - Every field is optional. Agencies fill in very different amounts β missing contact details, no stated hourly rate, no team bios are all normal. That's absence of published data, not a scrape failure.
- All the numbers are display strings.
ratingis"4.9",hourlyRateis a band like"$50 - $99 / hr",employeesis"50 - 249",minProjectSizeis"$10,000+". Parse before comparing or sorting β none of them are numeric. - Several fields are nested structures β
offices,members,teamBreakdown,tools,languagesListandreviews. Flatten before writing a CSV. scrapeAllReviewsis the most expensive switch in the Actor. Off, you get roughly the first page of reviews per company; on, it walks every review page. Only enable it when reviews are the point of the run.- There is no source-side filtering by rating, price, size or employee count. Run, then filter the dataset.
- Use a proxy for anything beyond a small run. Clutch applies bot protection; the input defaults to Apify Proxy with the
RESIDENTIALgroup, which needs a paid Apify plan. If proxy setup fails the run continues directly and is more likely to be blocked. - Runs are slow at depth β a real browser, plus an extra visit per company with profile scraping, plus more again with full reviews. Budget minutes and use the async endpoint.
deliveryModedefaults tosummaryβ one connector call per run.perCompanyon a 200-company run makes 200 calls.
dependencies:- rule: "scrapeProfiles changes the record from 8 fields to 31"on_violation: "consumers built against one shape break silently on the other"- rule: "location must be a real Clutch URL slug"on_violation: "an empty result with no error explaining why"- rule: "filterName filters after collection, not at the source"on_violation: "expecting a narrow filter to make the run cheaper or faster"- rule: "maxRecords 0 removes the cap entirely"on_violation: "an unbounded run - always pair with maxTotalChargeUsd"- rule: "maxPages caps pagination independently of maxRecords"on_violation: "a high maxRecords silently truncated by a low maxPages"- rule: "rating, hourlyRate, minProjectSize, employees and yearFounded are display strings"on_violation: "numeric comparison throws, or sorts a price band alphabetically"- rule: "offices, members, teamBreakdown, tools, languagesList and reviews are nested"on_violation: "flat-list assumptions break CSV export"- rule: "no source-side filtering by rating, price or size exists"on_violation: "agents construct filter arguments that are silently ignored"- rule: "Clutch applies bot protection; a proxy is recommended"on_violation: "thin or empty results on larger runs"- rule: "delivery requires mcpConnector AND mcpTool"on_violation: "delivery step is skipped with a warning; the dataset is still written in full"- rule: "mcpArguments must reference {message} for the rendered template to appear anywhere"on_violation: "message body is empty; the tool is still called"- rule: "mcpConnector only resolves when the Actor runs on the Apify platform"on_violation: "local runs log 'APIFY_MCP_PROXY_URL is not set' and skip delivery; the dataset is unaffected"authentication:actor_input: noneplatform: "Apify API token required for API / SDK / MCP invocation; paid plan required for residential proxy groups"target_site: "no Clutch account, login or cookie required - and none is accepted"
π₯ Input Contract
.actor/input_schema.json is authoritative β if any table on this page disagrees with the schema files, the schema files win.
Parameters
| Field | Type | Required | Default | Allowed Values / Format | Example |
|---|---|---|---|---|---|
category | enum | β¬ No | "software-developers" | Six categories, or "" for all β see below | "seo-companies" |
location | string | β¬ No | β | A Clutch location slug | "united-kingdom" |
filterName | string | β¬ No | β | Case-insensitive substring, applied after collection | "digital" |
maxRecords | integer | β¬ No | 10 | 0 = unlimited | 100 |
maxPages | integer | β¬ No | 1 | Listing pages to paginate | 5 |
scrapeProfiles | boolean | β¬ No | true | The depth dial β off gives 8 fields, on gives 31 | false |
scrapeAllReviews | boolean | β¬ No | false | Collect every review page per company | true |
proxyConfiguration | object | β¬ No | Apify Proxy + RESIDENTIAL | Apify proxy editor object | see below |
Categories
| Value | Covers |
|---|---|
software-developers (default) | Custom software and development firms |
web-designers | Web design and UX agencies |
digital-marketing | Digital marketing agencies |
seo-companies | SEO and search agencies |
mobile-app-developers | iOS / Android / cross-platform app builders |
it-services | Managed IT and infrastructure providers |
"" (empty) | All six, one after another |
Location
This is Clutch's own URL slug, not free text. Use the form Clutch uses in its own URLs β lowercase, hyphenated:
new-york-city Β· london Β· india Β· united-kingdom Β· united-states Β· canada Β· australia Β· germany Β· poland Β· ukraine
βΉοΈ These illustrate the slug format, not a fixed list. Clutchβs supported location slugs change over time, so copy the exact slug out of a Clutch URL before relying on it in an automated pipeline. A slug Clutch does not recognise returns nothing.
Proxy
{"proxyConfiguration": {"useApifyProxy": true,"apifyProxyGroups": ["RESIDENTIAL"]}}
This is the schema default. Clutch applies bot protection, so a proxy is strongly recommended for anything beyond a small validation run. RESIDENTIAL is the most reliable group and requires a paid Apify plan. If Apify Proxy cannot be set up, the run continues on a direct connection with a warning rather than failing.
Choosing your depth
| Goal | Configuration | Relative cost |
|---|---|---|
| Quick market scan β who's out there, how are they rated | scrapeProfiles: false | π Lowest |
| Shortlist with contacts | scrapeProfiles: true, scrapeAllReviews: false | π Moderate |
| Full vendor due diligence | scrapeProfiles: true, scrapeAllReviews: true | π΄ Highest |
Examples
Quick market scan β fast and cheap
{"category": "software-developers","location": "india","maxRecords": 100,"maxPages": 5,"scrapeProfiles": false,"deliveryMode": "none"}
Shortlist with contact details
{"category": "digital-marketing","location": "united-kingdom","maxRecords": 50,"maxPages": 3,"scrapeProfiles": true,"scrapeAllReviews": false,"deliveryMode": "none"}
Full due diligence on a small set
{"category": "web-designers","filterName": "studio","maxRecords": 10,"maxPages": 3,"scrapeProfiles": true,"scrapeAllReviews": true,"deliveryMode": "none"}
Every category, one run
{"category": "","location": "new-york-city","maxRecords": 200,"maxPages": 5,"scrapeProfiles": true,"deliveryMode": "none"}
Cheap validation run before committing
{"category": "seo-companies","maxRecords": 3,"maxPages": 1,"scrapeProfiles": false,"deliveryMode": "none"}
MCP Delivery Configuration (Optional)
Delivery pushes company data into your own tools. It never contacts an agency.
| Parameter | Type | Default | Description |
|---|---|---|---|
mcpConnector | string | "" | Authorized MCP connector on your Apify account (Notion, Slack, Airtable, Sheets, β¦). Leave empty for dataset-only runs. |
deliveryMode | enum | summary | summary (one call with everything) Β· chunked (split across calls) Β· perCompany (one call per company) Β· none. |
mcpTool | string | "" | Tool name on the connector: create_page, send_message, append_row, create_record. Run once with a connector selected β the log lists the connector's available tools. |
mcpArguments | object | {} | Arguments passed to the tool. String leaves support {placeholders}. |
mcpMessageTemplate | string | "" | Template rendered and exposed to mcpArguments as {message}. |
Summary / chunked placeholders: {companyCount}, {companies}, {message} β plus {part}/{partCount} in chunked mode.
Per-company placeholders: any field from that company's output record (e.g. {name}, {rating}, {hourlyRate}, {contactEmail}, {profileLink}), plus {message}.
One Airtable record per agency β a shortlist you can score:
{"category": "digital-marketing","location": "united-kingdom","maxRecords": 50,"scrapeProfiles": true,"mcpConnector": "<your-authorized-airtable-connector>","deliveryMode": "perCompany","mcpTool": "create_record","mcpArguments": {"fields": {"Agency": "{name}","Rating": "{rating}","Reviews": "{reviewCount}","Hourly rate": "{hourlyRate}","Min project": "{minProjectSize}","Employees": "{employees}","Location": "{location}","Email": "{contactEmail}","Website": "{website}","Clutch": "{profileLink}"}}}
A Slack digest per run:
{"category": "seo-companies","maxRecords": 30,"mcpConnector": "<your-authorized-slack-connector>","deliveryMode": "summary","mcpTool": "send_message","mcpArguments": { "channel": "#vendor-research", "text": "{message}" },"mcpMessageTemplate": "π {companyCount} agencies shortlisted from Clutch:\n\n{companies}"}
A long list split across Notion sub-pages:
{"category": "","maxRecords": 200,"mcpConnector": "<your-authorized-notion-connector>","deliveryMode": "chunked","mcpTool": "notion-create-pages","mcpArguments": {"parent": { "page_id": "<your-page-id>" },"pages": [{"properties": {"title": "Clutch shortlist β part {part}/{partCount}"},"content": "{companies}"}]}}
π€ Output Contract & Data Structure
Storage: Apify Dataset β one row per company.
Pagination: limit & offset on the dataset items endpoint.
Duplicates: one record per company per run. Across runs, dedupe on profileLink.
Two record shapes
Listing-only (scrapeProfiles: false) β 8 fields:
| Field | Type | Empty when | Meaning |
|---|---|---|---|
name | string | rarely | Company name |
profileLink | string | never | Clutch profile URL β the dedupe key |
rating | string | no reviews | Verified rating as displayed, e.g. "4.9" |
location | string | not stated | Headquarters as displayed |
hourlyRate | string | not published | Rate band, e.g. "$50 - $99 / hr" |
minProjectSize | string | not published | Minimum engagement, e.g. "$10,000+" |
description | string | not published | Short summary |
website | string | not published | Company website |
Profile run (scrapeProfiles: true) β the 8 above plus 23 more:
| Field | Type | Meaning |
|---|---|---|
reviewCount | string | Number of verified reviews, as displayed |
employees | string | Headcount band, e.g. "50 - 249" |
yearFounded | string | Year founded, as displayed |
languages | string | Languages served, as displayed |
languagesList | array | Languages as a list |
timezones | string | Timezones covered |
offices | array of object | { address, phone, employees, verified } per office |
contactEmail | string | Contact email where published |
contactPhone | string | Contact phone where published |
contactWebsite | string | Website from the contact section |
contactLinkedin | string | LinkedIn profile |
contactTwitter | string | Twitter/X profile |
contactFacebook | string | Facebook profile |
contactInstagram | string | Instagram profile |
overviewName | string | Named contact on the profile |
overviewPosition | string | That person's role |
overviewAvatar | string | Their avatar image URL |
teamBio | string | Team description |
teamBreakdown | array | Team composition as published |
members | array of object | { name, position, bio, photo } per member |
tools | array | Technologies and tools the company states it uses |
quickFacts | array/object | Assorted profile facts |
reviews | array of object | Client reviews β more with scrapeAllReviews: true |
β οΈ Two things to handle in code.
1. Every "number" is a string.
rating("4.9"),hourlyRate("$50 - $99 / hr"),minProjectSize("$10,000+"),employees("50 - 249"),reviewCountandyearFoundedare all captured as displayed. Sorting them naively sorts alphabetically β"$100 - $149"lands before"$50 - $99".2. Any field can be empty. Agencies fill in very different amounts of their Clutch profile. A missing
contactEmailmeans that agency didn't publish one.
Example β profile run
{"name": "Example Digital Studio","profileLink": "https://clutch.co/profile/example-digital-studio","rating": "4.9","location": "London, United Kingdom","hourlyRate": "$50 - $99 / hr","minProjectSize": "$10,000+","description": "Full-service digital product studio for scale-ups.","website": "https://exampledigital.co.uk","reviewCount": "37","employees": "50 - 249","yearFounded": "2014","languages": "English, French","languagesList": ["English", "French"],"timezones": "GMT","offices": [{"address": "12 Example St, London EC1","phone": "+44 20 7946 0000","employees": "50 - 249","verified": true}],"contactEmail": "hello@exampledigital.co.uk","contactPhone": "+44 20 7946 0000","contactWebsite": "https://exampledigital.co.uk","contactLinkedin": "https://www.linkedin.com/company/example-digital-studio","contactTwitter": "https://x.com/exampledigital","contactFacebook": "","contactInstagram": "","overviewName": "Alex Morgan","overviewPosition": "Managing Director","overviewAvatar": "https://clutch.co/β¦/avatar.jpg","teamBio": "A 60-person team of designers, engineers and strategists.","teamBreakdown": ["Engineering 60%", "Design 25%", "Strategy 15%"],"members": [{"name": "Alex Morgan","position": "Managing Director","bio": "15 years in digital product.","photo": "https://β¦"}],"tools": ["React", "Node.js", "AWS", "Figma"],"quickFacts": [],"reviews": []}
Example β listing-only run
{"name": "Example Digital Studio","profileLink": "https://clutch.co/profile/example-digital-studio","rating": "4.9","location": "London, United Kingdom","hourlyRate": "$50 - $99 / hr","minProjectSize": "$10,000+","description": "Full-service digital product studio for scale-ups.","website": "https://exampledigital.co.uk"}
Making the output usable
import redef rating_value(company):try:return float(company.get("rating") or "")except ValueError:return Nonedef rate_floor(company):"""Lowest number in an hourly-rate band, so bands sort numerically."""digits = re.findall(r"[\d,]+", company.get("hourlyRate") or "")return int(digits[0].replace(",", "")) if digits else Nonedef headcount_floor(company):digits = re.findall(r"[\d,]+", company.get("employees") or "")return int(digits[0].replace(",", "")) if digits else None# Handle both record shapes: `reviewCount` only exists on profile runs.is_profile_run = any("reviewCount" in c for c in items)shortlist = [c for c in itemsif (rating_value(c) or 0) >= 4.5 and (rate_floor(c) or 0) <= 99]shortlist.sort(key=lambda c: (-(rating_value(c) or 0), rate_floor(c) or 9999))contactable = [c for c in items if c.get("contactEmail") or c.get("contactPhone")]print(f"{len(items)} companies Β· {len(shortlist)} shortlisted Β· {len(contactable)} contactable")
What a successful run looks like
{"status": "SUCCEEDED","defaultDatasetId": "<datasetId>","stats": { "itemCount": 47 }}
itemCount below maxRecords is normal β the category and location combination held fewer companies, maxPages capped pagination before the record limit was reached, or filterName removed some after collection.
itemCount: 0 is a valid empty result. The usual causes, in order of likelihood: an unrecognised location slug, a filterName that matched nothing, or maxPages: 1 on a thin listing.
βΆοΈ Invocation & Integration
Lifecycle: Discover β Understand β Configure β Execute β Retrieve β Validate. Authenticate every call with Authorization: Bearer <APIFY_TOKEN>.
Apify Console
Open the Actor β Input tab β pick a Category (or leave blank for all) β optionally set a Location Filter (Clutch slug) β set Max Records and Max Pages β choose whether to Scrape Profile Pages β leave Proxy configuration on Apify Proxy β (optional) pick an MCP connector, tool and template β Start β export from the Dataset tab. The Contacts only view is CRM-ready; Team & capabilities and Reviews hold the deeper profile data.
Model Context Protocol (MCP)
claude mcp add --transport http apify \"https://mcp.apify.com?tools=techforce.global/clutch-scraper"
Python (apify-client)
import os, refrom apify_client import ApifyClientclient = ApifyClient(os.getenv("APIFY_TOKEN"))ACTOR = "techforce.global/clutch-scraper"run = client.actor(ACTOR).call(run_input={"category": "digital-marketing","location": "united-kingdom", # a Clutch URL slug, not free text"maxRecords": 50,"maxPages": 3,"scrapeProfiles": True, # 31 fields instead of 8"scrapeAllReviews": False, # the most expensive switch"deliveryMode": "none",})items = client.dataset(run["defaultDatasetId"]).list_items().itemsprint(f"{len(items)} companies")def first_number(value):digits = re.findall(r"[\d,]+", value or "")return int(digits[0].replace(",", "")) if digits else None# Every "number" is a display string β parse before sorting.for company in sorted(items, key=lambda c: -(float(c.get("rating") or 0)))[:10]:rate = company.get("hourlyRate") or "rate not published"email = company.get("contactEmail") or "no email published"print(f'{company["name"]} Β· {company.get("rating") or "β"}β ({company.get("reviewCount") or "0"} reviews)')print(f' {rate} Β· {company.get("employees") or "?"} staff Β· {email}')
Two-pass pattern β scan cheaply, then deepen only the shortlist:
# Pass 1: listing only, wide and cheap.scan = client.actor(ACTOR).call(run_input={"category": "software-developers", "location": "india","maxRecords": 200, "maxPages": 10,"scrapeProfiles": False, "deliveryMode": "none",})rows = client.dataset(scan["defaultDatasetId"]).list_items().items# Pass 2: deep-scrape only the names worth pursuing.top = [c["name"] for c in rows if (float(c.get("rating") or 0)) >= 4.8][:10]for name in top:deep = client.actor(ACTOR).call(run_input={"category": "software-developers", "filterName": name,"maxRecords": 1, "maxPages": 2,"scrapeProfiles": True, "scrapeAllReviews": True, "deliveryMode": "none",})
JavaScript / TypeScript (apify-client)
import { ApifyClient } from "apify-client";const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const ACTOR = "techforce.global/clutch-scraper";const run = await client.actor(ACTOR).call({category: "web-designers",location: "new-york-city",maxRecords: 50,maxPages: 3,scrapeProfiles: true,deliveryMode: "none",});const { items } = await client.dataset(run.defaultDatasetId).listItems();// Bands are strings β take the first number so they sort numerically.const firstNumber = (v?: string) => {const m = (v ?? "").match(/[\d,]+/);return m ? Number(m[0].replace(/,/g, "")) : undefined;};const affordable = items.filter((c) => (firstNumber(c.hourlyRate) ?? Infinity) <= 99).sort((a, b) => Number(b.rating ?? 0) - Number(a.rating ?? 0));console.log(`${items.length} companies Β· ${affordable.length} at or under $99/hr`,);
cURL β asynchronous with a spend cap (recommended)
Profile runs open an extra page per company, so prefer async over the 300s synchronous endpoint.
# 1. Start execution with a hard spend limitcurl -X POST -H 'Content-Type: application/json' \-H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \-d '{"category":"software-developers","location":"india","maxRecords":100,"maxPages":5,"scrapeProfiles":true,"deliveryMode":"none"}' \'https://api.apify.com/v2/acts/techforce.global~clutch-scraper/runs?maxTotalChargeUsd=3.00'# 2. Pollcurl -H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \'https://api.apify.com/v2/actor-runs/<runId>'# 3. Retrieve when SUCCEEDEDcurl -H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \'https://api.apify.com/v2/datasets/<DATASET_ID>/items?clean=true&format=json'
cURL β synchronous (small, listing-only runs)
curl -X POST \-H 'Content-Type: application/json' \-H 'Authorization: Bearer <YOUR_APIFY_TOKEN>' \-d '{"category":"seo-companies","maxRecords":5,"maxPages":1,"scrapeProfiles":false,"deliveryMode":"none"}' \'https://api.apify.com/v2/acts/techforce.global~clutch-scraper/run-sync-get-dataset-items'
β οΈ Autonomous Agent Error Handling & Resolution Matrix
| Error Code | Detection Condition | Underlying Cause | Deterministic Agent Action |
|---|---|---|---|
AUTH_INVALID | HTTP 401 from Apify | Missing or malformed APIFY_TOKEN | Abort & Prompt User: request a valid Apify API token. |
RATE_LIMITED | HTTP 429 from Apify | Apify API rate / concurrency limits | Retry: exponential backoff (2s, 4s, 8s). |
SYNC_TIMEOUT | HTTP 408 on the sync endpoint | Profile runs exceed the 300s synchronous ceiling | Reconfigure: async POST /runs + polling. |
BAD_LOCATION_SLUG | SUCCEEDED, 0 items, a location was set | location must be a Clutch URL slug | Modify Input: copy the slug from a Clutch URL, or clear the field. |
FILTER_MATCHED_NOTHING | SUCCEEDED, 0 items, filterName set | The substring matched nothing in what was collected | Modify Input: broaden or remove filterName. |
PAGES_TOO_SHALLOW | Far fewer records than maxRecords | maxPages capped pagination first | Modify Input: raise maxPages. |
UNLIMITED_RUNAWAY | Very large run, high spend | maxRecords: 0 removes the cap | Reconfigure: set a real limit and maxTotalChargeUsd. |
WRONG_RECORD_SHAPE | Expected fields missing | scrapeProfiles: false returns only 8 fields | Modify Input: enable profile scraping. |
EMPTY_FIELDS | contactEmail/hourlyRate empty on some rows | Those agencies didn't publish them | Not an error. Enrich from website elsewhere. |
NUMBERS_ARE_STRINGS | Sorting or arithmetic misbehaves | rating, hourlyRate, employees etc. are display strings | Fix Code: extract the leading number before comparing. |
PRICE_BAND_SORTS_WRONG | $100 - $149 ranks below $50 - $99 | Alphabetical sort on a band string | Fix Code: sort on the parsed lower bound. |
NESTED_FIELDS | CSV export mangles rows | offices, members, tools, reviews are nested | Fix Code: flatten before exporting. |
NO_REVIEWS_RETURNED | reviews thin or empty | scrapeAllReviews: false collects roughly the first page only | Modify Input: enable it if reviews matter. |
FILTER_UNSUPPORTED | Agent passes minRating, maxRate, minEmployees | No source-side filters exist | Fix Approach: run unfiltered, filter the dataset. |
CATEGORY_UNSUPPORTED | User wants a Clutch category outside the six | Not selectable | Abort & Prompt User or use the closest supported category. |
BLOCKED_OR_THIN | Sharply fewer results than an earlier identical run | Clutch bot protection on the exit IP | Reconfigure: enable Apify Proxy with RESIDENTIAL, then retry. |
PROXY_UNAVAILABLE | Log Could not set up Apify Proxy (β¦). Continuing without a proxy | The plan lacks access to the requested group | Prompt User: upgrade, or accept a higher block rate. |
NO_PORTFOLIO | User wants case studies or imagery | Not returned | Fix Expectation: open profileLink. |
DELIVERY_SKIPPED | Log no tool name was provided | mcpConnector set but mcpTool empty | Modify Input: set mcpTool; the dataset is already saved. |
DELIVERY_TOOL_UNKNOWN | Log Tool 'x' is not available on this connector | Wrong tool name for that connector | Modify Input: pick a name from the Available tools: list in the same log line. |
DELIVERY_EMPTY | Connector called, body empty | mcpArguments omitted the {message} placeholder | Modify Input: map {message} inside mcpArguments. |
DELIVERY_FLOOD | Hundreds of connector calls | deliveryMode: "perCompany" on a large run | Reconfigure: use summary or chunked. |
MCP_PROXY_MISSING | Log APIFY_MCP_PROXY_URL is not set | Running locally instead of on the platform | Reconfigure: apify push and run on the platform. |
CHARGE_LIMIT | Run aborted mid-sweep | maxTotalChargeUsd spend threshold reached | Prompt User: confirm a higher spend cap. |
Reading run status: an empty dataset with a
SUCCEEDEDstatus is a valid outcome here β an unrecognised location slug, an over-narrowfilterNameor a blocked first page all produce it, and the log says which. Only aFAILEDstatus is a platform-level failure. Every field-level and input-level row above comes from this Actorβs own contract; the401/408/429rows are standard Apify API responses.
π£οΈ Natural Language β Actor Mapping
| User says | Intent | Constructed Actor input |
|---|---|---|
| "Find me web design agencies in New York" | Shortlisting | {"category":"web-designers","location":"new-york-city","maxRecords":50} |
| "Which dev shops in India are top rated?" | Market scan | {"category":"software-developers","location":"india","scrapeProfiles":false,"maxRecords":200} then sort rating |
| "Agencies under $100/hr with 4.5+ ratings" | Filtered shortlist | run, then filter parsed hourlyRate and rating β no source-side filter |
| "Get contact details for these agencies" | Enrichment | {"scrapeProfiles":true} then read the contact* fields |
| "What do clients say about them?" | Reviews | {"scrapeProfiles":true,"scrapeAllReviews":true,"maxRecords":10} |
| "Compare SEO agency pricing in the UK" | Pricing research | {"category":"seo-companies","location":"united-kingdom"} then parse hourlyRate |
| "Find agencies that work with React" | Capability match | {"scrapeProfiles":true} then filter tools |
| "How big is this agency?" | Company size | {"filterName":"<name>","scrapeProfiles":true} then read employees, yearFounded |
| "Build a lead list of IT services firms" | Lead gen | {"category":"it-services","scrapeProfiles":true,"maxRecords":100} |
| "Everything Clutch has for this city" | Full sweep | {"category":"","location":"<slug>","maxRecords":200,"maxPages":5} |
| "Push the shortlist into Airtable" | CRM delivery | {"mcpConnector":"airtable","deliveryMode":"perCompany","mcpTool":"create_record"} |
| "Why did my location filter return nothing?" | Diagnosis | The slug must match Clutch's URL form β copy it from a Clutch URL |
| "Only agencies rated above 4.8" | Source filter | β οΈ No such input β filter the dataset on parsed rating |
| "Show me their case studies" | Portfolio | β Not returned β open profileLink |
| "Do the same on G2" | Other directory | β Clutch only β see Related Actors |
| "Request a quote from them" | Outreach | β Read-only β this Actor never contacts anyone |
Should NOT route here: source-side filtering by rating, price, size or employee count Β· Clutch categories outside the six supported Β· portfolio case studies, files or imagery Β· requesting quotes or contacting agencies Β· posting or responding to reviews Β· other directories such as G2, GoodFirms, DesignRush or TopDevelopers.
π§ Agent Execution & Routing Logic
[Input User Query]ββΌ1. Is the user shortlisting or researching AGENCIES / software vendors? NO β Route elsewhereβ YESβΌ2. Which directory?βββ Clutch β stay hereβββ DesignRush β Route: DesignRush Agency Scraperβββ TopDevelopers β Route: TopDevelopers Scraperβββ G2 / GoodFirms β Abort: not coveredβΌ3. Does the user want to CONTACT agencies or request quotes? YES β Abort. Read-onlyβ NOβΌ4. Does the user need filtering by rating / price / size?β YES β those inputs DO NOT EXIST. Run unfiltered, filter the dataset afterwardsβΌ5. Pick the category (six supported; empty = all six)βΌ6. Location? It must be a CLUTCH URL SLUG (new-york-city, india, united-kingdom).A wrong slug returns NOTHING with no error. Copy it from a Clutch URLβΌ7. ββ THE COST DECISION ββ how deep?βββ scrapeProfiles false β 8 fields, fast, cheap (market scan)βββ scrapeProfiles true β 31 fields, extra visit each (shortlist + contacts)βββ + scrapeAllReviews β every review page (due diligence, slowest)βΌ8. Set maxRecords AND maxPages together β a low maxPages truncates a high maxRecords.maxRecords 0 = UNLIMITED: only with maxTotalChargeUsd setβΌ9. Keep the proxy on (Clutch applies bot protection). RESIDENTIAL needs a paid planβΌ10. Deliver to a connector? YES β mcpConnector + mcpTool + {message}β summary (1 call) / chunked / perCompany (1 each!)β NO β set deliveryMode "none" (it defaults to summary)βΌ11. Use the ASYNC endpoint for any profile runβΌ[Execute]βββββΊ SUCCEEDED, items > 0 βββΊ handle the data contract:β which SHAPE did you get? 8 fields or 31 β branch on scrapeProfilesβ rating / hourlyRate / minProjectSize / employees are DISPLAY STRINGSβ β extract the leading number before sorting, or "$100-$149"β will rank below "$50-$99"β offices / members / tools / reviews are NESTED β flatten for CSVβ empty contact fields = the agency published none, not a failureβ dedupe on profileLinkβββββΊ SUCCEEDED, items == 0 βββΊ most likely, in order:a location slug Clutch does not recognisea filterName that matched nothingmaxPages too low for the listing
π° Cost Control & Pricing Transparency
Pay-per-result: you are charged per company returned, with no monthly subscription. The exact rate is on the Actor's Pricing tab in the Apify Store.
Autonomous spend caps: pass maxTotalChargeUsd as a query parameter on the run endpoint for a hard per-execution ceiling.
βΉοΈ Always confirm the live rate on the Actorβs Pricing tab before committing to a large run. The Store listing is what bills you, and Apify platform usage is charged on top of the per-result rate β see the depth table below for what drives it.
Depth is the cost dial
The per-result charge is the same either way, but platform usage is not β depth decides how much browser time and proxy traffic each company costs:
| Configuration | Work per company | Use for |
|---|---|---|
scrapeProfiles: false | π Lowest β listing only | Market scans, rating comparisons |
scrapeProfiles: true | π An extra visit per company | Shortlists with contacts β the common case |
+ scrapeAllReviews: true | π΄ Highest β walks every review page | Due diligence on a handful of finalists |
maxRecords: 0 deserves its own warning. It removes the cap completely. On an all-categories run with profile scraping on, that is an open-ended job β always pair it with maxTotalChargeUsd.
Cost levers:
- Scan shallow, then deepen. The two-pass pattern above β a wide listing-only pass, then profile scraping on only the names worth pursuing β is by far the biggest saving.
- Leave
scrapeAllReviewsoff unless review content is the actual deliverable. - Validate at
maxRecords: 3before committing to a large run, especially when trying a new location slug. - Remember
filterNamedoesn't save anything β it filters after collection. Narrow withcategoryandlocationinstead. - Prefer
summary/chunkeddelivery overperCompanyβ one call instead of hundreds. - Cap the spend with
maxTotalChargeUsdon any agent-driven run.
π Companion machine-readable files
| File | Purpose |
|---|---|
.actor/actor.json | Identity, title, description, version, build tag, and the input / output / dataset schema references |
.actor/input_schema.json | Authoritative typed input contract β category enum, location, name filter, limits, the two depth toggles, proxy, and the 5 delivery fields |
.actor/dataset_schema.json | Four Console Output views β Overview, a CRM-ready Contacts only, Team & capabilities, and Reviews |
.actor/output_schema.json | Declares where results are stored |
If any table on this page disagrees with the schema files, the schema files win.
π οΈ Troubleshooting
| # | Symptom you see | Most likely cause | Fix |
|---|---|---|---|
| 1 | 0 items with a location set | The slug isn't one Clutch recognises | Copy the slug from a real Clutch URL, or clear the field. |
| 2 | 0 items with filterName set | The substring matched nothing | Broaden or remove it β it filters after collection. |
| 3 | Far fewer records than maxRecords | maxPages capped pagination first | Raise maxPages alongside maxRecords. |
| 4 | Only 8 fields per company | scrapeProfiles: false | Turn it on for the full 31-field record. |
| 5 | contactEmail / hourlyRate empty on some rows | Those agencies didn't publish them | Normal. Enrich from website with a contact scraper. |
| 6 | Sorting by hourlyRate gives nonsense | It's a band string β "$100 - $149" sorts before "$50 - $99" | Sort on the parsed lower bound. |
| 7 | Arithmetic on rating or employees fails | Both are display strings | Extract the leading number first. |
| 8 | CSV export mangles rows | offices, members, tools, reviews are nested | Flatten before exporting. |
| 9 | reviews is thin or empty | scrapeAllReviews: false collects roughly the first page | Enable it if reviews are the point. |
| 10 | Rating/price filter appears ignored | No source-side filters exist | Filter the dataset afterwards. |
| 11 | A category you want isn't listed | Six categories are supported | Use the closest, or open a request. |
| 12 | Sharply fewer results than an earlier run | Clutch bot protection on the exit IP | Enable Apify Proxy with RESIDENTIAL and retry. |
| 13 | Log Could not set up Apify Proxy | The plan lacks access to that proxy group | Upgrade, or accept a higher block rate. |
| 14 | Run takes many minutes | Profile scraping opens an extra page per company | Expected; use the async endpoint. |
| 15 | Run seems unbounded | maxRecords: 0 means unlimited | Set a real limit and a spend cap. |
| 16 | No case studies or portfolio images | Not returned | Open profileLink. |
| 17 | HTTP 408 on run-sync-get-dataset-items | The synchronous endpoint has a hard 300-second ceiling | Use async POST /runs β poll β fetch. |
| 18 | Hundreds of connector calls | deliveryMode: "perCompany" | Switch to summary or chunked. |
| 19 | Notion / Airtable timed out | One call carrying every company is too large | Use deliveryMode: "chunked". |
| 20 | Slack / Notion received nothing | Delivery needs both mcpConnector and mcpTool | Set both. The dataset is still written in full. |
| 21 | Connector fired but the body is empty | mcpArguments did not reference {message} | Map {message} and populate mcpMessageTemplate. |
| 22 | Log APIFY_MCP_PROXY_URL is not set | You ran locally; connectors only resolve on the platform | Deploy with apify push and run on the platform. |
| 23 | HTTP 401 / 403 from Apify | Missing, expired or malformed APIFY_TOKEN | Regenerate in Apify Console β Settings β API & Integrations. |
| 24 | HTTP 429 from Apify | Apify account concurrency / rate limits | Retry with exponential backoff (2s β 4s β 8s). |
Known limitations
- No source-side filtering by rating, price, employee count or project size β filter the dataset.
- Six categories only.
locationmust be a Clutch slug, and a wrong one fails silently with zero results.- All the numbers are display strings, including price bands and headcount bands.
- Field availability varies a lot β agencies fill in very different amounts of their profile.
- No portfolio case studies, files or imagery.
Diagnostic checklist before opening an issue
- Baseline run.
{"category":"software-developers","maxRecords":3,"maxPages":1,"scrapeProfiles":false}β no location, no name filter. Cheapest proof the pipeline works. - Records returned? If yes, the Actor is fine and one of your filters was the problem.
- Suspect the location slug first. It's the most common cause of a silent empty result β it must match Clutch's own URL form exactly.
- Then suspect
maxPages. A highmaxRecordswithmaxPages: 1stops at one page. - Check field expectations against the shape. Missing contacts on a
scrapeProfiles: falserun is by design, not a bug.
If the issue survives all five steps, open an Issues ticket on the Actor page (or email support) with the run ID, the exact input JSON, and a profileLink where a field you expected was empty.
β FAQ
Setup & scope
Do I need a Clutch account?
No β and none is accepted. Only public directory and profile pages are read.
Which categories are supported?
Six: software developers, web designers, digital marketing, SEO companies, mobile app developers and IT services. Leaving the category blank scrapes all six.
Can I plug it into Claude, Cursor, or a LangChain agent?
Yes β it is a native MCP tool:
claude mcp add --transport http apify "https://mcp.apify.com?tools=techforce.global/clutch-scraper"
Do I need a proxy?
For anything beyond a small validation run, yes. Clutch applies bot protection, and the input defaults to Apify Proxy with the RESIDENTIAL group, which needs a paid plan. If proxy setup fails, the run continues directly rather than failing β but expect thinner results.
Inputs
Why did my location filter return nothing?
Because location is Clutch's own URL slug, not free text. united-kingdom works; UK or England won't. Copy the slug straight from a Clutch URL.
Does filterName make the run faster?
No β it filters what has already been collected. To reduce the actual work, narrow category and location instead.
What's the difference between maxRecords and maxPages?
maxRecords caps how many companies you keep; maxPages caps how many listing pages get walked. A high maxRecords with a low maxPages stops early β raise them together.
How do I make a run cheap?
Turn scrapeProfiles off. That's the single biggest lever: 8 fields instead of 31, and no extra visit per company. Then deepen only the shortlist.
Output
Why do I only get 8 fields?
scrapeProfiles was off. Turning it on adds contacts, team, tools, offices and reviews β 31 fields in total.
Why is rating a string?
Everything numeric is captured as displayed β rating, reviewCount, hourlyRate, minProjectSize, employees, yearFounded. Parse before comparing, and be careful sorting price bands: "$100 - $149" sorts before "$50 - $99" alphabetically.
Why are some contact fields empty?
Because that agency didn't publish them. Clutch profiles vary enormously in completeness. Take the website field and run a contact scraper over it if you need more.
Why are my reviews thin?
scrapeAllReviews defaults to off, which collects roughly the first page per company. Enable it for the full set β it's the slowest option in the Actor.
Can I get their portfolio or case studies?
No β open profileLink for those.
Pricing
How is this billed?
Pay-per-result β charged per company returned, with no monthly subscription. The current rate is on the Actor's Pricing tab. Apify platform usage is billed separately and depends heavily on your depth toggles.
Does profile scraping cost more?
The per-result charge is the same, but platform usage is higher because each company costs an extra page visit β and full review collection more again.
How do I guarantee an agent never overspends?
Pass maxTotalChargeUsd as a query parameter on the run endpoint β and never use maxRecords: 0 without it.
π Related Actors
Agency directories β same job, different source
| Actor | Directory | Why pick it over this one |
|---|---|---|
| This Actor | Clutch.co | Verified reviews, published hourly rates and minimum project sizes β the richest commercial detail of the three |
| DesignRush Agency Scraper | DesignRush | Different agency pool, strong on creative and branding firms |
| TopDevelopers Scraper | TopDevelopers | Different pool again, development-heavy |
βΉοΈ Run all three for a serious shortlist. The three directories overlap far less than you'd expect β an agency ranked highly on one is often absent from another. Dedupe on company name or website.
Enrichment & downstream pipeline
| Actor | Use it for |
|---|---|
| Website Contact Scraper | Fill contact gaps β feed it the website field where Clutch showed no email |
| LinkedIn Company Decision Makers | The named partner or director to actually approach |
| LinkedIn Company Employees | Verify claimed team size and skill mix against LinkedIn |
| GOV.UK Business Scraper | Confirm a UK agency is a real, active company before signing |
| Google Maps Business Leads & Sales Intelligence | Local presence and contact data for the same firms |
Suggested pipeline patterns
π― Shortlist β contacts β named buyer This Actor with profile scraping β Website Contact Scraper for the gaps β LinkedIn Decision Makers for the person to approach.
π‘οΈ Vendor due diligence Deep-scrape your finalists with full reviews β LinkedIn Employees to sanity-check claimed team size β GOV.UK Business Scraper to confirm the legal entity.
π° Pricing benchmark
One category across several countries β parse hourlyRate and minProjectSize β a defensible view of what the market actually charges.
πΊοΈ Three-directory market map This Actor + DesignRush + TopDevelopers β dedupe on website β the fullest picture of who serves a category.
π Reputation tracking
Schedule a listing-only run monthly β diff rating and reviewCount β watch competitors' reputations move.
Browse all Actors by Techforce Global at scraper.techforce.global.
π Compliance & Data Privacy
This Actor is an independent tool. It is not affiliated with, endorsed by, or sponsored by Clutch.co or Clutch Co. All trademarks are the property of their respective owners.
It reads publicly available directory and profile pages on Clutch.co. It does not log in, does not accept credentials, and never requests quotes, posts reviews or contacts an agency.
Most of the output is straightforward business data β company names, ratings, published pricing, service categories. Four points deserve care:
- Named individuals appear in the output.
overviewName,members[].name, their positions, bios and photos, and review authors are identifiable people. That is personal data under GDPR, UK GDPR and CCPA/CPRA. Have a lawful basis for storing it, set a retention period, and be ready to honour access and erasure requests. If you only need company-level data, don't retain the member records. - Review content belongs to the clients who wrote it. Reviews are the reason Clutch matters, and they are also third-party copyrighted text about identifiable companies. Quoting them at length in your own materials, or republishing them as if you had gathered them, raises both copyright and attribution issues β summarise and attribute.
- A published contact is not consent to be marketed to. An agency listing an email so prospective clients can reach it has not agreed to receive your outreach. Before any campaign, satisfy the applicable rules (GDPR Art. 6/21, ePrivacy/PECR, CAN-SPAM, CASL).
- Ratings and pricing go stale. Republishing them as current β in a comparison page or a report β commits you to a refresh cadence, and a wrong rating attached to a named company is commercially damaging to them and risky for you. Attribute the source and link through to
profileLink.
Use of automated collection is governed by Clutch's terms of service, which you are responsible for reviewing. You remain responsible for complying with those terms, Apify's proxy terms, and all applicable data-protection and marketing law in the markets you operate in.
π Support & Custom Pipeline Engineering
Need additional Clutch categories, scheduled reputation tracking with change detection, review sentiment analysis, multi-directory deduplication, or a full vendor-sourcing pipeline feeding your CRM?
- Email: bhavin.shah@techforceglobal.com
- Custom Enterprise Integrations: Book a 15-Minute Technical Consultation
- Maintained by: Techforce Global β Specialists in High-Performance Web Scrapers and Agentic Workflows.
Made with β€οΈ by Techforce Global Specialists in High-Performance B2B Contact Data Extraction and AI Automation.
π·οΈ Structured data for search & AI discovery
SoftwareApplication describes the Actor; FAQPage wraps the FAQ above so those answers are
eligible for rich results, matching it question-for-question.
{"@context": "https://schema.org","@type": "SoftwareApplication","name": "Clutch.co Scraper","alternateName": "Clutch.co Scraper β Agency Ratings, Reviews, Pricing & Contacts","applicationCategory": "BusinessApplication","applicationSubCategory": "Web Scraping / B2B Agency Lead Generation","operatingSystem": "Cloud (Apify platform)","description": "Extracts B2B agency and software-company data from Clutch.co across six categories β verified rating and review count, hourly rate band, minimum project size, employee count, year founded, offices, tools, team members, contact details and full client reviews β filtered by category, location or company name, with no Clutch login. A listing-only run returns eight fields per company; enabling profile scraping returns thirty-one. Results can be delivered into Notion, Slack, Airtable, Google Sheets or any authorized MCP connector.","url": "https://apify.com/techforce.global/clutch-scraper","author": {"@type": "Organization","name": "Techforce Global","url": "https://www.techforceglobal.com"},"provider": {"@type": "Organization","name": "Apify","url": "https://apify.com"},"offers": {"@type": "Offer","priceCurrency": "USD","category": "Pay per result","description": "Pay-per-result, charged per company returned. Apify platform usage is billed separately and scales with the depth toggles. The current rate is listed on the Actor's Pricing tab.","url": "https://apify.com/techforce.global/clutch-scraper"},"featureList": ["No Clutch account, login or API key required or accepted","Six Clutch categories, or all six in one run when the category is left blank","Location filtering via Clutch's own URL slug, so any place Clutch supports works","Case-insensitive company-name filter for pulling a known shortlist out of a category","Two depth modes: eight listing fields, or thirty-one with profile scraping on","Verified rating and review count as Clutch displays them","Hourly rate band, minimum project size, employee count and year founded","Office locations, tools and team members from the profile page","Contact details published on the profile, with the website for further enrichment","Client reviews, optionally paginated across every review page","Apify Proxy on by default with the RESIDENTIAL group, the reliable choice against Clutch's bot protection","A failed proxy setup degrades to a direct connection instead of failing the run","Companies pushed to the dataset as each one completes, so a partial run keeps its results","Optional MCP delivery to Notion, Slack, Airtable, Google Sheets and more","Chunked delivery mode keeps long company lists under connector size and timeout caps"],"isAccessibleForFree": false,"softwareRequirements": "Apify account and API token","softwareHelp": {"@type": "CreativeWork","url": "https://apify.com/techforce.global/clutch-scraper"},"keywords": "Clutch.co scraper, agency directory scraper, B2B lead generation, software development companies, agency ratings and reviews, hourly rate data, vendor shortlisting, outsourcing partner research, MCP connector"}
{"@context": "https://schema.org","@type": "FAQPage","mainEntity": [{"@type": "Question","name": "Do I need a Clutch account?","acceptedAnswer": {"@type": "Answer","text": "No - and none is accepted. Only public directory and profile pages are read."}},{"@type": "Question","name": "Which categories are supported?","acceptedAnswer": {"@type": "Answer","text": "Six: software developers, web designers, digital marketing, SEO companies, mobile app developers and IT services. Leaving the category blank scrapes all six."}},{"@type": "Question","name": "Can I plug it into Claude, Cursor, or a LangChain agent?","acceptedAnswer": {"@type": "Answer","text": "Yes - it is a native MCP tool. Add it with: claude mcp add --transport http apify \"https://mcp.apify.com?tools=techforce.global/clutch-scraper\""}},{"@type": "Question","name": "Do I need a proxy?","acceptedAnswer": {"@type": "Answer","text": "For anything beyond a small validation run, yes. Clutch applies bot protection, and the input defaults to Apify Proxy with the RESIDENTIAL group, which needs a paid plan. If proxy setup fails, the run continues directly rather than failing - but expect thinner results."}},{"@type": "Question","name": "Why did my location filter return nothing?","acceptedAnswer": {"@type": "Answer","text": "Because location is Clutch's own URL slug, not free text. united-kingdom works; UK or England will not. Copy the slug straight from a Clutch URL."}},{"@type": "Question","name": "Does filterName make the run faster?","acceptedAnswer": {"@type": "Answer","text": "No - it filters what has already been collected. To reduce the actual work, narrow category and location instead."}},{"@type": "Question","name": "What's the difference between maxRecords and maxPages?","acceptedAnswer": {"@type": "Answer","text": "maxRecords caps how many companies you keep; maxPages caps how many listing pages get walked. A high maxRecords with a low maxPages stops early - raise them together."}},{"@type": "Question","name": "How do I make a run cheap?","acceptedAnswer": {"@type": "Answer","text": "Turn scrapeProfiles off. That is the single biggest lever: 8 fields instead of 31, and no extra visit per company. Then deepen only the shortlist."}},{"@type": "Question","name": "Why do I only get 8 fields?","acceptedAnswer": {"@type": "Answer","text": "scrapeProfiles was off. Turning it on adds contacts, team, tools, offices and reviews - 31 fields in total."}},{"@type": "Question","name": "Why is rating a string?","acceptedAnswer": {"@type": "Answer","text": "Everything numeric is captured as displayed - rating, reviewCount, hourlyRate, minProjectSize, employees and yearFounded. Parse before comparing, and be careful sorting price bands: \"$100 - $149\" sorts before \"$50 - $99\" alphabetically."}},{"@type": "Question","name": "Why are some contact fields empty?","acceptedAnswer": {"@type": "Answer","text": "Because that agency did not publish them. Clutch profiles vary enormously in completeness. Take the website field and run a contact scraper over it if you need more."}},{"@type": "Question","name": "Why are my reviews thin?","acceptedAnswer": {"@type": "Answer","text": "scrapeAllReviews defaults to off, which collects roughly the first page per company. Enable it for the full set - it is the slowest option in the Actor."}},{"@type": "Question","name": "Can I get their portfolio or case studies?","acceptedAnswer": {"@type": "Answer","text": "No - open profileLink for those."}},{"@type": "Question","name": "How is this billed?","acceptedAnswer": {"@type": "Answer","text": "Pay-per-result - charged per company returned, with no monthly subscription. The current rate is on the Actor's Pricing tab. Apify platform usage is billed separately and depends heavily on your depth toggles."}},{"@type": "Question","name": "Does profile scraping cost more?","acceptedAnswer": {"@type": "Answer","text": "The per-result charge is the same, but platform usage is higher because each company costs an extra page visit - and full review collection more again."}},{"@type": "Question","name": "How do I guarantee an agent never overspends?","acceptedAnswer": {"@type": "Answer","text": "Pass maxTotalChargeUsd as a query parameter on the run endpoint - and never use maxRecords 0 without it."}}]}