Angi Scraper — Pros, Reviews & Contacts
Pricing
from $3.00 / 1,000 results
Angi Scraper — Pros, Reviews & Contacts
Search any US trade by city and get Angi's home-service pros as clean JSON: ratings, reviews, services, service areas, addresses, websites, emails, phones, and social profiles — streamed to your dataset in real time. Free plans return a sample.
Pricing
from $3.00 / 1,000 results
Rating
0.0
(0)
Developer
Emmanuel
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Angi Real-Time Data
Collect Angi's home-service pro directory as clean, structured JSON — search any trade in any US market, read full business profiles, capture public reviews, and enrich every business with the contact details it publishes (website, emails, phones, social profiles). Results stream straight to your dataset as they are collected, so you can watch rows arrive and start working with them immediately.
Angi is the largest US marketplace for home services: roofers, plumbers, HVAC pros, electricians, cleaners, landscapers, general contractors and hundreds more trades, each with ratings, review counts, service lists, service areas, and verification badges. This Actor turns that directory into a dataset your CRM, outreach tool, or research pipeline can use.
Free trial: on a free Apify plan this Actor returns a small sample (2 results) per run so you can confirm the output before upgrading. Paid plans get the full, uncapped output.
Who it is for
- Local marketing and SEO agencies building prospect lists by trade and city
- Lead-gen teams feeding CRM and outreach sequences with verified business contact details
- Home-service brands and distributors mapping who operates in a market and what they offer
- Market researchers sizing trades across metros and tracking ratings and review volumes
- Data teams and AI agents that need a steady, structured feed of business and review rows
Use cases
- Build a city prospect list — every roofing company in Austin, TX with rating, review count, phone, and website.
- Niche trade expansion — run house cleaning in 25 metros and compare review volumes to find underserved markets.
- CRM enrichment — match on business name and profile link, then write in the verified website, emails, and social profiles.
- Reputation monitoring — collect public reviews per business on a schedule and watch new feedback land in your dataset.
- Competitive mapping — pull all general contractors in a market and compare service lists, amenities, and warranties.
- AI agent research — let an agent search a trade, read the rows, and summarise the competitive landscape.
Features at a glance
| Checkbox | Default | What it returns |
|---|---|---|
| 🔎 Pro search | on | One row per business from a trade + US city search. |
| 📋 Profile details | off | Enriches each business in place: street address, published website, full service list, star breakdown, about text, business highlights, amenities, accepted payments, FAQs. |
| ⭐ Reviews | off | One row per public review: reviewer, date, stars, verified flag, recommendation, project cost, text, and the pro's reply. |
| 🎯 Lead details | on | Enriches each business in place: verified website, email addresses, phone numbers, and social profiles. |
| 🔗 Scrape By URL | off | Reads specific Angi business profile links instead of searching. |
Profile details and lead details enrich the same row — they never remove businesses and never create a second row, so your result count (and your cost) stays predictable. Every business found is exported.
Quick start
The default input runs a roofers-in-Austin search and returns 10 businesses. Press Start and rows begin streaming to the dataset.
{"enableProSearch": true,"searchTasks": [{ "category": "roofing", "location": "Austin, TX", "maxResults": 10 }],"enableLeadDetails": true}
For the fullest record per business, turn on Profile details as well:
{"enableProSearch": true,"searchTasks": [{ "category": "plumber", "location": "Chicago, IL", "maxResults": 50 }],"enableProfileDetails": true,"enableReviews": true,"maxReviewsPerBusiness": 25,"enableLeadDetails": true,"maxItems": 2000}
Input reference
🔎 Pro search
| Field | Type | Default | Notes |
|---|---|---|---|
enableProSearch | boolean | true | Primary feature. |
searchTasks | array | roofers in Austin, TX | One row per trade + market. |
searchTasks[].category | string | "roofing" | Trade or service. Everyday names work: plumber, ac repair, house cleaning, tree service. |
searchTasks[].location | string | "Austin, TX" | US city with state. The state is required. |
searchTasks[].maxResults | integer | from maxResultsPerTask | Cap for this row. |
maxResultsPerTask | integer | 10 | Default cap per row. |
maxPagesPerTask | integer | 5 | Safety cap on how deep a single search may go. |
Verified examples: roofing in Austin, TX · plumbing in Los Angeles, CA · hvac in Chicago, IL · house cleaning in Seattle, WA · handyman-service in Manhattan, NY · tree service in Atlanta, GA.
Everyday trade names are matched to the trade Angi publishes, so plumber finds plumbers and ac repair finds HVAC pros. Some very large metros are split into named areas — if a search comes back empty, try the specific area (for example Manhattan, NY instead of New York, NY).
📋 Profile details
| Field | Type | Default | Notes |
|---|---|---|---|
enableProfileDetails | boolean | false | Enriches each business in place. Every business is still exported. |
⭐ Reviews
| Field | Type | Default | Notes |
|---|---|---|---|
enableReviews | boolean | false | Adds one row per public review. Review rows count toward maxItems. |
maxReviewsPerBusiness | integer | 10 | 1–200. |
🎯 Lead details
| Field | Type | Default | Notes |
|---|---|---|---|
enableLeadDetails | boolean | true | Adds verified website, email(s), phone(s), and social profiles where publicly available. Enriches rows in place — never filters them. |
🔗 Scrape By URL
| Field | Type | Default | Notes |
|---|---|---|---|
enableScrapeByUrl | boolean | false | Reads specific business profiles instead of searching. |
scrapeUrls | array | [] | Angi business profile links, one per line. |
Example link: https://www.angi.com/companylist/us/tx/austin/quick-roofing-llc-reviews-10944876.htm
⚙️ Output & limits
| Field | Type | Default | Notes |
|---|---|---|---|
maxItems | integer | 10000 | Global cap on all rows (businesses + reviews). The run also respects your maximum cost for this run. |
concurrency | integer | 6 | Parallel detail lookups (1–8). |
delayBetweenRequestsMs | integer | 250 | 0–5000. Higher is gentler and slower. |
🔔 Notifications
| Field | Type | Default | Notes |
|---|---|---|---|
webhookUrl | string | "" | Optional. Every record is always saved to the dataset — this adds a real-time POST per record. |
webhookFormat | string | "json" | json sends the full record; slack sends a Slack-ready message. |
🌐 Connection
Apify Residential connection is used by default, pinned to the United States. Change the country or supply your own connections under Proxy settings if you need to.
Output
Every row is written to the default dataset. OUTPUT in the key-value store holds the run summary.
Summary shape
{"totalPushed": 10,"totalPros": 10,"totalReviews": 0,"tasksRequested": 1,"tasksCompleted": 1,"profileDetailsEnabled": false,"reviewsEnabled": false,"leadDetailsEnabled": true,"errors": [],"spendingLimitReached": false,"paywall": {"detected": true,"isPaying": true,"pricingTier": "BRONZE","limited": false,"blocked": false,"freeTierMaxItems": null}}
Business rows (type: "pro")
| Field | Description |
|---|---|
name | Business name |
profileUrl | Link to the business profile |
proId | Directory id parsed from the link |
category / categoryLabel | Trade slug and readable trade |
services | Services the business offers |
rating / reviewCount / reviewBreakdown | Star rating, total reviews, and per-star percentages |
location | Full address when Profile details is on |
street / city / state / zipCode | Address parts |
areaServed | Area the business serves |
phone / phones | Phone numbers found publicly |
website / websiteDomain / websiteConfidence / websiteScore | Verified website and how strongly it was matched |
email / emails | Email addresses found publicly |
socials / facebookUrl / instagramUrl / linkedinUrl | Social profiles |
description | About-the-business text |
businessHighlights | Highlights such as veteran owned or emergency service |
amenities | Amenities such as free estimates and warranties |
badges | Directory badges such as Approved |
acceptedPayments | Accepted payment methods |
faqs | Business FAQs with answers |
inBusinessSince / yearsInBusiness | Trading history |
responseTime / homeownerRecommendation / recentQuoteRequests | Response and demand signals |
reviewSnippet | Featured review excerpt |
logoUrl / imageUrl / images | Branding and project images |
detailsFetched | true once the full profile has been merged |
leadDetails | true once contact details have been merged |
searchTaskLabel / searchTaskIndex / position | Which search produced the row and where it ranked |
scrapedAt | Collection timestamp (ISO 8601) |
Review rows (type: "review")
| Field | Description |
|---|---|
proName / proId / profileUrl | The business the review belongs to |
author | Reviewer name as published |
date / dateText | ISO date and the date exactly as shown |
rating | Star rating |
verified | Whether the review is marked verified |
recommend | Whether the reviewer recommends the business |
projectCost | Project cost when the reviewer shared it |
body | Review text |
responseFromPro | The business's reply |
scrapedAt | Collection timestamp (ISO 8601) |
Dataset views Overview, Businesses, and Reviews are preconfigured in the Apify Console.
Webhooks
Set webhookUrl and every record is POSTed the moment it is saved — the dataset always receives it too. Delivery problems never stop the run.
JSON format posts the full record object:
{"type": "pro","name": "Quick Roofing LLC","rating": 4.9,"reviewCount": 98,"website": "https://quickroofing.com/","email": "office@quickroofing.com","profileUrl": "https://www.angi.com/companylist/us/tx/austin/quick-roofing-llc-reviews-10944876.htm"}
Slack format posts a short message:
{"text": ":hammer_and_wrench: *Quick Roofing LLC*\n*Trade:* Roofing\n*Rating:* 4.9 (98 reviews)\n*Website:* https://quickroofing.com/"}
Paste a Slack incoming-webhook URL and choose slack to get a card per business (and a review card per review). Works equally well with Zapier, Make, n8n, or your own receiver.
Use it from an AI agent (Apify MCP)
This Actor is callable as a tool through Apify's MCP server, so an assistant can pull live home-service data on demand. Add the Actor to your MCP client and ask in plain language.
Example question:
"Find roofers in Austin, TX with lead details on, then rank them by rating and review count and tell me which three have the strongest online presence."
Your agent calls the Actor, reads the dataset rows, and answers with real businesses, ratings, and links.
FAQ
Do I need my own proxies? No. Apify's Residential connection is preconfigured and pinned to the United States.
How much does a run cost?
You are charged per result exported. Set maxItems and your maximum cost for the run to stay in full control; the run finishes gracefully when either limit is reached.
What happens on a free plan? A free run returns a small sample (2 results) so you can inspect the output. Upgrading removes the cap.
How fresh is the data? Every run reads live data at the moment it runs. Schedule the Actor to keep a dataset current.
Why did a search return no businesses?
Either the trade and market have no listed pros, or the metro is split into named areas — try the specific area, for example Manhattan, NY instead of New York, NY.
Do profile details and lead details change how many rows I get? No. Both enrich a business in place. The number of businesses exported is exactly the number found by your search.
Can I get one row per review instead of one row per business?
Yes — turn on Reviews. Each review becomes its own row linked to its business, and review rows count toward maxItems.
Are phone numbers and emails always present? They are included when the business publishes them publicly. When none are found the row is still exported with the fields left empty — nothing is invented.
Can I collect a specific business I already know? Yes. Turn on Scrape By URL and paste the profile link.