# Justia Lawyer Scraper \[Only $0.9/1K💰] | Leads | Legal Data (`ahmed_jasarevic/lawyers-justia-scraper`) Actor

Scrape lawyer profiles and attorney leads from the Justia Lawyer Directory: name, firm, phone, practice areas, Justia rating, peer reviews and credentials. For legal lead generation and law firm databases. From $0.0009 per lawyer.

- **URL**: https://apify.com/ahmed_jasarevic/lawyers-justia-scraper.md
- **Developed by:** [Ahmed Jasarevic](https://apify.com/ahmed_jasarevic) (community)
- **Stats:** 3 total users, 0 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.88 / 1,000 lawyer rows

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?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## 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.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Justia Lawyer Directory Scraper — Attorney Contact Lists & Legal Lead Generation

Extract **attorney leads and lawyer profiles from the Justia Lawyer Directory** (lawyers.justia.com) — the largest free US lawyer directory — for **legal lead generation**, building attorney contact lists, and law firm databases. Returns **lawyer name, firm, phone, address, practice areas, Justia rating, peer reviews, claimed-profile flag, education, awards and profile URL** for every attorney in a state, city or practice area you choose. **$0.0009 per lawyer row** (cheapest verified Justia actor on Apify).

### Main Use Cases

- **Legal lead generation** — build targeted attorney contact lists by state, city and practice area, with built-in lead-quality signals.
- **Building a law firm database** — structured lawyer records (contact, education, awards, bar info) for legaltech products, CRMs and research.
- **Legal marketing data** — find personal-injury, family-law, criminal-law and other attorneys for law-firm marketing agencies.
- **Competitive and market research** — map who practices what in any US market, by Justia rating and peer-review volume.
- **Legal recruiting** — identify attorneys by specialty and location with full credential profiles.

### How It Works

Pick **states, practice areas and a city** (e.g. all personal-injury lawyers in Los Angeles), or paste specific Justia profile/listing URLs. The actor is a plain-HTTP **Cheerio crawler (no headless browser)** that paginates Justia's directory listing pages, collects profile links, and extracts each profile from structured **JSON-LD embedded in the served HTML**. Justia sits behind a **Cloudflare challenge**, so the **Apify Unblocker proxy is enabled by default** — it bypasses the challenge server-side, keeping every request fast and light.

### Build Attorney Contact Lists Without an Official API

Justia exposes **no public API** for its directory data — profiles are claimed by attorneys themselves and published publicly. This actor turns that public directory into a structured list: **name, phone, firm, address, practice areas, Justia rating (1–10), peer reviews, claimed-profile status, education, awards, jurisdictions, associations, languages, websites and bio** — one row per attorney.

Input is flexible:

| Field                 | Type    | Required | Default                                                      | Notes                                                                                                                                                                                           |
| --------------------- | ------- | -------- | ------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `startUrls`           | array   | No\*      | `["https://www.justia.com/lawyers/california/los-angeles"]`  | Specific Justia profile or listing URLs. Overrides filters.                                                                                                                                     |
| `states`              | array   | No       | `["CA"]`                                                     | US state codes (e.g. CA, NY, TX). Empty = all states.                                                                                                                                           |
| `practiceAreas`       | array   | No       | `[]`                                                         | Practice-area slugs (e.g. `personal-injury`, `family-law`). Empty = all.                                                                                                                        |
| `city`                | string  | No       | `""`                                                         | City name, used together with a state.                                                                                                                                                          |
| `maxItems`            | integer | No       | `100`                                                        | Max lawyer profiles to save.                                                                                                                                                                    |
| `maxRequestsPerCrawl` | integer | No       | `200`                                                        | Max pages (listing + profile) the crawler may load.                                                                                                                                             |
| `maxConcurrency`      | integer | No       | `10`                                                         | Pages fetched in parallel. Measured ceiling on Justia is 8–14 pages/min through the Unblocker, so 10 is the sweet spot.                                                                         |
| `scrapeDetails`       | boolean | No       | `true`                                                       | `true` = visit every profile page for complete data. `false` = listing-only: one request per ~50 lawyers (practice areas, bio, years of experience included) — ~50× faster and cheaper per row. |
| `proxy`               | object  | No       | `{"useApifyProxy": true, "apifyProxyGroups": ["UNBLOCKER"]}` | **Enabled by default — required** to pass Justia's Cloudflare challenge over plain HTTP.                                                                                                        |

\* Either `startUrls` or the `states`/`practiceAreas`/`city` filters must be used.

#### Example input

```json
{
    "states": ["CA"],
    "city": "Los Angeles",
    "practiceAreas": ["personal-injury"],
    "maxItems": 50
}
```

### Understand the Output: Lawyer Contact Data, Ratings & Credentials

Each dataset item is one lawyer profile:

```json
{
    "name": "Michael Cohen",
    "firm": "Cohen IP Law Group, PC - Main Office",
    "phone": "(310) 288-4500",
    "address": "9025 Wilshire Blvd., Suite 301",
    "city": "Beverly Hills",
    "state": "CA",
    "zip": "90211",
    "practiceAreas": [
        "Business Law: Business Contracts, Business Dissolution, Business Finance, Business Formation, Business Litigation, Franchising, Mergers & Acquisitions, Partnership & Shareholder Disputes",
        "Intellectual Property",
        "Patents: Patent Appeals, Patent Litigation, Patent Prosecution"
    ],
    "justiaRating": 10,
    "peerReviewCount": 1,
    "peerReviews": [
        {
            "reviewer": "Howard Leslie Hoffenberg",
            "date": "November 3, 2022",
            "rating": 10,
            "text": "He cares about the clients he represents. He surely puts his heart into his representation of clients."
        }
    ],
    "claimedProfile": true,
    "yearsOfExperience": 21,
    "education": [
        "Southwestern University School of Law | J.D. (2002) | Law | Honors: Paul W. Wildman Scholar",
        "Arizona State University | B.A. (1996) | Biological and Chemical Sciences"
    ],
    "awards": [
        "Super Lawyer in Intellectual Property & Intellectual Property Litigation | Super Lawyers | 2023",
        "AV Preeminent Peer Rating | Martindale-Hubbell | 2023"
    ],
    "jurisdictions": ["California", "Federal Patent Bar, United States Patent & Trademark Office"],
    "associations": ["American Bar Association - Intellectual Property Division | Member | Current"],
    "languages": [],
    "websites": ["https://www.patentlawip.com/"],
    "bio": "Mr. Cohen is the founder and principal of the Cohen IP Law Group...",
    "imageUrl": "https://justatic.com/profile-images/1483054-1467415635-s.jpg",
    "profileUrl": "https://lawyers.justia.com/lawyer/michael-cohen-1483054"
}
```

#### Data fields

| Field                                     | Description                                                           |
| ----------------------------------------- | --------------------------------------------------------------------- |
| `name`                                    | Lawyer's full name                                                    |
| `firm`                                    | Law firm / office name                                                |
| `phone`                                   | Primary phone number                                                  |
| `fax`                                     | Fax number (if listed)                                                |
| `address` / `city` / `state` / `zip`      | Location                                                              |
| `practiceAreas`                           | Practice areas with sub-specialties                                   |
| `justiaRating`                            | Justia peer rating (1–10)                                             |
| `peerReviewCount` / `peerReviews`         | Peer reviews: count + review text, reviewer, date, rating             |
| `claimedProfile`                          | Whether the lawyer claimed their profile (strong lead-quality signal) |
| `yearsOfExperience`                       | Years of legal experience                                             |
| `education`                               | Law school, degrees, years                                            |
| `awards`                                  | Awards and honors                                                     |
| `jurisdictions`                           | Bar admissions / jurisdictions                                        |
| `associations` / `languages` / `websites` | Professional associations, spoken languages, personal/firm sites      |
| `bio`                                     | Full biography text                                                   |
| `imageUrl` / `profileUrl`                 | Profile photo and Justia profile URL                                  |

Download the dataset as JSON, CSV, HTML, or Excel, or pull it via the Apify API.

### Integrations & Automation — Schedule Legal Lead Generation

The actor runs on the Apify platform with **API access, scheduling, webhooks, Zapier/Make/n8n integrations**, and monitoring. For **ongoing lead generation**, schedule a monthly or quarterly run per practice area × state combo and feed the dataset into your CRM or outreach tool. Filter `claimedProfile = true` and `justiaRating >= 8` downstream to prioritize the most responsive, highest-rated prospects.

### Related Actors

- [Attorney Contact List & Lawyer Directory Data — Justia (jungle_synthesizer)](https://apify.com/jungle_synthesizer/justia-scraper) — the incumbent Justia actor on the Store
- [Avvo Scraper with Mails | US Lawyer Directory (fatihtahta)](https://apify.com/fatihtahta/avvo-scraper) — Avvo directory, the other major US attorney directory
- [Martindale Scraper | US & Canada Lawyer Directory (fatihtahta)](https://apify.com/fatihtahta/martindale-scraper) — Martindale-Hubbell for cross-directory coverage
- [FindLaw Attorney Directory Scraper (moving_beacon-owner1)](https://apify.com/moving_beacon-owner1/findlaw-attorney-directory-scraper) — FindLaw, the Thomson Reuters directory

### FAQ

#### Why use this actor instead of an official API?

Justia has **no public API** for its directory. The actor reads public profile pages directly at **$0.0009 per lawyer row** (+$0.0013 for full-profile enrichment) — no subscription, pay per record.

#### What are alternatives to this actor / lawyer directory data?

Avvo, Martindale-Hubbell and FindLaw are the other major US lawyer directories, each with their own Apify actors (linked above). This actor is specific to Justia — the largest free directory — with its unique peer-rating and claimed-profile signals. Note: Justia does not publish attorney emails like some competitor actors claim; this actor returns phone, website and profile URL.

#### Is scraping Justia legal?

Justia is a public directory of lawyer information. This actor only collects publicly available professional data (names, firm info, contact details, ratings) published by lawyers on their own profiles — no login bypass. Respect Justia's Terms of Service and applicable laws; be mindful of telemarketing/outreach rules (e.g. TCPA) when using phone numbers.

#### How do I prioritize the best leads?

Filter by `claimedProfile = true` (lawyer actively manages their presence — more likely to respond) and `justiaRating >= 8`, or sort by `peerReviewCount`. That combination surfaces responsive, well-reviewed prospects.

#### Why should I keep the Unblocker proxy on?

Justia's Cloudflare challenge blocks plain HTTP from datacenter and residential IPs alike; the **UNBLOCKER** group bypasses it server-side cheaply. It's on by default — only `useApifyProxy: false` turns it off (most requests will then 403).

#### Known limitations

- Profiles deleted on Justia return HTTP 410 and are skipped automatically.
- Justia shows a limited number of peer reviews per profile.
- Free Apify users are limited to 10 profiles per run.

### For AI Agents & LLM Apps

**Purpose:** Returns one structured row per lawyer from the Justia Lawyer Directory (contact, practice areas, Justia rating, peer reviews, credentials).

**Minimal working input:**

```json
{ "states": ["CA"], "city": "Los Angeles", "maxItems": 10 }
```

**Variant inputs — scrape specific profiles:**

```json
{ "startUrls": [{ "url": "https://lawyers.justia.com/lawyer/michael-cohen-1483054" }], "maxItems": 1 }
```

**Output fields (per lawyer):** `name`, `firm`, `phone`, `fax`, `address`, `city`, `state`, `zip`, `practiceAreas`, `justiaRating`, `peerReviewCount`, `peerReviews`, `claimedProfile`, `yearsOfExperience`, `education`, `awards`, `jurisdictions`, `associations`, `languages`, `websites`, `bio`, `imageUrl`, `profileUrl`.

**Behaviors an agent should know:**

- `startUrls` **overrides** `states`/`practiceAreas`/`city` entirely when provided.
- The Unblocker proxy is on by default and required for plain-HTTP access — `RESIDENTIAL` and private datacenter proxies both get a plain HTTP 403 from Justia's Cloudflare, so don't switch groups.
- **Speed is bounded by the Unblocker, not by your settings.** A measured round trip to Justia is bimodal: ~1.5 s when Cloudflare lets the plain request through, ~33 s when the browser has to solve the challenge (p50 ≈ 33 s). Throughput plateaus at **8–14 pages/min** whether `maxConcurrency` is 8, 10, 12 or 16 — beyond ~10 the proxy only queues the extra requests (higher latency, more HTTP 502 retries, no extra speed). Default `10` is the sweet spot; drop to 6 if you see 502/403 storms.
- Crawlee starts its concurrency pool at `minConcurrency` (default 1) and only raises it by 5 % every 10 s, so a crawl used to run its first minute with a handful of slots open. The crawler is now configured to start at the full concurrency and to shrink at most 2× under system pressure.
- For bulk contact lists, `scrapeDetails: false` (listing-only) gets ~50 lawyers per request instead of one — roughly 50× cheaper and faster per row than visiting every profile. Listing rows are no longer bare: measured on a live Los Angeles run, `practiceAreas` filled **80 %** of rows, `bio` **98 %**, `education` **82 %**, `yearsOfExperience` **38 %** (Justia only prints experience for some cards) — all read from the listing HTML that was downloaded anyway, so it costs **zero extra requests**.
- Justia also exposes an internal directory endpoint (`/lawyers/<state>/<city>?method=json&limit=50&offset=N`, found in their own JS bundle). It was tested and **is not usable for enumeration or merging**: two calls of `page=1` return different sets (~50 % overlap) and every page overlaps the others by ~50 % — the API rotates a random ~42-record window. It has no per-profile JSON either, so the HTML listing remains the source of truth.
- No email field exists — outreach uses `phone`, `websites` and `profileUrl`.
- Billing: pay-per-result — **$0.0009 per lawyer row; +$0.0013 per lawyer** when enrichment targets reach profile pages (check `maxRequestsPerCrawl` vs `maxItems` interplay).

### Legal & Compliance Disclaimer

This actor is an independent tool and is **not affiliated with, endorsed by, or sponsored by Justia**. It collects only publicly available professional data that lawyers publish on their Justia profiles — no login bypass, no access-challenge evasion beyond the standard public page. Users are responsible for compliance with Justia's Terms of Service, applicable data-protection law, and outreach/telemarketing rules (e.g. TCPA, CAN-SPAM) when using contact data. Do not use phone numbers for unsolicited commercial outreach in violation of applicable law.

### SEO Keywords

justia scraper, justia lawyer directory data, attorney contact list, lawyer lead generation, legal lead generation, attorney leads, law firm database, practice area lawyer list, personal injury lawyer list, family law attorney data, attorney profile data, legal marketing data, lawyer reviews data, law firm contact info, justia rating peer review, scrape lawyers by state, justia vs avvo, lawyer directory scraping, attorney phone website, legaltech data, json csv excel export

# Actor input Schema

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

Specific Justia URLs to scrape. Can be lawyer profile URLs (https://lawyers.justia.com/lawyer/...) or directory listing URLs (https://www.justia.com/lawyers/...). If provided, the filters below are ignored.

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

US state codes to scrape (e.g. CA, NY, TX). Leave empty to scrape all states.

## `practiceAreas` (type: `array`):

Practice-area slugs to filter by (e.g. personal-injury, family-law, criminal-law). Leave empty for all practice areas.

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

City name to filter by (e.g. Los Angeles). Only used together with a state.

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

Maximum number of lawyer profiles to save to the dataset.

## `maxRequestsPerCrawl` (type: `integer`):

Maximum number of pages (listing + profile) the crawler may load. Protects against runaway runs.

## `maxConcurrency` (type: `integer`):

How many pages (listing + profile) to download at the same time. Default 10. Measured on Justia: a request through the Unblocker takes ~33 s when Cloudflare challenges it (~1.5 s when it doesn't) and total throughput plateaus at 8–14 pages/min — above ~10 parallel requests the proxy just queues them (higher latency, more HTTP 502 retries, no extra speed). Raise only up to ~12; lower to 6 if you see repeated HTTP 502/403 retries.

## `maxRequestRetries` (type: `integer`):

How many times to retry a failed or blocked request before giving up (exponential backoff between attempts).

## `scrapeDetails` (type: `boolean`):

true (default): visit every lawyer profile page for complete data — full bio, review text, awards, associations, languages, jurisdictions. false: listing-only mode — one request per ~50 lawyers, saving the listing row directly (name, firm, phone, address, city/state/zip, Justia rating, peer-review count, claimed flag, education, practice areas, years of experience, bio, website, avatar). Listing-only is ~50x faster and cheaper per row and is the right choice for bulk contact lists.

## `proxy` (type: `object`):

Proxy settings. Justia is behind a Cloudflare challenge, so keep the proxy enabled and use the UNBLOCKER group — it bypasses the challenge for plain HTTP requests (no browser needed). The proxy is used even when this field is omitted; only set useApifyProxy to false to disable it (most requests will then fail with HTTP 403).

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://www.justia.com/lawyers/california/los-angeles"
    }
  ],
  "states": [
    "CA"
  ],
  "practiceAreas": [],
  "maxItems": 100,
  "maxRequestsPerCrawl": 200,
  "maxConcurrency": 10,
  "maxRequestRetries": 4,
  "scrapeDetails": true,
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# 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 = {
    "startUrls": [
        {
            "url": "https://www.justia.com/lawyers/california/los-angeles"
        }
    ],
    "states": [
        "CA"
    ],
    "practiceAreas": [],
    "city": "",
    "proxy": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "UNBLOCKER"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("ahmed_jasarevic/lawyers-justia-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 = {
    "startUrls": [{ "url": "https://www.justia.com/lawyers/california/los-angeles" }],
    "states": ["CA"],
    "practiceAreas": [],
    "city": "",
    "proxy": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["UNBLOCKER"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("ahmed_jasarevic/lawyers-justia-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 '{
  "startUrls": [
    {
      "url": "https://www.justia.com/lawyers/california/los-angeles"
    }
  ],
  "states": [
    "CA"
  ],
  "practiceAreas": [],
  "city": "",
  "proxy": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}' |
apify call ahmed_jasarevic/lawyers-justia-scraper --silent --output-dataset

```

## MCP server setup

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