Skip to content

Latest commit

 

History

1 Commit

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Clutch.co Companies + Reviews + Contacts Scraper — Python Example

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.

Apify Actor Python 3.10+ License: MIT

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.

Why scrape Clutch.co?

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.

Use cases

  • 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.

Requirements

Quick start

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.py

main.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.

Four scrape modes

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.

How it works

  1. The actor accepts your startUrls and optional filters (location, hourly rate, min budget, employee size, verified-only, sort order).
  2. For each catalog page it parses the agency list (~50 per page) and decides whether to dig into each profile based on scrapeProfiles.
  3. 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.
  4. If scrapeReviews=true, it paginates Clutch's review list and pulls each individual review with rating, summary, client name, industry, project type, project size.
  5. 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.

Example: shortlist verified mid-market web devs

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 ''}")

Example output

{
  "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..."
    }
  ]
}

Input parameters

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).

More examples

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.

FAQ

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).

Related actors

See all my actors at apify.com/pro100chok.

License

MIT — see LICENSE.


Built on top of the Clutch.co Scraper Apify actor.