Angi Contractors & Reviews Scraper avatar

Angi Contractors & Reviews Scraper

Pricing

Pay per event

Go to Apify Store
Angi Contractors & Reviews Scraper

Angi Contractors & Reviews Scraper

🏠 Discover Angi contractors by city and trade. Export public profiles, ratings, reviews, services, badges, locations, phones, websites, and photos.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

3

Total users

2

Monthly active users

4 days ago

Last modified

Share

Find home-service businesses on Angi by city and trade, then export their public contractor profiles as clean JSON, CSV, Excel, XML, or API-ready records.

The Actor collects business names, profile URLs, service areas, addresses, ratings, review counts and excerpts, service categories, badges, response signals, descriptions, photos, phone numbers, and websites when Angi publishes them.

Use it for local lead generation, market mapping, contractor sales research, and reputation monitoring without copying data by hand.

What does Angi Contractors & Reviews Scraper do?

The scraper accepts either:

  • 🔎 an Angi city-and-trade directory URL;
  • 🏢 a public Angi contractor profile URL; or
  • 📍 a city, two-letter state code, and service such as plumbing.

It loads Angi's public Next.js pages in a browser session, reads structured application data, and falls back to rendered profile links and structured markup when page internals change.

Each dataset row represents one contractor. Review excerpts stay attached to their contractor so exports remain easy to join and analyze.

Who is it for?

Local lead-generation agencies

Create a current list of contractors in a target city and trade before qualification, outreach, or CRM import.

Home-services sales teams

Discover public phone numbers, websites, locations, services, and reputation signals for market-specific prospecting.

Contractor-market researchers

Compare provider density, ratings, review volume, categories, advertiser badges, and service areas across markets.

Reputation and competitive-intelligence teams

Refresh public Angi ratings and review excerpts on a schedule and detect meaningful changes downstream.

Developers and data teams

Call the Actor through the Apify API, webhooks, integrations, or MCP and receive predictable typed records.

Why use this Angi scraper?

  • City × trade discovery: turn a location and service into an Angi directory request.
  • Direct URL support: scrape known directory or contractor URLs.
  • Useful profile depth: collect more than names and links.
  • Public reviews: retain bounded review excerpts with their business.
  • Fail-closed validation: unsupported hosts and incomplete location inputs stop with a clear error.
  • Bounded anti-bot recovery: sessions rotate without creating unlimited retries.
  • Structured exports: use the Apify dataset in JSON, CSV, Excel, XML, RSS, or API workflows.

What Angi contractor data can I extract?

FieldDescription
contractorIdAngi provider/profile identifier when exposed
businessNamePublic business or provider name
profileUrlCanonical public Angi contractor page
sourceUrlDirectory or profile URL that produced the record
phonePublic business phone number when present
websitePublic business website when present
addressPublic street address when present
city, state, postalCodeStructured location fields
serviceAreaMarket or service area published by Angi
ratingPublic average rating
reviewCountPublic review total
reviewsBounded public review excerpts with author, rating, date, and featured flag
serviceCategoriesServices or trade categories
badgesPublic awards, certifications, or featured indicators
isAdvertiserPaid/advertiser signal when exposed
responseSignalsPublic response-time or reply indicators
descriptionPublic business description
logoUrl, photoUrlsPublic media URLs
scrapedAtUTC extraction timestamp

Fields may be null or empty when Angi does not publish them for a particular contractor.

How to scrape Angi contractors by city and service

  1. Open the Actor input page.
  2. Enter city, state, and service together.
  3. Keep maxItems at 10 for a low-cost first run.
  4. Choose whether to include public review excerpts.
  5. Start the run.
  6. Open the Dataset tab to inspect and export contractors.

Example:

{
"city": "San Francisco",
"state": "CA",
"service": "plumbing",
"maxItems": 10,
"includeReviews": true,
"maxReviewsPerContractor": 3
}

How to scrape an Angi directory URL

Paste one or more public Angi URLs into startUrls:

{
"startUrls": [
{ "url": "https://www.angi.com/companylist/us/ca/san-francisco/plumbing.htm" }
],
"maxItems": 25,
"includeReviews": true
}

Only public angi.com company-list, company-review, and business paths are accepted. This keeps explicit URLs within the product's promised contractor scope.

Input reference

InputTypeDefaultPurpose
startUrlsarraysample directoryAngi directory or contractor profile URLs
citystringUS city for directory discovery
statestringTwo-letter US state code
servicestringTrade slug such as plumbing or roofing
maxItemsinteger10Maximum unique contractors
includeReviewsbooleantrueInclude public review excerpts
maxReviewsPerContractorinteger3Maximum nested reviews per contractor
proxyConfigurationobjectUS residentialAdvanced connection settings

city, state, and service must be supplied as a complete group. You can also omit them and use startUrls alone.

Output example

{
"contractorId": "1234567",
"businessName": "Example Plumbing Inc",
"profileUrl": "https://www.angi.com/companylist/us/ca/example/example-plumbing-inc-reviews-1234567.htm",
"sourceUrl": "https://www.angi.com/companylist/us/ca/san-francisco/plumbing.htm",
"phone": "(415) 555-0100",
"website": "https://example.com/",
"city": "Example",
"state": "CA",
"serviceArea": "San Francisco",
"rating": 4.8,
"reviewCount": 127,
"reviews": [{ "author": "Customer", "rating": 5, "text": "Public review excerpt", "date": null, "isFeatured": true }],
"serviceCategories": ["Plumbing"],
"badges": ["Angi Certified"],
"scrapedAt": "2026-07-22T00:00:00.000Z"
}

This example shows the shape, not a promise that every field appears on every page.

How much does it cost to scrape Angi contractors?

The Actor uses pay-per-event pricing:

  • a small one-time run-start charge;
  • one contractor event for each dataset row saved;
  • automatic tier discounts for higher Apify plans.

The exact live prices appear in the Actor pricing tab before every run. Browser and residential-proxy costs are included in the event price; you do not need a separate proxy subscription when using the default Apify Proxy configuration.

Start with 10 contractors to validate your market and output needs before scaling.

Tips for better contractor datasets

  • 🎯 Use one city and one specific trade per source for focused results.
  • 🧪 Test with maxItems: 10 before a larger scheduled workflow.
  • 🧹 Deduplicate downstream by contractorId, then by profileUrl.
  • 📅 Store scrapedAt when comparing ratings over time.
  • 💬 Increase review limits only when text analysis needs them.
  • 🔗 Keep the source URL so analysts can trace every contractor.

Scheduling and monitoring

Apify schedules can refresh the same city-and-trade input daily, weekly, or monthly.

A practical reputation workflow is:

  1. run the Actor on a schedule;
  2. export the dataset to your database or Google Sheets;
  3. compare rating, reviewCount, reviews, and badges with the prior snapshot;
  4. notify a channel or CRM when a tracked value changes.

For lead discovery, schedule separate tasks by city and trade so failures and exports remain easy to audit.

Integrations

Google Sheets

Send new contractor rows to a sheet for manual qualification and territory assignment.

Webhooks

Trigger a webhook when a run succeeds, then ingest the dataset into your CRM or warehouse.

Zapier and Make

Build no-code flows that route qualified contractors by city, rating, or review volume.

Airbyte and database exports

Move dataset records into a warehouse for market-size, service-density, or reputation analysis.

Slack and email alerts

Notify teams when a scheduled comparison detects a rating, review-count, or badge change.

JavaScript API example

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/angi-contractors-reviews-scraper').call({
city: 'Austin',
state: 'TX',
service: 'roofing',
maxItems: 20,
includeReviews: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);

Python API example

from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("automation-lab/angi-contractors-reviews-scraper").call(run_input={
"city": "Austin",
"state": "TX",
"service": "roofing",
"maxItems": 20,
"includeReviews": True,
})
items = client.dataset(run["defaultDatasetId"]).list_items().items
print(items)

cURL API example

curl -X POST \
"https://api.apify.com/v2/acts/automation-lab~angi-contractors-reviews-scraper/runs?token=$APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"city":"Austin","state":"TX","service":"roofing","maxItems":20}'

Fetch results from the run's defaultDatasetId through the Apify Dataset API.

Use Angi data with Apify MCP

Connect AI clients to Apify MCP with this Actor selected:

https://mcp.apify.com?tools=automation-lab/angi-contractors-reviews-scraper

Claude Code setup

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

Claude Desktop setup

Add this HTTP server to the Claude Desktop MCP configuration:

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

Cursor setup

Use the same mcpServers JSON block in Cursor MCP settings and enable apify-angi.

VS Code setup

Add the same mcpServers JSON block through VS Code MCP server settings, then select the Angi tool in agent mode.

Example prompts:

  • “Run the Angi contractor scraper for plumbers in San Francisco and summarize rating distribution.”
  • “Extract 20 roofers in Austin, then identify businesses with strong review volume.”
  • “Compare the new Angi contractor dataset with last week's snapshot.”

Data quality and deduplication

The Actor prefers stable provider IDs. When an ID is unavailable, it uses the canonical profile URL and business name to prevent duplicate rows within one run.

Angi may expose richer data for paid profiles than basic profiles. Missing values remain null instead of being guessed.

Review excerpts are public page content and may represent only a featured or bounded subset. reviewCount is the better field for total-volume analysis.

Reliability and anti-bot handling

Angi protects pages with Cloudflare and browser checks. The Actor therefore uses a conservative browser route with US residential sessions, concurrency one, media blocking, and bounded rotation.

If all sessions receive a challenge or no structured contractor data, the run fails non-zero instead of reporting misleading success with zero records.

A successful run can still return fewer than maxItems when the selected directory has naturally limited public listings.

Limitations

  • Angi can change page internals, field names, directory slugs, and profile availability.
  • Public contact fields are not present for every contractor.
  • This v1 does not purchase, infer, or enrich email addresses.
  • Review excerpts are bounded and are not guaranteed to represent every review.
  • The Actor targets US Angi city/trade and public contractor pages.
  • A challenge-heavy period may require another session and increase run time.
  • Results reflect what Angi publicly displayed at extraction time.

This Actor extracts publicly accessible business information. It does not bypass login walls or request private homeowner/project data.

You are responsible for your use of the data. Review Angi's terms, applicable database rights, privacy rules, telemarketing requirements, and local laws before outreach or redistribution.

Use reasonable schedules, collect only fields needed for a legitimate purpose, and honor deletion or suppression obligations in downstream systems.

Troubleshooting

Why did my run reject the URL?

The Actor accepts only public angi.com contractor-related paths. Use a company-list directory, company-review page, business page, or city/state/service discovery input.

Why must city, state, and service be entered together?

All three values are needed to construct an unambiguous Angi directory URL. Remove all three when supplying startUrls instead.

Why are phone or website fields null?

Angi does not publish those fields for every profile. The Actor does not guess or buy missing contact data.

Why did the run fail after retries?

Angi may have served browser challenges to every bounded session or changed its structured data. Retry later with a small input and inspect the run log. Persistent failures should be reported with the source URL and run ID.

Why did I receive fewer contractors than maxItems?

maxItems is a ceiling, not a guarantee. The directory may contain fewer public listings or duplicate links.

Frequently asked questions

Does the Actor require an Angi login?

No. It targets the public no-login contractor and directory surface.

Can it extract emails?

No. Paid or inferred email enrichment is intentionally excluded from v1. Public phone and website fields are returned when present.

Can I scrape one contractor profile?

Yes. Supply its public Angi company-review or business URL in startUrls and set maxItems to 1.

Can I export to CSV or Excel?

Yes. Open the dataset and choose the desired export format, or use the Dataset API.

Can I monitor ratings over time?

Yes. Schedule repeat runs and compare contractorId, rating, reviewCount, reviews, and scrapedAt in your datastore.

Is maxItems a pagination guarantee?

No. It limits the output. Available records depend on the public directory and page state.

These actors target different public sources. Combining them can improve market coverage, but deduplicate by normalized business name, address, phone, and website.

Support

If a run fails, share the run ID, exact input, and expected Angi page. Do not include private credentials or personal homeowner data.

For the fastest diagnosis, keep the failed run available and note whether the same URL opens publicly in a normal US browser.