# CourtListener Attorney Profiles Scraper - Judges & Counsel (`parseforge/courtlistener-attorney-profiles-scraper`) Actor

Scrape attorney and judge profiles from CourtListener's judicial database by name, court, law school, appointer and party. Export to CSV, JSON, Excel or XML.

- **URL**: https://apify.com/parseforge/courtlistener-attorney-profiles-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Lead generation, Automation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.62 / 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

![ParseForge Banner](https://github.com/ParseForge/apify-assets/blob/ad35ccc13ddd068b9d6cba33f323962e39aed5b2/banner.jpg?raw=true)

## 👤 CourtListener Attorney Profiles Scraper

> 🚀 **Export attorney and judge profiles from CourtListener in seconds.** Search 15,119 legal professionals by name, court, law school, appointing president, party or birthplace, and get one 42-field row per person with every seat they have held, who appointed them, and when they were nominated and confirmed.

Pull structured profiles of judges, justices, magistrates, clerks and the lawyers who became them out of CourtListener's judicial people database. The Free Law Project builds it from the Federal Judicial Center biographical directory, state court records and the Judicial Conference, and publishes it through an open API with no login and no API key required. Every profile exports to CSV, JSON, Excel, or XML.

The database holds 15,119 people across 3,359 courts, from the Supreme Court of the United States down to county superior courts: 3,752 people at the California Superior Court alone and 534 at the New York Supreme Court. 3,717 of them were appointed by a President and 3,577 by a Governor. Harvard shows up on 692 profiles and Yale on 395. Barack Obama appointed 324 of the people in it. This Actor turns that into a flat table you can filter, join and diff.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Litigators and appellate counsel | Judge research before a filing: seat history, appointer, tenure, prior courts |
| Legal analytics and legal tech | A clean judiciary table with stable IDs to join against dockets and opinions |
| Law schools and academics | Judicial diversity, career paths and appointment patterns over two centuries |
| Journalists and watchdogs | Who sits where, who appointed them, and when the seat turns over |
| Recruiters and legal marketers | Clerkship and career histories for the federal and state bench |

### 📋 What the CourtListener Attorney Profiles Scraper does

> 💡 **Why it matters:** the biographical data on the American bench is scattered across the FJC directory, state court sites and Wikipedia, and CourtListener's own API returns each person's schools, ratings and seats as separate URIs you have to fetch one by one. This Actor reads the search index instead, where the whole profile already arrives in a single response, and flattens it into one row per person.

Set your filters, click Start, and the Actor queries CourtListener's public search API live, following the cursor until it has the rows you asked for. Filtering happens server side, so you pay for matches rather than for filtering afterwards.

- 👤 **The person.** Name, profile URL, CourtListener person ID, Federal Judicial Center ID, gender, race, religion, aliases, date and place of birth, date of death and whether the person is still living.
- 🏛 **The current seat.** Position type, job title, court, court ID and citation string, who appointed them, how the seat was filled, and the start and end dates of the term.
- 🗓 **The whole career.** Career start and end, how many positions the person has held, and every court, position type, job title, appointer and selection method they have ever had, in one semicolon separated cell each.
- 📂 **Every position, in full.** The `positions` array carries each seat separately with its nomination date, the date it was referred to the Judiciary Committee, the committee action date, the confirmation date, the retirement date, the supervising judge for clerkships, and the reason the term ended.
- 🎓 **Credentials and politics.** Every school on the record, ABA ratings such as `Well Qualified`, and political affiliations as both labels and CourtListener codes.
- 🔗 **Direct lookups.** Paste CourtListener profile URLs into the URL list and the Actor resolves them by person ID, twenty five per request, instead of searching.
- 🏷️ **No blanks.** Values the source can carry but did not fill read `Not Disclosed`; values that do not apply to that record read `N/A`; booleans read `Yes` or `No`.

### 🎬 Full Demo (🚧 Coming soon)

A short walkthrough video is in production.

### 📊 Output

Each row is one person in the CourtListener judicial database. Fields, in dataset order:

| Field | Description |
|---|---|
| 👤 `name` | Full name as CourtListener records it |
| 🔗 `url` | Profile page on courtlistener.com |
| 🆔 `personId` | CourtListener person ID, stable across runs |
| 🗂 `fjcId` | Federal Judicial Center biographical directory ID |
| ✅ `isActive` | `Yes` when a seat is open and the person is living |
| 🧑‍⚖️ `currentPositionType` / 💼 `currentJobTitle` | Justice, Judge, Magistrate, Clerk, and the free-text title when the source has one |
| 🏛 `currentCourt` / 🏷 `currentCourtId` / 📎 `currentCourtCitation` | Court name, CourtListener court ID (for example `scotus`), reporter-style abbreviation |
| 🖋 `currentAppointer` / 🗳 `currentSelectionMethod` | Who appointed them and how the seat was filled |
| 📅 `currentTermStart` / 🏁 `currentTermEnd` | Term dates for that seat (`N/A` while serving) |
| 🚀 `careerStart` / 🛑 `careerEnd` / 🔢 `positionCount` | First recorded start date, last termination date, and how many seats are on file |
| 🏢 `courts` / 🏷 `courtIds` | Every court in the career, semicolon separated |
| 📋 `positionTypes` / 💼 `jobTitles` | Every position type and job title held |
| 🖋 `appointers` / 🗳 `selectionMethods` | Every appointing authority and selection method on the record |
| 🎗 `politicalAffiliations` / 🔣 `politicalAffiliationIds` | Party labels and CourtListener party codes |
| ⭐ `abaRatings` | American Bar Association ratings, for example `Well Qualified` |
| 🎓 `schools` | Every school attached to the profile |
| 🧍 `gender` / 🌍 `races` / 🙏 `religion` | Demographic fields as the source records them |
| 🎂 `dateOfBirth` / 🏙 `birthCity` / 🗺 `birthState` / 🔤 `birthStateId` | Date and place of birth |
| ⚰️ `dateOfDeath` / 🕯 `isDeceased` | Date of death (`N/A` for the living) and a `Yes` or `No` flag |
| 🔀 `aliases` / 🆔 `aliasIds` | Other names the same person is filed under |
| 📂 `positions` | Array of every seat with its full nomination, confirmation and termination detail |
| 🕓 `lastUpdated` | When CourtListener last touched the record |
| 🕒 `scrapedAt` | ISO timestamp of the collection |
| ❌ `error` | `null` on success; error rows carry only this field and are never charged |

Three real records from a verification run (`courts` `["scotus"]`, `selectionMethod` `a_pres`, Max Items 5). The `positions` array is shown in full for the first record and trimmed to its first entry in the others:

```json
[
  {
    "name": "Amy Coney Barrett",
    "url": "https://www.courtlistener.com/person/8543/amy-coney-barrett/",
    "personId": 8543,
    "fjcId": "3979311",
    "isActive": "Yes",
    "currentPositionType": "Justice",
    "currentJobTitle": "Not Disclosed",
    "currentCourt": "Supreme Court",
    "currentCourtId": "scotus",
    "currentCourtCitation": "SCOTUS",
    "currentAppointer": "Trump, Donald John",
    "currentSelectionMethod": "Appointment (President)",
    "currentTermStart": "2020-10-27",
    "currentTermEnd": "N/A",
    "careerStart": "2020-10-27",
    "careerEnd": "N/A",
    "positionCount": 1,
    "courts": "Supreme Court",
    "courtIds": "scotus",
    "positionTypes": "Justice",
    "jobTitles": "Not Disclosed",
    "appointers": "Trump, Donald John",
    "selectionMethods": "Appointment (President)",
    "politicalAffiliations": "Republican",
    "politicalAffiliationIds": "r",
    "abaRatings": "Well Qualified",
    "schools": "Rhodes College; University of Notre Dame",
    "gender": "Female",
    "races": "White",
    "religion": "Catholic",
    "dateOfBirth": "1972-01-01",
    "birthCity": "New Orleans",
    "birthState": "Louisiana",
    "birthStateId": "LA",
    "dateOfDeath": "N/A",
    "isDeceased": "No",
    "aliases": "Not Disclosed",
    "aliasIds": "Not Disclosed",
    "positions": [
      {
        "positionType": "Justice",
        "jobTitle": "Not Disclosed",
        "court": "Supreme Court",
        "courtId": "scotus",
        "courtCitation": "SCOTUS",
        "organizationName": "Not Disclosed",
        "dateStart": "2020-10-27",
        "dateTermination": "N/A",
        "dateGranularityStart": "%Y-%m-%d",
        "dateNominated": "2020-09-26",
        "dateReferredToJudicialCommittee": "N/A",
        "dateJudicialCommitteeAction": "N/A",
        "dateConfirmation": "2020-10-26",
        "dateRetirement": "N/A",
        "appointer": "Trump, Donald John",
        "selectionMethod": "Appointment (President)",
        "supervisor": "Not Disclosed",
        "terminationReason": "Not Disclosed"
      }
    ],
    "lastUpdated": "2025-02-05T17:16:00.956698Z",
    "scrapedAt": "2026-09-08T05:32:10.711Z",
    "error": null
  },
  {
    "name": "William Burnham Woods",
    "url": "https://www.courtlistener.com/person/3552/william-burnham-woods/",
    "personId": 3552,
    "fjcId": "2650",
    "isActive": "No",
    "currentPositionType": "Judge",
    "currentJobTitle": "Not Disclosed",
    "currentCourt": "Supreme Court",
    "currentCourtId": "scotus",
    "currentCourtCitation": "SCOTUS",
    "currentAppointer": "Hayes, Rutherford B.",
    "currentSelectionMethod": "Appointment (President)",
    "currentTermStart": "1880-12-21",
    "currentTermEnd": "1887-05-14",
    "careerStart": "1880-12-21",
    "careerEnd": "1887-05-14",
    "positionCount": 1,
    "courts": "Supreme Court",
    "courtIds": "scotus",
    "positionTypes": "Judge",
    "jobTitles": "Not Disclosed",
    "appointers": "Hayes, Rutherford B.",
    "selectionMethods": "Appointment (President)",
    "politicalAffiliations": "Republican",
    "politicalAffiliationIds": "r",
    "abaRatings": "Not Disclosed",
    "schools": "Yale University",
    "gender": "Male",
    "races": "White",
    "religion": "Not Disclosed",
    "dateOfBirth": "1824-08-03",
    "birthCity": "Newark",
    "birthState": "Ohio",
    "birthStateId": "OH",
    "dateOfDeath": "1887-05-14",
    "isDeceased": "Yes",
    "aliases": "Not Disclosed",
    "aliasIds": "Not Disclosed",
    "positions": [
      {
        "positionType": "Judge",
        "court": "Supreme Court",
        "courtId": "scotus",
        "dateStart": "1880-12-21",
        "dateTermination": "1887-05-14",
        "dateNominated": "1880-12-15",
        "dateReferredToJudicialCommittee": "1880-12-15",
        "dateJudicialCommitteeAction": "1880-12-20",
        "dateConfirmation": "1880-12-21",
        "appointer": "Hayes, Rutherford B.",
        "selectionMethod": "Appointment (President)",
        "terminationReason": "Death"
      }
    ],
    "lastUpdated": "2023-10-10T19:24:32.922563Z",
    "scrapedAt": "2026-09-08T05:32:10.711Z",
    "error": null
  },
  {
    "name": "Levi Woodbury",
    "url": "https://www.courtlistener.com/person/3541/levi-woodbury/",
    "personId": 3541,
    "fjcId": "2641",
    "isActive": "No",
    "currentPositionType": "Judge",
    "currentJobTitle": "Not Disclosed",
    "currentCourt": "Supreme Court",
    "currentCourtId": "scotus",
    "currentCourtCitation": "SCOTUS",
    "currentAppointer": "Polk, James K.",
    "currentSelectionMethod": "Appointment (President)",
    "currentTermStart": "1846-01-03",
    "currentTermEnd": "1851-09-04",
    "careerStart": "1846-01-03",
    "careerEnd": "1851-09-04",
    "positionCount": 1,
    "courts": "Supreme Court",
    "courtIds": "scotus",
    "positionTypes": "Judge",
    "jobTitles": "Not Disclosed",
    "appointers": "Polk, James K.",
    "selectionMethods": "Appointment (President)",
    "politicalAffiliations": "Democratic",
    "politicalAffiliationIds": "d",
    "abaRatings": "Not Disclosed",
    "schools": "Dartmouth College",
    "gender": "Male",
    "races": "White",
    "religion": "Not Disclosed",
    "dateOfBirth": "1789-12-22",
    "birthCity": "Francestown",
    "birthState": "New Hampshire",
    "birthStateId": "NH",
    "dateOfDeath": "1851-09-04",
    "isDeceased": "Yes",
    "aliases": "Not Disclosed",
    "aliasIds": "Not Disclosed",
    "positions": [
      {
        "positionType": "Judge",
        "court": "Supreme Court",
        "courtId": "scotus",
        "dateStart": "1846-01-03",
        "dateTermination": "1851-09-04",
        "dateNominated": "1845-12-23",
        "dateReferredToJudicialCommittee": "1845-12-23",
        "dateJudicialCommitteeAction": "1846-01-03",
        "dateConfirmation": "1846-01-03",
        "appointer": "Polk, James K.",
        "selectionMethod": "Appointment (President)",
        "terminationReason": "Death"
      }
    ],
    "lastUpdated": "2023-10-10T19:24:32.791561Z",
    "scrapedAt": "2026-09-08T05:32:10.712Z",
    "error": null
  }
]
```

### ✨ Why choose this Actor

| | What you get |
|---|---|
| **The whole profile in one row** | 42 columns per person, including the full `positions` array. CourtListener's own people endpoint returns schools, ratings and seats as URIs you have to fetch one at a time; this Actor reads the search index, where all of it already arrives in a single response. |
| **All 3,359 courts, pickable** | The court filter is a list of every court ID CourtListener publishes, pulled from its own courts endpoint, not a free-text box you have to guess at. Several courts in one search are ORed by the source, so `ca1` (38 people) plus `ca9` (115) returns 153. |
| **The appointment record** | Nomination date, referral to the Judiciary Committee, committee action, confirmation, retirement and the reason the term ended, per seat. 3,717 people were appointed by a President, 3,577 by a Governor, 443 by a judge, 667 elected in non-partisan races. |
| **Career history, not a snapshot** | The current seat is the most recent one that was never terminated, and every earlier court, title, appointer and selection method stays on the row. A clerkship in 2005 and a district seat in 2019 both survive. |
| **Direct profile lookups** | Paste CourtListener profile URLs and the Actor resolves them by person ID, twenty five per request, which is one request for a batch instead of one per person. |
| **No API key needed** | CourtListener throttles anonymous callers at 5 requests a minute per IP, and each request returns 20 rows. Turn the proxy on for a fresh exit IP per request, or paste your own free CourtListener key and the throttle disappears. |
| **You pay for what you keep** | Rows are billed as they are written and capped at Max Items, so a page that overshoots the cap is trimmed before it is charged. Duplicates are dropped before billing, never after. |

### 📈 How it compares to alternatives

| | This Actor | Attorney directory scrapers | The FJC directory site |
|---|---|---|---|
| Coverage | 15,119 people, federal and state, back to 1789 | Practising lawyers in one commercial directory | Federal judges only, 1789 to today |
| Court filter | All 3,359 CourtListener court IDs, ORed in one search | City or practice area | Federal courts only |
| Appointment detail | Nomination, referral, committee action, confirmation, retirement, per seat | None | Yes, on the person page |
| Career history | Every seat on the row plus a full positions array | Current firm only | Federal seats only |
| Schools, ABA ratings, party | On the row | Sometimes schools | Schools and ABA ratings, no party |
| Rows a free account can preview | 10 | Varies | Not applicable |
| Ceiling | Anonymous API throttle of 5 requests a minute per IP, lifted by a free key or the proxy | Anti-bot defences | Manual browsing |

State bar membership, contact details, disciplinary history and private practice records are not in this database and this Actor does not invent them. For practising attorney contact data, use a bar or directory scraper instead.

### 🚀 How to use

1. [Create a free Apify account with $5 in credit](https://console.apify.com/sign-up?fpr=vmoqkp).
2. Open the [CourtListener Attorney Profiles Scraper](https://apify.com/parseforge/courtlistener-attorney-profiles-scraper?fpr=vmoqkp).
3. Pick the courts you care about, add a name, school or appointer if you want to narrow it, and click **Start**.
4. Export the results as CSV, Excel, JSON, or XML from the **Dataset** tab.

One typical run: `courts` `["ca9"]`, `selectionMethod` `a_pres`, `bornAfter` `01/01/1960`, `maxItems` `200`. Run it programmatically through the [Apify API](https://docs.apify.com/api/v2) or the [ApifyClient](https://docs.apify.com/api/client/js) for JavaScript and Python.

### 💼 Business use cases

#### ⚖️ Judge research before a filing

Pull the profile of the judge assigned to your case: how long they have sat, what they did before the bench, who appointed them, which schools they attended, and every earlier court on their record. Appellate teams do the same for a whole circuit panel in one run by setting `courts` to `ca9` or `cadc`.

#### 🧮 Build a judiciary table for analytics

The `personId` column is CourtListener's own stable ID, the same one that appears as `assignedToId` on a RECAP docket row. Pull the bench once, join it to your docket table, and every case in your warehouse gains the judge's tenure, appointer and background without a second lookup.

#### 📊 Study the bench

Filter by appointer, party, selection method or birth state and count. New York accounts for 526 profiles, California 332 and Texas 321. 3,847 people are recorded as Democratic and 3,404 as Republican. Law schools, diversity researchers and reporters use these cuts to measure how the bench has changed.

#### 🎓 Map clerkships and career paths

Clerkships appear as positions with a `supervisor`, so the people who clerked for a given justice come back with the years they served. Recruiters and legal media use it to trace where a cohort ended up.

### 🔌 Automating CourtListener Attorney Profiles Scraper

- **Make / Zapier:** run it on a schedule and push new or changed profiles into a CRM, a Google Sheet or a Slack channel.
- **Slack:** post an alert when a court gains a new sitting judge.
- **Airbyte:** land the dataset in Snowflake, BigQuery or Postgres and join it to your docket tables.
- **GitHub:** commit the JSON export to a repository to keep a versioned history of the bench.
- **Google Drive:** drop the CSV or Excel export into a shared folder for the practice group.

### 🌟 Beyond business use cases

- **Research:** measure judicial tenure, appointment lag between nomination and confirmation, or the spread of law schools across the federal bench over two centuries.
- **Personal:** look up the judge on your own case, or trace a family member who sat on a state court.
- **Non-profit:** track diversity on the courts you monitor, using the source's own race and gender fields.
- **Experimentation:** join profiles to opinion authorship and test whether background predicts anything at all.

### 🤖 Ask an AI assistant about this scraper

Give an AI agent live access to the judicial people database through the Model Context Protocol:

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/courtlistener-attorney-profiles-scraper"
```

Then prompt it in plain language:

- *"Which judges on the Ninth Circuit were appointed by a Democratic president?"*
- *"List every sitting Supreme Court justice with their confirmation date and law school."*
- *"Who clerked at the Supreme Court and later became a federal judge?"*

Copy this into ChatGPT, Claude, or Cursor to start:

```
Use the Apify Actor "parseforge/courtlistener-attorney-profiles-scraper" to search CourtListener's judicial people database. Input: { "startUrls": [{"url":"https://www.courtlistener.com/person/8543/amy-coney-barrett/"}], "query": "<text>", "name": "<surname>", "courts": ["scotus","ca9"], "school": "<school>", "appointer": "<president or governor>", "politicalAffiliation": "d" | "r" | "i" | "j" | "f" | "w" | "g" | "z", "selectionMethod": "a_pres" | "a_gov" | "a_judge" | "e_non_part" | "ct_trans", "birthState": "NY", "bornAfter": "MM/DD/YYYY", "maxItems": <n> }. It returns name, profile URL, person ID, current court and seat, appointer, career dates, schools, ABA ratings, party, biography and a full positions array per row. Call it with the ApifyClient and my APIFY_TOKEN.
```

### ❓ Frequently Asked Questions

#### ❓ Do I need a CourtListener account?

No. Every endpoint this Actor reads is public and anonymous. A free CourtListener API key is supported and lifts the 5-requests-a-minute throttle for long runs, but it is optional and never required.

#### ❓ Is this a directory of practising attorneys?

No, and that matters. CourtListener's people database is the judiciary: judges, justices, magistrates and the clerkships and earlier jobs on their records. It is the right source for the bench and for the lawyers who joined it, and the wrong source for a list of practising lawyers in a city. It carries no email addresses, no phone numbers and no bar numbers.

#### ❓ How many people are in it?

15,119 profiles across 3,359 courts, measured on 2026-09-08. Coverage is deepest on the federal bench, which comes from the Federal Judicial Center directory, and thinner but real on state courts: 3,752 people at the California Superior Court, 534 at the New York Supreme Court, 103 at the Supreme Court of California.

#### ❓ What does `isActive` mean?

That at least one of the person's seats has no termination date on record and the person is not recorded as deceased. It reflects what CourtListener holds, so a recent retirement can lag until the record is updated. `lastUpdated` tells you when the record was last touched.

#### ❓ How is the current position chosen?

It is the most recent seat that was never terminated. When every seat on the record is closed, the most recent of those is used instead, so a retired judge still reports a real court rather than a blank. Every other seat stays on the row and in the `positions` array.

#### ❓ Can I look up one specific person?

Yes. Paste their CourtListener profile URL into the URL list. The Actor reads the numeric person ID out of the URL and resolves twenty five of them per request, so a batch of profiles costs one request rather than twenty five.

#### ❓ Why are some fields `Not Disclosed`?

Because the source did not fill them for that person. Religion is on 3 of 20 profiles in a random sample, ABA ratings on 7 of 20, aliases on 2 of 20. Historical judges have thinner records than sitting ones. `Not Disclosed` means the field exists and is empty; `N/A` means it does not apply, like a date of death for a living judge.

#### ❓ Which sort orders are supported?

Two, because that is all CourtListener's person index offers: best match first and last name A to Z. Sorting by date of birth or death returns HTTP 400 from the source, so those options are not exposed.

#### ❓ Why am I getting no results?

Every filter is ANDed, and an over-narrow combination returns an empty set rather than an error. Drop one filter at a time. Some values are genuinely tiny: the Green party matches 2 profiles and the Reform party 2.

#### ❓ How fast is it, and what is the ceiling?

CourtListener throttles anonymous callers at 5 requests a minute per IP, and each request returns 20 rows, so a direct run tops out around 100 rows a minute and waits out the throttle when it hits it. Turn on the proxy for a fresh exit IP per request, or add a free CourtListener key, and the throttle no longer binds.

#### ❓ Are there photographs?

No. The search index carries no image field for people, so there is no image column and the Actor does not fabricate one.

#### ❓ Does it deduplicate?

Yes. Rows are keyed by CourtListener person ID across every search in a run, so a person who matches two of your batches is written and charged once.

#### ❓ How fresh is the data?

It is read at run time from the same index that powers courtlistener.com, so a run reflects the database as it stands that minute. `lastUpdated` on each row carries the source's own modification timestamp.

#### ❓ Can I filter by state court?

Yes. The court list holds every court CourtListener publishes, including state supreme, appellate and trial courts. Pick as many as you like; they are combined with OR in a single search.

#### ❓ How many rows per run?

Free plan: 10, as a preview. Paid plans: up to 1,000,000, bounded by how many profiles your query actually matches.

### 🔌 Integrate with any app

The dataset is available through the Apify API and the JavaScript and Python clients, and every run can be scheduled, triggered by webhook or wired into Make, Zapier, n8n, Airbyte, Google Sheets, Slack and GitHub from the **Integrations** tab.

### 🔗 Recommended Actors

- [CourtListener Opinions Scraper](https://apify.com/parseforge/court-listener-opinions-scraper?fpr=vmoqkp): full opinion text from the same archive, so you can read what these judges wrote.
- [CourtListener State Court Dockets Scraper](https://apify.com/parseforge/courtlistener-dockets-scraper?fpr=vmoqkp): state court dockets with the judge assigned to each case.
- [CourtListener Business Bankruptcy Scraper](https://apify.com/parseforge/business-bankruptcy-filings-scraper?fpr=vmoqkp): US business bankruptcy filings by chapter and court.
- [Avvo Attorney Profile Scraper](https://apify.com/parseforge/avvo-attorney-scraper?fpr=vmoqkp): practising attorney profiles with contact details, which this database does not carry.
- [California State Bar Scraper](https://apify.com/parseforge/california-state-bar-scraper?fpr=vmoqkp): bar admission status and discipline history for California attorneys.

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge) for more court, government and public-records scrapers.

**🆘 Need Help?** [Open our contact form](https://tally.so/r/BzdKgA) with your run ID, your input, and what you expected.

> **⚠️ Disclaimer:** This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by the Free Law Project or CourtListener. It collects only publicly available data through the public API. You are responsible for using the data in compliance with CourtListener's terms and applicable laws. These records concern real people: do not use this data to identify, profile, or target individuals.

# Actor input Schema

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

CourtListener profile pages such as https://www.courtlistener.com/person/57/henry-lee-adams-jr/. Each URL is resolved by its numeric person id, twenty five per request. Leave empty to search the whole database with the filters below instead.

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

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000. Leave empty on a paid plan for 100 profiles.

## `query` (type: `string`):

Full text query across the profile: name, court, school, appointing authority. Supports quoted phrases and AND/OR/NOT. Leave empty to browse with the filters alone.

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

Match on the person name only, unlike the broader search query. "Smith" returns 133 profiles.

## `courts` (type: `array`):

Return only people who have held a seat at one of these courts. Several courts are combined with OR in a single search, so picking more courts widens the result set.

## `school` (type: `string`):

Match the schools attached to the profile, for example Harvard (692 profiles) or Yale (395).

## `appointer` (type: `string`):

Name of the appointing president or governor, for example Obama (324 profiles) or Reagan.

## `politicalAffiliation` (type: `string`):

Party recorded for the person. Democratic and Republican cover most of the database; the historical parties are small but real.

## `selectionMethod` (type: `string`):

Selection method recorded on at least one of the person positions.

## `birthCity` (type: `string`):

City of birth exactly as CourtListener records it, for example Boston (36 profiles).

## `birthState` (type: `string`):

Two letter state of birth. New York (526), Texas (321) and California (332) are the largest.

## `bornAfter` (type: `string`):

Keep only people born on or after this date. Accepts MM/DD/YYYY or a bare year.

## `bornBefore` (type: `string`):

Keep only people born on or before this date. Accepts MM/DD/YYYY or a bare year.

## `orderBy` (type: `string`):

CourtListener sorts person results two ways only. Relevance is the default; the reverse name order walks the database alphabetically by last name.

## `courtListenerKey` (type: `string`):

A free CourtListener API key (Profile > API on courtlistener.com) lifts the anonymous throttle and makes long runs faster. Leave empty to run anonymously.

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

Off by default: the CourtListener API is open. Turn it on for long anonymous runs so each request gets a fresh exit IP and its own throttle allowance. Not used when an API key is supplied.

## Actor input object example

```json
{
  "startUrls": [],
  "maxItems": 10,
  "courts": [
    "scotus"
  ],
  "selectionMethod": "a_pres",
  "orderBy": "score desc",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Key fields: name, profile URL, current court and seat, appointer, career dates, schools, party and biography

## `fullData` (type: `string`):

Complete dataset with all 42 fields, including the full positions array

# 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": [],
    "maxItems": 10,
    "courts": [
        "scotus"
    ],
    "selectionMethod": "a_pres",
    "orderBy": "score desc",
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/courtlistener-attorney-profiles-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": [],
    "maxItems": 10,
    "courts": ["scotus"],
    "selectionMethod": "a_pres",
    "orderBy": "score desc",
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/courtlistener-attorney-profiles-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": [],
  "maxItems": 10,
  "courts": [
    "scotus"
  ],
  "selectionMethod": "a_pres",
  "orderBy": "score desc",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call parseforge/courtlistener-attorney-profiles-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/courtlistener-attorney-profiles-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/4fbTvK4NENbXz5ptg/builds/eQthwcnG2eRdq4oYw/openapi.json
