Bulk-extract agencies from Clutch.co — names, ratings, employee counts, hourly rates, services, location, customer reviews, and contact emails / phones — in Python. Built for agency-shortlist generation, B2B lead generation, and competitive intelligence.
This Python project runs the Clutch.co Scraper Apify actor — a programmable interface to Clutch's directory of 350,000+ B2B service providers. Pulls full company profiles (services, focus areas, hourly rate, project minimum, employee count, founding year, location, social media, portfolio items), individual customer reviews with ratings and project details, and contact emails plus phone numbers harvested from each company's own website.
Clutch is the de-facto Yelp for B2B services — design, dev, marketing, consulting agencies all list there with verified-client reviews. The pages are rendered as static HTML (no JavaScript-heavy SPA), but each profile is buried 2–4 clicks deep, so even getting 500 agencies for a shortlist by hand takes hours. There's no public API. Generic scrapers run into Clutch's rate-limit walls within minutes.
This actor uses residential proxies, per-session pacing, and proper pagination logic to navigate Clutch's catalog → company → reviews → website-extraction chain in one input, returning one record per company with everything embedded. Free Apify tier gets you ~1,000 profiles per month at zero cost.
- Agency shortlist generation — pull the top-100 mobile-app developers in Ukraine with reviews and contacts for a hiring search.
- B2B lead generation — feed your CRM with verified agencies in a target vertical for cold outbound.
- Procurement comparison — bulk-compare hourly rates and minimum project sizes across candidate agencies.
- Competitive intelligence — see who's reviewing your competitor, what industry they're in, and how they describe the engagement.
- Sales territory mapping — enumerate every agency in a country / state / city to plan field sales coverage.
- Vendor due diligence — pull a candidate vendor's full review history before signing a contract.
- Acquisitions research — score agencies by review volume, rating, and employee count for M&A pipelines.
- Python 3.10+
- A free Apify account
- No Clutch account required
git clone https://github.com/pro100chok/clutch-co-companies-reviews-scraper-python.git
cd clutch-co-companies-reviews-scraper-python
pip install -r requirements.txt
cp .env.example .env
# paste your APIFY_API_TOKEN
python main.pymain.py enumerates verified Ukrainian app-development agencies from Clutch's /app-developers catalog, sorted by Clutch Rank, and prints a leaderboard plus an email-coverage summary.
mode |
Inputs | What you get |
|---|---|---|
catalog |
A Clutch catalog URL (e.g. https://clutch.co/developers) |
Every agency on that catalog, page-by-page. |
profile |
Specific Clutch profile URLs | The full profile of one or more named companies. |
search |
keywords + a seed URL |
Companies matching keywords across Clutch's search. |
url |
Any Clutch URL | Auto-detects the URL type and runs the matching mode. |
- The actor accepts your
startUrlsand optional filters (location, hourly rate, min budget, employee size, verified-only, sort order). - For each catalog page it parses the agency list (~50 per page) and decides whether to dig into each profile based on
scrapeProfiles. - For each profile it fetches the public company page and parses 25+ fields including services, hourly rate, project size, focus areas, portfolio items, employee count.
- If
scrapeReviews=true, it paginates Clutch's review list and pulls each individual review with rating, summary, client name, industry, project type, project size. - If
extractContacts=true, it visits the company's own website (homepage + contact / about pages) and runs the email + phone extraction pipeline, attaching the results to the company record.
The whole pipeline runs server-side. Your script receives one row per company with everything pre-joined.
import os
from apify_client import ApifyClient
client = ApifyClient(os.environ["APIFY_API_TOKEN"])
run = client.actor("pro100chok/clutch-scraper").call(run_input={
"mode": "catalog",
"startUrls": [{"url": "https://clutch.co/web-developers"}],
"maxPages": 3,
"maxItems": 150,
"scrapeProfiles": True,
"extractContacts": True,
"filterEmployees": "50 - 249",
"filterVerifiedOnly": True,
"sortBy": "ClutchRank",
})
for c in client.dataset(run["defaultDatasetId"]).iterate_items():
contacts = (c.get("contacts") or {}).get("emails") or []
print(f"{c['name']:<35} ⭐ {c['rating']} {contacts[0] if contacts else ''}"){
"name": "Acme Web Studio",
"url": "https://clutch.co/profile/acme-web-studio",
"rating": 4.9,
"reviewCount": 87,
"hourlyRate": "$50 - $99 / hr",
"minimumProjectSize": "$25,000",
"employeeCount": "50 - 249",
"foundedYear": 2014,
"location": {
"city": "Kyiv", "country": "Ukraine", "lat": 50.4501, "lng": 30.5234
},
"services": ["Web Development", "Custom Software Development", "UX/UI Design"],
"focusAreas": [{ "name": "JavaScript", "percent": 35 }],
"website": "https://acmewebstudio.com",
"contacts": {
"emails": ["hello@acmewebstudio.com", "sales@acmewebstudio.com"],
"phones": ["+38-044-555-0123"],
"socials": { "linkedin": "https://www.linkedin.com/company/acme-web-studio/" }
},
"reviews": [
{
"rating": 5.0,
"clientName": "VP of Product, SaaS Startup",
"industry": "Information Technology",
"projectSize": "$50,000 - $199,999",
"summary": "Acme delivered a custom CMS on time and under budget..."
}
]
}| Parameter | Type | Required | Description |
|---|---|---|---|
mode |
string | yes | catalog, profile, search, or url. |
startUrls |
object[] | yes | URLs depending on mode (catalog page / profile / seed URL). |
keywords |
string[] | for search |
Service keywords. |
maxPages |
integer | no | Catalog pages to walk. 0 = all. Default 5. |
maxItems |
integer | no | Cap on companies. 0 = all. Default 10. |
scrapeProfiles |
boolean | no | Visit each profile for full details. Default true. |
scrapeReviews |
boolean | no | Pull reviews per company. Default false. |
maxReviewsPerCompany |
integer | no | Cap on reviews per company. Default 10. |
extractContacts |
boolean | no | Extract emails + phones from each company's website. Default true. |
filterLocation |
string | no | E.g. United States, Germany, Kyiv. |
filterBudget |
string | no | 5000, 10000, 25000, 50000, 100000. |
filterHourlyRate |
string | no | 25, 50, 100, 150, 200, 300. |
filterEmployees |
string | no | 10 - 49, 50 - 249, 250 - 999, 1,000 - 9,999. |
filterVerifiedOnly |
boolean | no | Show only verified companies. |
sortBy |
string | no | relevance_desc, ClutchRank, NumberOfReviews, ReviewRating. |
proxyConfiguration |
object | no | Residential proxies recommended. |
concurrency |
integer | no | Parallel sessions (1–10). |
requestDelay |
number | no | Seconds between requests (≥1.0). |
| File | Demonstrates |
|---|---|
examples/01_basic_usage.py |
10 companies from a catalog. |
examples/02_keyword_search.py |
Search mode with service keywords. |
examples/03_company_reviews.py |
Full review extraction for specific profiles. |
examples/04_export_to_csv.py |
Filtered shortlist with pandas. |
examples/05_export_to_google_sheets.py |
Append to a shared lead-pipeline Sheet. |
How much does it cost? The actor is metered per company record returned — typically a fraction of a cent each. Apify's free $5/month covers 1,000+ profiles before billing.
Is there a flat-rate monthly plan? Yes. Clutch.co Scraper monthly at $20/month gives unlimited usage.
Do I get contact emails for every agency?
Most agencies publish at least one role inbox (hello@, sales@, contact@) on their website — the contact extractor catches ~85% of them in practice. The rest hide contacts behind a JavaScript form or a "request a quote" wizard. You'll still get the website URL even when the email isn't extractable.
Will reviews include verified-client info? Yes — Clutch's review pages show the reviewer's role, company size, industry, and project size when the reviewer chose to disclose them. The actor preserves all those fields.
Can I filter by services / focus areas?
You can pre-filter by browsing Clutch yourself first — copy the URL of the filtered catalog page into startUrls and the actor walks only that pre-filtered set. Catalog URLs encode all the filter state (location, services, employee count, etc.) in the path/query.
Is the data accurate? Names, ratings, review counts, and locations match Clutch's UI exactly. Hourly rates and project minimums are what each company self-reports to Clutch.
Why is requestDelay defaulted to 1.5s?
Clutch returns a 429 if you hammer it too hard — 1 second between requests per session is the safe floor. Higher concurrency + a per-session delay is more reliable than 0-delay single-session.
Can I scrape Clutch's portfolio items / case studies?
Yes — scrapeProfiles: true includes the portfolio items each company has uploaded (image URLs, project descriptions, client names).
- Website Contact Scraper — pull contact info from arbitrary websites.
- Email Verifier — validate the emails before launching outreach.
- Google Maps Scraper — local business contact extraction (cross-reference with Clutch agency offices).
See all my actors at apify.com/pro100chok.
MIT — see LICENSE.
Built on top of the Clutch.co Scraper Apify actor.