# HomeAdvisor Contractors & Reviews Scraper (`automation-lab/homeadvisor-contractors-reviews-scraper`) Actor

Extract public HomeAdvisor contractor profiles and reviews by city or URL. Get services, experience, approval status, ratings, review text, recommendations, and project prices. Export two clean datasets or automate via API and schedules.

- **URL**: https://apify.com/automation-lab/homeadvisor-contractors-reviews-scraper.md
- **Developed by:** [Stas Persiianenko](https://apify.com/automation-lab) (community)
- **Categories:** Lead generation, Real estate, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

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

Extract **public HomeAdvisor contractor profiles and customer reviews** from city directories or direct profile URLs.

HomeAdvisor Contractors & Reviews Scraper turns public home-service business pages into structured contractor leads, reputation data, service details, rating distributions, review text, recommendations, and shown project prices.

Use one direct profile for a quick lookup, or provide a HomeAdvisor city directory to map contractors in a local market.

- 🏠 Find contractor profiles from supported city directories
- ⭐ Track ratings, review counts, distributions, and customer feedback
- 🔧 Capture services, experience, amenities, and payment methods
- 💵 Collect project prices when reviewers publicly show them
- 📤 Export contractors and reviews separately as JSON, CSV, Excel, XML, or RSS
- 🔑 No HomeAdvisor login or private API key required

### What does HomeAdvisor Contractors & Reviews Scraper do?

The Actor accepts public URLs from [HomeAdvisor](https://www.homeadvisor.com/) and extracts structured contractor intelligence.

Supported inputs are:

- City directories such as `/c.Denver.CO.html`
- Contractor profiles such as `/rated.MartinandSons.72192370.html`

A directory run discovers public contractor profile links.

A profile run extracts the business record and its publicly displayed reviews.

Contractors go to the default dataset.

Reviews go to a separate named **Reviews** dataset, so exports stay clean and easy to join with `profileId`.

The Actor does not submit quote requests, reveal gated phone numbers, or enter account-only flows.

### Who is it for?

**Lead-generation teams**

- Build contractor prospect lists by city or trade
- Enrich CRM records with public service and reputation data
- Segment businesses by rating, experience, or review volume

**Local market researchers**

- Compare contractor supply across cities
- Map services offered in a home-improvement market
- Identify established and highly reviewed businesses

**Reputation and customer-experience teams**

- Monitor new public feedback on selected contractors
- Review recommendation language and recurring themes
- Track aggregate ratings and review counts over time

**Analysts and pricing researchers**

- Collect project-price signals when customers show them
- Compare services with rating outcomes
- Feed review text into sentiment or topic models

### Why use this contractor reviews extractor?

- ✅ **Two useful datasets:** contractor profiles and reviews are not mixed together
- ✅ **Stable joins:** numeric HomeAdvisor profile IDs connect every review to a contractor
- ✅ **Source provenance:** every contractor keeps the directory or profile URL that produced it
- ✅ **Public-data scope:** no account, lead request, or gated phone workflow
- ✅ **Fail-closed validation:** unsupported domains and paths are rejected before crawling
- ✅ **Bounded costs:** contractor and per-profile review caps prevent accidental large runs
- ✅ **Automation ready:** use schedules, API calls, webhooks, Zapier, Make, or MCP
- ✅ **Resilient access:** conservative US residential browser sessions and blocked-page retries

### What HomeAdvisor contractor data can you extract?

**Contractor profile fields**

| Field | Description |
|---|---|
| `profileId` | Stable numeric ID parsed from the HomeAdvisor profile URL |
| `name` | Public contractor or business name |
| `profileUrl` | Canonical public HomeAdvisor profile URL |
| `sourceUrl` | Directory or profile input that produced the record |
| `sourceType` | `directory` or `profile` provenance |
| `city`, `state`, `postalCode` | Public business location |
| `streetAddress` | Public street address when shown |
| `approved` | Whether the page displays Approved status |
| `description` | Public About/business description |
| `services` | Offered service or project categories |
| `yearsOfExperience` | Experience stated on the profile |
| `amenities` | Public amenities such as free estimates |
| `paymentMethods` | Accepted payment methods |
| `rating` | Aggregate rating out of five |
| `reviewCount` | Public review count |
| `ratingDistribution` | Percent distribution for one- through five-star ratings |
| `website` | Public external business website when available |
| `serviceHours` | Public service hours when available |
| `reviewsScraped` | Number of review rows saved in this run |
| `scrapedAt` | ISO timestamp for monitoring and audit trails |

**Customer review fields**

| Field | Description |
|---|---|
| `profileId` | Join key for the contractor dataset |
| `contractorName` | Contractor name at scrape time |
| `author` | Public reviewer display name |
| `date` | Public review date |
| `rating` | Review rating |
| `service` | Reviewed service or project type when shown |
| `text` | Public review text |
| `recommended` | Recommendation flag when explicitly shown |
| `projectPrice` | Publicly shown project price when present |
| `currency` | Currency inferred from the shown price |
| `scrapedAt` | ISO extraction timestamp |

Optional fields are omitted when HomeAdvisor does not show them.

### How much does it cost to scrape HomeAdvisor contractors?

This Actor uses **pay-per-event pricing**.

You pay for the run startup, each contractor profile, and each public review saved.

The current pre-release pricing is:

| Event | Free | Starter | Scale | Business |
|---|---:|---:|---:|---:|
| Run startup | $0.010 | $0.010 | $0.010 | $0.010 |
| Contractor profile | $0.10514 | $0.091423 | $0.07131 | $0.054854 |
| Customer review | $0.00345 | $0.00300 | $0.00234 | $0.00180 |

Higher-tier plans receive additional volume discounts.

A direct profile with five reviews costs about **$0.1324 on the Free plan** before any platform rounding.

A direct profile with 25 reviews costs about **$0.2014 on the Free plan**.

The final published prices are formula-validated against representative cloud compute and residential proxy bandwidth.

Apify Free plan users receive monthly platform credits that can be used to test a small input.

### How to scrape HomeAdvisor contractors and reviews

1. Open [HomeAdvisor Contractors & Reviews Scraper](https://apify.com/automation-lab/homeadvisor-contractors-reviews-scraper).
2. Add one or more public HomeAdvisor directory or contractor profile URLs.
3. Choose the maximum number of contractors.
4. Keep **Include public reviews** enabled when you need review intelligence.
5. Set a small review limit for the first run.
6. Click **Start**.
7. Export contractor profiles from the default dataset.
8. Open the named **Reviews** dataset for review-level exports.

Start with a direct profile to validate your workflow quickly.

Then add directories or more profiles after checking output and cost.

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---:|---|
| `startUrls` | array | required | HomeAdvisor city directory or contractor profile URLs |
| `maxContractors` | integer | `10` | Global cap for unique contractor records |
| `includeReviews` | boolean | `true` | Save public reviews to the Reviews dataset |
| `maxReviewsPerContractor` | integer | `25` | Review cap per contractor, from 0 to 200 |
| `maxRequestRetries` | integer | `1` | Fresh-session retries per blocked or incomplete page |

Only `www.homeadvisor.com` directory and profile paths are supported.

Invalid URLs fail before scraping instead of silently returning unrelated data.

**Quick profile lookup**

```json
{
  "startUrls": [
    { "url": "https://www.homeadvisor.com/rated.MartinandSons.72192370.html" }
  ],
  "maxContractors": 1,
  "includeReviews": true,
  "maxReviewsPerContractor": 5,
  "maxRequestRetries": 1
}
````

**City contractor discovery**

```json
{
  "startUrls": [
    { "url": "https://www.homeadvisor.com/c.Denver.CO.html" }
  ],
  "maxContractors": 20,
  "includeReviews": false,
  "maxReviewsPerContractor": 0,
  "maxRequestRetries": 1
}
```

### Contractor output example

```json
{
  "profileId": "72192370",
  "name": "Martin and Sons",
  "profileUrl": "https://www.homeadvisor.com/rated.MartinandSons.72192370.html",
  "sourceUrl": "https://www.homeadvisor.com/rated.MartinandSons.72192370.html",
  "sourceType": "profile",
  "city": "Commerce City",
  "state": "CO",
  "approved": true,
  "yearsOfExperience": 30,
  "rating": 4.9,
  "reviewCount": 166,
  "reviewsScraped": 5,
  "scrapedAt": "2026-07-16T00:00:00.000Z"
}
```

Actual values reflect the live public page and can change.

The default dataset contains one row per contractor.

### Review output example

```json
{
  "profileId": "72192370",
  "contractorName": "Martin and Sons",
  "profileUrl": "https://www.homeadvisor.com/rated.MartinandSons.72192370.html",
  "author": "Jeff H.",
  "date": "Jun 2026",
  "rating": 5,
  "service": "Wood or Fiber Cement Siding Repair or Partial Replacement",
  "text": "The communication was excellent and prompt.",
  "projectPrice": 1500,
  "currency": "USD",
  "scrapedAt": "2026-07-16T00:00:00.000Z"
}
```

The Reviews dataset may contain fewer rows than requested when the profile exposes fewer public reviews.

### Tips for reliable HomeAdvisor scraping

- 🎯 Start with one direct profile and five reviews
- 📉 Keep limits low while designing a new downstream workflow
- 🔗 Prefer canonical `/rated.*.html` links for deterministic lookups
- 🧭 Keep directory inputs separated by market when comparing cities
- 🔁 Use schedules for reputation monitoring rather than one oversized run
- 🆔 Join contractor and review exports on `profileId`
- 🕐 Allow retries only when needed; retries consume residential bandwidth
- 📦 Store historical snapshots in a named dataset or external warehouse

HomeAdvisor changes page structures and anti-bot controls over time.

The Actor detects challenge pages and fails rather than saving misleading shells.

### Integrations and contractor workflows

**HomeAdvisor → Google Sheets**

Export contractor profiles for sales qualification, territory planning, or local competitor maps.

**HomeAdvisor → Slack or Discord**

Schedule selected profiles and alert a reputation team when rating or review count changes.

**HomeAdvisor → Make or Zapier**

Add new contractor records to a CRM, then route high-rated businesses into an outreach sequence.

**HomeAdvisor → data warehouse**

Load contractor and review datasets into BigQuery, Snowflake, or PostgreSQL for trend analysis.

**HomeAdvisor → sentiment model**

Send review text to an NLP pipeline to classify service quality, responsiveness, price, and professionalism themes.

**Webhooks**

Use run-finished webhooks to trigger exports without polling.

### API usage with Node.js

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

const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/homeadvisor-contractors-reviews-scraper').call({
  startUrls: [{ url: 'https://www.homeadvisor.com/rated.MartinandSons.72192370.html' }],
  maxContractors: 1,
  includeReviews: true,
  maxReviewsPerContractor: 5,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

The returned `defaultDatasetId` points to contractor profiles.

Named Reviews dataset metadata is available from the run's storage links in Apify Console.

### Using the Apify API with Python

```python
import os
from apify_client import ApifyClient

client = ApifyClient(os.environ['APIFY_TOKEN'])
run = client.actor('automation-lab/homeadvisor-contractors-reviews-scraper').call(run_input={
    'startUrls': [
        {'url': 'https://www.homeadvisor.com/rated.MartinandSons.72192370.html'}
    ],
    'maxContractors': 1,
    'includeReviews': True,
    'maxReviewsPerContractor': 5,
})

for item in client.dataset(run['defaultDatasetId']).iterate_items():
    print(item)
```

Use the same input contract in Python, Node.js, cURL, schedules, tasks, and MCP.

### Using the Apify API with cURL

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/automation-lab~homeadvisor-contractors-reviews-scraper/runs?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "startUrls": [{"url":"https://www.homeadvisor.com/rated.MartinandSons.72192370.html"}],
    "maxContractors": 1,
    "includeReviews": true,
    "maxReviewsPerContractor": 5
  }'
```

Do not embed permanent Apify tokens in client-side code or public repositories.

### Use HomeAdvisor data with AI agents via MCP

Connect the Actor to Claude Code, Claude Desktop, Cursor, or VS Code through Apify's hosted [Model Context Protocol](https://docs.apify.com/platform/integrations/mcp).

**Claude Code**

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=automation-lab/homeadvisor-contractors-reviews-scraper"
```

**Claude Desktop, Cursor, or VS Code**

```json
{
  "mcpServers": {
    "apify": {
      "url": "https://mcp.apify.com?tools=automation-lab/homeadvisor-contractors-reviews-scraper"
    }
  }
}
```

Authenticate with your Apify account when prompted.

Example prompts:

- “Use `automation-lab/homeadvisor-contractors-reviews-scraper` to extract this contractor profile and summarize recurring customer feedback.”
- “Collect five public reviews from these HomeAdvisor profiles and compare service ratings.”
- “Build a Denver contractor market table with business names, services, ratings, and review counts.”

### Legality of scraping HomeAdvisor

Web scraping public information is generally legal in many jurisdictions, but rules depend on the data, purpose, location, and applicable agreements.

Use this Actor only for lawful purposes.

Collect only public data you are authorized to process.

Respect HomeAdvisor's terms, applicable privacy laws, intellectual-property rights, and reasonable request volumes.

Do not use extracted data for harassment, discrimination, deceptive outreach, or unsolicited communications that violate law.

This Actor intentionally excludes private accounts, quote submission, lead requests, and gated phone revelation.

You are responsible for your use of the output.

### Limitations

- HomeAdvisor applies Cloudflare and other anti-bot protections
- Public city directories can change which profile links they expose
- Optional profile fields may be absent
- A profile page may expose fewer reviews than the requested cap
- The Actor does not promise every historical review
- Review dates can use human-readable month/year formatting
- Project prices are returned only when publicly shown in review content
- No login, phone reveal, quote request, or lead submission is performed
- Pages are processed sequentially to favor reliability over speed

Use a direct profile when directory discovery is unavailable.

### FAQ

**How fast is the HomeAdvisor scraper?**

A direct profile usually takes under a minute, but anti-bot retries and page size can increase runtime. Directory runs take longer because each discovered profile requires a separate browser navigation.

**Why are some contractor fields missing?**

HomeAdvisor does not show every field on every profile. The Actor omits unavailable optional values instead of inventing data.

**Why did a run fail with no contractor output?**

The page may have been blocked, the directory may no longer expose profiles, or the input path may be unsupported. Check logs, retry once, or use a canonical direct `/rated.*.html` profile URL.

**Why are there fewer reviews than `maxReviewsPerContractor`?**

The setting is a cap, not a promise. A page can expose fewer public records than requested, and this version does not claim full historical pagination.

**Does this reveal contractor phone numbers?**

No. Gated phone revelation and lead-generation interactions are intentionally excluded.

**Can I scrape profiles without reviews?**

Yes. Set `includeReviews` to `false` and `maxReviewsPerContractor` to `0` for a lower-cost profile-only workflow.

**Is this an official HomeAdvisor API?**

No. It is an independent public-web extraction Actor. It is not affiliated with or endorsed by HomeAdvisor or Angi.

**Can I schedule reputation monitoring?**

Yes. Create an Apify task with selected profile URLs, schedule it, and compare records by `profileId` and `scrapedAt`.

### Other contractor and local-business scrapers

Combine this Actor with Automation Lab tools for enrichment and verification:

- [Contractor License Verification Scraper](https://apify.com/automation-lab/contractor-license-verification-scraper)
- [CSLB California Contractor License Scraper](https://apify.com/automation-lab/cslb-california-contractor-license-scraper)
- [Washington Contractor License Lookup Scraper](https://apify.com/automation-lab/washington-contractor-license-lookup-scraper)
- [Oregon Contractor License Lookup Scraper](https://apify.com/automation-lab/oregon-contractor-license-lookup-scraper)
- [Google Maps Scraper](https://apify.com/automation-lab/google-maps-scraper)
- [Yelp Scraper](https://apify.com/automation-lab/yelp-scraper)

Use license tools for compliance checks and this HomeAdvisor scraper for public marketplace reputation and service intelligence.

### Support

Open an issue from the Actor's Apify Store page with:

- The affected public HomeAdvisor URL
- A run ID
- The expected record or field
- Whether the failure was repeatable

Do not include private credentials, personal account cookies, or gated lead information.

Start with [HomeAdvisor Contractors & Reviews Scraper](https://apify.com/automation-lab/homeadvisor-contractors-reviews-scraper) and a single profile URL to validate your workflow.

# Actor input Schema

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

Add one or more public HomeAdvisor city directories or contractor profiles. Only homeadvisor.com URLs in supported formats are accepted.

## `maxContractors` (type: `integer`):

Stop after saving this many unique contractor profiles across all directory and profile inputs.

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

Extract public customer reviews shown on each contractor profile into the separate Reviews dataset.

## `maxReviewsPerContractor` (type: `integer`):

Maximum public reviews to save for each contractor. The source may expose fewer records on a profile page.

## `maxRequestRetries` (type: `integer`):

Retry blocked or incomplete pages with a fresh proxy session. Keep this low to control residential bandwidth.

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.homeadvisor.com/rated.MartinandSons.72192370.html"
    }
  ],
  "maxContractors": 1,
  "includeReviews": true,
  "maxReviewsPerContractor": 5,
  "maxRequestRetries": 1
}
```

# Actor output Schema

## `contractors` (type: `string`):

No description

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

No description

# 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.homeadvisor.com/rated.MartinandSons.72192370.html"
        }
    ],
    "maxContractors": 1,
    "maxReviewsPerContractor": 5,
    "maxRequestRetries": 1
};

// Run the Actor and wait for it to finish
const run = await client.actor("automation-lab/homeadvisor-contractors-reviews-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.homeadvisor.com/rated.MartinandSons.72192370.html" }],
    "maxContractors": 1,
    "maxReviewsPerContractor": 5,
    "maxRequestRetries": 1,
}

# Run the Actor and wait for it to finish
run = client.actor("automation-lab/homeadvisor-contractors-reviews-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.homeadvisor.com/rated.MartinandSons.72192370.html"
    }
  ],
  "maxContractors": 1,
  "maxReviewsPerContractor": 5,
  "maxRequestRetries": 1
}' |
apify call automation-lab/homeadvisor-contractors-reviews-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "HomeAdvisor Contractors & Reviews Scraper",
        "description": "Extract public HomeAdvisor contractor profiles and reviews by city or URL. Get services, experience, approval status, ratings, review text, recommendations, and project prices. Export two clean datasets or automate via API and schedules.",
        "version": "0.1",
        "x-build-id": "3NHMXvcYdxkY6BMcF"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/automation-lab~homeadvisor-contractors-reviews-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-automation-lab-homeadvisor-contractors-reviews-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/automation-lab~homeadvisor-contractors-reviews-scraper/runs": {
            "post": {
                "operationId": "runs-sync-automation-lab-homeadvisor-contractors-reviews-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/automation-lab~homeadvisor-contractors-reviews-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-automation-lab-homeadvisor-contractors-reviews-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",
                "required": [
                    "startUrls"
                ],
                "properties": {
                    "startUrls": {
                        "title": "🔗 Directory or contractor URLs",
                        "type": "array",
                        "description": "Add one or more public HomeAdvisor city directories or contractor profiles. Only homeadvisor.com URLs in supported formats are accepted.",
                        "items": {
                            "type": "object",
                            "required": [
                                "url"
                            ],
                            "properties": {
                                "url": {
                                    "type": "string",
                                    "title": "URL of a web page",
                                    "format": "uri"
                                }
                            }
                        }
                    },
                    "maxContractors": {
                        "title": "Maximum contractors",
                        "minimum": 1,
                        "maximum": 500,
                        "type": "integer",
                        "description": "Stop after saving this many unique contractor profiles across all directory and profile inputs.",
                        "default": 10
                    },
                    "includeReviews": {
                        "title": "Include public reviews",
                        "type": "boolean",
                        "description": "Extract public customer reviews shown on each contractor profile into the separate Reviews dataset.",
                        "default": true
                    },
                    "maxReviewsPerContractor": {
                        "title": "Reviews per contractor",
                        "minimum": 0,
                        "maximum": 200,
                        "type": "integer",
                        "description": "Maximum public reviews to save for each contractor. The source may expose fewer records on a profile page.",
                        "default": 25
                    },
                    "maxRequestRetries": {
                        "title": "Retries per page",
                        "minimum": 0,
                        "maximum": 3,
                        "type": "integer",
                        "description": "Retry blocked or incomplete pages with a fresh proxy session. Keep this low to control residential bandwidth.",
                        "default": 1
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
