Angi Contractors & Reviews Scraper
Pricing
Pay per event
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
Maintained by CommunityActor stats
0
Bookmarked
3
Total users
2
Monthly active users
4 days ago
Last modified
Categories
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?
| Field | Description |
|---|---|
contractorId | Angi provider/profile identifier when exposed |
businessName | Public business or provider name |
profileUrl | Canonical public Angi contractor page |
sourceUrl | Directory or profile URL that produced the record |
phone | Public business phone number when present |
website | Public business website when present |
address | Public street address when present |
city, state, postalCode | Structured location fields |
serviceArea | Market or service area published by Angi |
rating | Public average rating |
reviewCount | Public review total |
reviews | Bounded public review excerpts with author, rating, date, and featured flag |
serviceCategories | Services or trade categories |
badges | Public awards, certifications, or featured indicators |
isAdvertiser | Paid/advertiser signal when exposed |
responseSignals | Public response-time or reply indicators |
description | Public business description |
logoUrl, photoUrls | Public media URLs |
scrapedAt | UTC 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
- Open the Actor input page.
- Enter
city,state, andservicetogether. - Keep
maxItemsat 10 for a low-cost first run. - Choose whether to include public review excerpts.
- Start the run.
- 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
| Input | Type | Default | Purpose |
|---|---|---|---|
startUrls | array | sample directory | Angi directory or contractor profile URLs |
city | string | — | US city for directory discovery |
state | string | — | Two-letter US state code |
service | string | — | Trade slug such as plumbing or roofing |
maxItems | integer | 10 | Maximum unique contractors |
includeReviews | boolean | true | Include public review excerpts |
maxReviewsPerContractor | integer | 3 | Maximum nested reviews per contractor |
proxyConfiguration | object | US residential | Advanced 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
contractorevent 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: 10before a larger scheduled workflow. - 🧹 Deduplicate downstream by
contractorId, then byprofileUrl. - 📅 Store
scrapedAtwhen 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:
- run the Actor on a schedule;
- export the dataset to your database or Google Sheets;
- compare
rating,reviewCount,reviews, andbadgeswith the prior snapshot; - 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 ApifyClientclient = 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().itemsprint(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.
Responsible and legal use
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.
Related scrapers
- HomeAdvisor Contractors & Reviews Scraper — use a different home-services marketplace for complementary contractor coverage.
- Google Maps Lead Finder — discover broader local businesses and optionally enrich public websites.
- Yellow Pages Scraper — compare directory coverage and public business contacts.
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.