# CourtListener Scraper — Opinions, Dockets & Courts (`logiover/courtlistener-scraper`) Actor

Scrape US court opinions, dockets, and court info from CourtListener. Extract case names, judges, citations, rulings, docket numbers and full URLs. No API key required.

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

## Pricing

from $1.50 / 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/docs.md):

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

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python/docs.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/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

## CourtListener Scraper — US Court Opinions, Dockets & Case Law Data

Extract US federal and state court opinions, dockets, and court records from CourtListener without any API key or login. Covers over 4 million opinions and millions of PACER dockets across all US courts — scraped clean with full citations, judge names, case names, and direct document links.

### What does CourtListener Scraper do?

CourtListener Scraper connects directly to the [CourtListener REST API v4](https://www.courtlistener.com/api/rest/v4/) — a free, keyless public API maintained by the Free Law Project. The actor supports three modes:

- **Opinions mode** — full-text search across over 4 million court opinions using CourtListener's relevance engine. Returns case names, citations, judges, filed dates, docket numbers, opinion snippets, and download links.
- **Dockets mode** — search PACER-sourced federal docket records by keyword with party names, attorneys, cause of action, jurisdiction type, and court metadata.
- **Courts mode** — enumerate all ~3,300 courts in the CourtListener database with jurisdiction type, citation strings, active status, and official URLs.

Pagination is handled automatically via the API's `cursor`-based system for opinions/dockets and `page`-based for courts. No proxy rotation required for basic usage; datacenter proxy is included for reliability. Bulk runs of hundreds to thousands of records are fully supported.

### Who is it for?

- **Legal researchers and scholars** who need bulk opinion data for citation analysis, legal trend research, or computational law studies.
- **Law firms and attorneys** building litigation databases, tracking opposing counsel precedents, or monitoring case law in specific areas.
- **LegalTech and AI developers** who need structured court data to train legal AI models, build case outcome predictors, or power legal document search.
- **Data journalists** investigating court activity, judge behavior patterns, or legal outcomes across demographics and jurisdictions.
- **Compliance and risk teams** tracking regulatory enforcement actions, specific statutes, or case law relevant to their industry.

### Use cases

- Collect all Supreme Court opinions mentioning "Fourth Amendment" since 2010 for constitutional law analysis.
- Pull 1,000 copyright infringement dockets from federal district courts to map litigation hotspots by jurisdiction.
- Build a judge-opinion database to analyze how specific judges rule on antitrust matters.
- Extract all bankruptcy dockets in a specific district for financial risk monitoring.
- Enumerate all active federal courts to build a jurisdiction lookup tool for a legal SaaS product.

### Why use CourtListener Scraper?

- **No API key, no login**: CourtListener's public API is fully open — no registration, no credentials, no rate-limit walls for standard usage.
- **18+ structured output fields**: case name, court, judge, citation, docket number, date filed, snippet, status, URL, download URL, attorney, cause of action, and more.
- **Bulk data collection**: paginate across thousands of results in a single run using cursor-based pagination.
- **Multi-mode flexibility**: switch between opinions, dockets, and courts from the same actor with a single input parameter.
- **Date and court filters**: narrow results by filing date range and specific court IDs to focus your dataset.
- **Export to CSV, JSON, Excel, or Google Sheets** via Apify's native dataset exports — no extra tooling required.

### What data can you extract?

The actor outputs structured records for each court opinion, docket, or court entry. Here is the complete field list:

| Field | Type | Description |
|---|---|---|
| caseName | string | Short case name (e.g. "Sony Corp. v. Universal City Studios") |
| caseNameFull | string | Full formal case name |
| court | string | Full court name (e.g. "Court of Appeals for the Ninth Circuit") |
| courtId | string | CourtListener court ID (e.g. "ca9", "scotus", "dcd") |
| dateFiled | string | Date the case was filed (YYYY-MM-DD) |
| docketNumber | string | Official docket number |
| citation | string | Legal citation string (e.g. "464 U.S. 417") |
| judge | string | Judge or panel assigned to the case |
| status | string | Opinion status (Published, Unpublished, etc.) |
| snippet | string | Text excerpt from the opinion or party list for dockets |
| url | string | Full URL to the CourtListener case page |
| downloadUrl | string | Direct download URL to the opinion document (if available) |
| clusterId | string | CourtListener cluster ID for opinions |
| docketId | string | CourtListener docket ID |
| type | string | Record type: "opinion", "docket", or "court" |
| attorney | string | Attorney names associated with the case |
| cause | string | Cause of action (dockets only) |
| jurisdictionType | string | Jurisdiction type (e.g. "Federal Question") |

**Sample JSON output (opinions mode):**

```json
{
  "caseName": "Sony Corp. of America v. Universal City Studios",
  "caseNameFull": "SONY CORP. OF AMERICA v. UNIVERSAL CITY STUDIOS, INC.",
  "court": "Supreme Court of the United States",
  "courtId": "scotus",
  "dateFiled": "1984-01-17",
  "docketNumber": "82-1073",
  "citation": "464 U.S. 417",
  "judge": "Stevens",
  "status": "Published",
  "snippet": "Petitioners manufacture and sell home video tape recorders. Respondents own the copyrights on some of the television programs that are broadcast on the public airwaves...",
  "url": "https://www.courtlistener.com/opinion/111351/sony-corp-of-america-v-universal-city-studios-inc/",
  "downloadUrl": "",
  "clusterId": "111351",
  "docketId": "64318628",
  "type": "opinion",
  "attorney": "Louis Nizer, New York City, for petitioners...",
  "cause": "",
  "jurisdictionType": ""
}
````

### How to use

#### Option A: Search opinions by keyword

Search for court opinions using legal concepts, case names, statutes, or legal phrases.

**Step-by-step:**

1. Set **Mode** to `opinions`
2. Enter your **Query** (e.g. `fourth amendment warrantless search`)
3. Optionally set a **Court ID** (e.g. `scotus` for Supreme Court only)
4. Set a **Date From/To** to narrow the time window
5. Set **Max Results** to the number of opinions you want

**Input example:**

```json
{
  "mode": "opinions",
  "query": "fair use copyright",
  "court": "ca9",
  "dateFrom": "2015-01-01",
  "dateTo": "2024-12-31",
  "maxResults": 500
}
```

#### Option B: Search dockets by keyword

Search PACER docket records for cases matching your query, with party names, attorneys, and cause of action data.

**Step-by-step:**

1. Set **Mode** to `dockets`
2. Enter your **Query** (e.g. `antitrust monopoly`)
3. Optionally filter by **Court ID** or **Date From/To**
4. Set **Max Results**

**Input example:**

```json
{
  "mode": "dockets",
  "query": "antitrust monopoly tech",
  "dateFrom": "2018-01-01",
  "maxResults": 300
}
```

#### Option C: List all courts

Enumerate all courts in the CourtListener database — useful for building a court ID reference or jurisdiction lookup.

```json
{
  "mode": "courts",
  "maxResults": 500
}
```

### Input parameters

| Parameter | Type | Default | Description |
|---|---|---|---|
| mode | string | `opinions` | Scrape mode: `opinions`, `dockets`, or `courts` |
| query | string | — | Search query text. Required for opinions and dockets |
| court | string | — | Filter by court ID (e.g. `scotus`, `ca9`, `dcd`) |
| dateFrom | string | — | Filed on or after this date (YYYY-MM-DD) |
| dateTo | string | — | Filed on or before this date (YYYY-MM-DD) |
| maxResults | integer | 100 | Maximum number of results. Range: 1–5000 |
| proxyConfiguration | object | Datacenter | Apify proxy configuration object |

**Full input JSON:**

```json
{
  "mode": "opinions",
  "query": "copyright fair use",
  "court": "",
  "dateFrom": "2010-01-01",
  "dateTo": "2024-12-31",
  "maxResults": 200,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": ["DATACENTER"]
  }
}
```

### Output example

```json
{
  "caseName": "Authors Guild v. Google, Inc.",
  "caseNameFull": "AUTHORS GUILD v. GOOGLE, INC.",
  "court": "Court of Appeals for the Second Circuit",
  "courtId": "ca2",
  "dateFiled": "2015-10-16",
  "docketNumber": "13-4829-cv",
  "citation": "804 F.3d 202",
  "judge": "Leval",
  "status": "Published",
  "snippet": "Google has made digital copies of tens of millions of books. Google's stated purpose is to make the information in those books more widely accessible...",
  "url": "https://www.courtlistener.com/opinion/3137282/authors-guild-v-google-inc/",
  "downloadUrl": "",
  "clusterId": "3137282",
  "docketId": "4879456",
  "type": "opinion",
  "attorney": "Edward H. Rosenthal, Frankfurt Kurnit Klein & Selz...",
  "cause": "",
  "jurisdictionType": ""
}
```

### Tips for best results

- **Use specific legal phrases**: queries like `"reasonable expectation of privacy"` (with quotes) tend to return more relevant results than single words.
- **Filter by court ID** to focus on a single jurisdiction — use the `courts` mode first to find the right court ID.
- **Date filters speed up runs**: narrowing to a 2–3 year window with `dateFrom`/`dateTo` returns results faster and more precisely.
- **Dockets mode returns more volume**: with 260k+ dockets matching most legal topics, it yields high row counts for broad queries.
- **Opinions mode has richer text**: citation strings, judge names, and opinion snippets are far more complete in opinions mode.
- **Max 5,000 results per run**: for larger datasets, break your date range into yearly windows and run the actor multiple times.
- **Common court IDs**: `scotus` (Supreme Court), `ca1`–`ca11` (Circuit Courts), `cadc` (DC Circuit), `cafc` (Federal Circuit), `dcd` (DC District).
- **Export to CSV** from the Apify dataset view for immediate use in Excel, R, or Python pandas workflows.
- **Combine with AI tools**: pipe the output into an LLM via Apify's MCP integration to automatically classify, summarize, or extract legal holdings from opinions.

### Integrations

CourtListener Scraper outputs to Apify datasets which connect natively to:

- **Google Sheets** — use the Apify Google Sheets integration to export case data directly into spreadsheets for team collaboration.
- **Slack** — get notified via Apify webhooks when a scrape finishes, with a summary of results collected.
- **Zapier / Make** — trigger downstream workflows (e.g. add new opinions to a Notion database, send to a CRM) via Apify's webhook integration.
- **Scheduled runs** — set the actor to run on a schedule (daily, weekly) to monitor new opinions filed on a specific topic or court.
- **API access** — retrieve results programmatically via the Apify dataset API in JSON, CSV, XLSX, or JSONL format.

### API usage

**cURL:**

```bash
curl -X POST \
  "https://api.apify.com/v2/acts/logiover~courtlistener-scraper/runs?token=YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"mode":"opinions","query":"copyright fair use","maxResults":200}'
```

**Node.js:**

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

const client = new ApifyClient({ token: 'YOUR_TOKEN' });

const run = await client.actor('logiover/courtlistener-scraper').call({
  mode: 'opinions',
  query: 'fourth amendment',
  court: 'scotus',
  maxResults: 100,
});

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

**Python:**

```python
from apify_client import ApifyClient

client = ApifyClient("YOUR_TOKEN")

run = client.actor("logiover/courtlistener-scraper").call(run_input={
    "mode": "opinions",
    "query": "antitrust monopoly",
    "dateFrom": "2020-01-01",
    "maxResults": 500,
})

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

### Use with AI agents (MCP)

CourtListener Scraper is available as an MCP tool via Apify's Model Context Protocol integration. Connect it to Claude, GPT-4, or any MCP-compatible AI agent to enable on-demand legal research. For example: *"Find all Ninth Circuit opinions about fair use in music copyright filed after 2018 and summarize the key holdings."* The agent calls the actor, retrieves the dataset, and synthesizes the legal landscape — no manual searching required.

### FAQ

#### Does this require an API key or login?

No. CourtListener's REST API v4 is fully public and keyless. The actor accesses it without any credentials or registration. You only need your Apify account to run the actor.

#### What courts are covered?

CourtListener covers all US federal courts (Supreme Court, all Circuit Courts of Appeals, all Federal District Courts, Bankruptcy Courts, and specialty courts) plus many state courts. The `courts` mode returns the full list of ~3,300 available courts.

#### How many results can I get in one run?

The actor supports up to 5,000 results per run. For larger datasets, use date filtering (e.g. one year per run) to stay within the limit while collecting complete coverage.

#### Why did my search return zero results?

Check that your query is not too specific or misspelled. Try broader terms. Also verify that the `court` ID you provided is valid — use `courts` mode to look up valid court IDs. CourtListener's search engine is BM25-based and works best with legal terminology.

#### Some fields are empty — is that normal?

Yes. Not all opinions have citations, download links, or judge names in the database. Older opinions and some state court records have partial data. The actor outputs whatever CourtListener provides for each record.

#### Can I export the data to Excel?

Yes. From the Apify dataset view, click "Export" and select XLSX. You can also export to CSV, JSON, or JSONL directly from the dataset API.

#### How fast does the actor run?

The actor processes approximately 20 results per API request. A run of 200 opinions takes roughly 30–60 seconds. Larger runs of 1,000+ results may take 3–5 minutes depending on CourtListener server response times.

#### Is this legal to use?

CourtListener is operated by the Free Law Project, a 501(c)(3) nonprofit with an explicit mission to make US court data publicly accessible. Their API is designed for programmatic access. Court opinions are public records with no copyright. See the "Is it legal?" section below.

#### How current is the data?

CourtListener updates its opinion database continuously. Federal courts are updated daily via automated scrapers and PACER sync. The data is typically 1–3 days behind real-time filings.

#### What is the difference between opinions and dockets?

Opinions are the actual written decisions issued by courts — they contain legal reasoning, rulings, and citations. Dockets are the procedural records of a case — they track filings, party names, attorneys, and case status but may not contain full opinion text.

#### Can I search for specific statutes or case names?

Yes. You can search for anything — statute references like `"17 U.S.C. 107"`, case names like `"v. Google"`, judge names, legal doctrines, or any text that appears in CourtListener's indexed opinions.

#### What related actors are available?

See the Related scrapers section below for complementary legal and government data actors from the logiover collection.

### Is it legal?

Court opinions, dockets, and court records are public records created by US government entities. They are not subject to copyright and are legally accessible to anyone. CourtListener's API is operated by the Free Law Project, a nonprofit that explicitly provides programmatic access to this data. This actor respects CourtListener's public API terms, uses reasonable request rates, and does not bypass any access controls. Users are responsible for ensuring their downstream use of the data complies with applicable laws and regulations in their jurisdiction.

### Related scrapers

- **[SEC EDGAR Full-Text Scraper](https://apify.com/logiover/sec-edgar-fulltext-scraper)** — Search all SEC filings by keyword, form type, and date. Pairs well with CourtListener for regulatory and enforcement research.
- **[Company Dossier Generator](https://apify.com/logiover/company-dossier-generator)** — AI-generated company intelligence from public sources; enrich litigation research with business context.
- **[LinkedIn Company Scraper](https://apify.com/logiover/linkedin-company-scraper)** — Extract company profiles to cross-reference with parties in court cases.
- **[CVE Advisory Scraper](https://apify.com/logiover/cve-advisory-scraper)** — Monitor security advisories referenced in technology-related litigation.

# Actor input Schema

## `mode` (type: `string`):

What to scrape: 'opinions' (court opinions / case law), 'dockets' (docket records), or 'courts' (list all courts).

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

Optional search text (e.g. 'copyright fair use', 'fourth amendment', 'antitrust'). Leave empty to browse the most recent opinions/dockets.

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

Optional court filter. Pick a court from the list (covers the Supreme Court, all federal circuit and district courts, and major state supreme courts). Leave as 'All courts' to search everywhere. Advanced: you can also type any CourtListener court ID here.

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

How to order search results. 'Auto' uses best relevance when you provide a query, and newest-first when browsing without a query.

## `dateFrom` (type: `string`):

Filter results filed on or after this date (format: YYYY-MM-DD, e.g. '2020-01-01').

## `dateTo` (type: `string`):

Filter results filed on or before this date (format: YYYY-MM-DD, e.g. '2024-12-31').

## `maxResults` (type: `integer`):

Maximum number of results to return. Default is 200. Raise for bulk data collection.

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

Apify Proxy configuration. Automatic proxy works well; the Actor also falls back to a direct connection if a proxy IP fails.

## Actor input object example

```json
{
  "mode": "opinions",
  "court": "",
  "orderBy": "",
  "maxResults": 200,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# Actor output Schema

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

All records extracted by this run. Open the Dataset tab to browse, filter, and export as CSV, JSON, or Excel.

# 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 = {
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("logiover/courtlistener-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 = { "proxyConfiguration": { "useApifyProxy": True } }

# Run the Actor and wait for it to finish
run = client.actor("logiover/courtlistener-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 '{
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call logiover/courtlistener-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "CourtListener Scraper — Opinions, Dockets & Courts",
        "description": "Scrape US court opinions, dockets, and court info from CourtListener. Extract case names, judges, citations, rulings, docket numbers and full URLs. No API key required.",
        "version": "1.0",
        "x-build-id": "Z4Lib2QSZYocGg6s9"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/logiover~courtlistener-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-logiover-courtlistener-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/logiover~courtlistener-scraper/runs": {
            "post": {
                "operationId": "runs-sync-logiover-courtlistener-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/logiover~courtlistener-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-logiover-courtlistener-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": {
                    "mode": {
                        "title": "Mode — what to scrape",
                        "enum": [
                            "opinions",
                            "dockets",
                            "courts"
                        ],
                        "type": "string",
                        "description": "What to scrape: 'opinions' (court opinions / case law), 'dockets' (docket records), or 'courts' (list all courts).",
                        "default": "opinions"
                    },
                    "query": {
                        "title": "Search Query (optional)",
                        "type": "string",
                        "description": "Optional search text (e.g. 'copyright fair use', 'fourth amendment', 'antitrust'). Leave empty to browse the most recent opinions/dockets."
                    },
                    "court": {
                        "title": "Court",
                        "enum": [
                            "",
                            "scotus",
                            "ca1",
                            "ca2",
                            "ca3",
                            "ca4",
                            "ca5",
                            "ca6",
                            "ca7",
                            "ca8",
                            "ca9",
                            "ca10",
                            "ca11",
                            "cadc",
                            "cafc",
                            "dcd",
                            "nysd",
                            "nyed",
                            "cand",
                            "cacd",
                            "casd",
                            "ilnd",
                            "txnd",
                            "txsd",
                            "flsd",
                            "flmd",
                            "mad",
                            "njd",
                            "paed",
                            "gand",
                            "vaed",
                            "cal",
                            "ny",
                            "tex",
                            "fla",
                            "ill",
                            "ohio",
                            "pa",
                            "mich",
                            "nj",
                            "ga",
                            "wash",
                            "mass",
                            "va",
                            "nc",
                            "bap9",
                            "bap1",
                            "cavc",
                            "tax",
                            "uscfc",
                            "cit"
                        ],
                        "type": "string",
                        "description": "Optional court filter. Pick a court from the list (covers the Supreme Court, all federal circuit and district courts, and major state supreme courts). Leave as 'All courts' to search everywhere. Advanced: you can also type any CourtListener court ID here.",
                        "default": ""
                    },
                    "orderBy": {
                        "title": "Sort order (opinions/dockets)",
                        "enum": [
                            "",
                            "dateFiled desc",
                            "dateFiled asc",
                            "score desc",
                            "citeCount desc",
                            "dateArgued desc"
                        ],
                        "type": "string",
                        "description": "How to order search results. 'Auto' uses best relevance when you provide a query, and newest-first when browsing without a query.",
                        "default": ""
                    },
                    "dateFrom": {
                        "title": "Date From (optional, YYYY-MM-DD)",
                        "type": "string",
                        "description": "Filter results filed on or after this date (format: YYYY-MM-DD, e.g. '2020-01-01')."
                    },
                    "dateTo": {
                        "title": "Date To (optional, YYYY-MM-DD)",
                        "type": "string",
                        "description": "Filter results filed on or before this date (format: YYYY-MM-DD, e.g. '2024-12-31')."
                    },
                    "maxResults": {
                        "title": "Max Results",
                        "minimum": 1,
                        "maximum": 5000,
                        "type": "integer",
                        "description": "Maximum number of results to return. Default is 200. Raise for bulk data collection.",
                        "default": 200
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Apify Proxy configuration. Automatic proxy works well; the Actor also falls back to a direct connection if a proxy IP fails.",
                        "default": {
                            "useApifyProxy": true
                        }
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
