# Justia Lawyer Directory Scraper - Attorney Profiles & Contacts (`confidential_gnat/justia-lawyers-scraper`) Actor

Scrapes the Justia Lawyer Directory (lawyers.justia.com) by practice area, state, city or link. Attorney name, firm, phone, address, website, practice areas, years of experience, bar admissions, education and reviews. Cache for new lawyers only.

- **URL**: https://apify.com/confidential_gnat/justia-lawyers-scraper.md
- **Developed by:** [ActorFlow](https://apify.com/confidential_gnat) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 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?

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 (lawyers.justia.com) Attorney Profiles Scraper

![Justia Lawyer Directory Scraper cover: US lawyer profiles with bar admissions, only new lawyers every run](https://i.postimg.cc/gk8FNPrJ/Gemini-Generated-Image-8kd14f8kd14f8kd1.jpg)

**Scrape lawyer profiles from the Justia Lawyer Directory (lawyers.justia.com)**: name, firm, phone, address, website, practice areas, years of experience, bar admissions, education, languages, awards and review counts. Search by **practice area, state and city** or paste a Justia link, then export the data as **JSON, CSV or Excel** or call the actor as an **API**. Paste a Justia link or type a practice area and a state, press **Start** and get a clean table of attorneys.

**Target website:** [lawyers.justia.com](https://lawyers.justia.com)

### ✨ Features of this Justia lawyer directory scraper

- **Attorney extraction** - search pages by practice area, state or city and single lawyer profile pages, with contact details, address, website, practice areas, years of experience and Justia rating.
- **Full profiles on demand** - optionally open every profile to add the firm, all offices, bar admissions with bar ids and admission years, education, languages, awards, associations, social links, full biography and review counts.
- **Pagination support** - search pages are followed automatically until your item limit is reached, repeated listings are removed.
- **Big searches** - Justia shows 25 pages for one search; when a state-wide search is still short of your limit it continues city by city.
- **Cache for new lawyers** - run the same search on a schedule and get only lawyers you have not saved before.
- **Proxy support** - proxy settings are preset in the input.
- **No browser required** - pages are read directly, no browser is started.

### 🚀 How to scrape Justia lawyers in 5 steps

1. [Sign up](https://apify.com/sign-up) for a free Apify account - includes **$5 monthly credit**.
2. Open the actor page and click **Try for free**.
3. Fill in the **Input** fields (a Justia URL, or a practice area and a state, is required).
4. Click **Start** and wait for the run to complete.
5. Download results from the **Output** tab in JSON, CSV, or Excel format.

You can also run this actor via the [Apify API](https://docs.apify.com/api/v2) or integrate it directly into your workflows using [Zapier](https://zapier.com/apps/apify), [Make](https://www.make.com/), or [n8n](https://n8n.io/).

### 💰 Pricing for the Justia lawyers scraper

This actor uses **pay-per-result** billing: you pay for each lawyer saved to the dataset.

- New Apify accounts include **$5 of free monthly credit**.
- Each search page (about 50 lawyers) is one request. With **Scrape full profiles** on, every lawyer adds one more request, so turn it off if the search page fields are enough.
- Pages load slowly, usually 5 to 25 seconds each, so large runs take a while.

### 🔧 Justia scraper input configuration

The input form starts with the Justia URLs, then the practice area, state and city fields, the cache name and the max items limit. The full-profiles switch is in the optional settings, and the proxy settings come last.

![Justia Lawyer Directory Scraper input form in Apify Console with the 7 fields numbered 1 to 7: Justia URLs, practice area, state, city, cache project name, max items per input and scrape full profiles](https://i.postimg.cc/wxSYXBxg/Gemini-Generated-Image-8n4of98n4of98n4o.jpg)

1. **Justia URLs** - lawyer search pages or single lawyer profile links to scrape (here the New York personal injury search)
2. **Practice area** - practice area name as Justia writes it, used together with a state
3. **State** - US state name, used together with a practice area
4. **City** - optional city inside the state (here Buffalo)
5. **Cache project name** - reuse the same name on every scheduled run to get only new lawyers
6. **Max items per input** - limit for each start URL or search (here 5)
7. **Scrape full profiles** - open each profile for the firm, offices, bar admissions, education, languages and review counts

| Field | Type | Required | Default | Description |
| ----- | ---- | -------- | ------- | ----------- |
| Justia URLs (`startUrls`) | array | - | prefilled search | Lawyer search pages or single lawyer profile links. |
| Practice area (`practiceArea`) | string | - | - | Practice area name such as Personal Injury or Criminal Law. Needs a state. |
| State (`state`) | string | - | - | US state name such as New York. |
| City (`city`) | string | - | - | Optional city inside the state, such as Buffalo. |
| Cache project name (`cacheProjectName`) | string | - | - | Same name on each run gives only lawyers not saved before. |
| Max items per input (`maxItems`) | integer | - | `5` | Maximum lawyers saved for each URL or search. |
| Scrape full profiles (`scrapeDetails`) | boolean | - | `true` | Opens each profile for the firm, offices, admissions, languages, awards and more. |
| Proxy configuration (`proxyConfiguration`) | object | - | Preset | Keep the preset. |

**Supported URL types:**

- Search by practice area and state: `https://lawyers.justia.com/lawyers/personal-injury/new-york`
- Search by practice area, state and city: `https://lawyers.justia.com/lawyers/criminal-law/california/los-angeles`
- Single lawyer profile: `https://lawyers.justia.com/lawyer/carissa-kranz-1526149`

### 📦 Justia scraper output data

Each lawyer is one flat JSON row with the same keys every time (`null` or an empty list where Justia has no value): `id`, `url`, `name`, `firmName`, `jobTitles`, `isPremium`, `premiumTier`, `isClaimed`, `justiaRating`, `tagline`, `yearsOfExperience`, `address`, `city`, `state`, `postalCode`, `phone`, `phoneFormatted`, `website`, `image`, `practiceAreas`, `practiceSubareas`, `education`, `licensedIn`, `licences`, `languages`, `awards`, `associations`, `socialLinks`, `offices`, `biography`, `freeConsultation`, `fees`, `ratingValue`, `ratingCount`, `clientReviewCount`, `peerReviewCount`, `reviews`, `sourceUrl`, `scrapedAt`.

The dataset has 2 views. **Lawyers** shows the main fields: photo, name, firm, city, state, phone, website, practice areas, years of experience and rating. **Credentials and reviews** shows admissions, education, languages, awards and review counts.

Without **Scrape full profiles**, the search page fields are filled (name, phone, city and state, website, photo, years of experience, claimed and premium status, and for free listings the street address, practice areas, school and a biography preview). Premium listings show less on the search page. The profile-only fields (firm, offices, admissions with bar ids, languages, awards, associations, social links, fees and review counts) stay empty until the profiles are opened. Justia lists no email addresses, only a contact form.

**Output at a glance:**

| Lawyer | City | State | Phone | Years | Practice areas |
| ------ | ---- | ----- | ----- | ----- | -------------- |
| [Victor Fusco](https://lawyers.justia.com/lawyer/victor-fusco-1132418) | Woodbury | NY | (800) 416-5454 | 50 | Personal Injury, Administrative, Social Security Disability and Workers' Comp |
| [Jeff D. DeFrancisco](https://lawyers.justia.com/lawyer/jeff-d-defrancisco-1265145) | East Syracuse | NY | (833) 200-2000 | 26 | Personal Injury, Medical Malpractice and Nursing Home |
| [Carissa Kranz](https://lawyers.justia.com/lawyer/carissa-kranz-1526149) | New York | NY | (866) 529-1114 | 15 | Personal Injury, Vegan Certification |
| [Lewis McCarthy](https://lawyers.justia.com/lawyer/lewis-mccarthy-1526734) | White Plains | NY | (914) 358-4326 | - | - |

**Sample output (raw JSON, with full profile):**

```json
[
{
  "id": "1526149",
  "url": "https://lawyers.justia.com/lawyer/carissa-kranz-1526149",
  "name": "Carissa Kranz",
  "firmName": "Law Offices of Carissa Kranz",
  "jobTitles": [
    "Founding Attorney",
    "Attorney",
    "Assistant State Attorney"
  ],
  "isPremium": false,
  "premiumTier": null,
  "isClaimed": true,
  "justiaRating": null,
  "tagline": null,
  "yearsOfExperience": 15,
  "address": "555 Madison Ave, 5th Floor",
  "city": "New York",
  "state": "NY",
  "postalCode": "10022",
  "phone": "(866) 529-1114",
  "phoneFormatted": "+1 866 529 1114",
  "website": "http://www.injurylegalfirm.com",
  "image": "https://justatic.com/profile-images/1526149-1557204685-s.png",
  "practiceAreas": [
    "Personal Injury",
    "Vegan Certification"
  ],
  "practiceSubareas": [
    "Animal & Dog Bites",
    "Brain Injury",
    "Car Accidents"
  ],
  "education": [
    "University of California - Berkeley",
    "Northwestern University",
    "University of Florida"
  ],
  "licensedIn": [
    "District of Columbia",
    "Florida",
    "New York"
  ],
  "licences": [
    {
      "jurisdiction": "District of Columbia",
      "authority": "District of Columbia Bar",
      "barId": null,
      "since": 2011
    },
    {
      "jurisdiction": "Florida",
      "authority": "The Florida Bar",
      "barId": "0089554",
      "since": 2011
    },
    {
      "jurisdiction": "New York",
      "authority": "New York State Office of Court Administration",
      "barId": null,
      "since": 2012
    }
  ],
  "languages": [
    "English: Spoken, Written",
    "Spanish: Spoken, Written"
  ],
  "awards": [
    "Super Lawyer Super Lawyer 2019",
    "Top Influencer Metropolitan Magazine 2019"
  ],
  "associations": [
    "The Federal Bar",
    "Palm Beach County Bar Association",
    "American Bar Association",
    "The Florida Bar",
    "The New York Bar",
    "The D.C. Bar"
  ],
  "socialLinks": [
    "https://www.facebook.com/CARISSAontheCASE",
    "https://twitter.com/injurylegalfirm",
    "https://www.linkedin.com/in/carissakranz/"
  ],
  "offices": [
    {
      "name": "Law Offices of Carissa Kranz",
      "address": "555 Madison Ave, 5th Floor",
      "city": "New York",
      "state": "NY",
      "postalCode": "10022",
      "phone": "(866) 529-1114",
      "fax": "(866) 520-4040"
    },
    {
      "name": null,
      "address": "3801 PGA Blvd, Suite 600",
      "city": "PBG",
      "state": "FL",
      "postalCode": "33410",
      "phone": "(866) 529-1114",
      "fax": "(866) 520-4040"
    }
  ],
  "biography": "Carissa is a former professional ballet dancer-turned lawyer who is licensed to practice law in New York, Washington D.C., and Florida. Aside from anchoring on the Law & Crime Network as a show host with Dan Abrams, you may have seen her on Nancy Grace, Dr. Dr…",
  "freeConsultation": true,
  "fees": [
    "Free Consultation",
    "Credit Cards Accepted",
    "Contingent Fees"
  ],
  "ratingValue": null,
  "ratingCount": null,
  "clientReviewCount": 1,
  "peerReviewCount": null,
  "reviews": [],
  "sourceUrl": "https://lawyers.justia.com/lawyers/personal-injury/new-york",
  "scrapedAt": "2026-11-03T16:44:33.618Z"
}
]
```

### 🔁 Scrape only new Justia lawyers with the cache

Set the same **Cache project name** on every scheduled run. Lawyers already saved under that name are skipped, not charged and not counted towards **Max items**, so each run returns only lawyers that are new for that name. Different names keep separate caches. Combine it with an [Apify Schedule](https://docs.apify.com/platform/schedules) to monitor a practice area and state weekly.

### 🐍 How to scrape Justia with Python, JavaScript or the API

Run the actor programmatically with the official Apify clients. Replace `<YOUR_API_TOKEN>` with the token from your [Apify Console](https://console.apify.com/account/integrations).

**Python** (`pip install apify-client`):

```python
from apify_client import ApifyClient

client = ApifyClient("<YOUR_API_TOKEN>")

run = client.actor("confidential_gnat/justia-lawyers-scraper").call(run_input={
    "practiceArea": "Personal Injury",
    "state": "New York",
    "city": "Buffalo",
    "maxItems": 20,
})

for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)
```

**JavaScript** (`npm install apify-client`):

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

const client = new ApifyClient({ token: '<YOUR_API_TOKEN>' });

const run = await client.actor('confidential_gnat/justia-lawyers-scraper').call({
    practiceArea: 'Personal Injury',
    state: 'New York',
    city: 'Buffalo',
    maxItems: 20,
});

const { items } = await client.dataset(run.defaultDatasetId).listItems();
console.log(items);
```

**cURL** - start a run and wait for the dataset:

```bash
curl -X POST "https://api.apify.com/v2/acts/confidential_gnat~justia-lawyers-scraper/run-sync-get-dataset-items?token=<YOUR_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{"practiceArea": "Personal Injury", "state": "New York", "city": "Buffalo", "maxItems": 20}'
```

### 💡 What you can use Justia lawyer data for

- Building lead lists of attorneys by practice area, state and city for legal marketing and sales.
- Finding referral partners or co-counsel in other states, with their bar admissions and years of experience.
- Mapping the legal market: how many lawyers a city has per practice area, and which firms have many offices.
- Monitoring new lawyers who join Justia with the cache and a schedule.
- Researching a lawyer's credentials, education, languages, awards and reviews before hiring or partnering.

Legal marketers, law-firm business developers, legal-tech companies and researchers use this kind of attorney directory data.

### ⚠️ Limitations of the Justia scraper

- **25 pages per search** - Justia serves at most 25 pages (roughly 1,000 different lawyers) for one search. State-wide searches continue city by city when your **Max items** is higher; a search for one city cannot be cut further and stops at what Justia shows.
- **Speed** - every page takes several seconds, and opening each profile doubles or more the number of requests.
- **No email addresses** - Justia shows a contact form instead of emails.
- **Premium listings** - show fewer fields on the search page (no street address or practice areas), so use **Scrape full profiles** for those.
- **Sponsored repeats** - sponsored lawyers repeat on every page and are saved once per search.

### ❓ Justia scraper FAQ

#### Can I scrape Justia legally?

The actor only collects data already publicly visible on lawyers.justia.com, with no login or private content. Scraping publicly available data is generally considered lawful (see *hiQ Labs v. LinkedIn*), but you are responsible for following Justia's Terms of Service and laws such as GDPR and CCPA when you use personal data like names and phone numbers.

#### What data does the Justia scraper return?

Name, phone, address, website, photo, practice areas, years of experience, claimed and premium status and Justia rating from search pages, and with **Scrape full profiles** also the firm, all offices, bar admissions with bar ids, education, languages, awards, associations, social links, fees, the full biography and review counts.

#### How many lawyers can I scrape from one search?

**Max items per input** limits each URL or search separately. Justia shows 25 pages for one search; a state-wide search that is still short of your limit continues city by city until it is reached or Justia has no more lawyers.

#### Do I need a proxy to scrape lawyers.justia.com?

No setup needed: the proxy settings are preset in the input. Keep the preset.

#### How do I scrape Justia with Python?

Use the Python example above with the Apify client and iterate over the dataset items.

#### Can I run this Justia scraper on a schedule?

Yes, use Apify Schedules. Add a **Cache project name** so each run saves only lawyers not saved before.

#### What output formats are supported?

JSON, CSV, Excel, XML and RSS, either from the **Output** tab or through the Apify API.

#### Why are some fields empty in my results?

Premium lawyers show less on search pages and some lawyers fill in few profile sections. Turn on **Scrape full profiles** to read the profile pages, and expect empty values where a lawyer has not filled in a section.

### 🔗 Relevant actors for Justia lawyer data

| Scraper | Description |
| ------- | ----------- |
| [🇺🇸 Yellow Pages USA Scraper - Emails & Leads](https://apify.com/confidential_gnat/yellowpages-usa-scraper) | Scrape US businesses from Yellow Pages with emails: name, phone, address and more. |

### 🔗 Other actors you may find useful

| Scraper | Description |
| ------- | ----------- |
| [Poshmark Listings Scraper](https://apify.com/confidential_gnat/poshmark-listings-scraper) | Scrapes Poshmark listings, sold items and closets. |
| [Rightmove Property Scraper](https://apify.com/confidential_gnat/rightmove-property-scraper) | Scrapes UK property listings from Rightmove for sale and rent. |
| [XING Jobs Scraper](https://apify.com/confidential_gnat/xing-jobs-scraper) | Scrapes job listings from XING Jobs in Germany. |
| [Auction.com Real Estate Auctions Scraper](https://apify.com/confidential_gnat/auction-com-scraper) | Scrapes foreclosure and bank-owned auctions from Auction.com. |
| [Dice Jobs Scraper](https://apify.com/confidential_gnat/dice-jobs-scraper) | Scrapes tech job listings from Dice by keyword or location. |

### 💬 Support & contact

If you encounter any issues or have questions, please [open an issue](https://apify.com/confidential_gnat/justia-lawyers-scraper/issues/open).

You can also find more of our actors on the [Actor Flow](https://apify.com/confidential_gnat) page.

# Actor input Schema

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

Lawyer searches (https://lawyers.justia.com/lawyers/personal-injury/new-york or a city page such as .../new-york/buffalo) or single lawyer profile links.

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

Practice area name as Justia writes it, for example Personal Injury or Criminal Law. Used together with a state.

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

US state name, for example New York. Used together with a practice area.

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

Optional city inside the state, for example Buffalo.

## `cacheProjectName` (type: `string`):

Use the same name on each scheduled run to get only lawyers not saved before. Lawyers already saved under this name are skipped, not charged and not counted towards Max items.

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

Maximum lawyers saved for each URL or search. Justia shows 25 pages (about 1,000 lawyers) for one search; a search that is still short of this limit then continues city by city automatically.

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

Also open each lawyer's profile to add the firm, full biography, all offices, bar admissions with bar ids, languages, awards, associations, social links and review counts. Slower and one extra paid proxy request per lawyer.

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

Justia blocks normal proxies, so the Apify unblocker proxy group (UNBLOCKER) is used by default. It is billed per request and slow (several seconds per page).

## Actor input object example

```json
{
  "startUrls": [
    {
      "url": "https://lawyers.justia.com/lawyers/personal-injury/new-york"
    }
  ],
  "maxItems": 5,
  "scrapeDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}
```

# Actor output Schema

## `overview` (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://lawyers.justia.com/lawyers/personal-injury/new-york"
        }
    ],
    "maxItems": 5,
    "proxyConfiguration": {
        "useApifyProxy": true,
        "apifyProxyGroups": [
            "UNBLOCKER"
        ]
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("confidential_gnat/justia-lawyers-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://lawyers.justia.com/lawyers/personal-injury/new-york" }],
    "maxItems": 5,
    "proxyConfiguration": {
        "useApifyProxy": True,
        "apifyProxyGroups": ["UNBLOCKER"],
    },
}

# Run the Actor and wait for it to finish
run = client.actor("confidential_gnat/justia-lawyers-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://lawyers.justia.com/lawyers/personal-injury/new-york"
    }
  ],
  "maxItems": 5,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "UNBLOCKER"
    ]
  }
}' |
apify call confidential_gnat/justia-lawyers-scraper --silent --output-dataset

```

## MCP server setup

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