Avvo APIavvo.com ↗
Search Avvo attorneys by location and practice area, retrieve full profiles, client reviews, practice areas, and legal Q&A via a structured REST API.
What is the Avvo API?
The Avvo API covers 5 endpoints for querying attorney listings, detailed profiles, client reviews, practice area directories, and legal Q&A. The search_attorneys endpoint accepts city, state, and practice area filters and returns Avvo ratings, review counts, phone numbers, and addresses. get_attorney_profile goes deeper, exposing bio text, education history, awards, and a profile photo URL for any attorney identified by their Avvo profile URL.
curl -X GET 'https://api.parse.bot/scraper/227f40e8-e5b3-40b0-bf98-7a6467afac31/search_attorneys?city=los+angeles&page=1&sort=relevance&state=ca&practice_area=criminal+defense' \ -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 avvo-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: Avvo Legal Directory — search attorneys, view profiles and reviews."""
from parse_apis.avvo_legal_directory_api import Avvo, AttorneyNotFound
client = Avvo()
# Search for criminal defense attorneys in California
for attorney in client.attorneysummaries.search(practice_area="criminal defense", state="ca", limit=3):
print(attorney.name, attorney.avvo_rating, attorney.phone)
# Drill into the first result's full profile
summary = client.attorneysummaries.search(practice_area="family", state="tx", limit=1).first()
if summary:
profile = summary.details()
print(profile.name, profile.avvo_rating, profile.about[:80] if profile.about else "")
print("Education:", profile.education)
print("Practice areas:", profile.practice_areas)
# Walk the attorney's client reviews via sub-resource
for review in profile.reviews.list(limit=3):
print(review.rating, review.header_info, review.text[:60] if review.text else "")
# Handle not-found errors when drilling into a summary
try:
result = client.attorneysummaries.search(practice_area="bankruptcy", state="ny", limit=1).first()
if result:
detail = result.details()
print(detail.name, detail.review_count)
except AttorneyNotFound as exc:
print(f"Attorney not found: {exc.url}")
# Browse practice area categories
for group in client.practiceareagroups.list(limit=5):
print(group.letter, [a.name for a in group.areas[:3]])
# Search legal Q&A
for question in client.legalquestions.search(query="divorce custody", limit=3):
print(question.title, question.url)
print("exercised: attorneysummaries.search / details / reviews.list / practiceareagroups.list / legalquestions.search")
Search for attorneys by practice area and location. Returns a paginated list of matching attorneys with their Avvo rating, review count, and contact information. Pagination via page number; 20 results per page. When no filters are provided, returns all lawyers.
| Param | Type | Description |
|---|---|---|
| city | string | City name (e.g. 'los angeles'). Requires state to also be provided. |
| page | integer | Page number for pagination. |
| sort | string | Sort field. |
| state | string | US state abbreviation in lowercase (e.g. 'ca', 'tx'). |
| practice_area | string | Practice area slug (e.g. 'criminal defense', 'family', 'bankruptcy'). Omitting returns all lawyers. |
{
"type": "object",
"fields": {
"page": "integer, current page number",
"count": "integer, number of attorneys returned on this page",
"attorneys": "array of attorney summary objects with name, url, avvo_rating, review_count, phone, address, job_title, awards"
},
"sample": {
"data": {
"page": 1,
"count": 20,
"attorneys": [
{
"url": "https://www.avvo.com/attorneys/92660-ca-john-christl-4732017.html",
"name": "John Doe",
"phone": "+1 (555) 012-3456",
"awards": "Certified Specialist - Criminal Law",
"address": "123 Main St, Springfield, IL 62704",
"job_title": "Attorney",
"avvo_rating": "Rating:9.7",
"review_count": "29 reviews"
}
]
},
"status": "success"
}
}About the Avvo API
Attorney Search and Profiles
The search_attorneys endpoint accepts city, state, practice_area, sort, and page parameters. Results include each attorney's name, Avvo rating, review count, phone, address, job title, awards, and profile URL. Practice area values follow Avvo's URL slug format — for example 'criminal defense', 'family', or 'bankruptcy'. Omitting practice_area returns results across all categories. Pagination is handled via the page parameter; each response includes the current page number and a count of attorneys returned.
Deep Profile and Reviews
get_attorney_profile takes a full Avvo profile URL and returns structured fields: name, about (bio text, may be null), phone, address (broken into streetAddress, addressLocality, addressRegion, postalCode), education, awards, image_url, avvo_rating, and review_count. For client feedback, get_attorney_reviews takes the same URL format and returns an array of review objects, each with an integer rating (1–5), header_info, optional title, and full text.
Practice Areas and Legal Q&A
list_practice_areas requires no inputs and returns every Avvo practice area organized by uppercase letter grouping, with each area's name and url. This is useful for discovering valid slugs to feed into search_attorneys. The search_legal_qa endpoint accepts a keyword query — such as 'speeding ticket' or 'divorce custody' — and returns matching Q&A entries with their titles and full Avvo URLs, giving access to community legal questions without browsing the site.
The Avvo API is a managed, monitored endpoint for avvo.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when avvo.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 avvo.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 an attorney finder that filters by practice area and city, displaying Avvo ratings and contact info from
search_attorneys. - Aggregate client reviews across multiple attorneys using
get_attorney_reviewsto compare rating distributions for a given practice area. - Populate a legal directory with structured attorney bios, education, and award data pulled from
get_attorney_profile. - Generate a sitemap or index of all Avvo practice area categories using
list_practice_areasto keep slugs in sync. - Surface relevant legal Q&A content on a legal advice platform using
search_legal_qakeyed to user-entered topics. - Monitor attorney profile completeness — checking for null
about, missingimage_url, or zero reviews — for attorney marketing tools. - Cross-reference attorney award and education data from profile responses to support credential-verification workflows.
| 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 Avvo have an official developer API?+
What does `search_attorneys` return, and how specific can location filtering get?+
attorneys array includes the attorney's name, profile URL, Avvo rating, review count, phone, address, job title, and awards. Location filtering works at the city and state level — both city and state can be provided together, or state alone. Sub-city filtering (neighborhood, zip code) is not currently supported by the endpoint parameters.Does the API return the full text of legal answers in Q&A results, or just question titles?+
search_legal_qa endpoint returns question titles and full URLs to each Q&A page, but does not return the answer text inline. Individual answer content is not currently exposed. You can fork the API on Parse and revise it to add an endpoint that fetches answer text from a given Q&A URL.Are attorney disciplinary records or bar admission status included in the profile data?+
get_attorney_profile returns bio, education, awards, contact details, Avvo rating, and review count. Disciplinary records, bar admission status, and license verification data are not currently included in any endpoint response. You can fork the API on Parse and revise it to add an endpoint targeting those profile sections.How does pagination work for attorney search results?+
search_attorneys endpoint accepts an integer page parameter. Each response includes page (current page number) and count (attorneys returned on that page). There is no total_results or total_pages field exposed, so you would need to iterate pages until a response returns fewer results than a full page to detect the end of results.