# CourtListener RECAP Documents Scraper - PACER Filings (`parseforge/courtlistener-recap-documents-scraper`) Actor

Scrape individual RECAP filings from CourtListener: docket entry text, page count, public PDF link, court, judge and case. Export to CSV, JSON, Excel or XML.

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

## Pricing

from $2.26 / 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 RECAP Documents Scraper

> 🚀 **Export individual federal court filings, not just cases, in seconds.** One row per document: the docket entry text, the page count, a working link to the PDF itself, and the case, court and judge it belongs to. RECAP indexes 493,413,653 docket entries and holds the actual PDF for 17,342,712 of them.

Every other court scraper stops at the case. This one goes inside it. A federal docket is a list of filings: complaints, motions, orders, briefs, exhibits, transcripts. This Actor returns those filings one by one, straight from the CourtListener RECAP archive, which is the Free Law Project's public mirror of PACER built from documents real users have already paid for and contributed.

Each row carries 43 fields: the filing (type, docket entry text, document number, attachment number, entry number, entry date, page count, PACER document id, a permanent PDF link and a text excerpt taken from the PDF itself) and the parent case it sits in (case name, docket number, court, judge, nature of suit, cause, parties, counsel and law firms). Coverage spans 235 federal district, bankruptcy, appellate and special courts, every one of them verified to return filings.

| 🎯 Target Audience | 💡 Primary Use Cases |
| --- | --- |
| Litigation analysts | Pull every brief and order in a case as a PDF set |
| Legal AI and RAG teams | Build a corpus of real filings with text excerpts and page counts |
| Docket monitoring services | Watch for a filing type across a court, not just for new cases |
| Journalists and researchers | Find the specific document behind a story and link to it |
| Law librarians | Assemble teaching sets of motions, orders and exhibits |
| Compliance and risk teams | Read what was actually filed against a counterparty |

### 📋 What the CourtListener RECAP Documents Scraper does

You give it a search: a phrase, a court, a party, a nature of suit, a date range, or a list of docket URLs. It queries the CourtListener RECAP document index, then joins each filing back to its parent case in a single extra request per 20 cases, and writes one flat row per filing.

> 💡 **Why it matters:** PACER bills ten cents a page and gives you no way to search document text across districts. The RECAP archive already holds millions of those documents for free, but its API returns document hits and case hits as two separate shapes, with no case name, court or judge on a document hit at all. This Actor joins them, so a filing row is usable on its own, and it never bills for a record it did not deliver.

**What each row gives you**

- **The document.** Filing type, the clerk's full docket entry text, document and attachment numbers, entry number, entry date, page count, PACER document id and RECAP storage path.
- **A link that works.** When the PDF is in RECAP, `pdfUrl` points at `storage.courtlistener.com` and resolves to the real PDF with no login and no per page charge.
- **The text inside.** `textSnippet` is an excerpt of the document's own extracted text, so you can tell a two page scheduling order from a thirty eight page summary judgment brief before downloading anything.
- **The case.** Case name, docket number, court, court citation string, case filed and terminated dates, assigned judge, referring judge, nature of suit, cause, jurisdiction type, jury demand, bankruptcy chapter and PACER case id.
- **The people.** Parties, attorneys of record and law firms, as arrays.
- **The citations.** `citedOpinionIds` lists the CourtListener opinion ids the document cites, when the archive has parsed them.

### 🎬 Full Demo (🚧 Coming soon)

A walkthrough video is on the way. Until then, run the Actor with its default input: it returns five filings matching the phrase "motion for summary judgment", each with a live PDF link.

### 📊 Output

Every run writes a flat table. One row is one filing.

| Field | Type | Description |
| --- | --- | --- |
| 🆔 `documentId` | integer | CourtListener id of the document |
| 📌 `shortDescription` | string | Filing type, for example "Order on Motion for Summary Judgment" |
| 📝 `description` | string | The clerk's full docket entry text |
| 🔗 `url` | string | CourtListener page for this filing |
| 📄 `pdfUrl` | string | Direct link to the PDF, or `N/A` when RECAP does not hold it |
| ✅ `isAvailable` | string | `Yes` when the PDF is in the archive |
| 🗂 `documentType` | string | `PACER Document` or `Attachment` |
| 🔢 `documentNumber` | integer | Filing number inside the docket |
| 📎 `attachmentNumber` | integer | Attachment index, or `N/A` for a main document |
| 📎 `isAttachment` | string | `Yes` or `No` |
| #️⃣ `entryNumber` | integer | Docket entry number |
| 📅 `entryDateFiled` | string | Date the filing was entered, `YYYY-MM-DD` |
| 📃 `pageCount` | integer | Pages in the PDF |
| 🗄 `filepathLocal` | string | Path of the document inside the RECAP archive |
| 🧾 `pacerDocId` | string | PACER's own document identifier |
| 🆔 `docketEntryId` | integer | CourtListener id of the docket entry |
| 🕓 `dateAddedToRecap` | string | Date the document entered the archive |
| 🆔 `docketId` | integer | CourtListener id of the parent case |
| ⚖️ `caseName` | string | Case caption |
| 🔢 `docketNumber` | string | PACER docket number |
| 🏛 `court` | string | Court full name |
| 🏷 `courtId` | string | Court slug, for example `mad` |
| 📎 `courtCitationString` | string | Bluebook court abbreviation |
| 🔗 `docketUrl` | string | CourtListener page for the whole case |
| 📅 `caseDateFiled` | string | Date the case was filed |
| 🏁 `caseDateTerminated` | string | Date the case closed, or `N/A` |
| ⏳ `isCasePending` | string | `Yes` or `No` |
| 👩‍⚖️ `assignedTo` | string | Assigned judge |
| 🆔 `assignedToId` | integer | CourtListener judge id |
| 👨‍⚖️ `referredTo` | string | Magistrate or referring judge |
| 📌 `suitNature` | string | JS-44 nature of suit |
| 📜 `cause` | string | Statutory cause of action |
| 🌐 `jurisdictionType` | string | Basis of federal jurisdiction |
| 🧑‍⚖️ `juryDemand` | string | Jury demand as recorded in PACER |
| 📕 `chapter` | string | Bankruptcy chapter, or `N/A` |
| 🧾 `pacerCaseId` | string | PACER's own case identifier |
| 🔎 `textSnippet` | string | Excerpt of the document's extracted text |
| ⚓ `citedOpinionIds` | array | Opinion ids the document cites |
| 👥 `parties` | array | Parties to the case |
| 💼 `attorneys` | array | Attorneys of record |
| 🏢 `lawFirms` | array | Law firms of record |
| 🕒 `scrapedAt` | string | ISO timestamp of the run |
| ❌ `error` | string | Set only on a row that reports a problem |

Three real records from a run:

```json
[
  {
    "documentId": 458527966,
    "shortDescription": "Order on Motion for Summary Judgment",
    "description": "Judge Brian E. Murphy: ORDER RE MOTION FOR SUMMARY JUDGMENT granting 10 Plaintiff's Motion for Summary Judgment. (BIB)",
    "url": "https://www.courtlistener.com/docket/71293908/14/volunteer-services-for-animals-inc-v-collins/",
    "pdfUrl": "https://storage.courtlistener.com/recap/gov.uscourts.mad.288682/gov.uscourts.mad.288682.14.0.pdf",
    "isAvailable": "Yes",
    "documentType": "PACER Document",
    "documentNumber": 14,
    "attachmentNumber": "N/A",
    "isAttachment": "No",
    "entryNumber": 14,
    "entryDateFiled": "2025-11-12",
    "pageCount": 3,
    "filepathLocal": "recap/gov.uscourts.mad.288682/gov.uscourts.mad.288682.14.0.pdf",
    "pacerDocId": "095013288800",
    "docketEntryId": 443873975,
    "dateAddedToRecap": "2025-11-12",
    "docketId": 71293908,
    "caseName": "Volunteer Services for Animals, Inc v. Collins",
    "docketNumber": "1:25-cv-12485",
    "court": "District Court, D. Massachusetts",
    "courtId": "mad",
    "courtCitationString": "D. Mass.",
    "docketUrl": "https://www.courtlistener.com/docket/71293908/volunteer-services-for-animals-inc-v-collins/",
    "caseDateFiled": "2025-09-08",
    "caseDateTerminated": "N/A",
    "isCasePending": "Yes",
    "assignedTo": "Brian E. Murphy",
    "assignedToId": "Not Disclosed",
    "referredTo": "Not Disclosed",
    "suitNature": "290 Real Property: Other",
    "cause": "28:1332 Diversity-Petition to Quiet Title",
    "jurisdictionType": "Diversity",
    "juryDemand": "Not Disclosed",
    "chapter": "N/A",
    "pacerCaseId": "288682",
    "textSnippet": "Case 1:25-cv-12485-BEM Document 14 Filed 11/12/25 Page 1 of 3 UNITED STATES DISTRICT COURT FOR THE DISTRICT OF MASSACHUSETTS VOLUNTEER SERVICES FOR ANIMALS, INC. : Plaintiff, : : v. : C.A. No 1:25-cv- ...",
    "citedOpinionIds": [],
    "parties": ["Volunteer Services for Animals, Inc", "Dorothy M Collins"],
    "attorneys": ["Charles D. Blackman"],
    "lawFirms": ["Charles D. Blackman, ESQ.", "Volunteer Services for Animals, Inc"],
    "scrapedAt": "2026-09-08T07:11:38.710Z",
    "error": null
  },
  {
    "documentId": 490197697,
    "shortDescription": "Not Disclosed",
    "description": "BRIEF IN SUPPORT of Defendant's Motion for Summary Judgment and Opposition to Plaintiffs' Motion for Summary Judgment re 39 MOTION for Summary Judgment or, in the Alternative, a Preliminary Injunction, 50 MOTION for Summary Judgme ...",
    "url": "https://www.courtlistener.com/docket/73501422/51/national-family-planning-reproductive-health-association-v-kennedy-jr/",
    "pdfUrl": "https://storage.courtlistener.com/recap/gov.uscourts.pamd.152426/gov.uscourts.pamd.152426.51.0.pdf",
    "isAvailable": "Yes",
    "documentType": "PACER Document",
    "documentNumber": 51,
    "attachmentNumber": "N/A",
    "isAttachment": "No",
    "entryNumber": 51,
    "entryDateFiled": "2026-08-06",
    "pageCount": 38,
    "filepathLocal": "recap/gov.uscourts.pamd.152426/gov.uscourts.pamd.152426.51.0.pdf",
    "pacerDocId": "15509916337",
    "docketEntryId": 474688472,
    "dateAddedToRecap": "2026-08-17",
    "docketId": 73501422,
    "caseName": "National Family Planning & Reproductive Health Association v. Kennedy, Jr.",
    "docketNumber": "1:26-cv-01684",
    "court": "District Court, M.D. Pennsylvania",
    "courtId": "pamd",
    "courtCitationString": "M.D. Penn.",
    "docketUrl": "https://www.courtlistener.com/docket/73501422/national-family-planning-reproductive-health-association-v-kennedy-jr/",
    "caseDateFiled": "2026-06-18",
    "caseDateTerminated": "N/A",
    "isCasePending": "Yes",
    "assignedTo": "Jennifer P. Wilson",
    "assignedToId": "Not Disclosed",
    "referredTo": "Not Disclosed",
    "suitNature": "899 Other Statutes: Administrative Procedures Act/Review or Appeal of Agency Decision",
    "cause": "05:702 Administrative Procedure Act",
    "jurisdictionType": "U.S. Government Defendant",
    "juryDemand": "Not Disclosed",
    "chapter": "N/A",
    "pacerCaseId": "152426",
    "textSnippet": "Case 1:26-cv-01684-JPW Document 51 Filed 08/06/26 Page 1 of 38 IN THE UNITED STATES DISTRICT COURT FOR THE MIDDLE DISTRICT OF PENNSYLVANIA NATIONAL FAMILY PLANNING & REPRODUCTIVE HEALTH No. 1:26-cv-16 ...",
    "citedOpinionIds": [112864, 118096, 184088, 185857, 185924, 743059, 754047, 790935, 1202445, 1963887],
    "parties": ["Robert F. Kennedy, Jr.", "Brian Christine", "National Family Planning & Reproductive Health Association"],
    "attorneys": ["Brigitte Amiri", "Nora Ellmann", "Timothy S. Judge", "Ryan Mendias", "Chelsea G. Tejada"],
    "lawFirms": ["U.S. Department of Health and Human Services", "American Civil Liberties Union of PA"],
    "scrapedAt": "2026-09-08T07:11:38.711Z",
    "error": null
  },
  {
    "documentId": 466865963,
    "shortDescription": "Order on Motion for Summary Judgment",
    "description": "ORDER DENYING MOTION FOR SUMMARY JUDGMENT denying 30 Motion for Summary Judgment By JUDGE JOHN A. WOODCOCK, JR. (CCS) (Entered: 01/29/2026)",
    "url": "https://www.courtlistener.com/docket/72070620/55/powell-v-powell/",
    "pdfUrl": "https://storage.courtlistener.com/recap/gov.uscourts.med.69610/gov.uscourts.med.69610.55.0.pdf",
    "isAvailable": "Yes",
    "documentType": "PACER Document",
    "documentNumber": 55,
    "attachmentNumber": "N/A",
    "isAttachment": "No",
    "entryNumber": 55,
    "entryDateFiled": "2026-01-29",
    "pageCount": 13,
    "filepathLocal": "recap/gov.uscourts.med.69610/gov.uscourts.med.69610.55.0.pdf",
    "pacerDocId": "09103641574",
    "docketEntryId": 452007577,
    "dateAddedToRecap": "2026-01-29",
    "docketId": 72070620,
    "caseName": "POWELL v. POWELL",
    "docketNumber": "2:25-cv-00641",
    "court": "District Court, D. Maine",
    "courtId": "med",
    "courtCitationString": "D. Me.",
    "docketUrl": "https://www.courtlistener.com/docket/72070620/powell-v-powell/",
    "caseDateFiled": "2025-12-22",
    "caseDateTerminated": "2026-03-04",
    "isCasePending": "No",
    "assignedTo": "John A. Woodcock Jr.",
    "assignedToId": 3543,
    "referredTo": "John C. Nivison",
    "suitNature": "890 Other Statutory Actions",
    "cause": "42:11601 International Child Abduction Remedies Act (Hague)",
    "jurisdictionType": "Federal Question",
    "juryDemand": "Not Disclosed",
    "chapter": "N/A",
    "pacerCaseId": "69610",
    "textSnippet": "Case 2:25-cv-00641-JAW Document 55 Filed 01/29/26 Page 1 of 13 PageID #: 704 UNITED STATES DISTRICT COURT DISTRICT OF MAINE SARAH LEYLA POWELL, ) ) Petitioner, ) ) v. ) No. 2:25 ...",
    "citedOpinionIds": [180959, 183909, 198629, 198787, 200014, 203004, 206613, 600349, 2671021, 4224316, 4344037],
    "parties": ["ADRIAN MAURICE POWELL, JR.", "SARAH LEYLA POWELL"],
    "attorneys": ["KATELYN D. SKINNER", "BRADLEY C. MORIN", "KATRINA ANNE SEIPEL"],
    "lawFirms": ["Bourque Clegg Causey & Morin LLC", "Milam Law Collective", "Buckley Law PC"],
    "scrapedAt": "2026-09-08T07:11:38.711Z",
    "error": null
  }
]
```

Fields the source can withhold come back as `Not Disclosed`, fields that do not apply to a record come back as `N/A`, and empty lists come back as `[]`. No column is ever a bare null except `error`.

### ✨ Why choose this Actor

- **One row per filing, not per case.** The unit of work in litigation is the document. This is the only ParseForge Actor that treats it that way.
- **PDF links that actually resolve.** `pdfUrl` was verified against the live archive, including attachments. No login, no PACER account, no per page charge.
- **Text from inside the document.** The excerpt comes from the PDF's own extracted text, so a full text search reaches words that never appear in the docket entry.
- **The case travels with the filing.** CourtListener's document index returns no case name, court or judge. This Actor joins them back in so your export is usable without a second pass.
- **235 courts, all verified.** Every court in the picker was tested against the live index and returns filings. Nothing invented.
- **Availability is a first class filter.** Turn it on and every row has a real PDF. Turn it off and you see the whole docket, including entries nobody has contributed yet.
- **Honest dates.** PACER lets clerks type any year, and the archive stores it verbatim. A filing date more than a year in the future is reported as `Not Disclosed` rather than shipped as fact.
- **No key required.** Runs anonymously out of the box. Add a free CourtListener token if you want to go faster.

### 📈 How it compares to alternatives

| | This Actor | Docket level scrapers | PACER directly |
| --- | --- | --- | --- |
| Unit of a row | One filing | One case | One page view |
| PDF link | Yes, permanent public URL | Rarely | Behind a paid login |
| Page count before download | Yes | No | No |
| Text from inside the PDF | Yes, excerpt | No | No |
| Cross district document search | Yes | Case level only | Not supported |
| Case name, court and judge on a document row | Yes | Not applicable | Manual |
| Account needed | None | None | PACER account, ten cents a page |
| Documents covered | 17,342,712 with a PDF, of 493,413,653 entries indexed | Cases only | Everything, at a cost |

Honest limits, stated up front. RECAP is a crowd sourced mirror, so a document exists here only if someone already bought and contributed it: that is 17,342,712 PDFs out of 493,413,653 indexed entries. Sealed and restricted filings are not in the archive at all. Anonymous access to CourtListener is throttled at 5 requests per minute and 50 per hour, and each request carries 20 filings, so a very large export either uses a free API token or the proxy toggle.

### 🚀 How to use

1. **Create a free Apify account.** New accounts get $5 in free usage credit: [sign up here](https://console.apify.com/sign-up?fpr=vmoqkp).
2. **Open the Actor** and leave the default input in place for a first look. It returns filings matching the phrase "motion for summary judgment".
3. **Narrow it.** Add a court, a party, an attorney, a nature of suit code or a date range. Or paste docket URLs into Docket URLs to pull every filing from specific cases.
4. **Decide on availability.** Leave "Only filings with a PDF in RECAP" on for rows that all carry a working PDF link. Turn it off to see the complete docket.
5. **Set Max Items** to how many filings you want. Free runs preview 10.
6. **Run it**, then download the dataset as CSV, JSON, Excel or XML, or read it from the API.

### 💼 Business use cases

#### 📚 Build a litigation document corpus

Search a phrase across every federal district at once, keep the rows whose `pageCount` fits your budget, and fetch the `pdfUrl` list. A single query for "motion for summary judgment" matches 1,260,519 filings with a PDF already in the archive.

#### 🔍 Reconstruct a case file

Paste a docket URL and get every filing in that case as its own row, in order, with page counts and links. What used to be an afternoon of clicking through PACER becomes one run.

#### 📡 Monitor a filing type, not a case

Watch for report and recommendation orders in one district, or for exhibits filed in patent cases, by combining the nature of suit code with the docket entry text filter. Schedule the run and diff the `documentId` column.

#### 🧾 Due diligence on a counterparty

Search a company as `partyName`, read the actual briefs and orders filed against it, and cite the document rather than a summary. `citedOpinionIds` shows which precedents each filing leans on.

### 🔌 Automating CourtListener RECAP Documents Scraper

Schedule it in the Apify console and it will run daily, weekly or on a cron of your choice. Every finished run can push straight into your stack:

- **Make and Zapier** for no code routing into a spreadsheet, a CRM or a matter management system.
- **Slack or email** alerts when a new filing matches your query.
- **Google Drive or Dropbox** to archive the exported CSV and the PDFs it points at.
- **Airbyte or Fivetran** into a warehouse for document level analytics.
- **GitHub Actions** to keep a versioned corpus in a repo.
- **Webhooks** to hit your own service the moment a run finishes.

### 🌟 Beyond business use cases

- **Research.** Empirical legal scholars can sample thousands of real motions and orders across districts, with page counts as a proxy for complexity.
- **Personal.** Anyone party to a federal case can pull their own docket's filings without paying PACER for pages they already have a right to read.
- **Non-profit.** Access to justice groups can assemble form banks of real pro se filings and the orders that answered them.
- **Experimentation.** Machine learning teams get a clean, licence friendly corpus of legal documents with structured metadata attached, ready for retrieval augmented generation.

### 🤖 Ask an AI assistant about this scraper

Paste this into ChatGPT, Claude or any assistant to plan your run:

> I am using the ParseForge CourtListener RECAP Documents Scraper on Apify. It returns one row per federal court filing from the RECAP archive, with 43 fields: the filing itself (type, docket entry text, document number, attachment number, entry date, page count, a public PDF link and a text excerpt from the PDF) and its parent case (case name, docket number, court, judge, nature of suit, cause, parties, attorneys, law firms). Inputs include a full text query, a court picker covering 235 federal courts, case name, docket number, party name, attorney name, nature of suit code, docket entry text, document number, attachment number, filed after and filed before dates, an availability toggle, and a list of docket URLs. Help me design the input for this goal: \[describe what you want].

### ❓ Frequently Asked Questions

#### ❓ What exactly is a RECAP document?

A single filing inside a federal court docket: one complaint, one motion, one order, one exhibit. RECAP is the Free Law Project's public archive of PACER records, built from documents that users of the RECAP browser extension have already purchased and shared.

#### ❓ How is this different from a docket scraper?

A docket scraper gives you one row per case. This gives you one row per document inside the case. A case with fifty filings produces fifty rows here and one row there.

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

No. Everything comes from CourtListener's public API and public document storage. A free CourtListener API token is supported and only affects speed.

#### ❓ Do the PDF links really work?

Yes, when `isAvailable` is `Yes`. The link points at `storage.courtlistener.com` and returns the PDF directly, for main documents and for attachments alike. When `isAvailable` is `No`, RECAP knows the entry exists but nobody has contributed the PDF, so `pdfUrl` is `N/A`.

#### ❓ Why is availability on by default?

Because a row without a PDF has no page count, no text excerpt and nothing to download. The archive holds 17,342,712 documents with a PDF out of 493,413,653 indexed entries. Turn the toggle off when you want the full docket rather than only the retrievable parts.

#### ❓ Why do some filings show a date like 3926?

PACER accepts whatever year a clerk types, and CourtListener stores the entry verbatim. Any entry date more than a year in the future is reported as `Not Disclosed` instead of being passed off as real. Sorting by entry date surfaces these first, which is why relevance is the default sort.

#### ❓ Why are some case fields empty on newly filed cases?

Nature of suit, cause, jurisdiction type and jury demand are typed into PACER by the clerk and are often not yet indexed on a case filed in the last few weeks. They fill in later. That is source coverage, not a gap in the export.

#### ❓ How many courts does it cover?

235, spanning federal district, bankruptcy, appellate and special courts. Every id in the court picker was tested against the live index and confirmed to return filings.

#### ❓ Can I get the full text of a document, not just an excerpt?

The excerpt is what the public search API exposes. For the whole document, take `pdfUrl` from the row and download the PDF, then run it through any PDF text extractor.

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

Five filings with full case details take about five seconds and two requests. Anonymous access is throttled at 5 requests per minute and 50 per hour per IP, and each search request carries 20 filings, so unattended large exports should use a free CourtListener token or switch the proxy toggle on for a fresh IP per request.

#### ❓ Why do I get fewer rows than Max Items?

Because the search ran out of matches. The count logged at the start of the run tells you the true size of the result set for your filters.

#### ❓ Does it deduplicate?

Yes. Rows are keyed on the CourtListener document id, so a document that appears twice across cursor pages is written once.

#### ❓ Does it cover state courts?

No. RECAP mirrors PACER, which is federal only. State court records are not part of this archive.

#### ❓ What happens if a request fails?

The failing page is written as a single row containing only an `error` message, and that row is never billed. The run continues where it can.

### 🔌 Integrate with any app

Datasets export to CSV, JSON, JSONL, Excel and XML, and every run is reachable through the Apify API, webhooks, and the official JavaScript and Python clients. Anything that can read a URL can read your filings.

### 🔗 Recommended Actors

- [CourtListener Civil Cases Scraper](https://apify.com/parseforge/courtlistener-civil-cases-scraper?fpr=vmoqkp): the same archive at case level, filtered by nature of suit.
- [CourtListener Bankruptcy Scraper](https://apify.com/parseforge/courtlistener-bankruptcy-scraper?fpr=vmoqkp): bankruptcy dockets across all 94 bankruptcy courts.
- [CourtListener Adversary Proceedings Scraper](https://apify.com/parseforge/courtlistener-adversary-scraper?fpr=vmoqkp): adversary suits filed inside bankruptcies.
- [CourtListener Citation Scraper](https://apify.com/parseforge/courtlistener-citation-scraper?fpr=vmoqkp): reporter citations and the case law citation graph.
- [CourtListener Judge Analytics Scraper](https://apify.com/parseforge/courtlistener-judge-analytics-scraper?fpr=vmoqkp): caseload and authorship analytics per judge.

> 💡 **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)

> **⚠️ 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 and public document storage. 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

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

CourtListener docket or document URLs, for example https://www.courtlistener.com/docket/70649963/sam-v-easy-honda/. Every filing that belongs to those dockets is returned. Any URL without a /docket/<id>/ path is ignored.

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

Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000

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

Full text search across the docket entry text and the text of the filed PDF. Supports quoted phrases and AND / OR / NOT, for example "summary judgment" AND patent.

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

On by default. RECAP indexes roughly 493 million docket entries but holds the actual PDF for about 17.3 million of them. With this on, every row carries a working PDF link, a page count and a text excerpt. Turn it off to include entries whose PDF nobody has contributed yet.

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

Matches words in the docket entry description only, for example deposition or subpoena. Narrower than the full text query above.

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

The filing number inside the docket, for example 1 for the complaint.

## `attachmentNumber` (type: `string`):

Return only the nth attachment of a filing, for example 2. Leave empty for both main documents and attachments.

## `courtIds` (type: `array`):

Limit to specific federal courts. All 235 district, bankruptcy, appellate and special courts listed here were verified to return RECAP filings. Leave empty for every court.

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

Words from the case caption, for example Apple or "United States".

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

Exact PACER docket number, for example 4:26-cv-00974.

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

A party to the case, for example Google.

## `attorneyName` (type: `string`):

An attorney of record in the case, for example Smith.

## `natureOfSuit` (type: `string`):

JS-44 civil cover sheet code, for example 830 for patent or 440 for civil rights.

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

Only cases filed on or after this date, in MM/DD/YYYY format, for example 01/01/2026.

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

Only cases filed on or before this date, in MM/DD/YYYY format, for example 12/31/2026.

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

Relevance needs a search query. Case filed date surfaces the newest cases, whose nature of suit and judge are often not indexed yet. Entry date sorts on the date the clerk typed into PACER, which surfaces typo years such as 3926 first.

## `includeCaseDetails` (type: `boolean`):

On by default. Adds the case name, court, judge, parties and counsel to every filing row, at the cost of one extra request per 20 cases. Turn it off for the fastest possible document-only export.

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

Optional free CourtListener API token. It lifts the anonymous rate limit, so large runs go faster. Get one at courtlistener.com/profile/api.

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

CourtListener answers directly, so the proxy is off by default. Turn it on to give every request a fresh exit IP and its own share of the anonymous rate limit.

## Actor input object example

```json
{
  "startUrls": [],
  "maxItems": 10,
  "query": "\"motion for summary judgment\"",
  "availableOnly": true,
  "orderBy": "score desc",
  "includeCaseDetails": true,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

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

Key fields: filing type, docket entry text, PDF link, page count, court, case and judge

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

Complete dataset with all 43 fields, including the text excerpt and the parties and counsel arrays

# 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,
    "query": "\"motion for summary judgment\"",
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/courtlistener-recap-documents-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,
    "query": "\"motion for summary judgment\"",
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/courtlistener-recap-documents-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,
  "query": "\\"motion for summary judgment\\"",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call parseforge/courtlistener-recap-documents-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/courtlistener-recap-documents-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/AhGZu2OuZBMVN0QaS/builds/ds7GeTyEzgnNV5U0B/openapi.json
