# Avvo Scraper with Mails | US Lawyer Directory (`fatihtahta/avvo-scraper`) Actor

Get verified US attorney profiles from Avvo.com including names, contacts, firms, ratings, practice areas, and locations. Build legal directories or power research tools with clean, structured data.

- **URL**: https://apify.com/fatihtahta/avvo-scraper.md
- **Developed by:** [Fatih Tahta](https://apify.com/fatihtahta) (community)
- **Categories:** Lead generation, Developer tools, Automation
- **Stats:** 1,250 total users, 5 monthly users, 100.0% runs succeeded, 8 bookmarks
- **User rating**: 5.00 out of 5 stars

## Pricing

$3.99 / 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.

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 Directory

**Slug:** fatihtahta/avvo-scraper

### Overview

Avvo Scraper | US Lawyer Directory collects structured lawyer listing data from Avvo, including profile URLs, names, practice areas, locations, contact details, ratings, reviews, and related professional attributes. It supports broad directory collection by legal category and state, as well as targeted collection from specific Avvo pages. [Avvo](https://www.avvo.com) is one of the most widely used U.S. legal directories, making it a practical source for market visibility, attorney discovery, and regional service analysis. The actor helps teams automate repetitive collection workflows and produce consistent, analysis-ready records at scale. This reduces manual research effort and accelerates reporting, enrichment, and operational use cases.

### Why Use This Actor

- **Market research and analytics teams:** Measure attorney supply, practice-area density, and regional activity across states to support benchmarking and trend analysis.
- **Product and content teams:** Identify service coverage gaps, prioritize legal topics, and improve localized content using real directory signals.
- **Developers and data engineering teams:** Feed structured records into ETL jobs, internal databases, or BI dashboards with predictable JSON output.
- **Lead generation and enrichment teams:** Build attorney prospect lists and enrich CRM profiles with public professional details and profile links.
- **Monitoring and competitive intelligence teams:** Track changes in listings, ratings, and profile presence over time for ongoing competitive visibility.

### Input Parameters

Provide any combination of URLs, queries, and filters to match your collection goals.

| Parameter | Type | Description | Default |
| --- | --- | --- | --- |
| `searchByCategory` | `string` | Practice area category to collect. Allowed values: `bankruptcy-debt-lawyer`, `consumer-protection-lawyer`, `government-lawyer`, `business-lawyer`, `immigration-lawyer`, `intellectual-property-lawyer`, `criminal-defense-lawyer`, `lawsuits-disputes-lawyer`, `personal-injury-lawyer`, `employment-labor-lawyer`, `estate-planning-lawyer`, `family-lawyer`, `real-estate-lawyer`, `civil-rights-lawyer`. | `real-estate-lawyer` |
| `searchByLocation` | `string` | U.S. state filter. Allowed values: `al`, `ak`, `az`, `ar`, `ca`, `co`, `ct`, `de`, `dc`, `fl`, `ga`, `hi`, `id`, `il`, `in`, `ia`, `ks`, `ky`, `la`, `me`, `md`, `ma`, `mi`, `mn`, `ms`, `mo`, `mt`, `ne`, `nv`, `nh`, `nj`, `nm`, `ny`, `nc`, `nd`, `oh`, `ok`, `or`, `pa`, `ri`, `sc`, `sd`, `tn`, `tx`, `ut`, `vt`, `va`, `wa`, `wv`, `wi`, `wy`. | `wy` |
| `startUrls` | `string[]` | One or more Avvo URLs to collect directly (for example: search pages, legal category pages, or lawyer profile pages). | – |
| `limit` | `integer` | Maximum number of listings to save per query. Use lower values for sampling and higher values for broader coverage. Minimum: `10`. | `50000` |
| `proxyConfiguration` | `object` | Connection settings used to keep larger runs stable. | Apify proxy with `RESIDENTIAL` group |

### Example Input

```json
{
  "searchByCategory": "family-lawyer",
  "searchByLocation": "ca",
  "startUrls": [
    "https://www.avvo.com/attorneys.html",
    "https://www.avvo.com/search/lawyer_search"
  ],
  "limit": 1500,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["RESIDENTIAL"]
  }
}
```

### Output

#### 6.1 Output destination

The actor writes results to an Apify dataset as JSON records. And the dataset is designed for direct consumption by analytics tools, ETL pipelines, and downstream APIs without post-processing.

#### 6.2 Record envelope (all items)

Every record includes these stable identifiers:

- **type** *(string, required)*
- **id** *(number, required)*
- **url** *(string, required)*

**Recommended idempotency key:** `type + ":" + id`.
Use this key to deduplicate records and perform reliable upserts when the same entity appears in multiple runs.

#### 6.3 Examples

Example: profile (`type = "profile"`)

```json
{
  "type": "profile",
  "id": 248309,
  "url": "https://www.avvo.com/attorneys/94133-ca-lindsay-spiller-248309.html",
  "name": "Lindsay Gunn Spiller",
  "jobTitle": "Lindsay Spiller is a San Francisco business attorney and founder of Spiller Law.",
  "address": "595 Pacific Avenue, Fourth Floor, San Francisco, CA",
  "city": "San Francisco",
  "state": "CA",
  "primary_phone": "4155019736",
  "specialties": [
    "Business",
    "Estate planning",
    "Entertainment",
    "Intellectual property"
  ],
  "practiceAreas": [
    { "name": "Business", "share": "25%" },
    { "name": "Entertainment", "share": "25%" }
  ],
  "website": "https://www.spillerlaw.com/",
  "linkedin": "http://www.linkedin.com/in/spillerlaw",
  "rating": 5,
  "reviewCount": 58,
  "endorsementsReceived": 6,
  "education": [
    {
      "school": "Georgetown University Law Center",
      "degree": "1985 JD Juris Doctor",
      "year": "1985"
    }
  ],
  "awards": [
    {
      "title": "Top 100 Entertainment Lawyers in State of California",
      "year": "2015"
    }
  ],
  "bioSummary": "Trusted advisor to startups, small businesses, and estate planning clients.",
  "yearsActiveEstimate": 46
}
```

### Field reference

#### Profile fields (`type = "profile"`)

- **type** *(string, required)*: Record category.
- **id** *(number, required)*: Stable profile identifier.
- **url** *(string, required)*: Canonical profile URL.
- **name** *(string, optional)*: Lawyer name as displayed.
- **jobTitle** *(string, optional)*: Headline or profile summary line.
- **address** *(string, optional)*: Street-level address text.
- **city** *(string, optional)*: City value.
- **state** *(string, optional)*: State/region code.
- **primary\_phone** *(string, optional)*: Primary contact phone number.
- **specialties** *(array\[string], optional)*: Specialty tags listed on the profile.
- **practiceAreas** *(array\[object], optional)*: Practice area breakdown.
- **practiceAreas.name** *(string, optional)*: Practice area label.
- **practiceAreas.share** *(string, optional)*: Share value as displayed.
- **website** *(string, optional)*: External website URL.
- **linkedin** *(string, optional)*: LinkedIn URL.
- **rating** *(number, optional)*: Rating value.
- **reviewCount** *(number, optional)*: Total number of reviews.
- **endorsementsReceived** *(number, optional)*: Endorsement count.
- **education** *(array\[object], optional)*: Education entries.
- **education.school** *(string, optional)*: School name.
- **education.degree** *(string, optional)*: Degree text.
- **education.year** *(string, optional)*: Graduation year or year label.
- **awards** *(array\[object], optional)*: Award entries.
- **awards.title** *(string, optional)*: Award title.
- **awards.year** *(string, optional)*: Award year.
- **bioSummary** *(string, optional)*: Short biographical summary.
- **yearsActiveEstimate** *(number, optional)*: Estimated years active.

### Data guarantees & handling

- **Best-effort extraction:** fields may vary by region/session/availability/UI experiments.
- **Optional fields:** null-check in downstream code.
- **Deduplication:** recommend `type + ":" + id`.

### How to Run on Apify

1. Open the actor in Apify Console.
2. Configure your search parameters (for example, practice area, state, and optional direct URLs).
3. Set the maximum number of outputs to collect.
4. Click **Start** and wait for the run to finish.
5. Download results in JSON, CSV, Excel, or other supported formats.

### Scheduling & Automation

#### Scheduling

**Automated Data Collection**
You can schedule recurring runs to keep your dataset current without manual reruns. This is useful for periodic reporting, enrichment refreshes, and monitoring workflows.

- Navigate to **Schedules** in Apify Console
- Create a new schedule (daily, weekly, or custom cron)
- Configure input parameters
- Enable notifications for run completion
- (Optional) Add webhooks for automated processing

#### Integration Options

This actor is built for structured, repeatable extraction of Avvo lawyer profile data. Below are practical integration patterns specifically suited to Avvo directory workflows:

- **Webhooks (Recommended for Production Pipelines)**\
  Trigger a webhook after each run to:
  - Push lawyer profiles into your CRM (e.g., HubSpot, Salesforce)
  - Sync new attorneys into a lead database
  - Update internal enrichment APIs
  - Trigger change-detection logic for ratings or review count shifts\
    Use the recommended idempotency key `type + ":" + id` to safely upsert profiles across recurring runs.

- **CRM Enrichment (Lead Generation Workflows)**\
  Automatically enrich law firm or attorney records with:
  - Avvo rating and review count
  - Practice area distribution
  - Profile URL and LinkedIn
  - Years active estimate\
    Ideal for outbound prospecting, segmentation, and territory mapping.

- **Monitoring & Change Tracking Pipelines**\
  Run the actor weekly or monthly and compare:
  - Rating changes
  - Review count growth
  - Profile visibility changes
  - Newly listed attorneys by state or category\
    Store snapshots in a database and compute diffs for competitive intelligence.

- **Data Warehouse / BI Dashboards**\
  Stream results into Snowflake, BigQuery, Redshift, or Postgres for:
  - State-level attorney density dashboards
  - Practice-area distribution analysis
  - Market saturation modeling
  - Regional trend reporting

- **Google Sheets / Airtable (Lightweight Ops)**\
  Append structured profile records to Sheets for:
  - Manual review and tagging
  - Outreach prioritization
  - Small-scale sampling
  - QA validation before CRM import

- **Zapier / Make Automation**\
  Trigger workflows when new attorneys are discovered:
  - Add to email sequencing tools
  - Notify Slack when high-rating attorneys appear
  - Route records by state to different teams

- **Slack / Email Notifications**\
  Send run summaries including:
  - Total profiles collected
  - Category + state used
  - New vs existing IDs detected
  - Runtime duration\
    Useful for ongoing monitoring campaigns.

***

**Typical Production Architecture**

Avvo Scraper → Apify Dataset → Webhook → Backend API → Database (with idempotent upserts) → CRM / BI Dashboard

This ensures repeatable, scalable, and deduplicated attorney directory ingestion.

### Performance

Estimated run durations:

- **Small runs (< 1,000 outputs):** ~3–5 minutes
- **Medium runs (1,000–5,000 outputs):** ~5–35 minutes
- **Large runs (5,000+ outputs):** ~35–60+ minutes

Execution time varies based on filters, result volume, and how much information is returned per record.

### Compliance & Ethics

#### Responsible Data Collection

This actor collects publicly available **lawyer directory** information from **{{TARGET\_SITE}}** for legitimate business purposes, including:

- **legal services** research and market analysis
- **lead enrichment and directory intelligence**
- **regional competitive monitoring**

Users are responsible for ensuring their use complies with applicable laws, regulations, and contractual obligations. This section is informational and not legal advice.

#### Best Practices

- Use collected data in accordance with applicable laws, regulations, and the target site’s terms
- Respect individual privacy and personal information
- Use data responsibly and avoid disruptive or excessive collection
- Do not use this actor for spamming, harassment, or other harmful purposes
- Follow relevant data protection requirements where applicable (e.g., GDPR, CCPA)

### Support

For help, open an issue on the actor page in Apify Console. Include the input used (with sensitive values redacted), the run ID, a brief expected vs actual behavior description, and an optional small output sample to speed up troubleshooting.

# Actor input Schema

## `searchByCategory` (type: `string`):

Choose the legal practice area to scrape (for example, family law or real estate law). Use this when you want broad coverage of one service category.

## `searchByLocation` (type: `string`):

Select the state where you want to find lawyers. Combine with the practice area field to focus results on a specific legal niche in one location.

## `startUrls` (type: `array`):

Paste one or more Avvo URLs to crawl directly. Supported page types include Avvo search result pages, legal category pages, and individual lawyer profile/listing pages.

## `limit` (type: `integer`):

Maximum listings to save (per query). Use a smaller number for quick sampling and validation, or a larger number for deeper market coverage.

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

Connection settings for reliability at scale. The default configuration works well for most runs and helps keep large crawls stable.

## Actor input object example

```json
{
  "searchByCategory": "real-estate-lawyer",
  "searchByLocation": "wy",
  "limit": 50000,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# 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 = {
    "searchByCategory": "real-estate-lawyer",
    "searchByLocation": "wy"
};

// Run the Actor and wait for it to finish
const run = await client.actor("fatihtahta/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 = {
    "searchByCategory": "real-estate-lawyer",
    "searchByLocation": "wy",
}

# Run the Actor and wait for it to finish
run = client.actor("fatihtahta/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 '{
  "searchByCategory": "real-estate-lawyer",
  "searchByLocation": "wy"
}' |
apify call fatihtahta/avvo-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,fatihtahta/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/LfLFZ56UVZYR73Fer/builds/cvfPUZxhukuSGhA6i/openapi.json
