# GoodFirms Scraper — B2B Agencies & Software Companies (`hipersoft/goodfirms-scraper`) Actor

Scrape GoodFirms B2B agencies and software companies: name, rating, reviews, hourly rate, employees, founded year, location, services, website and profile URL. By category or GoodFirms URL. No setup.

- **URL**: https://apify.com/hipersoft/goodfirms-scraper.md
- **Developed by:** [hiper soft](https://apify.com/hipersoft) (community)
- **Categories:** Lead generation, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.002125 / firm scraped

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## GoodFirms Scraper — Agencies, Ratings, Reviews & Leads

Scrape **GoodFirms** — a leading B2B research and review directory of agencies and software companies — into clean JSON, CSV, Excel or XML. Extract **company name, rating, review count, hourly rate, employee band, founding year, location, services, website and profile URL** from any GoodFirms category or city listing. Fast and reliable.

![GoodFirms Scraper input — category, city and startUrls in the Apify Console](https://api.apify.com/v2/key-value-stores/SUfvnaFLd9z9eBCtV/records/goodfirms-scraper-input.png)

### What does GoodFirms Scraper do?

The GoodFirms Scraper crawls GoodFirms directory pages and extracts every listed firm as a structured record. Point it at a category and city (or paste exact listing URLs) and it exports a clean dataset of agencies with their ratings, pricing, firmographics and services — a faster, cheaper way to build B2B lead and vendor lists than copying pages by hand.

### What data can you scrape from GoodFirms?

| Data | Fields |
| --- | --- |
| 🏢 Firm | name, GoodFirms profile URL, website, sponsored flag |
| ⭐ Reputation | rating, review count |
| 💵 Pricing | hourly rate band |
| 👥 Firmographics | employee band, founding year, location |
| 🧰 Services | listed service focus areas |
| 📝 Profile | description, source listing URL, collected timestamp |

### Use cases

- **B2B lead generation** — build targeted outreach lists of agencies and software vendors by category and city.
- **Agency & vendor research** — shortlist partners filtered by rating, reviews, price and size.
- **Competitive analysis** — track how competitors are positioned, priced and reviewed on GoodFirms.
- **Market research** — measure agency density, pricing bands and service trends across regions.
- **CRM & dataset enrichment** — append firmographics (size, founding year, location) to existing company records.
- **Recruitment & partnerships** — find firms by service focus for hiring, referrals or co-marketing.

### How to scrape GoodFirms data

1. Add the **GoodFirms Scraper** to your Apify account.
2. Enter a **category** and **city**, or paste exact GoodFirms listing URLs into **startUrls**.
3. Set **maxItems** to cap how many firms you collect.
4. Click **Run** and watch results stream into the dataset.
5. Export to JSON, CSV, Excel or XML, or pull them through the Apify API.

### Input

Enter a category + city, or paste GoodFirms directory URLs. Cap the run with `maxItems`.

#### Example input

```json
{ "startUrls": ["https://www.goodfirms.co/directory/city/top-web-development-companies/chicago"], "maxItems": 300 }
```

| Field | Description |
| --- | --- |
| `category` | GoodFirms category slug, e.g. `software-development`, `digital-marketing`. Combine with `city`. |
| `city` | City slug, e.g. `chicago`. Combine with `category`. |
| `startUrls` | GoodFirms directory URLs copied from goodfirms.co. Most reliable — paste the exact city-scoped page URL. |
| `maxItems` | Maximum number of firms to return. |

### Output

Each firm is one clean record:

```json
{
  "id": "webfx",
  "name": "WebFX",
  "rating": 4.8,
  "reviews": 825,
  "hourlyRate": "$100 - $149/hr",
  "employees": "250 - 999",
  "founded": 1995,
  "location": "Chicago, United States",
  "description": "Full-service digital marketing agency.",
  "services": ["Digital Marketing", "SEO", "PPC"],
  "isSponsored": false,
  "website": "https://www.webfx.com/",
  "profileUrl": "https://www.goodfirms.co/company/webfx",
  "sourceUrl": "https://www.goodfirms.co/directory/city/top-web-development-companies/chicago",
  "collectedAt": "2026-07-30T12:00:00.000Z"
}
```

![GoodFirms Scraper output example — company rating, pricing and firmographics as structured JSON](https://api.apify.com/v2/key-value-stores/SUfvnaFLd9z9eBCtV/records/goodfirms-scraper-output.png?v=1)

#### Output schema

| Field | Type | Description |
| --- | --- | --- |
| `id` | string | Unique GoodFirms company identifier (profile slug). |
| `name` | string | Company or agency name. |
| `rating` | number | Average GoodFirms review rating, 0–5. |
| `reviews` | integer | Number of client reviews on the profile. |
| `hourlyRate` | string | Advertised hourly rate band, e.g. `$100 - $149/hr`. |
| `employees` | string | Employee count band, e.g. `250 - 999`. |
| `founded` | integer | Year the company was founded. |
| `location` | string | Headquarters location (city, country). |
| `description` | string | Company profile summary. |
| `services` | array | List of the firm's service focus areas. |
| `isSponsored` | boolean | Whether the listing is a sponsored placement. |
| `website` | string (URL) | The company's own website URL. |
| `profileUrl` | string (URL) | GoodFirms profile page URL. |
| `sourceUrl` | string (URL) | Directory listing page the record was collected from. |
| `collectedAt` | string (ISO date) | Timestamp when the record was scraped. |

### Need more B2B leads data?

- [Houzz Scraper](https://apify.com/hipersoft/houzz-scraper) — home-design pros, reviews and contact details.
- [Europages Scraper](https://apify.com/hipersoft/europages-scraper) — European B2B suppliers and manufacturers.
- [BBB Scraper](https://apify.com/hipersoft/bbb-scraper) — Better Business Bureau company profiles and ratings.
- [Google Maps Scraper](https://apify.com/hipersoft/google-maps-scraper) — local businesses, ratings and contact info.

### FAQ

**How many firms can I scrape?**
As many as the listings contain — set `maxItems` to cap the run, or leave it open to collect an entire category or city.

**Do I need any setup or a login?**
No setup and no login. Just add the actor, enter a category and city (or listing URLs), and run.

**How does billing work?**
You pay only per firm you get — no subscription. Our per-item price floors 20% below the cheapest comparable scraper.

**What export formats are supported?**
JSON, CSV, Excel and XML, plus the Apify API for programmatic access.

**Can I filter by rating, price or size?**
Every record includes rating, reviews, hourly rate and employee band, so you can filter and sort in your dataset or downstream tools.

**How fresh is the data?**
Each run fetches live listings, so results reflect GoodFirms at the moment you run the actor. The `collectedAt` field timestamps every record.

**Is it legal?**
The actor returns only publicly available data. You are responsible for complying with GoodFirms' terms and applicable data and marketing laws.

**Can I connect it to my other tools?**
The GoodFirms Scraper can be connected with almost any cloud service or web app thanks to [integrations on the Apify platform](https://apify.com/integrations). It works with [Make](https://apify.com/integrations/make), [Zapier](https://apify.com/integrations/zapier), [Slack](https://docs.apify.com/platform/integrations/slack), [Airbyte](https://docs.apify.com/platform/integrations/airbyte), [GitHub](https://docs.apify.com/platform/integrations/github), [Google Drive](https://docs.apify.com/platform/integrations/drive) and [many more](https://apify.com/integrations), plus the [Apify API](https://docs.apify.com/api/v2), JavaScript/Python clients and MCP. Or use [webhooks](https://docs.apify.com/platform/integrations/webhooks) to trigger an action whenever a run finishes.

### Related Actors

- [Website Contact Scraper](https://apify.com/hipersoft/website-contact-scraper) — emails, phones and socials from any website.
- [Google Maps Reviews Scraper](https://apify.com/hipersoft/google-maps-reviews-scraper) — reviews and ratings for local businesses.
- [Europages Scraper](https://apify.com/hipersoft/europages-scraper) — B2B suppliers across Europe.

### Notes

Original clean-room implementation. Returns only public data; you are responsible for compliance with GoodFirms' terms. Not affiliated with GoodFirms.

# Actor input Schema

## `category` (type: `string`):

Service category, e.g. software-development, web-development, mobile-app-development, digital-marketing, seo. Pair with a city.

## `city` (type: `string`):

City for the listing, e.g. chicago, london, new-york-city. GoodFirms listings are city-scoped.

## `startUrls` (type: `array`):

Optional GoodFirms directory URLs (copy from goodfirms.co). Overrides category/city — most reliable.

## `maxItems` (type: `integer`):

Maximum firms to scrape.

## Actor input object example

```json
{
  "category": "software-development",
  "city": "chicago",
  "startUrls": [],
  "maxItems": 200
}
```

# Actor output Schema

## `results` (type: `string`):

The scraped results as dataset items.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {};

// Run the Actor and wait for it to finish
const run = await client.actor("hipersoft/goodfirms-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {}

# Run the Actor and wait for it to finish
run = client.actor("hipersoft/goodfirms-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{}' |
apify call hipersoft/goodfirms-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,hipersoft/goodfirms-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/UTgu41P4CQX1DkTpg/builds/wtgu9RzeRHwIm0y7q/openapi.json
