# CourtListener Opinion Scraper - US Court Case Law API (`jungle_synthesizer/courtlistener-opinion-scraper`) Actor

Crawl US court opinions from CourtListener (Free Law Project). 8M+ decisions from 3,350+ federal, state, and appellate courts. Filter by court, judge, date range, citation, or keyword. Returns case metadata, citations, precedential status, and opinion excerpts.

- **URL**: https://apify.com/jungle\_synthesizer/courtlistener-opinion-scraper.md
- **Developed by:** [BowTiedRaccoon](https://apify.com/jungle_synthesizer) (community)
- **Categories:** Business, Other
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

Pay per event

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

## CourtListener Opinion Scraper — US Court Case Law & Opinions

Extract structured US court opinion records from [CourtListener](https://www.courtlistener.com), the free case-law database maintained by the non-profit Free Law Project. The scraper reads the public v4 search API and covers 8 million+ opinions across 3,350+ federal, state, and territorial courts — SCOTUS, all 13 Circuit Courts of Appeals, every state supreme court and appellate court, plus historic and specialty courts.

### CourtListener Scraper Features

- Filter by free-text keyword, court, judge, citation, docket number, or date range — combine any of them
- Sort by relevance, date filed (newest or oldest), or citation count (most-cited first)
- Covers all 8,285,360+ opinions indexed by the Free Law Project, including SCOTUS, federal circuits, state courts, and bankruptcy/specialty courts
- Returns 30+ fields per case including full metadata, parallel citations, panel judges, precedential status, and opinion text excerpts
- Includes direct download links to the source PDF when CourtListener has one
- Queries the official JSON API — no HTML parsing, no fragile selectors
- Requires no authentication, no API key, and no proxy
- Rate-limited to 150 requests per minute, well under the documented unauthenticated ceiling

### Who Uses CourtListener Data and Why?

- **Law firms and litigators** — build case-law research workflows, track citation networks, and surface precedent by judge or court
- **Legal AI and tech companies** — train and evaluate legal language models on structured opinion data instead of scraping HTML yourself
- **Compliance and risk teams** — monitor opinions in specific practice areas (qualified immunity, IP, labor, environmental, etc.) for emerging precedent
- **Legal researchers and academics** — pull bulk samples of opinions for empirical legal studies, citation analysis, and doctrinal research
- **Journalists** — track recent decisions in high-profile cases and surface new opinions by specific judges

### How the Scraper Works

1. You provide at least one filter: a search query, a court ID, a judge name, a citation, a docket number, or a date range. An empty query with one filter is fine.
2. The scraper builds a query against the CourtListener v4 search API (`/api/rest/v4/search/?type=o`) and fetches the first page of 20 results.
3. It follows the cursor-based `next` URL through subsequent pages until it reaches your `maxItems` limit or exhausts the result set.
4. Each cluster (one case, possibly with multiple opinions) is flattened into one record and saved to the Apify dataset.

### Input

#### Keyword search across all courts

```json
{
    "query": "qualified immunity",
    "orderBy": "dateFiled desc",
    "maxItems": 200
}
````

#### All SCOTUS opinions, newest first

```json
{
    "query": "*",
    "court": "scotus",
    "orderBy": "dateFiled desc",
    "maxItems": 500
}
```

#### Federal Circuit patent cases in a specific year

```json
{
    "query": "patent",
    "court": "cafc",
    "filedAfter": "2023-01-01",
    "filedBefore": "2023-12-31",
    "maxItems": 100
}
```

#### Look up a specific case by citation

```json
{
    "citation": "\"410 U.S. 113\"",
    "maxItems": 5
}
```

#### All opinions authored by a given judge

```json
{
    "judge": "Scalia",
    "orderBy": "dateFiled desc",
    "maxItems": 100
}
```

#### Input Parameters

| Field | Type | Default | Description |
|-------|------|---------|-------------|
| query | string | `"qualified immunity"` | Free-text search over opinion content and metadata. Use quoted strings for exact phrases. Leave empty or set to `"*"` to browse by filters only. |
| court | string | `""` | CourtListener court ID (e.g. `scotus`, `ca9`, `cafc`, `cadc`). Leave empty to search all 3,350+ courts. Full list at https://www.courtlistener.com/api/rest/v4/courts/. |
| judge | string | `""` | Judge name, partial match (e.g. "Scalia", "Ginsburg"). Matches authoring judge and panel members. |
| citation | string | `""` | Citation filter. Use quoted form for exact match (e.g. `"410 U.S. 113"` for Roe v. Wade). |
| docketNumber | string | `""` | Court docket number filter (e.g. `24-813`). |
| filedAfter | string | `""` | Only include opinions filed on or after this date (ISO `YYYY-MM-DD`). |
| filedBefore | string | `""` | Only include opinions filed on or before this date (ISO `YYYY-MM-DD`). |
| orderBy | string | `"score desc"` | Sort order: `score desc` (relevance), `dateFiled desc`, `dateFiled asc`, or `citeCount desc`. |
| maxItems | integer | `50` | Maximum records to return. Set to `0` for unlimited — requires at least one filter when doing so. |
| proxyConfiguration | object | disabled | Proxy settings. Not required — CourtListener is a public API with no anti-bot measures. |

#### Court ID Cheat Sheet

| Court | ID |
|-------|-----|
| Supreme Court of the United States | `scotus` |
| Court of Appeals for the Federal Circuit | `cafc` |
| Court of Appeals for the D.C. Circuit | `cadc` |
| First through Eleventh Circuits | `ca1`, `ca2`, …, `ca11` |
| California Supreme Court | `cal` |
| New York Court of Appeals | `ny` |
| Texas Supreme Court | `tex` |

Plus 3,350+ additional federal district, state trial, state appellate, bankruptcy, and historic courts. Query `https://www.courtlistener.com/api/rest/v4/courts/` for the full list.

### Output Fields

```json
{
    "case_name": "Roe v. Wade",
    "case_name_full": "Jane Roe, et al., Appellants, v. Henry Wade",
    "court": "Supreme Court of the United States",
    "court_id": "scotus",
    "court_citation_string": "SCOTUS",
    "court_jurisdiction": "F",
    "date_filed": "1973-01-22",
    "date_argued": "1971-12-13",
    "docket_number": "70-18",
    "citation": "410 U.S. 113",
    "all_citations": "410 U.S. 113 | 93 S. Ct. 705 | 35 L. Ed. 2d 147 | 1973 U.S. LEXIS 159",
    "neutral_citation": "",
    "lexis_citation": "1973 U.S. LEXIS 159",
    "judges": "Blackmun",
    "panel_names": "Blackmun, Brennan, Douglas, Marshall, Powell, Stewart",
    "attorneys": "Sarah Weddington, Linda Coffee",
    "precedential_status": "Published",
    "source": "C",
    "cite_count": 5842,
    "opinion_count": 3,
    "opinion_types": "lead, concurrence, dissent",
    "lead_opinion_author_id": 1001,
    "lead_opinion_snippet": "The Constitution does not explicitly mention any right of privacy...",
    "lead_opinion_download_url": "https://example.com/roe.pdf",
    "per_curiam": false,
    "syllabus": "A pregnant single woman (Roe) brought a class action challenging the constitutionality of the Texas criminal abortion laws...",
    "posture": "",
    "procedural_history": "",
    "suit_nature": "",
    "cluster_id": 108495,
    "docket_id": 65000,
    "absolute_url": "https://www.courtlistener.com/opinion/108495/roe-v-wade/",
    "scraped_at": "2026-04-18T01:29:00.000Z"
}
```

| Field | Type | Description |
|-------|------|-------------|
| case\_name | string | Short case name (e.g. "Roe v. Wade") |
| case\_name\_full | string | Full formal case name when available |
| court | string | Full court name |
| court\_id | string | CourtListener court ID |
| court\_citation\_string | string | Short court abbreviation used in citations (e.g. "SCOTUS", "9th Cir.") |
| court\_jurisdiction | string | Jurisdiction code: `F` (federal), `S` (state), `FB` (federal bankruptcy), etc. |
| date\_filed | string | Date the opinion was filed (YYYY-MM-DD) |
| date\_argued | string | Date the case was argued, when recorded |
| docket\_number | string | Court docket number |
| citation | string | Primary citation (first entry in the citation list) |
| all\_citations | string | All parallel citations, joined with `\|` |
| neutral\_citation | string | Vendor-neutral citation when available |
| lexis\_citation | string | LexisNexis citation when available |
| judges | string | Authoring or panel judges (comma-separated) |
| panel\_names | string | Full judicial panel joined with `, ` |
| attorneys | string | Attorneys of record (truncated to 1,000 characters) |
| precedential\_status | string | Status: Published, Unpublished, Errata, Separate |
| source | string | Provenance code: `C`=court website, `R`=RECAP, `LC`=Library of Congress, `CR`=court+RECAP |
| cite\_count | number | Number of times this opinion has been cited by later cases |
| opinion\_count | number | Number of opinions in the cluster (lead + concurrences + dissents) |
| opinion\_types | string | Types of opinions in the cluster (e.g. "lead, concurrence, dissent") |
| lead\_opinion\_author\_id | number | CourtListener person ID of lead opinion author |
| lead\_opinion\_snippet | string | Text excerpt (typically 300-500 chars) from the lead or primary opinion |
| lead\_opinion\_download\_url | string | Direct download URL for the primary opinion PDF when available |
| per\_curiam | boolean | True if the primary opinion is per curiam (unsigned) |
| syllabus | string | Official court syllabus when available |
| posture | string | Procedural posture of the case |
| procedural\_history | string | Procedural history summary |
| suit\_nature | string | Nature of suit |
| cluster\_id | number | CourtListener opinion cluster ID (use with `/api/rest/v4/clusters/{id}/`) |
| docket\_id | number | CourtListener docket ID (use with `/api/rest/v4/dockets/{id}/`) |
| absolute\_url | string | Canonical CourtListener URL for the case |
| scraped\_at | string | ISO timestamp when the record was scraped |

### FAQ

**How many opinions does CourtListener cover?**
Over 8.2 million opinions across 3,358 US courts. CourtListener is maintained by the non-profit Free Law Project and pulls from court websites, PACER filings, the Library of Congress, and partner feeds. New opinions from actively scraped courts (SCOTUS, federal circuits, state supreme courts) typically appear within 24 hours of filing.

**Do I need proxies or an API key to run this?**
No. The CourtListener v4 search API is public and requires no authentication. The scraper ships with proxies disabled by default.

**What is the difference between `citation` and `docketNumber`?**
A docket number is the court's internal case number (e.g. `24-813`), assigned when the case is filed. A citation is the published reporter reference (e.g. `410 U.S. 113`), assigned later when the opinion is reported. Both filters can be used together.

**Why do I see multiple records with the same case name?**
Separate opinions in the same case (lead, concurrence, dissent) are consolidated into a single cluster record on output. But the same case may appear at different procedural stages (e.g. "Chiles v. Salazar" and "Chiles v. Salazar (revisions 3/31/26)") or under different docket numbers. These are distinct opinions and get distinct records.

**How do I get the full opinion text?**
The `lead_opinion_snippet` field contains a 300-500 character excerpt from the primary opinion. For full opinion text, follow the `lead_opinion_download_url` (direct court PDF) or fetch `/api/rest/v4/opinions/{id}/` using the `cluster_id` — that endpoint returns `plain_text` and `html_with_citations` but requires a free CourtListener API token.

**Can I run a bulk export of every opinion from a specific court?**
Yes. Set `court` to the court ID (e.g. `scotus`), set `query` to `"*"`, and raise `maxItems` to the volume you need. With unlimited `maxItems` (`0`), you must provide at least one filter.

**What is a "cluster"?**
CourtListener groups all opinions from the same case (majority, concurrence, dissent, per curiam, etc.) into one cluster. Each cluster gets one record in the output, with the primary opinion's snippet and download URL, and a count of how many opinions the cluster contains.

### Need More Features?

Need full opinion text, citation graph data (who cites whom), scheduled runs, or a different data source? [Get in touch](https://console.apify.com/actors/issues).

### Why Use CourtListener Scraper?

- **Official API, not HTML scraping** — reads the Free Law Project's v4 JSON endpoints directly, so field names match the source of truth, not a CSS selector
- **Production-grade, not a hobby wrapper** — cursor-paginated, rate-limit aware, retries on transient failures, flattens complex cluster data into a clean tabular schema
- **30+ fields per case including citations and panel data** — enough to build citation networks, map judge activity, and track precedent without a second API call
- **No proxy cost, no API key overhead** — CourtListener is public, US-hosted, and free; the per-record cost reflects actual compute, not unnecessary infrastructure

# Actor input Schema

## `sp_intended_usage` (type: `string`):

Please describe how you plan to use the data extracted by this crawler.

## `sp_improvement_suggestions` (type: `string`):

Provide any feedback or suggestions for improvements.

## `sp_contact` (type: `string`):

Provide your email address so we can get in touch with you.

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

Free-text search over opinion content and metadata. Use quoted strings for exact phrases (e.g., "qualified immunity"). Leave empty to browse all opinions by filters only.

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

CourtListener court ID. Common values: scotus (Supreme Court), ca1-ca11 (Circuit Courts), cafc (Federal Circuit), cadc (DC Circuit). Leave empty to search all 3,350+ courts. See https://www.courtlistener.com/api/rest/v4/courts/ for full list.

## `judge` (type: `string`):

Filter by authoring or panel judge name. Partial matches work (e.g., 'Scalia', 'Ginsburg').

## `citation` (type: `string`):

Filter by citation string. Use quoted form for exact match (e.g., '"410 U.S. 113"' for Roe v. Wade).

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

Filter by court docket number (e.g., '24-813').

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

Only include opinions filed on or after this date (ISO format, YYYY-MM-DD).

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

Only include opinions filed on or before this date (ISO format, YYYY-MM-DD).

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

How to order results.

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

Maximum number of opinion records to return.

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

Proxy settings. CourtListener's public API does not require a proxy.

## Actor input object example

```json
{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "query": "qualified immunity",
  "orderBy": "score desc",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# 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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "query": "qualified immunity",
    "court": "",
    "judge": "",
    "citation": "",
    "docketNumber": "",
    "filedAfter": "",
    "filedBefore": "",
    "orderBy": "score desc",
    "maxItems": 50,
    "proxyConfiguration": {
        "useApifyProxy": false
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("jungle_synthesizer/courtlistener-opinion-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 = {
    "sp_intended_usage": "Describe your intended use...",
    "sp_improvement_suggestions": "Share your suggestions here...",
    "sp_contact": "Share your email here...",
    "query": "qualified immunity",
    "court": "",
    "judge": "",
    "citation": "",
    "docketNumber": "",
    "filedAfter": "",
    "filedBefore": "",
    "orderBy": "score desc",
    "maxItems": 50,
    "proxyConfiguration": { "useApifyProxy": False },
}

# Run the Actor and wait for it to finish
run = client.actor("jungle_synthesizer/courtlistener-opinion-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 '{
  "sp_intended_usage": "Describe your intended use...",
  "sp_improvement_suggestions": "Share your suggestions here...",
  "sp_contact": "Share your email here...",
  "query": "qualified immunity",
  "court": "",
  "judge": "",
  "citation": "",
  "docketNumber": "",
  "filedAfter": "",
  "filedBefore": "",
  "orderBy": "score desc",
  "maxItems": 50,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}' |
apify call jungle_synthesizer/courtlistener-opinion-scraper --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "CourtListener Opinion Scraper - US Court Case Law API",
        "description": "Crawl US court opinions from CourtListener (Free Law Project). 8M+ decisions from 3,350+ federal, state, and appellate courts. Filter by court, judge, date range, citation, or keyword. Returns case metadata, citations, precedential status, and opinion excerpts.",
        "version": "1.0",
        "x-build-id": "XFcxyQZXcyG0fq05V"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/jungle_synthesizer~courtlistener-opinion-scraper/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-jungle_synthesizer-courtlistener-opinion-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/jungle_synthesizer~courtlistener-opinion-scraper/runs": {
            "post": {
                "operationId": "runs-sync-jungle_synthesizer-courtlistener-opinion-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/jungle_synthesizer~courtlistener-opinion-scraper/run-sync": {
            "post": {
                "operationId": "run-sync-jungle_synthesizer-courtlistener-opinion-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",
                "required": [
                    "sp_intended_usage",
                    "sp_improvement_suggestions"
                ],
                "properties": {
                    "sp_intended_usage": {
                        "title": "What is the intended usage of this data?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Please describe how you plan to use the data extracted by this crawler."
                    },
                    "sp_improvement_suggestions": {
                        "title": "How can we improve this crawler for you?",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide any feedback or suggestions for improvements."
                    },
                    "sp_contact": {
                        "title": "Contact Email",
                        "minLength": 1,
                        "type": "string",
                        "description": "Provide your email address so we can get in touch with you."
                    },
                    "query": {
                        "title": "Search Query",
                        "type": "string",
                        "description": "Free-text search over opinion content and metadata. Use quoted strings for exact phrases (e.g., \"qualified immunity\"). Leave empty to browse all opinions by filters only."
                    },
                    "court": {
                        "title": "Court ID",
                        "type": "string",
                        "description": "CourtListener court ID. Common values: scotus (Supreme Court), ca1-ca11 (Circuit Courts), cafc (Federal Circuit), cadc (DC Circuit). Leave empty to search all 3,350+ courts. See https://www.courtlistener.com/api/rest/v4/courts/ for full list."
                    },
                    "judge": {
                        "title": "Judge Name",
                        "type": "string",
                        "description": "Filter by authoring or panel judge name. Partial matches work (e.g., 'Scalia', 'Ginsburg')."
                    },
                    "citation": {
                        "title": "Citation",
                        "type": "string",
                        "description": "Filter by citation string. Use quoted form for exact match (e.g., '\"410 U.S. 113\"' for Roe v. Wade)."
                    },
                    "docketNumber": {
                        "title": "Docket Number",
                        "type": "string",
                        "description": "Filter by court docket number (e.g., '24-813')."
                    },
                    "filedAfter": {
                        "title": "Filed After",
                        "type": "string",
                        "description": "Only include opinions filed on or after this date (ISO format, YYYY-MM-DD)."
                    },
                    "filedBefore": {
                        "title": "Filed Before",
                        "type": "string",
                        "description": "Only include opinions filed on or before this date (ISO format, YYYY-MM-DD)."
                    },
                    "orderBy": {
                        "title": "Sort Order",
                        "enum": [
                            "score desc",
                            "dateFiled desc",
                            "dateFiled asc",
                            "citeCount desc"
                        ],
                        "type": "string",
                        "description": "How to order results."
                    },
                    "maxItems": {
                        "title": "Max Items",
                        "type": "integer",
                        "description": "Maximum number of opinion records to return.",
                        "default": 50
                    },
                    "proxyConfiguration": {
                        "title": "Proxy Configuration",
                        "type": "object",
                        "description": "Proxy settings. CourtListener's public API does not require a proxy."
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
