# Angi Scraper \[Only $0.9] | Contractor Leads | Reviews | Ratings (`ahmed_jasarevic/angi-scraper`) Actor

Extract contractor profiles, reviews, ratings, phone, website, and license info from Angi.com for any US trade and city. Build lead lists, monitor reputation, and run market research on America's largest home-services directory.

- **URL**: https://apify.com/ahmed\_jasarevic/angi-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Categories:**
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.90 / 1,000 reviews

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

## What's an Apify Actor?

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

## How to integrate an Actor?

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

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

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

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

# README

## Angi Scraper — Extract Contractor Profiles, Reviews & Leads from Angi.com

Extract **contractor profiles, individual reviews, ratings, phone numbers, websites, service areas, and license info** from [angi.com](https://www.angi.com) (formerly Angie's List) for any US trade and city. Build lead lists, monitor reputation, and run market research on America's largest home-services directory — no API key needed.

### What You Can Do

- **Contractor lead generation** — build lists of plumbers, electricians, roofers, HVAC techs, and 150+ trades by city with phone, website, and service area
- **Reputation monitoring** — track ratings, recommended-rate percentages, and individual review text, dates, costs, and pro responses per contractor
- **Market research** — compare contractor density, response rates, awards, and amenities across cities and trades
- **Competitor analysis** — map competitor coverage and identify acquisition targets with top ratings and Super Service Awards
- **Review intelligence** — extract full review text, cost data, pro responses, and would-hire-again signals for sentiment analysis
- **Database building** — assemble structured contractor datasets for CRM import, analytics dashboards, or outreach automation

### How It Works

1. Point the Actor at an Angi search URL (`/companylist/us/<state>/<city>/<trade>.htm`), a `/nearme/` category hub, or a direct contractor profile page — or simply enter Trade + State + City
2. The Actor uses a Cheerio-based HTTP crawler with residential proxy rotation to navigate Angi's Cloudflare-protected Next.js pages
3. It parses React Server Component (RSC) flight payloads embedded in HTML script tags to reconstruct provider and review objects
4. Turn on **Include individual reviews** to visit each profile page and extract full review text, phone, website, and license info
5. Results stream into the default **Contractors** dataset and a separate **Reviews** dataset — export as JSON, CSV, Excel, or via the Apify API

### Build Contractor Lead Lists by Trade & City

Feed the Actor a city-and-trade search URL or fill in the three fields (Trade, State, City) and it walks through Angi's paginated search results, collecting ~10 unique contractors per page. Enable profile-level crawling to enrich every record with phone numbers, website URLs, full addresses, years in business, and license mentions.

### Extract Individual Reviews for Reputation Monitoring

Turn on **Include individual reviews** and the Actor visits each contractor's profile page to pull full review text, star ratings, report dates, author names, cost data, service categories, and pro responses. Reviews go into a dedicated dataset so you can join them with contractor profiles for deep reputation analysis.

### Build a Home Services Database Without Official API Access

Angi does not offer a public developer API. This Actor reverse-engineers the Next.js RSC flight payloads that Angi's search pages deliver, extracting structured contractor and review records from the same data source the website renders — no login, no CAPTCHA solving, no browser automation overhead.

### Input Parameters

| Field | Type | Required | Default | Notes |
|-------|------|----------|---------|-------|
| `startUrls` | `array` | No | Angi Dallas plumbing URL | Angi search pages, `/nearme/` hubs, or profile pages |
| `trade` | `string` | No | `plumbing` | Service trade slug (e.g. roofing, electricians, hvac) |
| `state` | `string` | No | `tx` | Two-letter US state code |
| `city` | `string` | No | `dallas` | City name (e.g. austin, denver) |
| `maxPages` | `integer` | No | `5` | Search result pages to walk (~10 contractors per page) |
| `maxItems` | `integer` | No | `100` | Max contractor profiles to output (free users capped at 10) |
| `includeReviews` | `boolean` | No | `true` | Visit profiles for reviews, phone, website, license info |
| `maxReviewsPerProfile` | `integer` | No | `50` | Max individual reviews per contractor |
| `useApifyProxy` | `boolean` | No | `true` | Route through Apify Proxy (keep ON — datacenter IPs are blocked) |
| `proxyGroups` | `array` | No | `["RESIDENTIAL"]` | Proxy groups (RESIDENTIAL recommended) |
| `maxConcurrency` | `integer` | No | `10` | Parallel requests |
| `maxRequestsPerCrawl` | `integer` | No | `1000` | Hard cap on total HTTP requests |

### Output Fields — Contractors Dataset

| Field | Description |
|-------|-------------|
| `businessName` | Contractor or business name |
| `profileUrl` | Public Angi profile page URL |
| `angiId` | Angi provider identifier |
| `rating` | Numeric star rating |
| `displayRating` | Displayed rating value |
| `reviewCount` | Total number of reviews |
| `recommendedRatePct` | Percentage of customers who recommend |
| `yearsInBusiness` | Years in business |
| `businessDescription` | Business description text |
| `serviceArea` | Service area text |
| `address` | Full street address |
| `city`, `state`, `postalCode` | Address components |
| `phone` | Public phone number |
| `website` | Business website URL |
| `email` | Business email (if publicly listed) |
| `tradeCategories` | List of service categories |
| `responseRatePct` | Response rate percentage |
| `isSponsored` | Whether the listing is sponsored |
| `topRated` | Top-rated badge flag |
| `licenseInfo` | License information array |
| `amenities` | Amenities object |
| `awards` | Awards and badges |
| `photos` | Photo URL array |
| `quoteUrl` | Request-a-quote link |

### Output Fields — Reviews Dataset

| Field | Description |
|-------|-------------|
| `businessName` | Contractor name (reference) |
| `angiId` | Angi provider ID (reference) |
| `reviewId` | Unique review identifier |
| `reviewRating` | Star rating for this review |
| `text` | Full review text |
| `date` | Review date |
| `author` | Reviewer name |
| `isVerified` | Verified purchase flag |
| `costUsd` | Reported project cost |
| `categories` | Service categories reviewed |
| `proResponse` | Contractor's response |
| `wouldHireAgain` | Would-hire-again signal |

### Example Input

```json
{
  "trade": "plumbing",
  "state": "tx",
  "city": "dallas",
  "maxPages": 3,
  "maxItems": 50,
  "includeReviews": true,
  "maxReviewsPerProfile": 20
}
```

### Example Output — Contractor

```json
{
  "businessName": "ABC Plumbing Co",
  "profileUrl": "https://www.angi.com/companylist/us/tx/dallas/abc-plumbing-reviews-12345.htm",
  "angiId": "12345",
  "rating": 4.8,
  "displayRating": 4.8,
  "reviewCount": 127,
  "recommendedRatePct": 98,
  "yearsInBusiness": 15,
  "businessDescription": "Family-owned plumbing company serving Dallas-Fort Worth since 2009.",
  "serviceArea": "Dallas, Fort Worth, Plano, Irving",
  "address": "123 Main St, Dallas, TX, 75201",
  "city": "Dallas",
  "state": "TX",
  "postalCode": "75201",
  "phone": "(214) 555-1234",
  "website": "https://abcplumbing.com",
  "tradeCategories": ["Plumbing", "Water Heater Repair", "Drain Cleaning"],
  "responseRatePct": 95,
  "isSponsored": false,
  "topRated": true,
  "licenseInfo": ["TX Master Plumber License #12345"],
  "profileUrl": "https://www.angi.com/companylist/us/tx/dallas/abc-plumbing-reviews-12345.htm"
}
```

### Example Output — Review

```json
{
  "businessName": "ABC Plumbing Co",
  "angiId": "12345",
  "reviewId": "R67890",
  "reviewRating": 5,
  "text": "Excellent service. The plumber arrived on time, diagnosed the issue quickly, and fixed our leak within an hour. Fair pricing and professional work.",
  "date": "2026-03-15",
  "author": "John D.",
  "isVerified": true,
  "costUsd": 285,
  "categories": ["Plumbing"],
  "proResponse": "Thank you for your review, John! We appreciate your business.",
  "wouldHireAgain": true
}
```

### Integrations & Automation

- **API** — call the Actor programmatically via the [Apify API](https://docs.apify.com/api) or the [Apify MCP server](https://mcp.apify.com)
- **Scheduling** — set up a recurring schedule to monitor contractor ratings weekly or monthly
- **Webhooks** — receive a notification when a run completes
- **Zapier / Make** — connect to CRM tools, Google Sheets, or Slack for automated lead routing
- **Dataset exports** — download results as JSON, CSV, Excel, XML, or RSS

**Recommended schedule:** Run weekly to monitor reputation changes, or monthly for market research snapshots across multiple cities.

### Related Actors

- [Angi Scraper with Contacts](https://apify.com/fatihtahta/angi-scraper-with-contacts) — enriched Angi scraping with email extraction and social accounts
- [HomeAdvisor Contractors & Reviews Scraper](https://apify.com/automation-lab/homeadvisor-contractors-reviews-scraper) — complementary home-services marketplace data
- [BuildZoom Scraper — US Contractor Data & Leads](https://apify.com/parsebird/buildzoom-scraper) — 4M+ licensed contractors with permit data
- [Google Maps Lead Finder](https://apify.com/automation-lab/google-maps-lead-finder) — broader local business discovery across all categories
- [Contractor Lead Scraper — Verified Emails (HVAC, Plumbing)](https://apify.com/samstorm/contractor-lead-scraper) — Google Maps contractor leads with email verification

### FAQ

#### Why use this Actor instead of the official Angi API?

Angi does not publish a public developer API. Their search pages are server-rendered Next.js applications with no consumer-facing XHR endpoints. This Actor parses the same React Server Component flight payloads that the browser receives, extracting structured contractor and review data without requiring a browser session or API key.

#### How is this different from other Angi scrapers on Apify?

This Actor extracts **full individual review text** (not just excerpts or star counts), including review cost data, pro responses, and would-hire-again signals — data that most competing Angi scrapers do not capture. It also runs as a fast HTTP crawler (Cheerio-based), not a full browser automation tool, making it faster and more resource-efficient for large-scale runs.

#### What are alternatives to scraping Angi for contractor data?

Alternatives include HomeAdvisor (same parent company, different marketplace), Google Maps scraping (broader but less structured), state licensing board databases (verified but fragmented), and BuildZoom (permit-focused). Combining multiple sources typically gives the best coverage.

#### Can I scrape all contractors in a specific city?

Yes. Set `maxPages` high enough (each page yields ~10 contractors) and `maxItems` to your target count. For example, setting `maxPages: 20` and `maxItems: 200` will collect up to 200 contractors across 20 search result pages.

#### Does this work for all US cities and trades?

Yes. The Actor supports any Angi search URL format: `/companylist/us/<state>/<city>/<trade>.htm`. Simply change the state code, city slug, and trade slug to target different markets. Angi covers 150+ home-service categories across all 50 US states.

#### What happens if Cloudflare blocks a request?

The Actor automatically retries with a fresh proxy session. Keep `useApifyProxy: true` and `proxyGroups: ["RESIDENTIAL"]` for best results — datacenter IPs are typically blocked by Angi's Cloudflare protection.

#### Can I schedule this Actor for ongoing monitoring?

Yes. Use Apify's scheduling feature to run the Actor on a weekly or monthly basis. The separate Reviews dataset makes it easy to diff ratings and review counts over time for reputation monitoring.

### SEO Keywords

angi scraper, angi.com scraper, angies list scraper, contractor lead generation, home service contractor database, plumber leads usa, hvac contractor data, roofing contractor scraper, contractor review monitoring, angi.com api alternative, home services lead generation, contractor market research, electrical contractor leads, plumbing leads database, home service directory scraper, angie's list data export, contractor ratings scraping, local service business leads, home services market intelligence, residential contractor contact data

### For AI Agents & LLM Apps

**Purpose:** Extract structured contractor profiles and individual reviews from angi.com for lead generation, reputation monitoring, or market research.

**Minimal working input:**

```json
{
  "trade": "plumbing",
  "state": "tx",
  "city": "dallas",
  "maxItems": 20,
  "includeReviews": false
}
```

**Variant — fast listing-only mode (no profile visits):**

```json
{
  "startUrls": [{ "url": "https://www.angi.com/companylist/us/ca/los-angeles/electricians.htm" }],
  "maxPages": 5,
  "maxItems": 50,
  "includeReviews": false
}
```

**Variant — full review extraction:**

```json
{
  "trade": "roofing",
  "state": "fl",
  "city": "miami",
  "maxPages": 3,
  "maxItems": 30,
  "includeReviews": true,
  "maxReviewsPerProfile": 25
}
```

**Output fields (contractors dataset):** businessName, profileUrl, angiId, rating, displayRating, reviewCount, recommendedRatePct, yearsInBusiness, businessDescription, serviceArea, address, city, state, postalCode, phone, website, email, tradeCategories, responseRatePct, isSponsored, topRated, licenseInfo, amenities, awards, photos, quoteUrl

**Output fields (reviews dataset):** businessName, angiId, contractorRating, city, state, reviewId, reviewRating, text, date, author, isVerified, isAnonymous, costUsd, categories, proResponse, wouldHireAgain, profileUrl

**Behaviors an agent should know:**

- `includeReviews: true` triggers per-profile page visits, significantly increasing run time and request count — set `maxRequestsPerCrawl` higher for large runs
- `maxItems` caps total contractor profiles; free users are hard-capped at 10 regardless of this setting
- Reviews are always written to the separate `reviews` dataset, not the default dataset — fetch with `get-dataset-items` using the reviews dataset ID
- `useApifyProxy` defaults to `true` with residential proxies — disabling it will cause Cloudflare blocks on angi.com
- When both `startUrls` and `trade/state/city` are provided, `startUrls` takes precedence

**Pricing model:** Pay-per-event. $0.002 per contractor profile, $0.0009 per review extracted, $0.0005 actor start fee.

### Legal & Compliance Disclaimer

This Actor is independent and is not affiliated with, endorsed by, or sponsored by Angi Inc. It accesses only publicly available pages on angi.com — no login bypass, no CAPTCHA solving, and no private homeowner or project data is collected. Users are responsible for their own compliance with Angi's Terms of Service and applicable data-protection laws (including GDPR and CCPA where relevant). Do not use extracted data for unsolicited commercial outreach in violation of applicable law (e.g. CAN-SPAM, TCPA).

# Actor input Schema

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

Angi search pages (/companylist/us/<state>/<city>/<trade>.htm), category hubs (/nearme/...) or direct contractor profile pages to scrape.

## `trade` (type: `string`):

Service trade slug, e.g. plumbing, roofing, electricians. Combined with State + City to build a search URL (optional if Start URLs are given).

## `state` (type: `string`):

Two-letter US state code, e.g. tx, ca, ny.

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

City name, e.g. dallas, austin.

## `maxPages` (type: `integer`):

How many result pages to walk per search (?page=N). ~10 unique contractors per page.

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

Maximum contractor profiles to output (paying users; free users are capped at a 10-item preview). When reviews are enabled, each review is a separate row.

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

Visit each contractor profile to extract individual reviews, phone, website and license info (slower, more requests). Turn off for fast listing-only runs.

## `maxReviewsPerProfile` (type: `integer`):

Cap on individual reviews extracted per contractor.

## `useApifyProxy` (type: `boolean`):

Route traffic through Apify Proxy. angi.com walls datacenter/VPS IPs with Cloudflare — keep this ON (residential group recommended).

## `proxyGroups` (type: `array`):

Apify proxy groups to use (RESIDENTIAL recommended for angi.com — datacenter IPs are Cloudflare-blocked).

## `maxConcurrency` (type: `integer`):

Parallel requests. Higher values are faster but may trigger anti-bot limits.

## `maxRequestsPerCrawl` (type: `integer`):

Hard cap on total HTTP requests per run (loop safety).

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.angi.com/companylist/us/tx/dallas/plumbing.htm"
    }
  ],
  "trade": "plumbing",
  "state": "tx",
  "city": "dallas",
  "maxPages": 5,
  "maxItems": 100,
  "includeReviews": true,
  "maxReviewsPerProfile": 50,
  "useApifyProxy": true,
  "proxyGroups": [
    "RESIDENTIAL"
  ],
  "maxConcurrency": 10,
  "maxRequestsPerCrawl": 1000
}
```

# 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.angi.com/companylist/us/tx/dallas/plumbing.htm"
        }
    ],
    "trade": "plumbing",
    "state": "tx",
    "city": "dallas"
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/angi-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.angi.com/companylist/us/tx/dallas/plumbing.htm" }],
    "trade": "plumbing",
    "state": "tx",
    "city": "dallas",
}

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

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

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

```

## CLI example

```bash
echo '{
  "startUrls": [
    {
      "url": "https://www.angi.com/companylist/us/tx/dallas/plumbing.htm"
    }
  ],
  "trade": "plumbing",
  "state": "tx",
  "city": "dallas"
}' |
apify call ahmed_jasarevic/angi-scraper --silent --output-dataset

```

## MCP server setup

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

```

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

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/Vkx3AniMdALyQqSuA/builds/971rltIlfxvHZFVZp/openapi.json
