# CourtListener Opinions Scraper | US Court Rulings (`parseforge/court-listener-opinions-scraper`) Actor

Extract US court opinions from CourtListener with case name, court, judges, citations, date filed, and full opinion text. Filter by court, date range, or keyword. Built for legal research, AI training datasets, litigation tracking, and academic case law analysis.

- **URL**: https://apify.com/parseforge/court-listener-opinions-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Other, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $19.00 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
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.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use 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 Opinions Scraper

> 🚀 **Export US federal and state court opinions in seconds.** Pull the latest published opinions from the Supreme Court, federal Circuit Courts of Appeals, District Courts, and specialty tribunals straight into clean CSV, Excel, JSON, or XML.

> 🕒 **Last updated:** 2026-05-25 · **📊 7 fields** per record · **46+ courts supported** · **Free Law Project / public domain**

CourtListener is a free legal research project run by Free Law Project. This scraper reads the public Atom feeds for every court that CourtListener tracks and turns each opinion into a structured record with title, URL, court name, publication date, summary, and direct PDF link. No CourtListener account or API token required.

Coverage includes the Supreme Court of the United States, all 13 federal Circuit Courts of Appeals (including the Federal Circuit and D.C. Circuit), specialty courts like the Court of International Trade, the Court of Federal Claims, the Tax Court, the FISA Court and its Court of Review, and dozens of high-traffic federal District Courts (S.D.N.Y., N.D. Cal., E.D. Va., S.D. Fla. and more). Pick a single court or use the high-volume "All Courts" stream.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Legal researchers, paralegals, law firms, journalists, academics, legaltech engineers | Build case alert feeds, monitor a specific circuit, populate a legal data warehouse, train legal NLP models, track federal litigation trends |

### 📋 What the CourtListener Opinions Scraper does

- Pulls the latest opinions from a chosen court Atom feed
- Decodes titles, links, courts, publication dates, and short summaries
- Returns a direct PDF link for each opinion when available
- Supports 46+ courts from the Supreme Court to high-traffic district courts
- Exports clean tabular data to CSV, Excel, JSON, or XML

> 💡 **Why it matters:** legal research products and academic studies need raw, structured opinion data. This Actor delivers it in seconds without scraping court websites individually.

### 🎬 Full Demo (_🚧 Coming soon_)

### ⚙️ Input

<table>
<tr><th>Field</th><th>Type</th><th>Required</th><th>Description</th></tr>
<tr><td>court</td><td>select</td><td>Yes</td><td>Court identifier (e.g. scotus, ca9, all)</td></tr>
<tr><td>maxItems</td><td>integer</td><td>No</td><td>Max records to return. Free plan capped at 10.</td></tr>
</table>

```json
{
    "court": "scotus",
    "maxItems": 10
}
````

```json
{
    "court": "ca9",
    "maxItems": 50
}
```

> ⚠️ **Good to Know:** CourtListener's feeds return the most recent opinions per court. To go deeper into the historical archive you can chain runs across multiple courts or schedule daily runs to capture all new filings.

### 📊 Output

| Field | Type | Description |
|---|---|---|
| 📌 `title` | string | Case caption |
| 🔗 `url` | string | CourtListener opinion page URL |
| 🏛️ `court` | string | Full court name |
| 📅 `publishedDate` | string | ISO publication timestamp |
| 📄 `pdfUrl` | string | Direct PDF download URL |
| 📝 `summary` | string | First-paragraph excerpt of the opinion |
| 🕒 `scrapedAt` | string | Run timestamp |
| ❌ `error` | string | Null on success |

Sample record:

```json
{
    "title": "M & K Employee Solutions, Inc. v. Trustees of IAM Nat. Pension",
    "url": "https://www.courtlistener.com/opinion/10862762/m-k-employee-solutions-inc-v-trustees-of-iam-nat-pension/",
    "court": "Supreme Court of the United States",
    "publishedDate": "2026-05-21T00:00:00-07:00",
    "pdfUrl": "https://storage.courtlistener.com/pdf/2026/05/21/m__k_employee_solutions_inc._v._trustees_of_iam_nat._pension.pdf",
    "summary": "(Slip Opinion) OCTOBER TERM, 2025 1 Syllabus NOTE: Where it is feasible, a syllabus (headnote) will be released ...",
    "scrapedAt": "2026-05-25T17:40:00.000Z",
    "error": null
}
```

### ✨ Why choose this Actor

| 🔥 Reason | Why it matters |
|---|---|
| 🆓 No CourtListener account or token required | Run instantly without setup |
| 🏛️ 46+ courts covered | Federal supreme, appellate, district, specialty |
| ⚡ Atom-feed source | Stable structure, fast responses |
| 📦 Clean tabular output | Drop straight into BI, Sheets, a database |
| 🔁 Schedule daily | Build case alerts cheaply |

### 📈 How it compares to alternatives

| Approach | Setup | Cost | Output Quality |
|---|---|---|---|
| CourtListener REST API | Account + token | Free | Excellent (auth-gated) |
| Scraping court websites individually | Per-court engineering | High | Mixed |
| **This Actor** | **None** | **Pay-per-use** | **Clean, normalized** |

### 🚀 How to use

1. [Create a free Apify account with $5 credit](https://console.apify.com/sign-up?fpr=vmoqkp)
2. Open the CourtListener Opinions Scraper
3. Pick a court from the dropdown
4. Set `maxItems`
5. Click Start and download CSV / Excel / JSON / XML when the run completes

### 💼 Business use cases

#### Legaltech and case alerting

Schedule daily runs against the courts your clients care about. Push deltas into your alerting product or CRM.

#### Law firm internal research

Feed structured case lists into Westlaw / Lexis enrichment pipelines. Pre-screen opinions for relevance with internal classifiers.

#### Academic research

Build training corpora for legal NLP (citation extraction, outcome prediction, holding classification) across decades of circuit opinions.

#### Journalism

Track which circuits are issuing rulings on a hot statute. Surface fresh opinions for newsroom coverage without manual checking.

### 🔌 Automating CourtListener Opinions Scraper

Run on a schedule and pipe results into Make, Zapier, Slack, Airbyte, GitHub Actions, or Google Drive. Apify's integrations make webhooks, dataset webhooks, and storage exports trivial.

### 🌟 Beyond business use cases

#### Research

Construct historical datasets for academic study of judicial opinion trends.

#### Personal

Track opinions in your home district for civic engagement and personal interest.

#### Non-profit

Power legal aid dashboards with up-to-date opinion data.

#### Experimentation

Train or benchmark legal LLMs against published opinions.

### 🤖 Ask an AI assistant about this scraper

Open this Actor's page in [ChatGPT](https://chat.openai.com/), [Claude](https://claude.ai/), [Perplexity](https://www.perplexity.ai/), or [Copilot](https://copilot.microsoft.com/) and ask for help wiring it into your workflow.

### ❓ Frequently Asked Questions

**Q: Do I need a CourtListener account?**
A: No. This Actor reads only the public Atom feeds.

**Q: Which courts can I scrape?**
A: SCOTUS, all 13 federal Circuit Courts of Appeals, specialty federal courts, and many high-traffic district courts. See the dropdown for the full list.

**Q: How fresh is the data?**
A: As fresh as CourtListener's feed updates, typically same-day for most courts.

**Q: Does it return full opinion text?**
A: It returns the title, URL, summary excerpt, and a direct PDF link. For full opinion text, follow the PDF URL.

**Q: Can I scrape historical opinions?**
A: Feeds return the latest items per court. For deep historical archives, use CourtListener's authenticated REST API directly.

**Q: Is the data accurate?**
A: It mirrors what CourtListener publishes. Free Law Project is a respected source.

**Q: Can I export to Excel?**
A: Yes. Apify lets you export CSV, Excel, JSON, XML directly from the dataset.

**Q: How do I schedule daily runs?**
A: Use Apify's built-in Schedules feature on the actor page.

**Q: What about state courts?**
A: This Actor focuses on federal courts. CourtListener does cover some state courts via its API.

**Q: Will this break if CourtListener changes the feed?**
A: We monitor and update the parser when feeds change.

### 🔌 Integrate with any app

Apify supports Make, Zapier, n8n, Slack, Airbyte, GitHub Actions, Google Sheets, Google Drive, AWS, Azure, BigQuery, Snowflake, and any HTTP-aware tool via webhooks.

### 🔗 Recommended Actors

| Actor | What it does |
|---|---|
| [USPTO Patent Assignments](https://apify.com/parseforge/uspto-patent-assignments-scraper) | Pull US patent assignment records |
| [WIPO Brand Database](https://apify.com/parseforge/wipo-brand-database-scraper) | Global trademark search |
| [Clinical Trials](https://apify.com/parseforge/clinicaltrials-scraper) | ClinicalTrials.gov registry data |
| [FINRA BrokerCheck](https://apify.com/parseforge/finra-brokercheck-scraper) | US securities-broker disclosures |

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge).

**🆘 Need Help?** [Open our contact form](https://tally.so/r/BzdKgA)

> **⚠️ Disclaimer:** This is an independent tool not affiliated with CourtListener or Free Law Project. Only publicly available data is collected. Opinions remain in the public domain per Free Law Project's terms.

# Actor input Schema

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

Court to scrape opinions from. 'all' returns the latest high-volume feed across all courts.

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

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

## Actor input object example

```json
{
  "court": "scotus",
  "maxItems": 10
}
```

# Actor output Schema

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

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

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

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "maxItems": 10
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/court-listener-opinions-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 = { "maxItems": 10 }

# Run the Actor and wait for it to finish
run = client.actor("parseforge/court-listener-opinions-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "maxItems": 10
}' |
apify call parseforge/court-listener-opinions-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=parseforge/court-listener-opinions-scraper",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "CourtListener Opinions Scraper | US Court Rulings",
        "description": "Extract US court opinions from CourtListener with case name, court, judges, citations, date filed, and full opinion text. Filter by court, date range, or keyword. Built for legal research, AI training datasets, litigation tracking, and academic case law analysis.",
        "version": "0.1",
        "x-build-id": "27qUgwySNtwxGxBkN"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/parseforge~court-listener-opinions-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-parseforge-court-listener-opinions-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/parseforge~court-listener-opinions-scraper/runs": {
            "post": {
                "operationId": "runs-sync-parseforge-court-listener-opinions-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/parseforge~court-listener-opinions-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-parseforge-court-listener-opinions-scraper",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "properties": {
                    "court": {
                        "title": "Court",
                        "enum": [
                            "all",
                            "scotus",
                            "ca1",
                            "ca2",
                            "ca3",
                            "ca4",
                            "ca5",
                            "ca6",
                            "ca7",
                            "ca8",
                            "ca9",
                            "ca10",
                            "ca11",
                            "cadc",
                            "cafc",
                            "armfor",
                            "cit",
                            "uscfc",
                            "tax",
                            "fiscr",
                            "fisc",
                            "njd",
                            "nyed",
                            "nynd",
                            "nysd",
                            "nywd",
                            "cand",
                            "cacd",
                            "cased",
                            "casd",
                            "ilnd",
                            "ilcd",
                            "ilsd",
                            "txnd",
                            "txed",
                            "txsd",
                            "txwd",
                            "flmd",
                            "flnd",
                            "flsd",
                            "ned",
                            "nwd",
                            "mad",
                            "med",
                            "vaed",
                            "vawd"
                        ],
                        "type": "string",
                        "description": "Court to scrape opinions from. 'all' returns the latest high-volume feed across all courts.",
                        "default": "scotus"
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "minimum": 1,
                        "maximum": 1000000,
                        "type": "integer",
                        "description": "Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000"
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
