# GoodFirms Scraper (`solidcode/goodfirms-scraper`) Actor

\[💰 $3.50 / 1K] Extract company profiles and verified client reviews from GoodFirms — software developers, IT services, marketing agencies, and design firms. Get ratings, hourly rates, team size, location, services, plus full reviews with sub-ratings. Great for B2B lead generation.

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

## Pricing

from $3.50 / 1,000 companies

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/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js/docs.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/integrations/mcp.md).

If your project is in a different language, use 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

Pull B2B company profiles and their full client-review history from GoodFirms at scale — hourly-rate band, team size, founding year, HQ location, services offered, and every published review with its Overall, Quality, Schedule, and Communication scores. Companies and reviews come back as separate, ready-to-join rows. Built for B2B lead-generation teams, competitive-intelligence analysts, and agencies vetting vendors who need structured software-vendor data and real client feedback without trawling directory pages one at a time.

### Why This Scraper?

- **Full client-review history, not just the latest review** — collect every published review on a company profile (up to 1,000 per company), where latest-review-only tools throw the rest of the feedback away.
- **Four-dimension scoring on every review** — Overall, Quality, Schedule, and Communication ratings (0–5), decoded from GoodFirms' star bars into clean numbers you can average, sort, and benchmark.
- **Reviewer identity on every review** — reviewer name, job role, and company, so each review doubles as a qualified B2B contact tied to a real project.
- **Project context per review** — the service provided, project cost band, project status, and client industry when the reviewer published them.
- **Full firmographics on every company** — hourly-rate band, team-size band, founding year, HQ city and country, plus the complete list of services offered.
- **Company and review split into two clean record types** — `company` rows and `review` rows in one run, linked by `companyName` and `profileUrl`, ready to join straight into a CRM, BI tool, or warehouse.
- **14 service categories** — from Software Development, Artificial Intelligence, and Cloud Computing to SEO, Social Media Marketing, Branding, and UI/UX design.
- **19-country headquarters filtering** — narrow any directory to firms based in the US, UK, India, Germany, UAE, Singapore, and 13 more markets.
- **Precise URL targeting** — paste any GoodFirms category listing, country-scoped listing, or company-profile URL and the actor scrapes exactly that, honoring the filters already baked into the link.

### Use Cases

**Lead Generation**
- Build lists of software and marketing agencies with contact email, phone, and website
- Turn reviewer name, role, and company into qualified B2B contacts who recently bought services
- Prioritize outreach by rating, review volume, and hourly-rate band

**Competitive & Market Research**
- Track what real clients praise and criticize about a competitor across its full review history
- Monitor a rival's overall rating and review count over time
- Size a category by how many firms and reviews exist per service and country

**Vendor Due Diligence & Sourcing**
- Shortlist development or design partners by rating, team size, and founding year
- Read every client review — not just the highlight reel — before signing a vendor
- Compare Quality, Schedule, and Communication scores side by side across a candidate list

**Agency Benchmarking**
- Benchmark your own firm's rating and review breakdown against category peers
- Spot which services and price bands correlate with the highest client scores
- Track project cost bands and industries served across a competitive set

**Analytics & Data Platforms**
- Feed a structured company-and-review dataset into a BI dashboard or data warehouse
- Run sentiment analysis on full review text at scale
- Keep an internal vendor-comparison database current with fresh reviews

### Getting Started

#### Simple — one category

Scrape the top companies in a single service category with their reviews.

```json
{
    "category": "software-development"
}
````

#### Filtered — category, country, and review cap

Narrow to firms headquartered in one country and cap reviews per company.

```json
{
    "category": "mobile-app-development",
    "country": "in",
    "includeReviews": true,
    "maxReviewsPerCompany": 25,
    "maxResults": 50
}
```

#### Advanced — exact URLs with deep review history

Target specific company profiles and a category listing, and pull up to 100 reviews each.

```json
{
    "startUrls": [
        "https://www.goodfirms.co/company/openxcell",
        "https://www.goodfirms.co/directory/marketing-services/top-digital-marketing-companies"
    ],
    "maxReviewsPerCompany": 100,
    "maxResults": 200
}
```

#### Company-only — fast and cheap

Turn reviews off for a quick census of company profiles and firmographics.

```json
{
    "category": "it-services",
    "includeReviews": false,
    "maxResults": 100
}
```

### Input Reference

#### What to Scrape

Pick any combination of URLs and guided filters. Leave everything blank to scrape the top software development companies.

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `startUrls` | array | `[]` | GoodFirms URLs — category listings, country-scoped listings, or individual company profiles (`/company/<slug>`). Filters already in the URL are used as-is; the most precise way to target exactly what you want. |

#### Filters

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `category` | string | `"software-development"` | Service category to list. 14 options, from Software Development and AI to SEO and Branding. Ignored when you provide URLs. |
| `country` | string | `"all"` | Restrict results to firms headquartered in one of 19 countries, or `all` for the global listing. Some category/country pairs have no dedicated page — the global category listing is used instead. |

#### Reviews

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `includeReviews` | boolean | `true` | Collect each company's client reviews (overall and sub-ratings, reviewer details, project metadata, date) as separate rows. Turn off for faster, cheaper company-only runs. |
| `maxReviewsPerCompany` | integer | `10` | Cap on reviews captured per company. `0` captures every available review, up to a safety ceiling of 1,000 per company. Ignored when reviews are off. |

#### Limits

| Parameter | Type | Default | Description |
|-----------|------|---------|-------------|
| `maxResults` | integer | `20` | Cap on total companies collected across all URLs and filters. `0` = no cap (an internal upper limit still applies). Collection stops requesting new listing pages once the cap is reached. |

### Output

Results come back as two record types in one dataset. Each row carries a `recordType` field: `company` rows are the firm profiles, and `review` rows are individual client reviews linked back to their company by `companyName` and `profileUrl`. Use the **Companies** and **Reviews** dataset views to see each on its own.

#### Company (`recordType: "company"`)

```json
{
    "recordType": "company",
    "name": "OpenXcell",
    "profileUrl": "https://www.goodfirms.co/company/openxcell",
    "website": "https://www.openxcell.com",
    "logo": "https://www.goodfirms.co/uploads/logo/openxcell-logo.png",
    "rating": 4.9,
    "reviewCount": 76,
    "hourlyRate": "$25 - $49 / hr",
    "teamSize": "250 - 999",
    "foundedYear": "2009",
    "description": "OpenXcell is a leading software development company delivering mobile, web, and AI solutions.",
    "services": ["Mobile App Development", "Software Development", "Web Development"],
    "location": "Milpitas, US",
    "address": {
        "country": "US",
        "region": "California",
        "city": "Milpitas",
        "postalCode": "95035",
        "street": "1968 S Coast Hwy"
    },
    "offices": [
        {"country": "IN", "city": "Ahmedabad", "phone": "+91 79 4004 1994", "email": "sales@openxcell.com"}
    ],
    "phone": "+1 (408) 677-1489",
    "email": "sales@openxcell.com",
    "socialLinks": {
        "linkedin": "https://www.linkedin.com/company/openxcell",
        "facebook": "https://www.facebook.com/OpenXcellInc",
        "twitter": "https://twitter.com/OpenXcellInc"
    },
    "sourceUrl": "https://www.goodfirms.co/company/openxcell",
    "scrapedAt": "2026-07-16T09:31:00Z"
}
```

**Core & Ratings**

| Field | Type | Description |
|-------|------|-------------|
| `recordType` | string | Always `"company"` for these rows |
| `name` | string | Company display name |
| `profileUrl` | string | GoodFirms profile URL (join key for reviews) |
| `website` | string | Company's official website |
| `logo` | string | Company logo image URL |
| `description` | string | Company description / tagline |
| `rating` | number | Overall GoodFirms rating (0–5) |
| `reviewCount` | integer | Total reviews GoodFirms reports for the company |

**Firmographics**

| Field | Type | Description |
|-------|------|-------------|
| `hourlyRate` | string | Hourly-rate band (e.g. `"$25 - $49 / hr"`) |
| `teamSize` | string | Employee-count band (e.g. `"250 - 999"`) |
| `foundedYear` | string | Year the company was founded |
| `services` | array | Service focus areas the company offers |

**Location & Contact**

| Field | Type | Description |
|-------|------|-------------|
| `location` | string | HQ summary (city, country) |
| `address` | object | Headquarters `country`, `region`, `city`, `postalCode`, `street` |
| `offices` | array | Additional office locations with city, phone, and email when listed |
| `phone` | string | Primary contact phone |
| `email` | string | Primary contact email |
| `socialLinks` | object | `linkedin`, `facebook`, `twitter`, `instagram` profile links when present |
| `sourceUrl` | string | The URL this company was scraped from |
| `scrapedAt` | string | ISO-8601 collection timestamp |

#### Review (`recordType: "review"`)

Present only when `includeReviews` is on. Each review is its own row.

```json
{
    "recordType": "review",
    "companyName": "OpenXcell",
    "profileUrl": "https://www.goodfirms.co/company/openxcell",
    "title": "A reliable long-term development partner",
    "body": "OpenXcell delivered our mobile app on schedule and communicated clearly throughout the engagement.",
    "rating": 5,
    "qualityRating": 5,
    "scheduleRating": 4.8,
    "communicationRating": 5,
    "reviewerName": "Candice Claassen",
    "reviewerRole": "Co-founder",
    "reviewerCompany": "SixClicks",
    "projectService": "Mobile App Development",
    "projectStatus": "Completed",
    "projectIndustry": "Information Technology",
    "projectCost": "$10,001 to $50,000",
    "reviewDate": "14 November, 2025",
    "scrapedAt": "2026-07-16T09:31:00Z"
}
```

**Review & Ratings**

| Field | Type | Description |
|-------|------|-------------|
| `recordType` | string | Always `"review"` for these rows |
| `companyName` | string | Links back to the parent company's `name` |
| `profileUrl` | string | Links back to the parent company's `profileUrl` |
| `title` | string | Review headline |
| `body` | string | Full review text |
| `rating` | number | Overall star rating for this review (0–5) |
| `qualityRating` | number | Quality sub-rating (0–5) |
| `scheduleRating` | number | Schedule & timing sub-rating (0–5) |
| `communicationRating` | number | Communication sub-rating (0–5) |
| `reviewDate` | string | Date the review was posted |
| `scrapedAt` | string | ISO-8601 collection timestamp |

**Reviewer & Project**

| Field | Type | Description |
|-------|------|-------------|
| `reviewerName` | string | Reviewer's name |
| `reviewerRole` | string | Reviewer's job title / role |
| `reviewerCompany` | string | Reviewer's own company |
| `projectService` | string | The service the reviewer's project used |
| `projectStatus` | string | Project status (e.g. `"Completed"`) when published |
| `projectIndustry` | string | Reviewer's industry when published |
| `projectCost` | string | Project cost band when published |

### Tips for Best Results

- **Turn off `includeReviews` for a quick company census** — you get every firm's name, rating, hourly-rate band, team size, founding year, and contacts without paying for individual reviews.
- **Cap `maxReviewsPerCompany` on popular firms** — top agencies carry hundreds of reviews; set a cap (reviews are collected in the order GoodFirms lists them) to keep a run predictable, or set `0` to pull the full history.
- **Paste a company-profile URL for pinpoint targeting** — a `/company/<slug>` URL skips the directory and goes straight to the exact firm you want.
- **Country filtering only applies to four categories** — Software Development, Digital Marketing, Web Design, and Mobile App Development have dedicated country pages; for any other category the country is ignored and the global listing is used. Use `startUrls` if you need a country facet the dropdown can't reach.
- **Combine dropdown filters and `startUrls` in one run** — sweep a whole category and hit a specific watchlist of profiles at the same time.
- **Work each record type in its own tab** — the Companies and Reviews dataset views keep firm profiles and individual reviews cleanly separated for export.
- **Project cost, status, and industry are optional** — reviewers don't always publish them, so treat those review fields as nullable in your pipeline.

### Pricing

**From $3.50 per 1,000 companies** (plus $0.50 per 1,000 reviews) at the Gold tier — a transparent, results-based price for a fully structured company-and-review dataset. You are charged per company profile plus per review collected, so reviews are optional and far cheaper than the company row.

#### Price per event by discount tier

| Event | No discount | Bronze | Silver | Gold |
|-------|-------------|--------|--------|------|
| Company (per 1,000) | $4.20 | $3.95 | $3.75 | $3.50 |
| Review (per 1,000) | $0.60 | $0.56 | $0.53 | $0.50 |

#### Example run cost (Gold tier)

| Scenario | Companies | Reviews | Approx. total |
|----------|-----------|---------|---------------|
| Company-only census | 100 | 0 | ≈ $0.35 |
| Small lead pull | 100 × 20 reviews | 2,000 | ≈ $1.35 |
| Category sweep | 1,000 × 25 reviews | 25,000 | ≈ $16.00 |
| Large dataset | 10,000 × 20 reviews | 200,000 | ≈ $135.00 |

**No compute or time-based charges — you pay per result, plus a small fixed per-run start fee.** A "result" is a company profile row or a review row. The four discount tiers — No discount, Bronze, Silver, and Gold — apply automatically through Apify's loyalty program, so larger and longer-term usage costs progressively less.

### Integrations

Export data in JSON, CSV, Excel, XML, or RSS. Connect to 1,500+ apps via:

- **Zapier** / **Make** / **n8n** — Workflow automation
- **Google Sheets** — Direct spreadsheet export
- **Slack** / **Email** — Notifications on new results
- **Webhooks** — Trigger custom APIs on run completion
- **Apify API** — Full programmatic access

### Legal & Ethical Use

This actor collects publicly available information from GoodFirms. Use it responsibly and in compliance with GoodFirms' terms of service and all applicable laws, including data-protection regulations such as the GDPR and CCPA. Personal data contained in reviews and reviewer profiles must be handled lawfully — obtain a valid legal basis before processing, and respect the rights of the individuals concerned. You are responsible for how you use the collected data; do not use it for spam, harassment, or any unlawful purpose.

# Actor input Schema

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

Paste one or more GoodFirms URLs. Accepts category listings (e.g. https://www.goodfirms.co/directory/languages/top-software-development-companies), country-scoped listings (e.g. https://www.goodfirms.co/directory/country/top-software-development-companies/us), and individual company profiles (https://www.goodfirms.co/company/<name>). Any filters already in the URL are used as-is. This is the most precise way to scrape exactly what you want.

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

Which kind of companies to list. Ignored when you provide URLs above (the URL already sets the category).

## `country` (type: `string`):

Restrict results to companies headquartered in a specific country. Choose 'All countries' for the global listing. Some category/country combinations have no dedicated page — in that case the actor falls back to the global listing for that category.

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

Also collect each company's client reviews (overall star rating, quality/schedule/communication sub-ratings, project service, cost band and industry, reviewer name, role and company, and date). Each review is returned as its own result row. Turn this off for faster, cheaper runs that return only the company profiles.

## `maxReviewsPerCompany` (type: `integer`):

Cap on how many reviews to capture per company. Default 10. Set to 0 to capture every available review, up to a safety ceiling of 1,000 per company. Popular companies can have hundreds of reviews, so raising this increases both run time and cost. Ignored when 'Include Client Reviews' is off.

## `maxResults` (type: `integer`):

Hard cap on the total number of companies collected across all URLs and filters. Default 20 — increase for bigger runs (up to a maximum of 5,000), or set to 0 for no cap (an internal upper limit still applies to prevent runaway pagination). The actor stops requesting new listing pages once this number is reached but keeps the full final page even if it slightly overshoots (a single listing page holds about 48 companies).

## Actor input object example

```json
{
  "startUrls": [],
  "category": "software-development",
  "country": "all",
  "includeReviews": true,
  "maxReviewsPerCompany": 10,
  "maxResults": 20
}
```

# Actor output Schema

## `overview` (type: `string`):

Every record from the run in one place — companies and reviews — distinguished by `recordType`.

## `companies` (type: `string`):

Companies only, with rating, hourly rate, team size, founding year, location, services, and contacts.

## `reviews` (type: `string`):

Client reviews only, each linked back to its company. Present only when 'Include Client Reviews' is enabled.

# 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": [],
    "category": "software-development",
    "country": "all",
    "includeReviews": true,
    "maxReviewsPerCompany": 10,
    "maxResults": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("solidcode/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": [],
    "category": "software-development",
    "country": "all",
    "includeReviews": True,
    "maxReviewsPerCompany": 10,
    "maxResults": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("solidcode/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": [],
  "category": "software-development",
  "country": "all",
  "includeReviews": true,
  "maxReviewsPerCompany": 10,
  "maxResults": 20
}' |
apify call solidcode/goodfirms-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "GoodFirms Scraper",
        "description": "[💰 $3.50 / 1K] Extract company profiles and verified client reviews from GoodFirms — software developers, IT services, marketing agencies, and design firms. Get ratings, hourly rates, team size, location, services, plus full reviews with sub-ratings. Great for B2B lead generation.",
        "version": "1.0",
        "x-build-id": "fF3c8BSMrCc5YEZYn"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/solidcode~goodfirms-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-solidcode-goodfirms-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/solidcode~goodfirms-scraper/runs": {
            "post": {
                "operationId": "runs-sync-solidcode-goodfirms-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/solidcode~goodfirms-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-solidcode-goodfirms-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "startUrls": {
                        "title": "GoodFirms URLs",
                        "type": "array",
                        "description": "Paste one or more GoodFirms URLs. Accepts category listings (e.g. https://www.goodfirms.co/directory/languages/top-software-development-companies), country-scoped listings (e.g. https://www.goodfirms.co/directory/country/top-software-development-companies/us), and individual company profiles (https://www.goodfirms.co/company/<name>). Any filters already in the URL are used as-is. This is the most precise way to scrape exactly what you want.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "category": {
                        "title": "Service Category",
                        "enum": [
                            "software-development",
                            "web-development",
                            "mobile-app-development",
                            "ecommerce-development",
                            "software-testing",
                            "it-services",
                            "cloud-computing",
                            "artificial-intelligence",
                            "digital-marketing",
                            "seo",
                            "social-media-marketing",
                            "web-design",
                            "app-design",
                            "branding"
                        ],
                        "type": "string",
                        "description": "Which kind of companies to list. Ignored when you provide URLs above (the URL already sets the category).",
                        "default": "software-development"
                    },
                    "country": {
                        "title": "Country",
                        "enum": [
                            "all",
                            "us",
                            "gb",
                            "ca",
                            "au",
                            "in",
                            "de",
                            "es",
                            "netherlands",
                            "pl",
                            "ua",
                            "ae",
                            "singapore",
                            "pakistan",
                            "bangladesh",
                            "malaysia",
                            "vietnam",
                            "turkey",
                            "south-africa",
                            "egypt"
                        ],
                        "type": "string",
                        "description": "Restrict results to companies headquartered in a specific country. Choose 'All countries' for the global listing. Some category/country combinations have no dedicated page — in that case the actor falls back to the global listing for that category.",
                        "default": "all"
                    },
                    "includeReviews": {
                        "title": "Include Client Reviews",
                        "type": "boolean",
                        "description": "Also collect each company's client reviews (overall star rating, quality/schedule/communication sub-ratings, project service, cost band and industry, reviewer name, role and company, and date). Each review is returned as its own result row. Turn this off for faster, cheaper runs that return only the company profiles.",
                        "default": true
                    },
                    "maxReviewsPerCompany": {
                        "title": "Max Reviews Per Company",
                        "minimum": 0,
                        "maximum": 1000,
                        "type": "integer",
                        "description": "Cap on how many reviews to capture per company. Default 10. Set to 0 to capture every available review, up to a safety ceiling of 1,000 per company. Popular companies can have hundreds of reviews, so raising this increases both run time and cost. Ignored when 'Include Client Reviews' is off.",
                        "default": 10
                    },
                    "maxResults": {
                        "title": "Max Companies",
                        "minimum": 0,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Hard cap on the total number of companies collected across all URLs and filters. Default 20 — increase for bigger runs (up to a maximum of 5,000), or set to 0 for no cap (an internal upper limit still applies to prevent runaway pagination). The actor stops requesting new listing pages once this number is reached but keeps the full final page even if it slightly overshoots (a single listing page holds about 48 companies).",
                        "default": 20
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
