# Avvo Scraper — US Lawyer & Attorney Directory Data (`haketa/avvo-scraper`) Actor

Extract US attorneys from Avvo: name, law firm, phone, Avvo Rating, reviews, practice area, address & hourly rate. Filter by practice area & state. Optional firm website & email enrichment for legal B2B lead generation.

- **URL**: https://apify.com/haketa/avvo-scraper.md
- **Developed by:** [Haketa](https://apify.com/haketa) (community)
- **Categories:** Lead generation
- **Stats:** 3 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $1.30 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

## Avvo Scraper — US Lawyer & Attorney Directory Data

Extract structured **US attorney and law-firm data** from **Avvo**, one of the largest legal directories in the United States. Pick a practice area and states (or paste Avvo URLs) and get clean records for every lawyer: **name, law firm, phone, Avvo Rating, review count, practice area, full address, hourly rate, education** and, optionally, a **law-firm website and contact email**.

No code, no login. Run it from the Apify Console, on a schedule, or from your own app via the API. Results download as **JSON, CSV, Excel, HTML or XML**, or sync straight into Google Sheets, Airtable, HubSpot, Make, Zapier and n8n.

> **⚖️ Built for legal lead generation & market research.** Every record carries the **attorney's name, firm, phone, rating and location** — perfect for building targeted lists of lawyers by practice area and state.

***

### 📋 What this scraper does

Avvo lists hundreds of thousands of US attorneys across every practice area and state. This actor turns an Avvo directory search into a clean, structured dataset you can analyse, enrich or feed into a CRM.

Give it a practice area (e.g. `personal-injury`) and one or more states, and it will:

- ✅ Collect every matching attorney, page after page
- ✅ Return the **Avvo Rating (0–10)** and **client review count**
- ✅ Capture the **law firm, phone number and hourly rate**
- ✅ Break out the **full address** — street, city, state and ZIP
- ✅ Include **education** (law schools / universities)
- ✅ Optionally visit each **profile** for the firm **website** and **years of experience**
- ✅ Optionally extract a **contact email** from the firm's website
- ✅ De-duplicate every attorney by their Avvo ID

***

### ⭐ Why choose this scraper

- **Ready-to-use legal leads.** Name, firm, phone, rating and location for every attorney — build outreach or referral lists in minutes.
- **Reputation signals.** Avvo Rating and review count let you rank and qualify attorneys instantly.
- **Rich targeting.** Filter by practice area and state to reach exactly the lawyers you need.
- **Deep enrichment.** Optionally add each firm's website, the attorney's years of experience and a contact email.
- **Fast and reliable.** Efficient extraction straight from Avvo's directory pages.

***

### 💡 Popular use cases

| Use case | How this scraper helps |
| --- | --- |
| **Legal B2B lead generation** | Build targeted lists of attorneys by practice area and state for outreach. |
| **Legal marketing & SaaS sales** | Reach law firms that match your product (case management, intake, ads, SEO). |
| **Referral networks** | Find and rank attorneys by practice area, rating and location for referrals. |
| **Recruiting & headhunting** | Source lawyers by experience, education and specialisation. |
| **Market research** | Measure attorney supply, ratings and pricing across practice areas and states. |
| **Competitor analysis** | Benchmark firms by rating, reviews and coverage in any market. |

***

### 🚀 Quick start

1. Enter a **Practice area** slug (e.g. `personal-injury`, `tax`, `divorce`).
2. Pick one or more **States** (or leave empty for nationwide).
3. (Optional) Turn on **Enrich from profile pages** for website + experience, and **Find emails from firm websites**.
4. Set **Max attorneys** and click **Start**.
5. Download your data from the **Storage → Dataset** tab.

***

### ⚙️ Input

| Field | Type | Description |
| --- | --- | --- |
| **Practice area** | string | Avvo practice-area slug, e.g. `personal-injury`, `tax`, `divorce`, `criminal-defense`, `bankruptcy-and-debt`. |
| **States** | multi-select | One or more US states. Empty = nationwide search for the practice area. |
| **Avvo search URLs** | array | Advanced: paste full Avvo directory URLs (e.g. `https://www.avvo.com/tax-lawyer/ca.html`) instead of the fields above. |
| **Enrich from profile pages** | boolean | Visit each profile for the firm website and years of experience. Slower but richer. |
| **Find emails from firm websites** | boolean | For attorneys with a firm website, try to extract a contact email. Coverage is partial (see below). |
| **Max attorneys** | integer | Cap on total attorneys returned. `0` = no limit. |
| **Proxy** | object | Apify Proxy (US recommended, on by default). |

#### Example 1 — Personal-injury lawyers in California & Texas

```json
{
  "practiceArea": "personal-injury",
  "states": ["ca", "tx"],
  "maxItems": 500
}
```

#### Example 2 — Tax attorneys in New York, with website + email

```json
{
  "practiceArea": "tax",
  "states": ["ny"],
  "enrichProfiles": true,
  "enrichEmails": true,
  "maxItems": 200
}
```

#### Example 3 — Paste Avvo URLs directly

```json
{
  "searchUrls": [
    "https://www.avvo.com/divorce-lawyer/fl.html",
    "https://www.avvo.com/immigration-lawyer/tx.html"
  ],
  "maxItems": 300
}
```

***

### 📦 Output

Each attorney becomes one dataset record:

```json
{
  "lawyerId": "457496",
  "name": "Kathryn Crawford Gentle",
  "profileUrl": "https://www.avvo.com/attorneys/35243-al-kathryn-gentle-457496.html",
  "jobTitle": "Attorney",
  "firm": "Kathryn Crawford Gentle",
  "avvoRating": 10,
  "reviewCount": 9,
  "phone": "(205) 208-1800",
  "priceRange": "$275 - $300 per hour",
  "street": "4505 Pine Tree Circle, Suite 121",
  "city": "Vestavia",
  "state": "AL",
  "postalCode": "35243",
  "practiceArea": "tax",
  "practiceAreas": null,
  "experienceYears": 24,
  "education": "University of Alabama School of Law; University of Alabama - Tuscaloosa",
  "website": "https://example-law-firm.com/",
  "email": "contact@example-law-firm.com",
  "image": "https://images.avvo.com/.../lawyer_kathryn_gentle_457496.jpg",
  "scrapedAt": "2026-07-02T00:00:00.000Z"
}
```

#### Output fields

| Field | Description |
| --- | --- |
| `lawyerId` | Avvo lawyer ID (used for de-duplication). |
| `name` | Attorney full name. |
| `profileUrl` | Avvo profile page URL. |
| `jobTitle` | Job title (e.g. Attorney). |
| `firm` | Law firm / business name. |
| `avvoRating` | Avvo Rating (0–10). |
| `reviewCount` | Number of client reviews. |
| `phone` | Contact phone number. |
| `priceRange` | Hourly rate / price range, when listed. |
| `street` / `city` / `state` / `postalCode` | Office location. |
| `practiceArea` | The practice area used in the search. |
| `practiceAreas` | Practice areas listed on the profile (profile enrichment). |
| `experienceYears` | Years licensed / in practice (profile enrichment). |
| `education` | Law schools / universities attended. |
| `website` | Law-firm website (profile enrichment). |
| `email` | Contact email found on the firm website (email enrichment). |
| `image` | Headshot image URL. |
| `scrapedAt` | Extraction timestamp. |

***

### 📧 About emails

Avvo does not publish attorney email addresses on its directory or profile pages. When enabled, the actor checks the firm's homepage and at most one linked contact page. Coverage is **partial** because many firms use contact forms instead of public email addresses. Use the phone number as the primary contact channel and email as a bonus where available.

Profile and email enrichment are included in the result price. Email lookup automatically enables profile enrichment because the firm's website must first be discovered from the Avvo profile.

***

### ⚖️ Practice areas you can search

`personal-injury` · `tax` · `divorce` · `criminal-defense` · `bankruptcy-and-debt` · `family` · `employment-and-labor` · `estate-planning` · `immigration` · `real-estate` · `dui-and-dwi` · `medical-malpractice` · `workers-compensation` · `business` · `car-accident` · `social-security-disability` · `intellectual-property` · `foreclosure` · `child-custody` · `landlord-and-tenant` · `wrongful-termination` · `probate` · and many more.

> Not sure of the slug? Search on avvo.com and copy the part of the URL before `-lawyer` — e.g. `avvo.com/tax-lawyer/ca.html` → `tax`.

***

### 🗺️ States

All 50 US states plus Washington DC are supported. Select one, several, or none (nationwide).

***

### 🧭 Tips for best results

- **Combine practice area + states** to zoom into a precise legal market.
- **Rank by `avvoRating` + `reviewCount`** to surface the strongest attorneys.
- **Turn on profile enrichment** for firm website and years of experience.
- **Use the phone number** as the primary contact channel — it's the most complete field.
- **Schedule weekly runs** to track new attorneys and rating changes.

***

### 🔌 Integrations & export

- **Download formats:** JSON, CSV, Excel, HTML, XML, RSS.
- **CRM / Sheets / Airtable / Make / Zapier / n8n:** push results automatically.
- **API:** run and fetch data with the Apify API or the JS / Python clients.
- **Scheduling:** run on a schedule to keep an always-fresh attorney database.

***

### ❓ FAQ

**Do I need an Avvo account or API key?**
No. You only need an Apify account.

**Which attorneys are covered?**
US attorneys listed on Avvo, across every practice area and state.

**Where does the phone number come from?**
Directly from the directory listing — it's available for most attorneys.

**Why are some emails empty?**
Avvo doesn't publish emails. The actor only finds an email when the attorney's firm website publishes one, so coverage is partial.

**Does it return duplicates?**
No. Attorneys are de-duplicated by their Avvo ID across all searches.

***

### ⚖️ Legal & responsible use

This actor collects **publicly available** information from Avvo's directory — the same data any visitor can see. It does not log in or access private data. Respect Avvo's Terms of Use and applicable law, and use the data for lawful purposes such as market research, analytics and B2B outreach.

***

### 🛟 Support

Need an extra field or hit an issue? Open a ticket from the actor's **Issues** tab with your input configuration.

Happy sourcing! ⚖️

# Actor input Schema

## `practiceArea` (type: `string`):

Pick the legal practice area to search on Avvo. Combined with the states below to pull matching attorneys. Leave the states empty to search nationwide.

## `states` (type: `array`):

US states to search (each becomes one search). Leave empty to search nationwide for the chosen practice area.

## `searchUrls` (type: `array`):

Optional power-user override. Paste full Avvo directory URLs, e.g. https://www.avvo.com/tax-lawyer/ca.html. If provided, these are used instead of the practice area + states above.

## `enrichProfiles` (type: `boolean`):

Visit each attorney's Avvo profile for website, experience and review data. Slower but richer. Email lookup enables this automatically.

## `enrichEmails` (type: `boolean`):

Look for a public contact email on the law firm's own website. Coverage is partial because Avvo does not publish emails. The lookup checks at most two website pages to stay fast and efficient.

## `maxItems` (type: `integer`):

Maximum number of attorneys to return across all searches. Set 0 for no limit.

## `proxyConfiguration` (type: `object`):

Apify Proxy settings. Uses datacenter proxies by default (fast and low-cost) and automatically escalates to US residential if a site block is detected. You can pin residential yourself for maximum reliability.

## Actor input object example

```json
{
  "practiceArea": "personal-injury",
  "searchUrls": [],
  "enrichProfiles": false,
  "enrichEmails": false,
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

## `lawyerId` (type: `string`):

Avvo lawyer ID

## `name` (type: `string`):

Attorney full name

## `profileUrl` (type: `string`):

Avvo profile page URL

## `jobTitle` (type: `string`):

Job title (e.g. Attorney)

## `firm` (type: `string`):

Law firm / business name

## `avvoRating` (type: `string`):

Avvo Rating (0-10)

## `reviewCount` (type: `string`):

Number of client reviews

## `phone` (type: `string`):

Contact phone number

## `priceRange` (type: `string`):

Hourly rate / price range

## `street` (type: `string`):

Street address

## `city` (type: `string`):

City

## `state` (type: `string`):

State

## `postalCode` (type: `string`):

ZIP / postal code

## `practiceArea` (type: `string`):

Practice area used in the search

## `experienceYears` (type: `string`):

Years licensed / in practice

## `education` (type: `string`):

Schools / universities attended

## `website` (type: `string`):

Law-firm website (from profile)

## `email` (type: `string`):

Email found on the firm website (when available)

## `image` (type: `string`):

Headshot image URL

## `scrapedAt` (type: `string`):

Extraction timestamp

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "searchUrls": [],
    "maxItems": 100,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("haketa/avvo-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "searchUrls": [],
    "maxItems": 100,
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("haketa/avvo-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "searchUrls": [],
  "maxItems": 100,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call haketa/avvo-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,haketa/avvo-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/fQZw0r4vTnVP6HsPA/builds/ei7s3xd0gITToegMk/openapi.json
