# CourtListener Civil Cases Scraper - PACER by Nature of Suit (`parseforge/courtlistener-civil-cases-scraper`) Actor

Federal civil cases from the RECAP archive, filtered by JS-44 nature of suit, cause of action, court, party and date. Criminal and bankruptcy records are dropped. Returns cases, filings or case law with parties, counsel and firms. No API key needed.

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

## Pricing

from $2.10 / 1,000 civil case with filings

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 Civil Cases Scraper

> 🚀 **Export federal civil cases from the CourtListener RECAP archive in seconds.** Pick a JS-44 nature of suit, a court and a date range, and get one 36-field row per case with the judge, every party, counsel and law firm, and the filings that matched. The civil-rights category alone holds 13,084 dockets filed since January 2026.

Pull federal civil cases out of CourtListener's RECAP archive the way they are actually filed: by JS-44 nature of suit, cause of action, court, party and date. Patent suits in the Eastern District of Texas, ADA employment claims filed this month, securities class actions against a named company. Criminal cases and bankruptcy petitions are dropped, so the output is civil litigation and nothing else. No login and no API key required, and the results export to CSV, JSON, Excel, or XML.

The RECAP index is one pool of 8.8 million federal dockets and 60 million filings, and civil, criminal and bankruptcy share it. Measured on 2026-09-07, only 100 of 500 fresh dockets were civil cases. This Actor filters on the nature-of-suit code server side (all 93 JS-44 codes in 14 categories, every one verified to return cases) and screens what is left against the PACER case type, so you never page through chapter 13 petitions to find a contract dispute.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Litigation and IP teams | New patent, trademark and trade-secret suits by court and week |
| Employment and civil rights firms | Title VII, ADA and Section 1983 filings, with the assigned judge |
| Insurers and risk analysts | Tort, product liability and insurance dockets by cause of action |
| Legal tech and AI teams | Structured civil dockets with stable IDs, parties, counsel and firms |
| Journalists and watchdogs | Suits against an agency or a company, as they are filed |

### 📋 What the CourtListener Civil Cases Scraper does

> 💡 **Why it matters:** PACER charges per page and has no nature-of-suit search across districts. CourtListener's public search API does, but it returns civil, criminal and bankruptcy records in one stream with the fields buried in nested JSON. This Actor sends your filters to the API, keeps only civil cases, flattens each docket into one row, and never bills for a record it did not deliver.

Pick a nature-of-suit category, or the exact JS-44 codes, and the Actor queries CourtListener's search API live, following the cursor until it has the rows you asked for. Filters are applied server side, so you pay for matches rather than for filtering afterwards.

- ⚖️ **Civil cases (default).** Case caption, court and court ID, docket number, PACER case ID, date filed, date terminated and whether the case is still pending, nature of suit as a code and as a label, JS-44 category, cause of action, jurisdiction type, jury demand, assigned and referred judge with their CourtListener IDs, every party with IDs, counsel of record, law firms, and the filings that matched your query.
- 🗂️ **Civil cases only.** The same row without the matched-documents list, for the fastest scan of a court or a category.
- 📄 **Individual filings.** One row per document: entry number and date, document and attachment number, document type, short and long description, page count, PACER document ID, the opinions it cites, whether the free PDF is in the RECAP archive, and the docket ID and URL that tie it back to its case.
- 🕰️ **Full docket timeline (opt-in).** Every entry on the case, oldest first, not just the ones that matched the search. One case measured on 2026-09-07 carried 1,537 entries.
- 📚 **Case law opinions.** Published opinions with reported citations, citation count, precedential status, judge and panel, syllabus and the source PDF URL, from 8.3 million opinions.
- 🧹 **Civil means civil.** Bankruptcy petitions and criminal cases are screened out by PACER case type and bankruptcy chapter, never by guessing from the caption. Turn `civilOnly` off to get the raw feed.
- 🏷️ **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 federal civil case. Fields, in dataset order:

| Field | Description |
|---|---|
| 🗂 `dataset` | `cases`, `dockets`, `filings` or `opinions` |
| 🆔 `docketId` | CourtListener docket ID, stable across runs |
| ⚖️ `caseName` | Case caption |
| 🔗 `url` | Docket page on courtlistener.com |
| 🏛 `court` / 🏷 `courtId` / 📎 `courtCitationString` | Court name, CourtListener court ID (for example `txed`), reporter-style abbreviation |
| 🔢 `docketNumber` | PACER docket number, for example `2:26-cv-02492` |
| 🧾 `pacerCaseId` | PACER's internal case ID |
| 📅 `dateFiled` / 🏁 `dateTerminated` / ⏳ `isPending` | Filing date, termination date (`N/A` while pending), `Yes` or `No` |
| 📝 `natureOfSuitRaw` / 🔣 `natureOfSuitCode` / 📌 `natureOfSuit` / 🗃 `suitCategory` | The cover-sheet text as PACER wrote it, the three-digit JS-44 code, its label and its category |
| 📜 `cause` | Cause of action, for example `42:1983 Civil Rights Act` |
| 🌐 `jurisdictionType` / 🧑‍⚖️ `juryDemand` | Federal question, diversity, U.S. government party; who demanded a jury |
| 👩‍⚖️ `assignedTo` / `assignedToId` / 👨‍⚖️ `referredTo` / `referredToId` | District judge and magistrate judge with their CourtListener IDs |
| 👥 `parties` / `partyIds` / `partyCount` | Every party, semicolon-separated, with IDs and a count |
| 💼 `attorneys` / `attorneyIds` / 🏢 `lawFirms` / `lawFirmIds` | Counsel of record and their firms, with IDs |
| 📄 `matchedDocumentCount` / 📂 `matchedDocuments` / ➕ `hasMoreDocuments` | The filings that matched your query (entry number, date, type, description, PDF availability, PACER document ID, URL), and whether the docket holds more |
| 🕓 `dateCreated` | When the docket entered RECAP |
| 🕒 `scrapedAt` | ISO timestamp of the collection |
| ❌ `error` | `null` on success; error rows carry only this field and are never charged |

With `includeTimeline` on, two more columns appear before `dateCreated`: `timelineEntryCount` and `timeline`. The filings and opinions datasets use their own row layouts, described in the FAQ.

Three real records from a verification run (civil rights, filed since 01/01/2026, Max Items 10):

```json
[
  {
    "dataset": "cases",
    "docketId": 74754532,
    "caseName": "Devine v. Smokie Jerrys Tiki Bar & Grill LLC",
    "url": "https://www.courtlistener.com/docket/74754532/devine-v-smokie-jerrys-tiki-bar-grill-llc/",
    "court": "District Court, M.D. Florida",
    "courtId": "flmd",
    "courtCitationString": "M.D. Fla.",
    "docketNumber": "2:26-cv-02492",
    "pacerCaseId": "465797",
    "dateFiled": "2026-09-04",
    "dateTerminated": "N/A",
    "isPending": "Yes",
    "natureOfSuitRaw": "442 Civil Rights: Jobs",
    "natureOfSuitCode": "442",
    "natureOfSuit": "Employment",
    "suitCategory": "Civil rights",
    "cause": "28:1331 Fed. Question: Employment Discrimination",
    "jurisdictionType": "Federal Question",
    "juryDemand": "Plaintiff",
    "assignedTo": "Not Disclosed",
    "assignedToId": "Not Disclosed",
    "referredTo": "Not Disclosed",
    "referredToId": "Not Disclosed",
    "parties": "Taylor Devine; Smokie Jerrys Tiki Bar & Grill LLC",
    "partyIds": "23655888; 23655887",
    "partyCount": 2,
    "attorneys": "Taylor Devine",
    "attorneyIds": "16027169",
    "lawFirms": "Not Disclosed",
    "lawFirmIds": "Not Disclosed",
    "matchedDocumentCount": 0,
    "matchedDocuments": [],
    "hasMoreDocuments": "No",
    "dateCreated": "2026-09-04T23:15:42.144400Z",
    "scrapedAt": "2026-09-08T04:46:28.267Z",
    "error": null
  },
  {
    "dataset": "cases",
    "docketId": 74753149,
    "caseName": "Lietzke v. Marquirettes",
    "url": "https://www.courtlistener.com/docket/74753149/lietzke-v-marquirettes/",
    "court": "District Court, W.D. Oklahoma",
    "courtId": "okwd",
    "courtCitationString": "W.D. Okla.",
    "docketNumber": "5:26-cv-02389",
    "pacerCaseId": "138072",
    "dateFiled": "2026-09-04",
    "dateTerminated": "N/A",
    "isPending": "Yes",
    "natureOfSuitRaw": "440 Civil Rights: Other",
    "natureOfSuitCode": "440",
    "natureOfSuit": "Other civil rights",
    "suitCategory": "Civil rights",
    "cause": "42:1983 Civil Rights Act",
    "jurisdictionType": "Federal Question",
    "juryDemand": "None",
    "assignedTo": "Patrick Robert Wyrick",
    "assignedToId": 8654,
    "referredTo": "Not Disclosed",
    "referredToId": "Not Disclosed",
    "parties": "Marquirettes; Bill Lietzke",
    "partyIds": "23657030; 23657031",
    "partyCount": 2,
    "attorneys": "Bill Lietzke",
    "attorneyIds": "16028565",
    "lawFirms": "Bill Lietzke",
    "lawFirmIds": "616447",
    "matchedDocumentCount": 2,
    "matchedDocuments": [
      {
        "id": 492604829,
        "docketEntryId": 477025481,
        "documentNumber": "1",
        "attachmentNumber": "N/A",
        "entryNumber": 1,
        "entryDateFiled": "2026-09-04",
        "documentType": "PACER Document",
        "shortDescription": "Complaint",
        "description": "COMPLAINT against Marquirettes filed by Bill Lietzke. (Attachments: # 1 Attachment 1 - Proposed Summons, # 2 Civil Cover Sheet, # 3 Envelope)(alw) (Entered: 09/04/2026)",
        "isAvailable": "No",
        "pageCount": "Not Disclosed",
        "url": "https://www.courtlistener.com/docket/74753149/1/lietzke-v-marquirettes/",
        "filepathLocal": "N/A",
        "pacerDocId": "14906856326",
        "snippet": "N/A"
      },
      {
        "id": 492616647,
        "docketEntryId": 477036786,
        "documentNumber": "2",
        "attachmentNumber": "N/A",
        "entryNumber": 2,
        "entryDateFiled": "2026-09-04",
        "documentType": "PACER Document",
        "shortDescription": "Proceed In Forma Pauperis",
        "description": "MOTION for Leave to Proceed in forma pauperis by Bill Lietzke. (Attachments: # 1 Envelope)(alw) (Entered: 09/04/2026)",
        "isAvailable": "No",
        "pageCount": "Not Disclosed",
        "url": "https://www.courtlistener.com/docket/74753149/2/lietzke-v-marquirettes/",
        "filepathLocal": "N/A",
        "pacerDocId": "14906856338",
        "snippet": "N/A"
      }
    ],
    "hasMoreDocuments": "No",
    "dateCreated": "2026-09-04T20:16:39.320613Z",
    "scrapedAt": "2026-09-08T04:46:24.030Z",
    "error": null
  },
  {
    "dataset": "cases",
    "docketId": 74752079,
    "caseName": "Harris v. Houston Independent School District",
    "url": "https://www.courtlistener.com/docket/74752079/harris-v-houston-independent-school-district/",
    "court": "District Court, S.D. Texas",
    "courtId": "txsd",
    "courtCitationString": "S.D. Tex.",
    "docketNumber": "4:26-cv-07448",
    "pacerCaseId": "2108275",
    "dateFiled": "2026-09-04",
    "dateTerminated": "N/A",
    "isPending": "Yes",
    "natureOfSuitRaw": "448 Civil Rights: Education",
    "natureOfSuitCode": "448",
    "natureOfSuit": "Education",
    "suitCategory": "Civil rights",
    "cause": "28:1983 Civil Rights",
    "jurisdictionType": "Federal Question",
    "juryDemand": "None",
    "assignedTo": "Andrew S. Hanen",
    "assignedToId": 1354,
    "referredTo": "Not Disclosed",
    "referredToId": "Not Disclosed",
    "parties": "Lovie Harris; Houston Independent School District",
    "partyIds": "23656729; 23656730",
    "partyCount": 2,
    "attorneys": "Lovie Harris",
    "attorneyIds": "16028275",
    "lawFirms": "Lovie Harris",
    "lawFirmIds": "1370933",
    "matchedDocumentCount": 3,
    "matchedDocuments": [
      {
        "id": 492688567,
        "docketEntryId": 477102832,
        "documentNumber": "1",
        "attachmentNumber": "N/A",
        "entryNumber": 1,
        "entryDateFiled": "2026-09-04",
        "documentType": "PACER Document",
        "shortDescription": "Not Disclosed",
        "description": "COMPLAINT against Houston Independent School District filed by Lovie Harris. (Attachments: # 1 Civil Cover Sheet) (amp4) (Entered: 09/04/2026)",
        "isAvailable": "No",
        "pageCount": "Not Disclosed",
        "url": "https://www.courtlistener.com/docket/74752079/1/harris-v-houston-independent-school-district/",
        "filepathLocal": "N/A",
        "pacerDocId": "179051286601",
        "snippet": "N/A"
      },
      {
        "id": 492688568,
        "docketEntryId": 477102833,
        "documentNumber": "2",
        "attachmentNumber": "N/A",
        "entryNumber": 2,
        "entryDateFiled": "2026-09-04",
        "documentType": "PACER Document",
        "shortDescription": "Not Disclosed",
        "description": "MOTION/APPLICATION to Proceed In Forma Pauperis by Lovie Harris, filed. Motion Docket Date 9/25/2026. (amp4) (Entered: 09/04/2026)",
        "isAvailable": "No",
        "pageCount": "Not Disclosed",
        "url": "https://www.courtlistener.com/docket/74752079/2/harris-v-houston-independent-school-district/",
        "filepathLocal": "N/A",
        "pacerDocId": "179051286852",
        "snippet": "N/A"
      },
      {
        "id": 492688569,
        "docketEntryId": 477102834,
        "documentNumber": "N/A",
        "attachmentNumber": "N/A",
        "entryNumber": "N/A",
        "entryDateFiled": "2026-09-04",
        "documentType": "PACER Document",
        "shortDescription": "Not Disclosed",
        "description": "Referral Judge Selected: Magistrate Judge Christina A. Bryan randomly selected to receive referrals. The selected Magistrate Judge is not assigned to this case until a District Judge refers the case or a motion or the parties consent to jurisdiction of the Magistrate Judge. Once a referral has been made, the name of the referral judge will appear at the top of the docket sheet. (amp4)",
        "isAvailable": "No",
        "pageCount": "Not Disclosed",
        "url": "N/A",
        "filepathLocal": "N/A",
        "pacerDocId": "Not Disclosed",
        "snippet": "N/A"
      }
    ],
    "hasMoreDocuments": "Yes",
    "dateCreated": "2026-09-04T18:27:30.993620Z",
    "scrapedAt": "2026-09-08T04:46:32.469Z",
    "error": null
  }
]
```

### ✨ Why choose this Actor

| | What you get |
|---|---|
| **Civil means civil** | Bankruptcy petitions and criminal cases are screened out by PACER case type and bankruptcy chapter, not by hoping the caption looks civil. Turn `civilOnly` off if you want the raw feed. |
| **93 nature-of-suit codes** | Every JS-44 code, grouped into 14 categories you can pick from a list. All 93 were measured one by one against the API on 2026-09-07 and all 93 return cases, from 75,281 for alien detainee petitions down to 2 for recovery of veteran's benefits, covering 303,054 federal civil cases filed since 2024. |
| **Cause of action, not just case type** | `cause` filters on the statute the complaint is brought under, for example `28:1332 Diversity` or `42:1983`. Measured: it cuts a 1,001,445-docket feed to 13,903. |
| **Counsel and firms on the row** | Parties, attorneys and law firms come back with their CourtListener IDs. Measured on 60 cases: 60/60 had parties, 59/60 counsel, 57/60 firms. |
| **The full timeline, on request** | The search row only carries the documents that matched your query. Turn on `includeTimeline` and each case also gets its complete docket entry list. |
| **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 `maxItems`, so a page that overshoots the cap is trimmed before it is charged. Non-civil records and duplicates are dropped before billing, never after. |

### 📈 How it compares to alternatives

| | This Actor | Other CourtListener actors | PACER directly |
|---|---|---|---|
| Nature-of-suit filter | 93 codes in 14 pickable categories, one search per code | Usually a free-text box or none | Per-court only, no cross-district search |
| Civil versus criminal and bankruptcy | Screened by case type and chapter before billing | Mixed feed | Mixed feed |
| Parties, counsel, firms | On every row, with IDs | Rarely | Behind the docket sheet, per page |
| Matched filings and full timeline | Matched filings on the row, full timeline opt-in | Sometimes, as a separate mode | Per page |
| Rows a free account can preview | 10 | Varies | None |
| Ceiling | Anonymous API throttle of 5 requests a minute per IP, lifted by a free key or the proxy | Same source, same ceiling | Per-page fees |

### 🚀 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 Civil Cases Scraper](https://apify.com/parseforge/courtlistener-civil-cases-scraper?fpr=vmoqkp).
3. Pick a nature-of-suit category, set your court and dates, and click **Start**.
4. Export the results as CSV, Excel, JSON, or XML from the **Dataset** tab.

One typical run: `dataset` `cases`, `suitCategories` `["intellectual-property"]`, `court` `txed`, `filedAfter` `01/01/2026`, `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

#### 📡 Watch a case type as it is filed

Set a category such as intellectual property or civil rights, sort by filing date, and run it on a schedule. Each run returns the newest suits first, so a diff against the last run is your alert feed. A litigation funder can see every new 830 patent case in `txed` and `dedcourt` the morning after it is docketed.

#### ⚔️ Track litigation against a company

`partyName` searches the party list, which is what PACER indexes, so a company's suits come back whether it is plaintiff or defendant. Insurers and M\&A teams use it to build a litigation history before underwriting or a deal.

#### 🏛️ Map a court's civil docket

Set `court` to a district ID such as `txed`, `cand` or `nysd` and pull every civil case filed in a date range, grouped by the code the plaintiff wrote on the cover sheet. Law firm marketing teams use the `assignedTo` and `attorneys` columns to see who is filing what before whom.

#### 📊 Measure filing trends

Every row carries the nature-of-suit code, the JS-44 category and the cause of action, so counts by court, quarter and case type fall out of a group-by. Legal analytics vendors feed the stable `docketId` into their own tables and refresh it on a schedule.

### 🔌 Automating CourtListener Civil Cases Scraper

- **Make / Zapier:** trigger a run on a schedule, then push new rows to a CRM, a Google Sheet or a Slack channel.
- **Slack:** post each new case caption, court and cause to a litigation-watch channel.
- **Airbyte:** land the dataset in Snowflake, BigQuery or Postgres for analytics.
- **GitHub:** commit the JSON export to a repository to keep a versioned history of filings.
- **Google Drive:** drop the CSV or Excel export into a shared folder for the practice group.

### 🌟 Beyond business use cases

- **Research:** count Section 1983 filings by district and year, or trace the spread of a new cause of action across circuits.
- **Personal:** follow a case you are a party to, or watch a company you are in a dispute with.
- **Non-profit:** monitor civil rights, housing and immigration filings in the districts you serve.
- **Experimentation:** train classifiers on cover-sheet codes versus complaint text, or build a docket-alert bot on top of the JSON export.

### 🤖 Ask an AI assistant about this scraper

Give an AI agent live access to federal civil dockets through the Model Context Protocol:

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

Then prompt it in plain language:

- *"List the patent suits filed in the Eastern District of Texas this month."*
- *"Find ADA employment cases filed against school districts in 2026."*
- *"Which judges are assigned the most securities cases in the Southern District of New York?"*

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

```
Use the Apify Actor "parseforge/courtlistener-civil-cases-scraper" to search federal civil cases. Input: { "dataset": "cases" | "dockets" | "filings" | "opinions", "suitCategories": ["intellectual-property"], "natureOfSuitCodes": ["830"], "court": "<court id>", "filedAfter": "MM/DD/YYYY", "partyName": "<name>", "maxItems": <n> }. It returns case name, court, docket number, dates, nature of suit, cause, judge, parties, counsel and firms 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 (`courtListenerKey`) and lifts the 5-requests-a-minute throttle for long runs, but it is optional.

#### ❓ What is a nature of suit?

The three-digit code the plaintiff writes on the JS-44 civil cover sheet, for example 830 for patent or 442 for employment discrimination. It is how federal civil cases are classified, and this Actor searches by it.

#### ❓ Does it cover state courts?

No. RECAP is the federal PACER archive. The opinions dataset does include state appellate case law.

#### ❓ 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. The rarer codes are genuinely rare: recovery of veteran's benefits matched 2 cases in all of 2024 and 2025.

#### ❓ Why are the newest cases missing their nature of suit or judge?

A case enters RECAP with whatever the first donated filing carried, and the cover-sheet fields arrive later. Measured on 2026-09-07: of 100 dockets filed that same day, 1 had a nature of suit, while of 60 cases filed in 2024 and 2025 all 60 had one. Those cells read `Not Disclosed` until the data lands.

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

#### ❓ Can I get the documents themselves?

The ones already donated to the free RECAP archive, yes: each filing carries the archive path in `filepathLocal` and `isAvailable` tells you whether the PDF is there. Turn on `availableOnly` to keep only cases with free PDFs.

#### ❓ Does it return the full docket?

On request. `includeTimeline` fetches every entry per case as a second search and adds `timelineEntryCount` and `timeline` to the row. It is off by default because it adds one request per case.

#### ❓ What do the filings and opinions rows look like?

A filing row is the document plus the `docketId` and `caseUrl` that link it back to its case: `id`, `docketEntryId`, `documentNumber`, `attachmentNumber`, `entryNumber`, `entryDateFiled`, `documentType`, `shortDescription`, `description`, `isAvailable`, `pageCount`, `url`, `caseUrl`, `filepathLocal`, `pacerDocId`, `citedOpinionIds`, `snippet`, `dateCreated`. An opinion row carries `clusterId`, `caseName`, `court`, `docketNumber`, `status`, `dateFiled`, `syllabus`, `judge`, `panelNames`, `citations`, `citeCount`, `opinionType`, `downloadUrl` and the opinions it cites.

#### ❓ Why fewer rows than Max Items?

Either your query has that many matches, or non-civil records and duplicates were dropped. The log prints CourtListener's own total per search and how many records were skipped.

#### ❓ Why does a case show dates that do not match its docket number?

A handful of RECAP dockets carry entries from an older case that reused the same PACER slot, so `dateFiled` and the entry dates can disagree. That is what the source index holds; the Actor passes it through and `url` takes you to the docket so you can check.

#### ❓ How fresh is the data?

It is read at run time from the same index that powers courtlistener.com. Dockets appear as RECAP receives them from the courts' RSS feeds and from RECAP extension users.

#### ❓ Does it deduplicate?

Yes. The API paginates by cursor, which is stable, and rows are keyed by docket or document ID across all the searches in a run, so a case that matches two codes is written and charged once.

#### ❓ How many rows per run?

Free plan: 10, as a preview. Paid plans: up to 1,000,000, bounded by how many records 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 Scraper](https://apify.com/parseforge/courtlistener-docket-scraper?fpr=vmoqkp): all six CourtListener indexes, including judges and oral arguments.
- [CourtListener Business Bankruptcy Scraper](https://apify.com/parseforge/business-bankruptcy-filings-scraper?fpr=vmoqkp): US business bankruptcy filings by chapter and court, the records this Actor deliberately drops.
- [CourtListener Opinions Scraper](https://apify.com/parseforge/court-listener-opinions-scraper?fpr=vmoqkp): full opinion text, walked by court feed.
- [Justia Case Law Scraper](https://apify.com/parseforge/justia-case-law-scraper?fpr=vmoqkp): published opinions from Justia by court and year.
- [Caselaw Access Project Scraper](https://apify.com/parseforge/caselaw-access-scraper?fpr=vmoqkp): historical US case law from the Harvard Caselaw Access Project.

> 💡 **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 court data through the public API. You are responsible for using the data in compliance with CourtListener's terms and applicable laws. Court records concern real people: do not use this data to identify, profile, or target individuals.

# Actor input Schema

## `dataset` (type: `string`):

Cases returns one row per federal civil docket with the filings that matched your query attached. Dockets is the same case row without the document list. Filings returns one row per document. Opinions returns published case law instead of PACER dockets.

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

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000. Split evenly across the selected nature-of-suit codes. Leave empty on a paid plan for 100 rows.

## `suitCategories` (type: `array`):

Pick whole JS-44 groups instead of memorising codes. Each category expands to its nature-of-suit codes and is searched in turn. Leave empty to take every civil case. Not supported by the opinions dataset, where CourtListener ignores the filter.

## `natureOfSuitCodes` (type: `array`):

Exact JS-44 codes, for example 830 for patent, 850 for securities or 442 for employment discrimination. Each code is searched separately and the results are merged, with the row budget split between them. Combines with the categories above. Not supported by the opinions dataset.

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

Full-text query across the case caption, parties and filing text. Supports quoted phrases and AND/OR/NOT. Leave empty to browse with the filters alone.

## `cause` (type: `string`):

The statute the complaint is brought under, as PACER writes it, for example "28:1332 Diversity" or "42:1983". Words are matched, so "civil rights" works too.

## `court` (type: `string`):

Restrict to one court by its CourtListener ID, for example cand, nysd, txed or ca9. Space-separate several IDs to match any of them.

## `filedAfter` (type: `string`):

Earliest filing date, as MM/DD/YYYY or YYYY-MM-DD.

## `filedBefore` (type: `string`):

Latest filing date, as MM/DD/YYYY or YYYY-MM-DD.

## `caseName` (type: `string`):

Match words in the case caption, for example "smith" or "united states".

## `docketNumber` (type: `string`):

Exact docket number, for example 1:20-cv-03590.

## `partyName` (type: `string`):

Name of a party to the case, for example Google or "United States".

## `entryDescription` (type: `string`):

Match words in the docket entry description, for example complaint, motion or judgment.

## `documentNumber` (type: `string`):

Filter to a specific document number within the docket, for example 1 for the complaint.

## `availableOnly` (type: `boolean`):

Keep only cases whose filings are already in the free RECAP archive rather than paywalled behind PACER.

## `civilOnly` (type: `boolean`):

Drop criminal cases and bankruptcy petitions, which share the PACER index with civil cases. On by default: without it most of the unfiltered feed is bankruptcy. The document index does not expose the case type, so for filings pick a nature-of-suit code instead.

## `includeTimeline` (type: `boolean`):

Look up every docket entry for each case, not just the ones that matched the query. Adds the timeline and timelineEntryCount columns and costs one extra request per case, so runs are slower.

## `timelineLimit` (type: `integer`):

How many docket entries to attach when the timeline is on. Older entries come first.

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

How to order results. Relevance only means anything when a search query is set.

## `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
{
  "dataset": "cases",
  "maxItems": 10,
  "suitCategories": [
    "civil-rights"
  ],
  "filedAfter": "01/01/2026",
  "availableOnly": false,
  "civilOnly": true,
  "includeTimeline": false,
  "timelineLimit": 20,
  "orderBy": "dateFiled desc",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Key fields: case, court, docket number, dates, nature of suit, cause, judge, parties, counsel

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

Complete dataset with all 36 fields, including the matched documents 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 = {
    "dataset": "cases",
    "maxItems": 10,
    "suitCategories": [
        "civil-rights"
    ],
    "filedAfter": "01/01/2026",
    "civilOnly": true,
    "orderBy": "dateFiled desc",
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/courtlistener-civil-cases-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 = {
    "dataset": "cases",
    "maxItems": 10,
    "suitCategories": ["civil-rights"],
    "filedAfter": "01/01/2026",
    "civilOnly": True,
    "orderBy": "dateFiled desc",
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/courtlistener-civil-cases-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 '{
  "dataset": "cases",
  "maxItems": 10,
  "suitCategories": [
    "civil-rights"
  ],
  "filedAfter": "01/01/2026",
  "civilOnly": true,
  "orderBy": "dateFiled desc",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call parseforge/courtlistener-civil-cases-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/courtlistener-civil-cases-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/46XvZNJPAAw5Zhgx2/builds/1hEQfLGz8LR9phRv2/openapi.json
