L logiover
lead-generation · May 29, 2026 · 9 min read

How to Scrape Avvo for Attorney Leads (2026 Guide)

Turn Avvo's US attorney directory into structured B2B legal leads — name, firm, phone, address, bar license, ratings and bio — at scale, with no login or API key.

If you sell to law firms — legal-tech software, marketing services, recruiting, or research — Avvo is one of the richest public sources of attorney leads in the US, and almost nobody scrapes it cleanly. This guide is about how to scrape Avvo into a structured list of attorney leads: names, law firms, phone numbers, full mailing addresses, practice areas, bar licenses, Avvo ratings, reviews, awards and bios. Avvo indexes hundreds of thousands of US lawyers by practice area and location, but its directory UI is built for a consumer looking for one lawyer, not for a B2B team that needs every lawyer in a category. That gap is exactly what makes it worth scraping.

Avvo is a consumer-facing legal directory: people go there to find and vet an attorney, read reviews, and check ratings. To serve that audience, Avvo publishes a remarkably complete professional record for each lawyer — and it does so on public pages with no login wall.

That matters for lead generation in a few specific ways:

  • It’s segmented the way buyers think. Every attorney is filed under a practice area (divorce, personal injury, criminal defense, immigration, bankruptcy…) and a location (state or city). That’s exactly the segmentation a legal-tech sales team or lead-gen agency wants — “every immigration lawyer in Texas,” “every personal-injury firm in California.”
  • It carries qualifying signals. Beyond contact data, profiles expose Avvo ratings, review counts, awards, bar admission dates and law schools — enough to score and prioritize leads before anyone picks up the phone.
  • It’s public directory data. No account, no credentials, no developer key. You read the same pages a prospective client would, just in bulk.

Compared with scraping a logged-in platform like LinkedIn, this is a much safer engineering posture: there is no account to get restricted, because there is no account in the loop at all.

What you can extract per attorney

The scraper parses each attorney from Avvo’s JSON-LD structured data, so the fields are consistent and clean rather than scraped out of fragile page markup. The exact output fields are:

  • name / profileUrl — attorney name and Avvo profile link.
  • firm / website — law firm name and firm website.
  • phone / address — phone number and full mailing address (street, city, state, zip).
  • lat / lng — geo coordinates for mapping or territory assignment.
  • practiceAreas — every practice area the attorney lists.
  • languages — languages the attorney speaks (useful for targeted, localized outreach).
  • licenses — bar licenses, each with state (jurisdiction), bar (recognizing bar association) and admissionDate.
  • rating / reviewCount — the Avvo rating and number of reviews.
  • awards — recognitions and awards (e.g. “Avvo Clients’ Choice”).
  • lawSchool / bio — law school and the attorney’s full biography.
  • scrapedAt — capture timestamp.

There are two collection modes, and the difference is mostly about cost and depth. With fetchProfileDetails: false you get the fast, cheap search-level subset — name, profile, phone, address, practice areas and rating — straight off the paginated results pages at 20 attorneys per page. With fetchProfileDetails: true, the actor opens each individual profile and pulls the complete record: bar license details, awards, languages, law school and full bio. Start in cheap mode to build the universe, then re-run in detail mode on the segment you actually care about.

Input: practice area + state, or explicit URLs

The input is deliberately simple. The two fields that drive almost every run are:

  • practiceArea — a practice-area slug like divorce, personal-injury, criminal-defense or immigration.
  • location — a US state 2-letter code (ny, ca, tx) or a city slug.

The rest are controls:

  • fetchProfileDetails (boolean, default false) — cheap search records vs. full per-profile records, as described above.
  • maxResults (integer, default 1000) — cap on attorneys collected; set 0 for unlimited (the entire practice-area + state directory).
  • startUrls (array, advanced) — pass explicit Avvo search or profile URLs to override the practice area + location. Useful for scraping several segments in one run.
  • proxyConfiguration — US residential proxy. This is required because Avvo is fronted by Cloudflare, and it comes pre-configured, so you can leave it as-is.

A typical run looks like this:

{
  "practiceArea": "personal-injury",
  "location": "ca",
  "fetchProfileDetails": true,
  "maxResults": 2000
}

Or drive it directly with URLs to cover multiple segments at once:

{
  "startUrls": [
    "https://www.avvo.com/divorce-lawyer/ny.html",
    "https://www.avvo.com/immigration-lawyer/tx.html"
  ],
  "fetchProfileDetails": false,
  "maxResults": 5000
}

Run the Avvo Lawyer Scraper — name, firm, phone, address, bar license, ratings and bio for thousands of US attorneys by practice area and state. No login, no API key. $5 per 1,000 attorneys.

Pagination and scale

Avvo’s search results are paginated at 20 attorneys per page, and a popular practice-area + state combination runs 100+ pages — thousands of lawyers in a single search. The actor walks that pagination from page one until results run out, parsing each page’s structured data, streaming records to the dataset and de-duplicating as it goes.

That’s where maxResults matters. If you’re exploring, cap it (the default 1,000 is a reasonable first pull). If you want the complete picture, set maxResults: 0 and let it pull the entire directory for that segment. Because the search pass uses lightweight HTTP and JSON-LD parsing rather than a headless browser, even an unlimited run stays fast and cheap.

A practical pattern for nationwide coverage: rather than one giant run, loop over states. Fifty runs of personal-injury × each state is cleaner to monitor, easier to retry on the rare failed state, and naturally partitions your dataset by territory — which is usually how a sales team wants it anyway.

A realistic output record

Here is one attorney as the scraper emits it in full-detail mode (fetchProfileDetails: true):

{
  "name": "Jane A. Attorney",
  "profileUrl": "https://www.avvo.com/attorneys/10001-ny-jane-attorney-1234567.html",
  "firm": "Attorney & Partners LLP",
  "website": "https://www.attorneypartners.com",
  "phone": "(212) 555-0123",
  "address": {
    "street": "123 Main St, Suite 400",
    "city": "New York",
    "state": "NY",
    "zip": "10001"
  },
  "lat": 40.7128,
  "lng": -74.006,
  "practiceAreas": ["Divorce", "Family", "Child Custody"],
  "languages": ["English", "Spanish"],
  "licenses": [
    { "state": "New York", "bar": "New York State Bar", "admissionDate": "2009" }
  ],
  "rating": 9.5,
  "reviewCount": 42,
  "awards": ["Avvo Clients' Choice 2024"],
  "lawSchool": "Columbia Law School",
  "bio": "Jane is a family-law attorney with 15 years of experience...",
  "scrapedAt": "2026-06-04T12:00:00.000Z"
}

A few schema choices worth making early:

  • Keep profileUrl as your stable join key. Names and firms change; the profile URL is the durable identifier for dedup across re-runs.
  • Store practiceAreas, languages and licenses as arrays. Most attorneys list several. Flattening them into strings forces a painful migration the first time you want to filter on “speaks Spanish” or “admitted before 2010.”
  • Treat rating as ordinal scoring fuel. Combined with reviewCount, it’s a cheap lead-quality signal: a 9.5 with 42 reviews is a very different prospect than a 6.0 with one.
  • Always keep scrapedAt. Ratings, firms and contact details drift. Knowing when a record was captured tells you when to refresh it.

Use cases

The data maps onto a handful of concrete B2B plays:

  • Legal-tech & SaaS sales. Build targeted outreach lists of attorneys by specialty and state — every bankruptcy lawyer in Florida, say — then enrich firm websites with emails and hand a ranked list to your SDRs. The practice-area segmentation means your pitch lands in context.
  • Marketing & lead-gen agencies. Supply law firms and legal vendors with qualified prospect lists as a product. Ratings, review counts and awards let you sell scored leads, not just raw rows.
  • Recruiters & legal staffing. Source attorneys by practice area, location and bar admission date. The admissionDate field is effectively a seniority proxy — filter for, say, attorneys admitted 8–15 years ago when you’re recruiting for a partner-track role.
  • Market & competitive research. Map the competitive landscape of any practice area across the US: firm density by metro, rating distribution, which firms dominate a niche. The geo coordinates make it trivial to plot territory coverage.

The common thread is the same one that makes any directory scrape valuable: breadth across a whole segment plus freshness over time. A one-off pull of one city is a starting point; a scheduled feed across every state in your target practice areas, refreshed monthly, is a sellable intelligence product.

Cost math

Pricing is $5 per 1,000 attorneys on a pay-per-result basis, with no browser bandwidth or proxy overhead to think about — the search pass is plain HTTP plus JSON-LD parsing.

A concrete example: pulling every personal-injury attorney across the ten largest states, in cheap search mode, might land around 8,000 attorneys — roughly $40 for a complete contact-level dataset. Re-running just the top segment in full-detail mode to add bar licenses, awards and bios is where the per-profile fetch (and a bit more cost) earns its keep. The sensible workflow is two-pass: cheap-and-wide first to define the universe, deep-and-narrow second on the slice you’ll actually sell or call.

Compare that to building it yourself. The HTTP layer is simple, but Cloudflare fronting means you need clean US residential proxies, the JSON-LD extraction breaks whenever Avvo tweaks its markup, and the pagination-plus-dedup logic is fiddly across 100+ pages per segment. The managed actor absorbs that maintenance.

FAQ

Do I need an Avvo login or API key?

No. The scraper reads only public Avvo directory pages — the same ones any visitor sees. There are no cookies, no developer key and no account in the loop, so there is nothing to get banned.

Why is a residential proxy required?

Avvo is fronted by Cloudflare, which serves clean US residential IPs normally but challenges datacenter traffic. The actor ships with a pre-configured US residential proxy, so you can leave the proxy setting as-is.

How many attorneys can I realistically get?

Thousands per segment. A single practice-area + state search paginates 100+ pages at 20 attorneys each. Set maxResults: 0 to pull an entire practice-area + state directory in one run, or cap it while you’re exploring.

What’s the difference between the two collection modes?

With fetchProfileDetails: false you get fast, cheap search-level records (name, profile, phone, address, practice areas, rating). With fetchProfileDetails: true the actor opens each profile and returns the full record — bar license, rating, awards, languages, law school and bio. Use cheap mode to build the list, detail mode on the segment that matters.

Is scraping Avvo data ethical and compliant?

The actor collects only publicly available directory information — the professional details Avvo itself publishes for consumers vetting a lawyer. That said, how you use it is on you. Treat the records as B2B professional contact data, honor opt-outs and unsubscribe requests, respect anti-spam rules like CAN-SPAM (and GDPR where it applies to EU-admitted attorneys), and stay within Avvo’s Terms of Service. Don’t repackage attorney bios or reviews as if they were your own content. Used as a B2B prospecting and research input, it’s a clean use of public data; used to blast unsolicited bulk mail, it isn’t.

Can I scrape several practice areas or states in one run?

Yes. Pass multiple startUrls (search or profile URLs) and the actor de-duplicates records across all of them, so overlapping segments won’t double up in your dataset.

Wrapping up

Avvo is a rare case of a high-value, well-structured B2B dataset sitting behind no login wall — every US attorney filed by exactly the practice area and location a legal-tech seller, agency or recruiter cares about, with ratings, bar licenses and bios attached. If you need to look up one lawyer, the website is fine. If you want a structured, refreshable feed of attorney leads across whole practice areas and states, run it as a managed scraper and let someone else carry the proxy and parsing maintenance.

Run the Avvo Lawyer Scraper — practice area + state in, thousands of structured attorney leads out, with bar licenses, ratings and bios. No login, no ban risk. $5 per 1,000 attorneys.

This guide — how-to-scrape-avvo-attorney-lawyer-leads — covered how to scrape Avvo for attorney leads at scale.

Related guides