GoodFirms Scraper - Agency Reviews
Pricing
from $0.01 / 1,000 results
GoodFirms Scraper - Agency Reviews
Extract agency profiles, reviews, ratings & service offerings from GoodFirms. Ideal for B2B lead generation, competitor analysis & agency research.
Pricing
from $0.01 / 1,000 results
Rating
0.0
(0)
Developer
The Howlers
Maintained by CommunityActor stats
2
Bookmarked
15
Total users
0
Monthly active users
6 days ago
Last modified
Categories
Security
Limited permissionsShare
GoodFirms Directory Scraper
Find any company on GoodFirms by name and get its real profile: name, profile URL, every office address with its phone, main phone, email, website, rating, review count, hourly rate, employees, year founded, services, service and industry focus, and reviews. Or list companies by category and city. Built by John Rippy (https://www.linkedin.com/in/johnrippy/ | https://johnrippy.link/).
Note: this actor runs in Demo Mode by default, so a default free run returns sample data. Set demoMode to false to fetch real data.
How it reads the site
GoodFirms sits behind a Cloudflare bot check and rate-limits scripted requests. The actor opens it in a stealth Firefox (Camoufox) whose fingerprint matches an Apify residential IP, keeps one session for the run, and reads each page with a normal, paced page load. It reads public pages only and never logs in.
Quick Start
Test with Demo Mode (free)
{"demoMode": true}
Look up one company (citation check)
{"demoMode": false,"searchQuery": "Brolik","location": "Philadelphia, PA","maxResults": 3}
Read profiles you already have
{"demoMode": false,"profileUrls": ["https://www.goodfirms.co/company/smartsites"],"includeReviews": true}
List SEO agencies in a city
{"demoMode": false,"category": "seo","location": "Detroit, MI","maxResults": 20}
Input Parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
demoMode | boolean | true | Run with sample data without making API calls. Great for testing the actor. |
searchQuery | string | - | A company name to find its GoodFirms profile (e.g. 'SmartSites'), or a service to list companies (e.g. 'SEO agencies', 'web development company'). |
profileUrls | array | - | GoodFirms company pages to read directly, e.g. https://www.goodfirms.co/company/smartsites. When set, the search is skipped. |
category | string | - | Filter by company category. |
location | string | - | City and state, e.g. 'Detroit, MI'. For a company name it ranks the profile in this location first and sets locationMatch on each row; for a service or category it lists companies in that city. |
maxResults | integer | 50 | Maximum number of companies to scrape. |
includeReviews | boolean | false | Add the reviews shown on each company page. |
webhookUrl | string | - | URL to POST results when scraping completes (Zapier, Make, n8n, custom endpoint) |
proxyConfiguration | object | {"useApifyProxy": true, "apifyProxyGroups": ["RESIDENTIAL"]} | GoodFirms blocks datacenter IPs. The default Apify RESIDENTIAL proxy (US) is used with one sticky session per run. |
Output
Each company or product is one dataset row:
name,url(the GoodFirms profile),goodfirmsIdaddress{street, city, state, postalCode, country, full} of the headquarterslocations[]: every office withisHeadquarters,country,address,phonephone,email,websiterating,reviewCount,hourlyRate,employees,foundedservices,serviceFocus[],industries,industryFocus[],clientFocus[],socialLinks,description,taglinereviews[]whenincludeReviewsis onsearchQuery,searchLocation,matchScore(1 = same name),locationMatch,source
When GoodFirms has no profile with that name the dataset gets one row with status: "not_found" and a _notice. When GoodFirms blocks every session the row has status: "blocked". Neither is charged.
Pricing
This actor uses pay-per-event billing:
| Event | When it is charged | Price |
|---|---|---|
| Actor start | Once when the run starts, one event per GB of memory (minimum one). At the default 2 GB of memory a run starts at $0.20 | $0.10 per GB |
| Agency Scraped | Per agency profile scraped | $0.04 |
| Result | Each item written to the default dataset | $0.00001 |
Demo mode is free: no charges for sample data.
Troubleshooting
The run returned a "blocked" row
The site answered every proxy session with a bot check. Nothing was charged. Run again later.
The run returned a "not_found" row
The site has no listing with that name. Check the spelling, or pass the listing URL directly.
How do I test for free?
Enable Demo Mode. It returns labeled sample rows and charges no task events.
Built by John Rippy | Actor Arsenal