Angieslist APIangieslist.com ↗
Search Angi service professionals by category and location. Access company profiles, reviews, contact info, ratings, and project photos via 5 endpoints.
What is the Angieslist API?
The Angi API gives developers access to 5 endpoints covering home service professional data from angieslist.com. Use search_pros to query contractors by category and US zip code, returning names, grades, star ratings, and review counts. Companion endpoints retrieve full company profiles, customer reviews, contact details, and project photo albums for any result returned by a search.
curl -X GET 'https://api.parse.bot/scraper/d528b4c0-1730-4a6e-b30b-3f1d573c8cb2/search_pros?limit=5&query=plumbing&offset=0&location=02108&category_id=1271' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace angieslist-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""Walkthrough: Angi API — find service professionals, check reviews and photos."""
from parse_apis.angi_angies_list_api import Angi, ServiceCategory, CompanyNotFound
client = Angi()
# Search for plumbers in Boston — limit= caps total items fetched.
for pro in client.serviceproviders.search(query=ServiceCategory.PLUMBING, location="02108", limit=3):
print(pro.name, pro.star_rating, pro.review_count)
# Drill into the first result's reviews.
pro = client.serviceproviders.search(query=ServiceCategory.ELECTRICAL, location="10001", limit=1).first()
if pro:
review_result = pro.reviews()
print(review_result.rating_value, review_result.total_reviews)
for review in review_result.reviews[:2]:
print(review.review_body[:80], review.date_published)
# Get contact info for a known provider.
if pro:
contact = pro.contact_info()
print(contact.name, contact.address.locality, contact.address.region)
# Get photos for a provider — may be empty.
if pro:
photo_result = pro.photos()
print(photo_result.album_count, photo_result.total_photos)
for album in photo_result.albums[:2]:
print(album.album_name, album.image_count)
# Typed error handling: catch CompanyNotFound for a deleted profile.
try:
gone = client.serviceprovider("/companylist/us/tx/austin/fake-company-reviews-0000000.htm")
gone.reviews()
except CompanyNotFound as exc:
print(f"Company not found: {exc.profile_url}")
print("exercised: search / reviews / contact_info / photos / CompanyNotFound")
Search for service professionals by category and location (zip code). Returns a paginated list of companies with name, rating, review count, grade, and profile URL slug. Pagination is offset-based. Each result carries a slug suitable for the profile, reviews, contact, and photos endpoints.
| Param | Type | Description |
|---|---|---|
| limit | integer | Maximum number of results to return. |
| query | string | Search keyword used to match a category ID if category_id is not provided. Supported keywords include: plumbing, electrical, hvac, landscaping, roofing, painting, cleaning, remodeling, handyperson, concrete, windows. |
| offset | integer | Offset for pagination. |
| location | string | US zip code for the search area. |
| category_id | string | Category ID for the service type. If not provided, inferred from query. Falls back to '1271' (plumbing) if neither query nor category_id resolves to a known category. |
{
"type": "object",
"fields": {
"category": "object with id and name of the matched category",
"totalResults": "integer total number of matching results",
"serviceProviders": "array of service provider objects with serviceProviderId, name, description, grade, starRating, reviewCount, slug, and businessHighlights",
"searchLocationInfo": "object with postalCode, cityName, and stateAbbreviation"
},
"sample": {
"data": {
"category": {
"id": 107,
"name": "Plumbing"
},
"totalResults": 22,
"serviceProviders": [
{
"name": "Beantown Drains",
"slug": "/companylist/us/ma/belmont/beantown-drains-reviews-7366722.htm",
"grade": "A",
"starRating": 4.89,
"description": "We accept check, cash and credit cards",
"reviewCount": 67,
"serviceProviderId": 7366722,
"businessHighlights": [
{
"name": "EmergencyServices",
"description": "Emergency Services Offered"
}
]
}
],
"searchLocationInfo": {
"cityName": "Boston",
"postalCode": "02108",
"stateAbbreviation": "MA"
}
},
"status": "success"
}
}About the Angieslist API
Search and Discovery
The search_pros endpoint accepts a location (US zip code), an optional category_id, or a query keyword that maps to a category. It returns a serviceProviders array where each entry includes serviceProviderId, name, grade, starRating, reviewCount, description, slug, and businessHighlights. The response also contains a category object with the matched category id and name, a totalResults count, and a searchLocationInfo block with postalCode, cityName, and stateAbbreviation. Pagination is controlled through limit and offset. If neither query nor category_id resolves, the endpoint falls back to category ID 1271 (plumbing).
Company Profiles and Reviews
get_company_profile takes a profile_url slug from search_pros results and returns the full profile, including a profile object containing LocalBusiness structured data with name, address, image, an aggregateRating, and a review array. It also surfaces a services list of offered service names, a highlights array of business differentiators, and a contact_sidebar object with address details. get_company_reviews focuses specifically on review data, returning up to 25 recent reviews with reviewBody, reviewRating, datePublished, and author, alongside aggregate rating_value and review_count. get_company_contact_info returns the company name, structured address fields (addressLocality, addressRegion, postalCode, addressCountry), and telephone when available.
Project Photos
get_company_photos retrieves photo albums associated with a company profile. The albums array includes album_id, album_name, image_count, project_year, description, min_cost, and max_cost. The photos array provides individual images with urlSmallImg, urlLargeSquare, title, description, and the parent album_id and album_name. Both arrays return empty when a company has not uploaded photos. The sp_id field identifies the provider, or returns null if not found.
The Angieslist API is a managed, monitored endpoint for angieslist.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when angieslist.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official angieslist.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Build a contractor comparison tool using
starRating,grade, andreviewCountfromsearch_prosresults across multiple zip codes. - Populate a CRM with verified business contact data using
get_company_contact_infoto retrievetelephoneand structuredaddressfields. - Aggregate customer sentiment by pulling
reviewBodyandreviewRatingfields fromget_company_reviewsacross multiple companies in a category. - Generate local service provider directories by combining
search_proscategory searches with profile data fromget_company_profile. - Analyze project cost ranges in a service category using
min_costandmax_costfields fromget_company_photosalbum data. - Monitor a company's aggregate rating and review count over time using
rating_valueandreview_countfromget_company_reviews. - Enrich lead lists with business highlights and offered services using the
highlightsandservicesfields fromget_company_profile.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Angi have an official developer API?+
How many reviews does `get_company_reviews` return, and can I page through all of them?+
get_company_reviews returns up to 25 recent reviews per request, pulled from the structured data on the company's profile page. The review_count field in the aggregate rating may show a higher total than the reviews actually returned. The endpoint does not currently support pagination through older reviews beyond those 25.Is telephone number always available in `get_company_contact_info`?+
telephone field returns the number as a string when present in the profile's structured data, but returns null when the company has not listed a phone number. Applications consuming this field should handle the null case.Does the API cover contractor licensing, background check status, or verified badge data?+
Does `search_pros` work for locations outside the United States?+
location parameter accepts US zip codes only, and searchLocationInfo returns US city and state fields. Non-US locations are not supported. The API is scoped to the US market that Angi operates in.