# GoodFirms Scraper — Agency B2B Leads, Emails & Phones (`scrapersdelight/goodfirms-scraper`) Actor

Scrape GoodFirms directories into clean B2B agency leads: company name, own website, contact email, phone, every office address, hourly-rate band, founded year, service list, LinkedIn/Facebook/X/Instagram, rating and reviews. From the public JSON-LD. No login.

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

## Pricing

$2.70 / 1,000 per company returneds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#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 — Agency B2B Leads, Emails & Phones

**Turn any GoodFirms directory into a clean B2B lead list — company name, its own website, contact email, phone, every office, hourly-rate band, founded year, service list, socials, rating and reviews.**

> 🕒 Last updated: 2026-07-30 · 📊 30+ fields per company · 🌎 Any category, city, state or country page · 🚫 No login · 🔑 Straight from GoodFirms' own schema.org JSON-LD · ⚡ A Clutch / DesignRush alternative

Paste one or more GoodFirms directory URLs (software development, digital marketing, web design, app development, SEO, city and country pages…), and every listed firm comes back as one flat record with the fields a sales, partnerships or research team actually needs. Export to JSON, CSV, Excel or Google Sheets, or pull it into your CRM via API.

***

### 🎯 What you get

One flat record per company. The money fields:

| Field | Type | Example |
|---|---|---|
| 🏢 `company_name` | text | `Goji Labs` |
| 🌐 `website` | link | `https://gojilabs.com` |
| 🔤 `website_domain` | text | `gojilabs.com` (bare domain — GoodFirms sometimes lists a landing page) |
| ✉️ `email` | text | `hello@gojilabs.com` |
| ☎️ `phone` | text | `(213) 816-1285` |
| 📍 `city` / `state` / `country` | text | `Los Angeles` / `California` / `US` |
| 🏠 `street_address` / `postal_code` | text | `800 Wilshire Blvd Ste 200` / `90017` |
| 🏢 `offices` / `office_count` | list / number | every office GoodFirms lists / `2` |
| 💵 `price_range` | text | `$100 - $149` (hourly band) |
| 📅 `founded_year` | number | `2014` |
| 🧰 `services` | list | `["Mobile App Development", "Web Development", …]` |
| ⭐ `rating` / `review_count` | number | `5.0` / `45` |
| 🔗 `linkedin` / `facebook` / `twitter` / `instagram` | link | company social profiles |
| 💬 `top_review` / `reviews` | object / list | author, rating, title, body, date |
| 🖼️ `logo_url` · 📝 `description` | link / text | — |
| 🔗 `goodfirms_url` / `company_slug` | link / text | `https://www.goodfirms.co/company/goji-labs` |

Outcome keywords: *agency leads, IT company list, software development companies, agency emails and phones, hourly rate band, agency directory export, GoodFirms export, Clutch alternative.*

<details><summary>🏢 Sample company record</summary>

```json
{
  "company_slug": "goji-labs",
  "company_name": "Goji Labs",
  "goodfirms_url": "https://www.goodfirms.co/company/goji-labs",
  "website": "https://gojilabs.com",
  "website_domain": "gojilabs.com",
  "email": "hello@gojilabs.com",
  "phone": "(213) 816-1285",
  "price_range": "$100 - $149",
  "founded_year": 2014,
  "street_address": "800 Wilshire Blvd Ste 200",
  "city": "Los Angeles", "state": "California", "postal_code": "90017", "country": "US",
  "office_count": 2,
  "services": ["Mobile App Development", "Web Development", "Software Development"],
  "rating": 5, "review_count": 45,
  "linkedin": "https://www.linkedin.com/company/goji-labs/",
  "instagram": "https://www.instagram.com/goji_labs",
  "profile_enriched": true,
  "scraped_at": "2026-07-30T00:00:00Z"
}
```

</details>

***

### 💡 Use cases

- 🛠️ **Sell-to-agency outbound** — white-label dev, PM, hosting, proposal and staffing tools. `price_range`, `founded_year` and `office_count` pre-segment prospects by size and deal band.
- 🤝 **Partner & vendor sourcing** — shortlist firms by service, city or country, with rating and review volume attached.
- 🧲 **Recruiting / outsourcing research** — find development shops in a specific city or tech stack (React, Python, Java sub-pages are real filters).
- 📊 **Market mapping** — export an entire category and analyse rate bands, geography, ratings and service mix.

### ⚙️ How it works

1. Click **Try for free**.
2. Paste one or more **GoodFirms URLs** into *GoodFirms URLs*. Directory pages are paginated automatically; individual `/company/…` URLs work too.
3. Set **Max companies** and **Max directory pages per URL**. Leave **Enrich from company profiles** on to get the email, website, offices, services and socials.
4. Click **Start** and export from the **Dataset** tab (JSON, CSV, Excel, Google Sheets) or via API.

#### Example input

```json
{
  "startUrls": [
    { "url": "https://www.goodfirms.co/directory/languages/top-software-development-companies" },
    { "url": "https://www.goodfirms.co/directory/city/top-software-development-companies/london" }
  ],
  "maxItems": 100,
  "maxPagesPerUrl": 5,
  "includeProfileDetails": true,
  "includeReviews": false,
  "proxyConfiguration": { "useApifyProxy": true }
}
```

Useful URL shapes (all real filters, verified):
`/directory/languages/top-software-development-companies[/reactjs|/python|/java]` ·
`/directory/marketing-services/top-digital-marketing-companies[/seo|/social-media-marketing]` ·
`/directory/services/top-web-design-companies[/logo|/graphic]` ·
`/directory/platform/app-development` ·
`/directory/city/<category>/<city>` · `/directory/country/<category>/<cc>` · `/directory/state/<category>/<state>`

***

### 🔎 Honesty — where the data comes from

Every field is read from the **schema.org JSON-LD that GoodFirms itself publishes** on its public directory and company pages. There is **no email guessing, no third-party enrichment and no verification**: a field comes back `null` when the firm didn't publish it. In our sample runs the enriched fields (website, email, phone, hourly band, founded year, services, LinkedIn) came back on ~100% of profiles, but that will vary by category.

Two things worth knowing:

- **`city` / `country` reflect the office that matched your directory page.** A firm with London and New York offices appears on both the London and the US directory with the matching office shown. The full list is always in `offices`.
- **Turning off profile enrichment** gives a cheaper listing-only row: name, phone, location, `price_range`, rating, review count and one featured review — but no email, website, services or socials.

### 💳 Pricing

**Pay per company returned.** You are charged once per company record actually delivered to your dataset — duplicates are removed before charging, and rows a buyer's cap can't cover are never delivered unbilled.

### ❓ FAQ

**Do I need a login or API key?** No. It reads GoodFirms' public directory — no account, no key, no captcha.

**Is a proxy required?** Effectively yes. GoodFirms rate-limits a single IP (HTTP 429) after a handful of requests. The Actor rotates a fresh Apify Proxy session per request; the default datacenter proxy was enough in testing.

**Is this a Clutch alternative?** Yes — the same kind of agency lead row, from the GoodFirms directory instead. GoodFirms publishes the contact email on the profile, which many agency directories do not.

**Can I scrape a specific city or country?** Yes — use the `/directory/city/…` and `/directory/country/…` URLs. They are genuine filters, not labels.

**Can I get client reviews?** Yes — enable **Include client reviews** to add each profile's recent reviews (author, rating, title, body, date).

**Can I export to Excel or Google Sheets?** Yes — the dataset exports to JSON, CSV, Excel or Google Sheets, or via API.

### 📝 Changelog

- **0.1** — Initial release: directory pagination from the ItemList JSON-LD, profile enrichment (email, own website, offices, services, socials, founded year, reviews), dedupe by GoodFirms company slug, fresh proxy session per request to survive the site's rate limit.

### Notes & fair use

You are responsible for complying with GoodFirms' Terms of Service and with applicable data-protection law. This Actor reads publicly available company listings; any personal data it returns (e.g. review author names, contact inboxes) is your responsibility to handle lawfully.

# Actor input Schema

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

GoodFirms directory URLs (e.g. https://www.goodfirms.co/directory/languages/top-software-development-companies, .../directory/city/top-software-development-companies/london, .../directory/marketing-services/top-digital-marketing-companies/social-media-marketing) and/or individual company URLs (https://www.goodfirms.co/company/goji-labs). Directory URLs are paginated automatically.

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

Cap on how many company records this run returns (cost + speed guard). 0 = no cap, up to a 50,000 safety backstop.

## `maxPagesPerUrl` (type: `integer`):

How deep to paginate each directory URL. Each page lists 48 companies. Stops early at the last page of the category.

## `includeProfileDetails` (type: `boolean`):

Open each company's GoodFirms profile to add the contact email, the agency's own website, founded year, every office address, the service list and LinkedIn/Facebook/X/Instagram links. Turn off for a faster, listing-only run (name, phone, location, rate band, rating).

## `includeReviews` (type: `boolean`):

Add the recent client reviews published on each profile (author, rating, title, body, date) as a `reviews` array. Requires profile enrichment.

## `proxyConfiguration` (type: `object`):

Required. GoodFirms rate-limits a single IP after a few requests (HTTP 429); the Actor rotates a fresh proxy session per request. Apify Proxy (datacenter) is enough — measured 18/18 pages OK.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.goodfirms.co/directory/languages/top-software-development-companies"
    }
  ],
  "maxItems": 10,
  "maxPagesPerUrl": 1,
  "includeProfileDetails": true,
  "includeReviews": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `records` (type: `string`):

The dataset of scraped GoodFirms agency leads (one item per company).

# 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 = {
    "startUrls": [
        {
            "url": "https://www.goodfirms.co/directory/languages/top-software-development-companies"
        }
    ],
    "maxItems": 10,
    "maxPagesPerUrl": 1,
    "includeProfileDetails": true,
    "includeReviews": false,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("scrapersdelight/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 = {
    "startUrls": [{ "url": "https://www.goodfirms.co/directory/languages/top-software-development-companies" }],
    "maxItems": 10,
    "maxPagesPerUrl": 1,
    "includeProfileDetails": True,
    "includeReviews": False,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.goodfirms.co/directory/languages/top-software-development-companies"
    }
  ],
  "maxItems": 10,
  "maxPagesPerUrl": 1,
  "includeProfileDetails": true,
  "includeReviews": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call scrapersdelight/goodfirms-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=scrapersdelight/goodfirms-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

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