Angi (formerly Angie's List) Scraper
Pricing
from $0.01 / 1,000 results
Angi (formerly Angie's List) Scraper
Angi Scraper extracts comprehensive business data from Angi (formerly Angie's List), the leading home services marketplace. Get verified contractor profiles, customer reviews, ratings, and project photos for plumbers, electricians, HVAC technicians, roofers, and all home service categories.
Pricing
from $0.01 / 1,000 results
Rating
1.0
(1)
Developer
The Howlers
Maintained by CommunityActor stats
1
Bookmarked
81
Total users
4
Monthly active users
a day ago
Last modified
Categories
Features
Share
Angi (HomeAdvisor) Business Scraper
Find a business's Angi profile by name and city, list the pros Angi shows for a service in a city, or read one profile by URL. Each result is read from the pro's public Angi page: profile URL, name, street address with ZIP, phone, the website the pro lists, rating, review count, services, years in business, licenses, reviews and project photos.
Angi and HomeAdvisor share one pro database. Every row carries the pro id (spId), which is also the id in the pro's HomeAdvisor URL (homeadvisor.com/rated.<Name>.<spId>.html).
How it works
The actor opens Angi the way a person does, in a real browser (Camoufox, a hardened Firefox with a realistic fingerprint) on US residential IPs, one page at a time with short pauses. It never logs in.
-
Find one business: set
businessNameandlocation. Angi has no public search by business name (its search box suggests services, not pros), so the actor looks in three places and opens every candidate it finds:- Google's index of angi.com for the quoted name. Google usually hides these result links behind its own click-through link; the actor follows that link only far enough to read the Angi address it points to.
- Angi's city list pages that name the business, in a pro card or a recent review. These are the pages Google says mention the name, or, when Google has none, the first two list pages for the services Angi's own search suggests for the name (for example Roofing for "A&E Roofing Construction") in that city.
- Angi's address for newer pros,
/companylist/us/<st>/<city>/<name>-reviews-1.htm.
Give
businessPhoneorbusinessAddressto put the business's own profile first when several share the name.Angi often has more than one profile for the same business: a second listing under the same name, or a branch in another city. The actor returns every profile it finds that fits the name, and each one is a separate result, billed as one Profile Scraped. A profile with the same name in another city (for example another branch of a chain) is also returned and billed, and is flagged
inSearchedCity: falseso you can filter it out. To get, and pay for, only the best match, setmaxResultsto 1: the actor then returns the profile that matches your phone or street first, then one in the city you searched. -
Pros for a service: set
searchTerm(for exampleplumber,roofing,electrician) andlocation. The actor opens Angi's list page for that service in that city and reads each pro listed, up tomaxResults. -
One profile: set
scrapeTypetobusiness_profile(orreviews) andbusinessUrl.
When nothing is found the run returns one notice row instead of a profile, and notice rows are never charged as profiles:
status: "not_found": the search could have found the business and did not. Google answered for the name, every Angi page it returned for the name was read, and none is this business. Near misses are listed inpossibleMatches.status: "unverified": the search could not be completed, so this is not evidence that the business is missing from Angi.reasonssays why (Google did not answer, a result link could not be opened, or a candidate page did not load).status: "blocked": neither Angi nor the search answered after retries.
Quick start
Find one business
{"scrapeType": "search","businessName": "Bone Dry Roofing","location": "Indianapolis, IN","businessAddress": "7735 Winton Dr","maxResults": 3,"includeReviews": false,"demoMode": false}
Pros for a service in a city
{"scrapeType": "search","searchTerm": "roofing","location": "Dallas, TX","maxResults": 10,"includeReviews": true,"maxReviewsPerBusiness": 5,"demoMode": false}
One profile
{"scrapeType": "business_profile","businessUrl": "https://www.angi.com/companylist/us/in/indianapolis/bone-dry-roofing-reviews-1.htm","includeReviews": false,"demoMode": false}
{"demoMode": true} returns labeled sample rows (demo: true) without visiting Angi. Sample rows are never charged as profiles.
Input
| Parameter | Type | Default | Description |
|---|---|---|---|
scrapeType | string | "search" | search, business_profile or reviews |
businessUrl | string | - | An angi.com profile page |
businessName | string | - | Business to find near location |
businessPhone | string | - | Optional, with businessName: ranks the profile with this phone first |
businessAddress | string | - | Optional, with businessName: ranks the profile at this street first |
searchTerm | string | - | Service to list pros for, or a business name |
location | string | - | City and state, for example Indianapolis, IN |
serviceType | string | "all" | Service list page to use; all follows searchTerm |
minRating | number | - | Skip pros rated below this |
includeReviews | boolean | true | Include the reviews shown on each profile |
maxReviewsPerBusiness | integer | 20 | Reviews per profile |
includePhotos | boolean | false | Include project photo URLs |
maxResults | integer | 50 | Most profiles to read |
sortBy | string | "relevance" | Order of service-search results |
proxyConfiguration | object | RESIDENTIAL | Keep residential proxies on; Angi turns away datacenter IPs |
demoMode | boolean | false | Labeled sample data, nothing fetched |
webhookUrl | string | - | Each profile is also POSTed here |
Output
website is the website the pro lists in its Contact Information, or null when it lists none; addresses that belong to Angi or HomeAdvisor themselves (angi.com, angi.cloud, homeadvisor.com and their other service hosts) are never returned as a pro's website. rating is null when the pro has no reviews yet, never 0.
{"businessName": "Bone Dry Roofing","angiUrl": "https://www.angi.com/companylist/us/in/indianapolis/bone-dry-roofing-reviews-1.htm","spId": "31569905","categories": ["Asphalt Shingle Roofing - Install or Replace", "Asphalt Shingle Roofing - Repair"],"rating": 4.42,"reviewCount": 26,"yearsInBusiness": 37,"phone": "(463) 219-4253","website": "https://bonedry.com/indianapolis/","address": { "street": "7735 Winton Drive", "city": "Indianapolis", "state": "IN", "zip": "46268", "full": "7735 Winton Drive, Indianapolis, IN 46268" },"fullAddress": "7735 Winton Drive, Indianapolis, IN 46268","reviews": [],"nameMatchScore": 1,"inSearchedCity": true,"matchesStreet": true}
Pricing
This actor uses pay-per-event billing:
| Event | When it is charged | Price |
|---|---|---|
| Actor start | Once when the run starts, one event per GB of memory (minimum one). At the default 2 GB of memory a run starts at $0.20 | $0.10 per GB |
| Profile Scraped | Once for each profile returned. A business with several Angi profiles returns, and is billed for, each one | $0.02 |
| Review Extracted | Per review extracted | $0.01 |
| Result | Each item written to the default dataset | $0.00001 |
A profile is charged once, after it has been read, and each review returned once. You pay per profile returned, not per business: when a business has several Angi profiles, each one is returned and charged, including same-name profiles in another city, which are flagged inSearchedCity: false. In a name search, set maxResults to 1 to get and pay for only the best match. Set includeReviews to false when you need only the listing. Not-found and blocked notices and sample rows are not charged as profiles.
Troubleshooting
status: "not_found" for a business
Google's index of angi.com was searched for the name and every Angi page it returned was read; none is this business. Check possibleMatches, try the name as the business uses it on Angi, or the city where the business is based.
status: "unverified"
The search could not be completed (see reasons), so the business may still be on Angi. Run again; nothing was charged.
status: "blocked"
Angi did not serve the page after several tries on fresh residential IPs. Run again later and keep proxyConfiguration on RESIDENTIAL.
Built by John Rippy | Actor Arsenal