Angi Scraper

Every contractor on the list,
as a row in your sheet.

Paste an Angi near-me search or a company-list URL and get the contractors back as rows: name, trade, full address, star rating, review count, recommended rate, six summarised sub-ratings, years in business and the amenity flags Angi puts on a profile. Ranked in the order Angi returned them.

one-time 500 free rows$0.002 per row after42 columnsCSV · XLSX · JSON
How it works

A search URL in,
its contractors out.

The input is the listing page, not the company - you point it at a search you would otherwise scroll, and the job returns every result on it as a row.

  1. STEP 1Sign in to the platform.
  2. STEP 2Open the Angi Scraper.
  3. STEP 3Paste Angi near-me search or company-list URLs, one per line - or upload a CSV, XLSX, TXT or Parquet file.
  4. STEP 4Set a limit per query, or leave it at zero to take everything.
  5. STEP 5Choose your output format.
  6. STEP 6Click Get Data.

One row per company, tagged with the query it came from and numbered in the order Angi returned it - so the ranking survives into the spreadsheet.

Why teams use it

A trade directory
you can actually filter.

Ratings that break down

Not one star score but seven numbers: the headline rating plus summarised professionalism, punctuality, overall, responsiveness, quality and value. They come back as real numbers, so a sort works without cleaning the column first.

Amenity flags as booleans

Emergency callouts, free estimates, warranties, veteran-owned, bilingual, small jobs welcome, commercial work - seven true/false columns, not a phrase you have to parse. Filtering a list down to who does emergency work is one expression.

The area, not just the postcode

A near-me search returns the firms that serve your postcode, and their own addresses sit in surrounding towns - in the runs we checked, results routinely carried postcodes other than the one searched. That is the point of the query, and worth knowing before you filter on it.

What you get back

Forty-two columns -
and what they really contain.

Company identity, a full postal address, the ratings block, years in business, the amenity flags, and Angi's own listing id and profile URL. One row per company, numbered in the order the listing returned it.

Two things about that number are worth saying before you read the table rather than after. Eight of the forty-two columns are duplicates - Angi returns the company name, four address parts, the profile URL and the review count twice each under different names, and each pair carried the same value in every export we checked. And three columns came back empty throughout: phone, hours and local_quotes. Counting honestly, that is around thirty-one distinct populated fields, not forty-two.

The duplicate pairs, the empty columns and the column types are properties of the export and hold regardless of what you query. How often a sparse field like address_street2 carries a value is a different matter - that moves with the trade and the area, and with how many rows you take. Run a free-tier job on your own category for that.

Data dictionary

Forty-two columns in the file,
forty-three in the JSON.

The header row of real exports, in export order. Duplicates are named as duplicates and empty columns are named as empty - read the note underneath before you build against this.

query
The Angi URL you submitted, repeated on every row that came from it.
name
The company name.
category
The trade, echoing the category in the search URL - e.g. plumbing.
rating
The headline star rating, as a string with two decimals. Not the same number as the summarised OVERALL rating below.
review_count
How many reviews the company has, as a string.
phone
Empty in every export we have checked. See the note below.
description
The company’s own blurb. Occasionally ends with their website address - there is no separate website column.
street
Street line of the company’s address.
city
Town or city.
region
State, two-letter.
postal
The company’s own postcode - not the postcode you searched.
country
Country code. US in every export we have checked.
image
Company logo or photo, hosted on Angi’s HomeAdvisor CDN.
hours
Empty in every export we have checked.
profile_url
Link to the company’s Angi listing page.
id
Angi’s numeric id for the company, as a string. The same id appears at the end of the profile URL.
listing_url
Duplicate of profile_url - the same value under a second name.
title
Duplicate of name - the same value under a second name.
address_street1
Duplicate of street - the same value under a second name.
address_street2
Second address line: suite, unit or PO box. Genuinely sparse - most companies have nothing here.
address_city
Duplicate of city - the same value under a second name.
address_state
Duplicate of region - the same value under a second name.
address_country
Duplicate of country - the same value under a second name.
address_postalCode
Duplicate of postal - the same value under a second name. Note the camelCase, alone among the address columns.
years_in_business
How long the company has traded, as a number.
reviews
Duplicate of review_count - the same value under a second name.
recommended_rate
Percentage of reviewers who would recommend the company, as a number from 0 to 100.
average_ratings_summarized_PROFESSIONALISM
Summarised sub-rating, as a number.
average_ratings_summarized_PUNCTUALITY
Summarised sub-rating, as a number.
average_ratings_summarized_OVERALL
Summarised overall sub-rating, as a number. Close to rating but not equal to it - the two disagreed on every row.
average_ratings_summarized_RESPONSIVENESS
Summarised sub-rating, as a number.
average_ratings_summarized_QUALITY
Summarised sub-rating, as a number.
average_ratings_summarized_VALUE
Summarised sub-rating, as a number.
amenities_emergency_services
Boolean. Does emergency callouts.
amenities_free_estimates
Boolean. Quotes for free.
amenities_warranties_offered
Boolean. Offers warranties.
amenities_veteran_owned
Boolean. Veteran-owned business.
amenities_bilingual
Boolean. Bilingual staff.
amenities_small_jobs_welcome
Boolean. Takes small jobs.
amenities_accepted_payment_methods
A string, not a boolean - the odd one out among the amenity columns. Only CREDIT_CARD has appeared in the exports we checked, so treat the vocabulary as open.
amenities_offers_commercial_services
Boolean. Works commercial as well as residential.
local_quotes
Empty in every export we have checked.
position
1-based rank within the query, in the order Angi returned the listing. JSON only - the CSV and XLSX exports stop at forty-two columns.

Forty-two columns, but eight are copies and three never filled. title, address_street1, address_city, address_state, address_country, address_postalCode, listing_url and reviews each duplicate an earlier column and carried the same value as it; phone, hours and local_quotes came back empty throughout. That leaves roughly thirty-one fields carrying distinct information. Types are mixed here, unlike our kununu and Product Hunt exports: the seven amenity flags are real booleans, years_in_business, recommended_rate and the six summarised ratings are real numbers, and everything else - including rating and review_count - is a string. And do not merge rating into average_ratings_summarized_OVERALL: they are different figures and disagreed on every row we compared.

What it accepts

Two kinds of Angi URL,
four ways to hand them over.

The input is a listing page. Point it at a near-me search for a trade and an area, or at a company-list page, and every result on it comes back as a row.

angi.com/nearme/<trade>/?postalCode=… angi.com/companylist/… Paste one per line CSV upload XLSX upload TXT upload Parquet upload Limit per query One row per company
Common workflows

Three jobs people
most often run here.

A few examples of what a filterable table of contractors is good for.

Sales

Build a contractor prospect list

Suppliers, franchisors and SaaS vendors selling into the trades can pull every firm in a category and area, then filter on years in business and review count to separate established operators from brand-new listings.

Sales · Outreach
Competitive

See where you rank, and against whom

The row order is the order Angi served it, so a repeat run shows movement. Alongside the ratings breakdown you can see which competitor is winning on punctuality and which on value.

Market intel
Research

Map the trades across a region

Run the same category across a list of postcodes and you have a supply map: how many firms serve each area, how long they have traded, and how many offer emergency work.

Research
Pricing

Pay only for the companies
you actually pull.

No subscription, no minimum, no recurring bill. Your first 500 rows are on us - after that, pay-as-you-go at the same flat rate as every other scraper here.

Free tier

500 free rows - $0

Every new account, one-time. No credit card required. Per-query limits, file upload and every export format included.

$0 forever
Pay-as-you-go

$0.002 per row, after the free tier

Roughly $2 per 1,000 companies. The pre-flight estimator shows the row count and credit cost before a run starts - no surprise bills, no compute units to translate.

Most popular
Volume

Custom · high volume

Volume pricing, dedicated workers and an SLA for running many categories across many areas on a schedule. Tell us your numbers and we will quote.

Talk to us
10% off your first paid run.Use code LIVESCRAPER10 at checkout.
Sign up
Pairs well with

The listing,
then a way to reach them.

Angi's phone column came back empty on every row we pulled, and there is no website column at all. These two close that gap.

The legal bit

Is it legal to scrape
Angi listings?

Short answer: yes for the public listing - and what comes back is business information, not personal data.

Everything collected here is shown on a public Angi listing to any visitor, signed in or not: the company name, its trade, its business address, the star rating and review count, the summarised sub-ratings, years in business and the amenity flags. No login, no paywall, nothing behind an account.

It is also worth being clear about what this is not. There is no reviewer name, no review text and no customer detail anywhere in the export - you get counts and averages, so the output describes companies rather than the people who wrote about them. That keeps it on the business-data side of the line, which is a materially easier position than a scrape of review prose.

Angi's terms restrict automated access, so this is a terms question as well as a legal one - if you have a contractual relationship with the site, check it. We run no third-party trackers on the data layer, and your exports auto-delete after 30 days.

livescraper.app · principles
Public listing data only
No logins, no accounts touched
Business information, not personal data
GDPR-aligned by default
Exports auto-delete (30 days)
Check Angi's own terms before scaling.
Common questions

Things people
ask before signing up.

The questions we hear most. Anything else? Talk to us - humans, not bots, write the answers.

How do I scrape Angi?+
Using the Angi Scraper:
  1. Sign in to the platform.
  2. Open the Angi Scraper.
  3. Paste Angi near-me search or company-list URLs, one per line - or upload a CSV, XLSX, TXT or Parquet file.
  4. Set a limit per query, or leave it at zero to take everything.
  5. Choose your output format.
  6. Click Get Data.
What can I use as input?+
An Angi listing URL of either kind: a near-me search, which looks like angi.com/nearme/plumbing/?postalCode=75151, or a company-list page under angi.com/companylist/. Paste them one per line or upload a CSV, XLSX, TXT or Parquet file. The input is the listing page - one URL produces many rows.
Really forty-two columns?+
Forty-two in the file, but eight of them are duplicates and three came back empty throughout. title, address_street1, address_city, address_state, address_country, address_postalCode, listing_url and reviews each repeat an earlier column, and phone, hours and local_quotes carried nothing. Around thirty-one columns carry distinct information.
Does it return phone numbers?+
There is a phone column, but it was empty on every row of every current-format run we have. Treat it as unavailable rather than intermittent, and get contact details from the Google Maps Scraper instead - it returns the phone number and the website for the same companies.
Do I get the review text?+
No. The export carries the review count, the headline rating, the recommended rate and six summarised sub-ratings - professionalism, punctuality, overall, responsiveness, quality and value - but no review text and no reviewer names. It describes companies, not individual reviews.
Why is the postcode different from the one I searched?+
Because a near-me search returns the firms that serve your area, and their own registered addresses are often in neighbouring towns - in the runs we checked, results routinely carried postcodes other than the one searched, spread across several nearby ones. The postal column is the contractor's address, not your query.
Are the ratings and flags usable as-is?+
Mostly yes, and that is unusual for our exports. The seven amenity flags are real booleans, and years_in_business, recommended_rate and the six summarised ratings are real numbers, so they sort without cleaning. The headline rating and review_count are strings, so parse those two first.
How much does it cost?+
The first 500 rows are free and one-time, with no credit card. After that it is $0.002 per row - about $2 per 1,000 companies - which is the same flat rate as every other scraper on the platform. The estimator shows the cost of a run before it starts.

Your first 500 contractors,
on the house.

500 one-time free rows on every new account - no expiry. After that it is $0.002 per row, pay-as-you-go - no card on file until you say so.

Activates instantly · no card required

Scrape Angi contractor listings into a spreadsheet

Livescraper's Angi Scraper turns a listing page into contractor data. You submit Angi near-me search URLs or company-list URLs - typed one per line, or uploaded as a CSV, XLSX, TXT or Parquet file - set a limit per query if you want one, and download the results as a clean CSV, Excel or JSON file. One row per company, numbered in the order Angi returned it.

Each row carries the company's identity and a full postal address, its trade, the headline star rating and review count, the percentage of reviewers who would recommend it, six summarised sub-ratings covering professionalism, punctuality, overall, responsiveness, quality and value, how many years it has traded, and the amenity flags Angi shows on a profile - emergency callouts, free estimates, warranties, veteran-owned, bilingual, small jobs and commercial work.

Suppliers and vendors selling into the trades use it to build prospect lists they can filter by tenure and review volume. Contractors use it to see where they rank in their own area and which competitor is winning on which sub-rating. Researchers run one category across many postcodes to map how a trade is supplied across a region.

Two honest notes before you start, because a column count is not the same as a field count. Eight of the forty-two columns duplicate another column exactly, and three - phone, hours and local quotes - came back empty throughout, which leaves roughly thirty-one carrying distinct information. And a near-me search returns firms that serve your postcode rather than firms registered in it, so the address you get is theirs, not yours. Start free: your first 500 rows cost nothing and need no credit card, and after that it is $0.002 per row, flat.