GoodFirms B2B Companies & Software Scraper
Pricing
from $2.50 / 1,000 results
GoodFirms B2B Companies & Software Scraper
GoodFirms scraper & API: find B2B agencies & software by service category and location β company name, rating & reviews, hourly rate, minimum budget, team size, founded year, location, services and website. B2B vendor research and agency lead generation β fast, no login.
Pricing
from $2.50 / 1,000 results
Rating
0.0
(0)
Developer
Haketa
Maintained by CommunityActor stats
0
Bookmarked
34
Total users
5
Monthly active users
an hour ago
Last modified
Categories
Security
Limited permissionsShare
GoodFirms Scraper β B2B Agencies, Software Products, Hourly Rates, Emails & Reviews
Turn GoodFirms' global B2B agency and SaaS directory into an enriched sales and market-intelligence pipeline. Extract verified B2B service companies and SaaS software products from GoodFirms.co β including company name, cleaned website URL, aggregate rating, verified review count, hourly rate bracket, employee headcount band, founded year, structured headquarters & office addresses, public business email & phone, social links (LinkedIn, X/Twitter, Facebook, Instagram), service-focus percentages, client-size split, AI tools used, and verified client reviews.
Export to JSON, CSV, Excel, or the Apify API β no login, no manual copy-pasting.
β‘ At a glance
| Feature | Details |
|---|---|
| π― Target directory | GoodFirms.co β Top global B2B IT services, agency & SaaS review directory |
| π’ Collection modes | Companies (companies) β 30+ B2B agency categories Γ 20+ country/state filters; Software (software) β 20+ SaaS verticals; Auto (auto) β detects from startUrls |
| π B2B Contact & Social | UTM-stripped websiteUrl (100%), contact.phone (~99.5%), contact.email (~88%), and socialLinks (linkedin ~92%, facebook, twitter, instagram) |
| πΌ Firmographic signals | hourlyRateRange (e.g., $25 - $49/hr), employeesRange (e.g., 50 - 249), foundedYear, rating, reviewCount, and structured headquarters + offices |
| π Service & Client Split | services breakdown with % share (e.g., Web Development: 20%), focusBreakdown (Small / Medium / Large Business %), aiTools, and whyChoose bullets |
| β Verified Client Reviews | Optional scrapeReviews: true extracts individual client reviews (rating, projectName, projectCost, projectDuration, reviewer, reviewerRole, reviewerCompany, summary) |
| π Pagination & Scale | Unlocked 1,000+ results pagination (maxPagesPerCategory: 0 auto-paginates until maxRecords is reached) with 100% slug deduplication |
| π¦ Bulk export | Pre-built Companies, Software, and Reviews dataset views in JSON, CSV, Excel (XLSX), and REST API |
π Why scrape GoodFirms?
GoodFirms is one of the Big Three global B2B service and software directories (alongside Clutch and G2/DesignRush). Over 110,000+ software development companies, digital marketing agencies, UI/UX studios, AI/blockchain consultancies, and SaaS vendors maintain detailed profiles on GoodFirms because enterprise procurement teams and startup founders use it daily to shortlist vendors.
That makes GoodFirms one of the highest-intent B2B lead sources on the web β every agency profile combines budget & pricing tier (hourlyRateRange), headcount (employeesRange), geographic footprint (headquarters + offices), verified review velocity (rating + reviewCount), service specialization (services %), and direct contact channels (websiteUrl, contact.email, contact.phone, socialLinks.linkedin).
Collecting this manually is a bottleneck:
- Deep multi-page directories: Categories like Web Development, Mobile App Development, and Digital Marketing span hundreds of pages.
- Split data between cards and profiles: Listing cards show summary firmographics, while business emails, street addresses, multi-office locations, service-focus percentages, and social links live on individual
/company/{slug}pages. - Cross-category overlap: The same agency often ranks in 5β10 categories (e.g., Web Dev, Node.js, React, E-Commerce); scraping without global slug deduplication creates noisy duplicates.
This GoodFirms scraper automates discovery, multi-page traversal, profile enrichment, UTM cleanup, and slug deduplication in a single run.
Common reasons teams use this GoodFirms data extractor
- π― Outbound B2B Lead Generation β Build hyper-targeted agency prospect lists filtered by hourly rate, employee count, country, and service line β with website, email, phone, and LinkedIn in the same row.
- π Account-Based Marketing (ABM) & Lookalike Audiences β Segment mid-market IT and marketing agencies (
50 - 249or250 - 999employees) for partnerships, white-label services, DevOps tooling, or SaaS sales. - π Competitive & Pricing Intelligence β Benchmark hourly rates, review counts, client-size splits, and AI tool adoption (
aiTools) across regions (US, UK, India, Ukraine, Poland, UAE, LATAM). - π» SaaS Market & Alternatives Research β Extract software products (
mode: "software") with pricing models, starting prices, free-trial flags, feature checklists, and competitor alternatives. - π€ M&A, Roll-up & PE Deal Sourcing β Screen boutique and mid-sized IT service firms by founding year, headcount, hourly rate band, and verified review momentum.
β¨ What this GoodFirms scraper does
- β
Dual scraping modes (
companies&software) β Scrape B2B service agencies, SaaS software products, or letmode: "auto"infer the record type from any URL instartUrls. - β
Unlocked 1,000+ results pagination β With
maxPagesPerCategory: 0(the default), the scraper automatically walks page1, 2, 3 β¦across your selected categories and countries until yourmaxRecordstarget is reached or the directory ends. - β
Two speed/depth tiers (
scrapeProfileDetails):- Fast List Mode (
scrapeProfileDetails: false): Extracts rich listing-card data (name,websiteUrl,logoUrl,tagline,rating,reviewCount,hourlyRateRange,employeesRange,foundedYear,headquarters,aiTools,topReview,whyChoose) in seconds. - Full Profile Mode (
scrapeProfileDetails: true): Visits each/company/{slug}page to addcontact.email(~88% fill),contact.phone(~99.5% fill),socialLinks(LinkedIn ~92%), fulldescription,services%breakdown,focusBreakdown%, andoffices.
- Fast List Mode (
- β
Server-side ICP filtering β Apply
countrySlugs,employeesFilter,hourlyRateFilter, andminReviewsdirectly to GoodFirms discovery URLs so you only scrape companies matching your Ideal Customer Profile. - β
Automatic slug normalization β If a bare category slug is passed (e.g.,
web-developmentinstead ofweb-development-agency), the actor automatically retries the canonical-agencyslug on page 1. - β
Opt-in verified client reviews (
scrapeReviews: true) β Pulls individual client reviews with project cost, project duration, reviewer name/title/company, and review summary.
π― Use cases
1. Outbound SDR & Cold Email Teams (Apollo / Clay / Smartlead / Lemlist)
- Ready-to-sequence agency lists: Scrape
digital-marketing-agency,seo-agency, andppc-agencyacross["us", "gb", "ca", "au"]withemployeesFilter: "10-49"andscrapeProfileDetails: true. Export directly to Clay or Smartlead withwebsiteUrl,contact.email,contact.phone,socialLinks.linkedin, andtopReview.quotefor personalized first lines.
2. B2B SaaS & Developer Tool Vendors
- AI & DevOps tool adoption targeting: Filter agencies by the
aiToolsarray reported on their cards (e.g., GitHub Copilot, Cursor, ChatGPT, Claude, Midjourney) andtopServicesto pitch developer productivity, cloud infrastructure, or QA automation platforms.
3. White-Label & Staff Augmentation Partnerships
- High-rate agency partnering: Identify US/UK/EU agencies charging
$100 - $149/hror$150 - $199/hr(hourlyRateFilter: "100-149") and pair them with nearshore/offshore delivery teams.
4. M&A Advisors, Private Equity & Search Funds
- IT Services acquisition screening: Filter for established firms (
foundedYear <= 2018,employeesFilter: "50-249",minReviews: 15) and analyze theirfocusBreakdown(Enterprise vs. Mid-Market vs. SMB share) and multi-countryoffices.
π₯ Input parameters
Configure the actor in the Apify Console or pass JSON via the API. All fields are optional β launching with an empty input {} runs a curated multi-category sample of ~100 B2B agencies.
| Parameter | Type | Default | Prefill | Description |
|---|---|---|---|---|
mode | string | "auto" | "companies" | "companies" (B2B agencies), "software" (SaaS products), or "auto" (detect from startUrls). |
serviceCategorySlugs | array<string> | [] | ["web-development-agency"] | One or more B2B agency categories to crawl (30 built-in options in the dropdown, or pass any GoodFirms category slug). |
countrySlugs | array<string> | [] | [] | Optional country or US state filters (us, gb, ca, au, in, de, fr, nl, ua, pl, ae, california, new-york, texas, etc.). Empty = global. |
softwareCategorySlugs | array<string> | [] | [] | SaaS categories to crawl when mode is "software" or "auto" (crm-software, project-management-software, erp-software, etc.). |
employeesFilter | string | "" | β | Filter agencies by headcount bracket: "" (Any), "2-9", "10-49", "50-249", "250-999", "1000-9999", "10000+". |
hourlyRateFilter | string | "" | β | Filter agencies by USD hourly rate: "" (Any), "<25", "25-49", "50-99", "100-149", "150-199", "200+". |
minReviews | integer | 0 | β | Only include companies with at least this many verified reviews (0 = no minimum). |
scrapeProfileDetails | boolean | true | false | Visit each profile page for contact.email, contact.phone, socialLinks, services %, focusBreakdown %, and full description. Set false for fast list-card scraping. |
scrapeReviews | boolean | false | false | Fetch verified client reviews per company/software profile. |
maxRecords | integer | 0 | 20 | Maximum total records to output (0 = unlimited). Set to 1000+ for deep category sweeps. |
maxPagesPerCategory | integer | 0 | β | Maximum listing pages to crawl per category/country combo. 0 = unlimited (auto-governed by maxRecords). |
startUrls | array | [] | [] | Advanced: Paste any GoodFirms category URL, country listing URL, /company/{slug} URL, or /software/{slug} URL. Category URLs in startUrls paginate automatically. |
companySlugs | array<string> | [] | [] | Advanced: Direct company slugs (e.g., ["unified-infotech", "hyperlink-infosystem"]). |
softwareSlugs | array<string> | [] | [] | Advanced: Direct software slugs (e.g., ["hubspot-crm", "monday-com"]). |
requestDelay | integer | 1200 | β | Delay between requests in milliseconds. |
maxConcurrency | integer | 3 | 3 | Parallel worker count (1β10). Keep at 2β3 for smooth execution. |
proxyConfiguration | object | Apify Proxy | Apify Proxy | Proxy configuration (uses cost-effective datacenter IPs first and automatically escalates to residential if challenged). |
Sample Input Recipes
Recipe 1: Fast list-mode discovery of 1,000+ Web & Mobile Agencies
{"mode": "companies","serviceCategorySlugs": ["web-development-agency","mobile-app-development-agency","software-development-agency"],"scrapeProfileDetails": false,"maxRecords": 1000,"maxPagesPerCategory": 0}
Recipe 2: Full-detail ICP Lead Generation (US, UK & Canada Mid-Market Agencies with Emails & LinkedIn)
{"mode": "companies","serviceCategorySlugs": ["digital-marketing-agency","seo-agency","web-development-agency"],"countrySlugs": ["us", "gb", "ca"],"employeesFilter": "10-49","hourlyRateFilter": "50-99","minReviews": 5,"scrapeProfileDetails": true,"scrapeReviews": false,"maxRecords": 500,"maxPagesPerCategory": 0}
Recipe 3: SaaS Software Directory Extraction (mode: "software")
{"mode": "software","softwareCategorySlugs": ["crm-software","project-management-software","helpdesk-software"],"maxRecords": 300,"maxPagesPerCategory": 0}
π€ Output schema & field reference
Example Output β B2B Company Record (recordType: "company")
{"recordType": "company","slug": "example-agency","profileUrl": "https://www.goodfirms.co/company/example-agency","name": "Example Agency","tagline": "Example Agency is a premier web and software development agency delivering scalable digital products for startups and enterprises.","logoUrl": "https://assets.goodfirms.co/services/medium/example-agency.png","websiteUrl": "https://exampleagency.com/","description": "With 250+ engineers and designers across New York and London, Example Agency builds custom web applications, AI workflows, and enterprise e-commerce platforms...","rating": 4.9,"reviewCount": 202,"foundedYear": 2015,"employeesRange": "250 - 999","hourlyRateRange": "$25 - $49/hr","minProjectSize": "$10,000+","headquarters": {"city": "New York","state": "New York","country": "us","address": "287 Park Ave S"},"offices": [{ "city": "London", "country": "gb" },{ "city": "Noida", "country": "in" }],"topServices": ["Web Development","Software Development","E-commerce Development","Web Design"],"services": [{ "name": "Web Development", "percent": 40 },{ "name": "Software Development", "percent": 30 },{ "name": "E-commerce Development", "percent": 20 },{ "name": "Web Design", "percent": 10 }],"focusBreakdown": [{ "name": "Small Business", "percent": 30 },{ "name": "Medium Business", "percent": 35 },{ "name": "Large Business", "percent": 35 }],"contact": {"email": "hello@exampleagency.com","phone": "+1-555-123-4567"},"socialLinks": {"linkedin": "https://www.linkedin.com/company/example-agency","twitter": "https://twitter.com/exampleagency","facebook": "https://www.facebook.com/exampleagency","instagram": null},"aiTools": ["GitHub Copilot", "Cursor", "ChatGPT", "Claude"],"topReview": {"quote": "Example Agency delivered a robust, user-friendly platform ahead of schedule.","author": "VP of Engineering at FinTech Corp"},"whyChoose": ["Full-cycle agile product engineering","Dedicated cross-functional pods","Transparent weekly sprint reporting"],"reviews": [],"discoveredFrom": "web-development-agency","scrapedAt": "2026-11-01T23:59:00.000Z"}
π’ Company Identity & Firmographics
| Field | Type | Coverage | Description |
|---|---|---|---|
recordType | string | π’ High (100%) | "company" or "software" |
slug | string | π’ High (100%) | Unique GoodFirms URL slug (primary deduplication key) |
profileUrl | string | π’ High (100%) | Canonical GoodFirms profile URL |
name | string | π’ High (100%) | Company or software product display name |
websiteUrl | string | null | π’ High (100%) | External company website URL with UTM tracking parameters stripped |
logoUrl | string | null | π’ High (100%) | Company or product logo image URL |
tagline | string | null | π’ High (100%) | Short positioning headline from the directory listing card |
description | string | null | π’ High (~99.7% in profile mode) | Full multi-paragraph "About" summary from the profile page |
rating | number | null | π’ High (~99.5%) | Aggregate star rating (0.0β5.0) |
reviewCount | integer | null | π’ High (~99%) | Total number of verified client reviews |
foundedYear | integer | null | π’ High (~98%) | Year the company was founded |
employeesRange | string | null | π’ High (100%) | Team size bracket (e.g., "10 - 49", "50 - 249", "250 - 999") |
hourlyRateRange | string | null | π’ High (100%) | Hourly rate bracket (e.g., "< $25/hr", "$25 - $49/hr", "$50 - $99/hr") |
minProjectSize | string | null | π‘ Conditional | Minimum project budget when disclosed on the profile |
π Location, Contact & Social Links
| Field | Type | Coverage | Description |
|---|---|---|---|
headquarters | object | null | π’ High (~99%) | Structured primary HQ ({ city, state, country, address }) |
offices | array<object> | π‘ Conditional (~11%) | Additional global branch offices ([{ city, country }], profile mode) |
contact.phone | string | null | π’ High (~99.5% in profile mode) | Public business telephone number |
contact.email | string | null | π’ High (~88% in profile mode) | Public business contact email address |
socialLinks.linkedin | string | null | π’ High (~92% in profile mode) | Company LinkedIn page URL |
socialLinks.facebook Β· twitter Β· instagram | string | null | π’ High (82% / 68% / 37%) | Additional social profile links |
π§© Services, Client Focus, AI Stack & Reviews
| Field | Type | Coverage | Description |
|---|---|---|---|
topServices | array<string> | π’ High (~99.7% in profile mode) | Top-level service lines offered by the agency |
services | array<object> | π’ High (~99.7% in profile mode) | Sub-service breakdown with percentage share ([{ name, percent }]) |
focusBreakdown | array<object> | π’ High (~95% in profile mode) | Client segment split (Small Business, Medium Business, Large Business with percent) |
aiTools | array<string> | π‘ Conditional (~47%) | AI coding/design/productivity tools listed on the company card |
topReview | object | null | π’ High (~99.5%) | Highlighted client review quote ({ quote, author }) from the listing card |
whyChoose | array<string> | π‘ Conditional (~50%) | Key differentiator bullet points from the listing card |
reviews | array<object> | π‘ Opt-in (scrapeReviews) | Full verified client review array (rating, projectName, projectCost, projectDuration, reviewer, reviewerRole, reviewerCompany, summary, datePublished) |
discoveredFrom | string | π’ High (100%) | Category slug, country filter, or start URL that surfaced the record |
scrapedAt | string | π’ High (100%) | ISO-8601 UTC extraction timestamp |
π Pagination & scale
The GoodFirms Scraper supports seamless deep pagination to collect 1,000+ B2B companies or software products in a single run:
- Auto-governed pagination (
maxPagesPerCategory: 0): By default,maxPagesPerCategoryis0(unlimited). The scraper walks?page=1, 2, 3 β¦across every selected category and country combination untilmaxRecordsis reached or the category runs out of new companies. - End-of-category detection: If a page returns zero new companies (or only repeats already-queued slugs), the actor stops paginating that category immediately and moves to the next target.
- Cross-category deduplication: Every company and software product is deduplicated globally by
slugbefore profile scraping begins. Even if an agency appears across 8 different categories or countries, it is scraped and billed only once (while merging any card seed fields). - Safe-exit wall-clock guard: On massive multi-hundred-profile runs, the actor monitors the run timer and gracefully finishes in-flight workers before the platform timeout so partial datasets are never lost.
π» API Integration Examples
Python (apify-client)
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("haketa/goodfirms-scraper").call(run_input={"mode": "companies","serviceCategorySlugs": ["web-development-agency", "ai-development-agency"],"countrySlugs": ["us", "gb"],"scrapeProfileDetails": True,"maxRecords": 250,"maxPagesPerCategory": 0,})for company in client.dataset(run["defaultDatasetId"]).iterate_items():email = (company.get("contact") or {}).get("email")linkedin = (company.get("socialLinks") or {}).get("linkedin")print(f"{company['name']} | {company['hourlyRateRange']} | {company['employeesRange']} | {email} | {linkedin}")
Node.js / TypeScript (apify-client)
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('haketa/goodfirms-scraper').call({mode: 'companies',serviceCategorySlugs: ['digital-marketing-agency', 'seo-agency'],scrapeProfileDetails: false,maxRecords: 1000,maxPagesPerCategory: 0,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(`Extracted ${items.length} unique B2B agencies`);
cURL
curl -X POST "https://api.apify.com/v2/acts/haketa~goodfirms-scraper/runs?token=YOUR_APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"mode": "companies","serviceCategorySlugs": ["web-development-agency"],"scrapeProfileDetails": false,"maxRecords": 100}'
β Frequently Asked Questions
What is the difference between scrapeProfileDetails: false and scrapeProfileDetails: true?
scrapeProfileDetails: false(Fast List Mode): Extracts all data directly from the category listing cards (name,websiteUrl,logoUrl,tagline,rating,reviewCount,hourlyRateRange,employeesRange,foundedYear,headquarters,aiTools,topReview,whyChoose). Because each category page holds ~10β60 companies, you can collect 1,000+ companies in just a couple of minutes.scrapeProfileDetails: true(Full Profile Enrichment): Visits each company's individual/company/{slug}page in addition to the listing card, addingcontact.email(~88%),contact.phone(~99.5%),socialLinks(LinkedIn ~92%),services%share,focusBreakdown%,offices, and fulldescription.
How do I scrape 1,000+ companies in one run?
Set maxRecords: 1000 (or 0 for unlimited) and leave maxPagesPerCategory: 0. The scraper will automatically paginate as deep as needed across your chosen serviceCategorySlugs (or default categories) until 1,000 unique companies are collected.
Do I need to configure special proxies?
No. The default Apify Proxy configuration starts on low-cost datacenter IPs and automatically escalates to residential IPs only if a request is challenged.
Can I pass custom filtered GoodFirms URLs?
Yes! Copy any URL from goodfirms.co (such as a niche category, city page, or industry directory) and paste it into startUrls. The actor will automatically paginate through all pages of that URL.
π Related B2B & lead-generation scrapers
Pair this GoodFirms scraper with complementary B2B intelligence actors from haketa:
- D&B / Dun & Bradstreet Scraper β Company firmographics, NAICS/SIC codes, revenue bands & executive contacts
- BBB (Better Business Bureau) Scraper β Accredited North American businesses with ratings, complaints & phone numbers
- YouTube Contact Scraper β Channel business emails & social links for creator outreach
- Marktplaats Scraper β Netherlands classifieds & commercial seller leads
- Yad2 Real Estate Scraper β Israel property listings & seller contacts
π SEO Keywords
GoodFirms scraper Β· scrape GoodFirms Β· GoodFirms data extractor Β· GoodFirms lead generation Β· B2B agency scraper Β· software development companies list Β· digital marketing agency leads Β· SaaS directory scraper Β· Clutch alternative scraper Β· B2B contact email extractor Β· bulk export JSON CSV Excel API Β· 1,000+ results pagination Β· B2B intelligence
π Changelog
| Version | Date | Notes |
|---|---|---|
| 1.2.0 | 2026-11 | Unlocked 1,000+ deep pagination & auto page scaling: Changed maxPagesPerCategory default from 5 to 0 (unlimited, governed by maxRecords), removed the 100-record clamp when maxRecords > 100 is explicitly requested on default categories, added automatic multi-page pagination for category startUrls, and cleaned dataset schema validation. |
| 1.1.0 | 2026-11 | Enhanced profile parser (cp2- layout + JSON-LD): Updated extractProfileExtras for GoodFirms' current profile DOM (services %, focusBreakdown %, full .cp2-about-text description) and pickCompanyOrg JSON-LD extraction (contact.email 88%, contact.phone 99.5%, reviewCount 99%). |
| 1.0.10 | 2026-05 | Added automatic -agency canonical slug retry on first-page 404s and graceful Actor.exit status reporting. |
| 1.0.0 | 2026-03 | Initial release β Companies & Software modes, server-side ICP filters, and verified review extraction. |