Avvo.com [Only $1π°] Lawyer Directory Scraper
Pricing
from $1.00 / 1,000 results
Avvo.com [Only $1π°] Lawyer Directory Scraper
π°$1 per 1,000 results β No limits. Turn Avvo.com into a structured US-attorney dataset. Pull name, firm, phone, full address with real coordinates, practice areas, languages, credentials, awards, hourly rate, and star ratings from any listing or attorney URL. JSON or CSV out, billed per result.
Pricing
from $1.00 / 1,000 results
Rating
0.0
(0)
Developer
Muhamed Didovic
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Categories
Share
Avvo.com Lawyer Directory Scraper
Turn Avvo.com into a structured US-attorney dataset. Scrape every attorney profile from any Avvo listing URL β name, firm, telephone, full street address with real lat/long coordinates, practice areas, languages, bar credentials, memberships, awards, hourly rate, accepted payment methods, star rating with review count, plus a clean bio β straight out of the page. JSON or CSV out, no compute charge per run, just per result.
How it works

β¨ Why use this scraper?
Building a US legal-marketing list? Mapping competition by practice area + city? Need a clean attorney dataset without paying for a legal-vertical CRM seat?
- π― Two ways to start. Paste any Avvo URL (listing or attorney profile) β that always wins. Or, with no URLs set, pick a practice area + US state from the dropdowns and the scraper synthesizes the listing URL for you.
- π Real firm name, not the attorney name.
firmNameis parsed from the rendered HTML masthead β most JSON-LD-only scrapers conflate it with the attorney's name (Avvo'sLocalBusiness.namerepeats the lawyer). We don't. - βοΈ Avvo Rating (1-10 scale) + tier label.
avvoRating: 9.7,avvoRatingLabel: "Superb",avvoRatingType: "Good"(trend) β Avvo's own algorithmic rating, distinct from the 5-point review-rating. Competitors often miss this entirely. - π Practice areas with share percentages + descriptions. Each
practiceAreas[]row carriesname,share("30%"), AND a description β extracted from Avvo's rendered practice-area chart.primaryPracticeAreasurfaces the top one as a flat string. - π Structured education + bar admissions with year.
education[]is[{school, degree, year}].barAdmissions[]is["California (2004)"].licenses[]carries the full breakdown (state, year, status, license_status, yearsLicensed). - π
Years of experience + claimed-profile flag.
yearsOfExperiencederived from the longest active license.claimedProfile,isPro,isAdvertiser, anddisciplinaryActionall parsed from Avvo's embedded payload + license-status text. - π° Fees in three flat fields.
feeFreeConsultation(boolean),feeContingency(boolean),feeHourlyRate("$ 650-750 per hour") β pulled from the rendered Fees and Rates section. - β Reviews + endorsements split.
rating(5-pt JSON-LD),reviewScore(unrounded 4.802),reviewCount,endorsementsReceived(peer endorsements),legalAnswersWritten(Q&A activity) β Avvo packs both interaction types into one counter; we split them. - π Awards as
[{title, year}]."Super Lawyer - 2024"becomes{title: "Super Lawyer", year: "2024"}β and multi-year award strings (e.g."Client's Choice - 2026,2025,2024") get exploded into one row per year. - π Real coordinates, not just zip codes. Each row carries
coordinates.latitude+coordinates.longitudeparsed straight from the JSON-LDgeoblock β drop attorneys onto a map without a geocoding step. - π
websiteandlinkedinseparated. First non-social URL goes towebsite, any LinkedIn URL goes tolinkedinβ the fullsameAs[]array is preserved too. - π‘ Cloudflare-aware, zero browser automation. Three-stack TLS race (impit + got-scraping + curl-impersonate) handles the anti-bot layer without spinning up a headless Chromium.
- π€ Clean exports. One row per attorney. No padding rows, no duplicate firm rows. JSON + CSV exported automatically.
π― Use cases
| Team | What they build |
|---|---|
| Legal marketing / SaaS GTM | Outbound lists for vendors selling to small/solo law firms β by state, city, and practice area |
| Bar association researchers | Coverage maps of attorney density per practice area across cities + states |
| Lead-gen / referral networks | Building local attorney directories or referral matchmaking by language, practice area, rating |
| Competitive intelligence | Competitor benchmarking β pricing (priceRange), reviews, awards, credentials |
| Journalists / academic research | Studies on legal-services access, language coverage, attorney concentration |
| Existing platforms enriching their data | Patching attorney records with verified phone, address, geo coords, and ratings |
π₯ Supported inputs
The scraper accepts inputs in two mutually-exclusive modes β URLs take strict precedence over filters:
β οΈ Precedence rule. If
startUrlshas any non-empty entry, the practice-area + state dropdowns are completely ignored. To use the dropdown filters, leavestartUrlsempty.
Mode 1 β Paste Avvo URLs (highest priority)
Drop one or more avvo.com URLs into startUrls. Each URL is classified automatically:
| URL pattern | Behaviour |
|---|---|
https://www.avvo.com/all-lawyers/{state}/{city}.html | Listing β extracts attorney links + walks pagination |
https://www.avvo.com/{practice-area}-lawyer/{state}.html | Listing β practice-area + state |
https://www.avvo.com/search/lawyer_search?q=...&loc=... | Listing (search results) |
https://www.avvo.com/attorneys/{zip}-{state}-{slug}-{id}.html | Attorney detail β routed straight to the profile parser |
Easiest workflow: apply your filters on avvo.com in the browser, copy the URL from the address bar, paste into startUrls.
Mode 2 β Practice area + US state dropdowns (used when startUrls is empty)
Both dropdowns are multi-select. Pick one or many of each:
- Practice areas β 14 options (
real-estate-lawyer,family-lawyer,criminal-defense-lawyer, etc.) - U.S. states β all 50 states + DC
The scraper expands the cartesian product. With 2 practice areas Γ 3 states the actor crawls 6 listings:
{real-estate-lawyer, family-lawyer} Γ {ca, ny, tx}β /real-estate-lawyer/ca.htmlβ /real-estate-lawyer/ny.htmlβ /real-estate-lawyer/tx.htmlβ /family-lawyer/ca.htmlβ /family-lawyer/ny.htmlβ /family-lawyer/tx.html
Pagination is followed automatically on each listing until Max items is reached.
Edge cases:
- Practice area(s) selected, no states β national listings (e.g.
/real-estate-lawyer.htmlfor the whole US). - States selected, no practice area β no synthesized URLs (Avvo's
/all-lawyers/{state}.htmlis a city-picker page with no actual listings). A warning is printed; add a practice area or paste explicit URLs.
Not supported:
- Avvo Q&A pages, guides, and articles (the scraper targets attorney profiles only)
- Hosts outside
avvo.com/www.avvo.com
π How it works
- Resolve start URLs. Synthesize a listing URL from the practice-area + state dropdowns (if set) and combine with any pasted
startUrls. - Classify each URL as a listing URL or a single attorney profile URL.
- Fetch each listing and pull every attorney profile link from the page (~20 per listing page on Avvo).
- Follow pagination by walking
?page=Nuntil either norel="next"link exists ormaxItemsis reached. - Fetch each attorney detail page in parallel through a global sliding window.
- Parse the JSON-LD
LocalBusinessblock for name, phone, full address, geo coordinates, languages, credentials, memberships, ratings, hourly rate, payment methods β plus the rendered HTML forfirmName,practiceAreas[]with shares + descriptions, andeducation[]. - Decode HTML entities in the bio (Avvo ships
&/"literally inside the JSON-LDdescription). - Push one row per attorney to the dataset and export
data.csv+data.jsonat the end.
πͺΆ Lite mode
Toggle liteMode on and the scraper extracts data directly from each listing page's embedded Person JSON-LD blocks β no per-attorney detail HTTP calls. Trade-off:
- ~20Γ faster + ~20Γ cheaper. One listing fetch yields ~20 rows.
- Smaller field set.
name,jobTitle,firmName,streetAddress,addressLocality,addressRegion,postalCode,addressCountry,telephone,image,education[](basic),awards[](basic). Not in lite mode: bio, geo coordinates, practice-area shares + descriptions, languages, credentials, memberships, services, area served, hourly rate, payment methods, ratings, endorsements, LinkedIn.
Use lite mode when you only need contact + firm data (typical lead-gen flow). Use full mode for the rich 40-field profile (typical CRM enrichment / market-intelligence flow).
βοΈ Input parameters
| Parameter | Type | Default | Description |
|---|---|---|---|
searchByCategory | array (enum) | ["real-estate-lawyer"] | Practice-area slugs to crawl (14 options). Multi-select. Combined with searchByLocation as a cartesian product. Empty array = no synthesis. |
searchByLocation | array (enum) | ["wy"] | US state codes to filter listings by (51 options including DC). Multi-select. Empty array = national listings (one per category). |
startUrls | array | β | Optional avvo.com URLs to crawl directly. Listing pages, search-result pages, and direct attorney profile URLs are all supported. Mix freely with the dropdowns above. |
liteMode | boolean | false | Skip per-attorney detail fetches; emit one row per card from the listing's Person JSON-LD. ~20Γ faster and ~20Γ cheaper, but smaller field set. |
maxItems | integer | 1000 | Hard cap on attorneys collected. Listings paginate ~20 per page; this cap limits billing. |
maxConcurrency / minConcurrency | integer | 10 / 1 | Parallel HTTP request limits. |
maxRequestRetries | integer | 5 | Retries before a request is given up. |
proxy | object | Apify residential, US | Proxy configuration. Avvo serves Cloudflare on detail pages β a US residential pool is strongly recommended. |
π Output overview
Each scraped attorney is one single dataset row of type: "attorney". There are no separate firm rows; firm name and address live on the attorney row, so the dataset row count equals the attorney count exactly.
π¦ Output sample
One row per attorney (trimmed to the most useful fields):
{"type": "attorney","attorneyId": "415841","id": 415841,"url": "https://www.avvo.com/attorneys/85719-az-adam-weisman-415841.html","profileUrl": "https://www.avvo.com/attorneys/85719-az-adam-weisman-415841.html","name": "Adam Weisman","firmName": "Hinderaker Rauh & Weisman, PLC","bio": "Adam Weisman is a real estate, business, and construction lawyer and litigator based in Tucson, Arizona and Jackson Hole, Wyoming.","bioSummary": "Adam Weisman is a real estate, business, and construction lawyer and litigator based in Tucson, Arizona and Jackson Hole, Wyoming.","image": "https://images.avvo.com/avvo/ugc/images/head_shot/standard/lawyer_adam_weisman_415841_1588792397.jpg","telephone": "+1 (520) 214-1122","primaryPhone": "5202141122","address": "2401 East Speedway, Tucson, AZ","streetAddress": "2401 East Speedway","addressLocality": "Tucson","addressRegion": "AZ","city": "Tucson","state": "AZ","postalCode": "85719","addressCountry": "US","coordinates": { "latitude": 32.236417, "longitude": -110.936529 },"specialties": ["Contracts & Agreements", "Real Estate", "Landlord & Tenant", "Litigation"],"practiceAreas": [{ "name": "Real Estate", "share": "30%", "description": "Advice on all aspects of real estate law including contested matters, easements, property rights, evictions, and foreclosures." },{ "name": "Landlord or Tenant", "share": "25%", "description": "Advice on and litigation of commercial and residential landlord and tenant issues." },{ "name": "Litigation", "share": "25%", "description": "Civil litigation of business and real estate matters including property line disputes, easements, adverse possession, eviction, and foreclosure." },{ "name": "Contracts and Agreements", "share": "20%", "description": "Review, interpretation, and drafting of leases, operating agreements, lending documents, settlement agreements, and other contracts; formation of limited liability companies." }],"languages": ["French"],"credentials": ["Licensed Attorney - Wyoming", "Licensed Attorney - Arizona"],"memberships": ["State Bar of Arizona, Real Property Section"],"awards": [{ "title": "Super Lawyer", "year": "2024" },{ "title": "Best Lawyer", "year": "2023" },{ "title": "Distinguished", "year": "2019" },{ "title": "Client's Choice", "year": "2021" }],"education": [{ "school": "University of Arizona College of Law", "degree": "JD - Juris Doctor", "year": "2002" },{ "school": "Harvard University", "degree": "PhD - Doctorate", "year": "1995" },{ "school": "Oxford University", "degree": "M.Phil", "year": "1989" },{ "school": "Columbia University", "degree": "BA - Bachelor of Arts", "year": "1985" }],"services": [],"areaServed": ["Wyoming", "Arizona"],"website": "https://www.hrtucson.com","linkedin": null,"priceRange": null,"currenciesAccepted": "USD","paymentAccepted": null,"acceptedPaymentMethod": [],"aggregateRating": { "ratingValue": 4.7, "reviewCount": 36, "bestRating": 5, "worstRating": 1 },"rating": 4.7,"reviewCount": 36,"endorsementsReceived": 3,"legalAnswersWritten": 3,"sameAs": ["https://www.hrtucson.com"],"ogImage": "https://images.avvo.com/...","scrapedAt": "2026-05-09T12:37:13.624Z"}
π Key output fields
| Group | Fields |
|---|---|
| Identifiers | type, attorneyId, id (numeric form), url / profileUrl, scrapedAt |
| Person | name, firstName, lastName, firmName (HTML-parsed, distinct from name), bio (full, decoded), bioSummary (first sentence), image, claimedProfile, isPro, isAdvertiser |
| Contact | telephone (formatted), primaryPhone (digits-only 10-digit form), address (composed), streetAddress, addressLocality / city, addressRegion / state, postalCode, addressCountry, coordinates.{latitude,longitude} |
| Practice | primaryPracticeArea, specialties[] (flat names), practiceAreas[].{name, share, description} (HTML-parsed with %-shares + descriptions), languages[], services[], areaServed[], memberships[] (bar associations) |
| Licensing | barAdmissions[] (e.g. ["California (2004)"]), licenses[].{state, acquiredYear, status, licenseStatus, yearsLicensed}, credentials[] (legacy JSON-LD form), yearsOfExperience, disciplinaryAction (boolean) |
| Education / awards | education[].{school, degree, year} (HTML-parsed), awards[].{title, year} (split + multi-year-aware) |
| Web presence | website (first non-social URL), linkedin (LinkedIn URL if present), sameAs[] (full outbound link list) |
| Fees / commercials | feeFreeConsultation (bool), feeContingency (bool), feeHourlyRate (e.g. "$ 650-750 per hour"), priceRange (legacy JSON-LD), currenciesAccepted, paymentAccepted, acceptedPaymentMethod[] |
| Social proof | avvoRating (10-pt Avvo Rating), avvoRatingLabel ("Superb", "Excellent", ...), avvoRatingType (trend), rating (5-pt review), reviewScore (unrounded), reviewCount, aggregateRating.{ratingValue,reviewCount,bestRating,worstRating}, endorsementsReceived, legalAnswersWritten |
β FAQ
Which Avvo URLs are supported?
Listing URLs (/all-lawyers/{state}/{city}.html, /{practice-area}-lawyer/{state}.html, /search/lawyer_search?...) and direct attorney profile URLs (/attorneys/{zip}-{state}-{slug}-{id}.html). Avvo's Q&A pages, legal guides, and any host outside avvo.com are skipped.
Do I have to paste a URL or can I just pick from dropdowns?
Either works, but URLs take strict precedence. If startUrls has any entry, the practice-area + state dropdowns are completely ignored (a warning is printed in the run log). To use the dropdowns, leave startUrls empty β the scraper will then synthesize https://www.avvo.com/{practice-area}-lawyer/{state}.html automatically.
When should I enable liteMode?
Enable it for cheap, large-scale lead-gen runs where you only need contact + firm data. One listing fetch yields ~20 rows (~20Γ faster and cheaper than full mode). Disable it for CRM enrichment, market intelligence, or any workflow that needs practice-area shares, ratings, endorsements, education, or full bios β those fields require fetching each attorney's detail page individually.
Why is firmName different from the JSON-LD name?
Avvo's LocalBusiness JSON-LD packs the attorney's own name into name (so the JSON-LD name field is the lawyer, not the firm). The real firm β Hinderaker Rauh & Weisman, PLC for Adam Weisman β is rendered in HTML, not JSON-LD. We parse the HTML so firmName always reflects the actual firm.
What's practiceAreas[].share?
Avvo renders a pie chart on each profile showing how the attorney splits their practice (e.g. 30% real estate, 25% litigation). Each practiceAreas[] row carries that percentage as a string ("30%") plus a description. If the attorney didn't fill in shares, you get share: null.
Why are some bios very long and others empty?
The bio comes from the JSON-LD description field. Some attorneys have written extensive bios, others left it blank β the scraper passes through whatever the page provides. bioSummary is just the first sentence (capped at 280 chars), useful as a tagline.
What's endorsementsReceived vs legalAnswersWritten?
Avvo packs two distinct interaction counts into the same JSON-LD interactionStatistic array β peer endorsements (EndorseAction) and legal questions answered (WriteAction). Most scrapers either sum them or only surface the total; we split them so you can rank attorneys by peer reputation vs Q&A activity separately.
What's priceRange and how is it formatted?
It's the hourly rate as Avvo displays it on the profile (e.g. "$525/hr", "$300/hr"). Many attorneys leave it blank β those rows get priceRange: null.
Why is my run getting blocked?
Avvo serves Cloudflare on attorney detail pages. The scraper's three-stack TLS race (impit + got-scraping + curl-impersonate) handles that without browser automation, but if you turn off the proxy you may still see 403s β keep the default RESIDENTIAL + country: US proxy on.
Can I scrape private pages or recruiter-only views? No. The scraper accesses only publicly available attorney profiles and listings β no logged-in content, no Avvo Pro / recruiter content, no candidate data.
How do I limit results?
Set maxItems. The actor stops queuing new attorneys as soon as the cap is reached.
π¬ Support
- For issues or feature requests, please use the Issues tab on the actor's Apify Console page.
- Author's website: https://muhamed-didovic.github.io/
- Email: muhamed.didovic@gmail.com
π Additional services
- Custom output shape, additional fields, or one-off datasets: muhamed.didovic@gmail.com
- Need a similar scraper for another legal directory (Justia, Martindale, FindLaw, Lawyers.com, Super Lawyers)? Drop an email.
- For API access (no Apify fee, just a usage fee for the API): muhamed.didovic@gmail.com
π Explore more scrapers
If this Avvo Scraper was useful, see other scrapers and actors at memo23's Apify profile β covering job boards, real estate, social media, and more.
β οΈ Disclaimer
This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by Avvo, Internet Brands, or any of their subsidiaries or affiliates. All trademarks mentioned are the property of their respective owners.
The scraper accesses only publicly available attorney profile and listing pages on avvo.com β no authenticated endpoints, no Avvo Pro / recruiter-only features, and no content behind a logged-in session. Users are responsible for ensuring their use complies with avvo.com's Terms of Service, applicable data-protection law (GDPR, CCPA, etc.), and any state-bar rules around the marketing or use of attorney data in their jurisdiction.
SEO Keywords
avvo scraper, scrape avvo, avvo api, avvo.com scraper, Apify avvo, us lawyer directory scraper, attorney directory scraper, lawyer data api, attorney data extraction, lawyer leads scraper, legal marketing leads, attorney contact data, lawyer contact info scraper, us attorney database, lawyer search api, legal directory scraper, legal vertical lead generation, justia alternative scraper, martindale alternative scraper, findlaw alternative scraper, super lawyers alternative scraper, lawyers.com alternative scraper, attorney email scraper, law firm scraper, solo practitioner data, small law firm leads, attorney practice areas data, lawyer ratings dataset, attorney star ratings api, attorney bar credentials data, attorney languages spoken data, lawyer geo coordinates, attorney hourly rate data, lawyer pricing data