# ⚖ CourtListener Docket Monitor (`skootle/courtlistener-federal-dockets`) Actor

Stop checking PACER by hand. Scrape and monitor federal dockets by party, court, filing date, or nature of suit. Get case names, docket numbers, judges, parties, attorneys, status, ISO dates, and direct links. Export, run via API, schedule, or integrate with other tools.

- **URL**: https://apify.com/skootle/courtlistener-federal-dockets.md
- **Developed by:** [Skootle](https://apify.com/skootle) (community)
- **Categories:** Developer tools, AI, Lead generation
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.00 / 1,000 docket records

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

<!-- skootle:growth-loop-hook -->
### Stop checking PACER and CourtListener by hand

Need to know when a client, portfolio company, or competitor is named in a new federal case? Search once, save the input, and schedule structured docket results instead of repeating searches and cleaning exports.

- Search federal dockets by party, court, filing date, keyword, or nature of suit.
- Schedule recurring litigation-monitoring runs from one saved input.
- Export case names, docket numbers, judges, parties, attorneys, status, ISO dates, and direct CourtListener links.

![CourtListener Federal Dockets hero](https://raw.githubusercontent.com/kesjam/skootle-actors-assets/main/heroes/courtlistener-federal-dockets-v2.png)

### TL;DR

**CourtListener Docket Monitor turns CourtListener and RECAP search results into one structured row per case.** Use it for company watchlists, daily new-filing alerts, litigation research, and legal-news monitoring. Every row includes source names, best-effort cleaned names, nature-of-suit taxonomy, ISO dates, status, judges, attorneys, and direct source links. Party roles are inferred only when a name can be matched to the case caption; uncertain roles remain `other`.

**Verified cloud proof:** three current-build runs each returned 5 dockets with 0 recorded errors. The Apple watchlist run covered 4 federal courts, and the case-caption role check found no unsupported plaintiff/defendant assignments. [Inspect the public sample dataset.](https://api.apify.com/v2/datasets/Hi2UiZrVByPIRqNaT/items?clean=true)

> Coverage follows CourtListener and RECAP. Very recent, sealed, and unevenly covered state matters may be missing. Treat inferred party roles and cleaned names as best-effort enrichment and verify important facts against the source docket.

<!-- skootle:review-cta -->
> Try it on a small dataset, then let us know what you think in a [review](https://apify.com/skootle/courtlistener-federal-dockets/reviews).

---

### What does CourtListener Federal Dockets do?

**CourtListener** is operated by the non-profit Free Law Project. It maintains a public collection of federal and state court data sourced in part from **RECAP**, the community PACER archive. Coverage varies by court, date, document type, and RECAP availability; use CourtListener's coverage page for current details.

This actor wraps the CourtListener `/api/rest/v4/search/?type=r` endpoint, paginates through results, and normalizes each docket into a flat dataset row with these enrichments on top of the raw API output:

1. **Best-effort party-role inference.** CourtListener returns `party` as a flat array with unreliable ordering. This actor matches names to the two sides of the case caption and leaves uncertain roles as `other` rather than guessing.
2. **Best-effort name cleanup.** Common legal suffixes and punctuation are removed into a separate `nameCanonical` field while every original source value remains in `nameRaw`.
3. **Nature-of-suit taxonomy.** The raw `suitNature` field is a free-text string with a leading JFC numeric code (e.g. "830 Patent"). The actor decodes the code into one of 17 top-level categories: `intellectual_property`, `civil_rights`, `antitrust`, `securities`, `labor`, `contract`, `tort_personal_injury`, etc. Filter on category in one expression.
4. **Date arithmetic.** `daysSinceFiled` computed at scrape time. `isTerminated` boolean derived from the presence of a termination date.
5. **Firm cleanup plus source attorneys.** Firm names include raw and best-effort cleaned values; attorney names remain exactly as CourtListener returned them.

### Why scrape CourtListener?

PACER is the official federal court records system and charges for document access. CourtListener, operated by Free Law Project, maintains a public RECAP-backed search API. This Actor turns that API into scheduled, structured monitoring output without requiring a manual PACER search-and-download workflow.

What CourtListener gives you raw is good but not finished:

- The `party` field is a flat array with no plaintiff/defendant tags. Every consumer writes their own splitter.
- `suitNature` is "830 Patent" or "440 Civil Rights" - no enum, no category rollup. Every consumer writes their own taxonomy.
- Corporate-entity normalization is on you. Same parent appears as "Apple Inc.", "APPLE, INC.", "Apple Computer Co." across cases.
- Date math is on you. "Has this case been pending more than 2 years?" needs `dateFiled` parsing on every read.

This actor bakes all four into the output. Buyers consume; they don't pre-process.

### Who needs this?

- **Litigation-finance shops** building automated triage of new federal filings against companies in their portfolio.
- **IP and patent law firms** tracking new infringement filings against competitors of their clients.
- **Class-action plaintiff firms** monitoring new filings in a target nature-of-suit category.
- **Legal-news desks** running daily new-filing alerts.
- **Corporate compliance teams** tracking adverse-litigation exposure on portfolio companies (PE/VC).
- **General counsel offices** at large companies tracking new filings naming the company as a party.
- **AI agents and automation pipelines** that need clean, taxonomy-tagged docket data piped into Slack, LLM context, or a structured DB.

### How to use CourtListener Federal Dockets

1. Open the actor in the Apify Console.
2. Set `contactEmail` to your work email (recommended; CourtListener asks scrapers to identify themselves but does not require it).
3. (Optional, recommended) Set `courtlistenerApiToken` for substantially higher rate limits. Free 1-minute signup at https://www.courtlistener.com/help/api/.
4. Choose at least one filter: `searchTerm`, `courts`, `partyName`, `dateFiledFrom/To`, or `natureOfSuit`.
5. Set `maxItems` (default 10 trial; production typically 100-1000).
6. Click **Start**.

### How much will scraping CourtListener cost?

Pricing is per-result (per docket row written to the dataset).

| Plan tier | Per-result price |
|---|---|
| FREE | $0.007 |
| BRONZE | $0.005 |
| SILVER | $0.004 |
| GOLD | $0.003 |
| PLATINUM | $0.003 |
| DIAMOND | $0.003 |

A 10-row trial costs $0.07 on the FREE tier or $0.03 on GOLD. Your final cost depends only on the number of docket rows saved; use `maxItems` to set a predictable ceiling before starting a broader search.

### Is it legal to scrape CourtListener?

Yes. CourtListener's REST API is publicly documented and explicitly intended for programmatic use. Free Law Project's terms request attribution and ask scrapers to identify themselves in User-Agent (this actor enforces that). Commercial use is permitted under their terms. The underlying federal docket data is U.S. government public record.

We recommend setting your `contactEmail` and getting a free API token. Token requests are processed automatically and substantially raise your rate limit.

### Examples

**All new patent cases in NDCal in the last 90 days.**

```json
{
  "courts": ["cand"],
  "natureOfSuit": "830",
  "dateFiledFrom": "2026-02-12",
  "maxItems": 200
}
````

**Every federal case where Apple is a party.**

```json
{
  "partyName": "Apple",
  "dateFiledFrom": "2026-01-01",
  "maxItems": 500
}
```

**Antitrust filings, market-wide.**

```json
{
  "natureOfSuit": "antitrust",
  "dateFiledFrom": "2026-01-01",
  "maxItems": 300
}
```

**Daily new-filing monitor (cron).**

```json
{
  "dateFiledFrom": "2026-05-11",
  "dateFiledTo": "2026-05-11",
  "maxItems": 1000
}
```

**Securities class-action filings in SDNY.**

```json
{
  "courts": ["nysd"],
  "natureOfSuit": "securities",
  "dateFiledFrom": "2026-01-01",
  "maxItems": 200
}
```

**Search for cases mentioning "trade secret" + "AI".**

```json
{
  "searchTerm": "trade secret AI",
  "maxItems": 100
}
```

### Input parameters

| Field | Type | Description |
|---|---|---|
| `searchTerm` | string | Free-text search across case names + parties + docket text. |
| `courts` | string\[] | CourtListener court IDs (e.g. `cand`, `nysd`, `txed`). |
| `partyName` | string | Substring match on party name. |
| `dateFiledFrom` | string | ISO date inclusive. |
| `dateFiledTo` | string | ISO date inclusive. |
| `natureOfSuit` | string | JFC code (e.g. `830`) or keyword (`antitrust`). |
| `contactEmail` | string | Recommended. Included in User-Agent. |
| `courtlistenerApiToken` | string | Optional, raises rate limit. |
| `maxItems` | integer | Upper bound. Default 10. |

### Output format

| Field | Type | Notes |
|---|---|---|
| `recordType` | string | Always `"docket"`. |
| `docketId` | integer | CourtListener docket ID. |
| `docketNumber` | string | E.g. `"4:26-cv-04382"`. |
| `caseName` | string | E.g. `"Reynolds v. Google LLC"`. |
| `caseNameFull` | string | Long-form case name when available. |
| `pacerCaseId` | string | PACER-side case ID. |
| `court` | string | Court display name. |
| `courtId` | string | CourtListener court ID. |
| `courtCitationString` | string | E.g. `"N.D. Cal."`. |
| `dateFiled` | string | ISO date. |
| `dateTerminated` | string | ISO date or null. |
| `dateArgued` | string | ISO date for appellate cases. |
| `daysSinceFiled` | integer | Computed at scrape time. |
| `isTerminated` | boolean | True iff `dateTerminated` is set. |
| `natureOfSuitRaw` | string | Original JFC field. |
| `natureOfSuitCategory` | enum | 17-value top-level category. |
| `cause` | string | Statute or rule cited. |
| `juryDemand` | string | "Plaintiff" / "Defendant" / "Both" / null. |
| `parties`, `plaintiffs`, `defendants` | object\[] | `{nameRaw, nameCanonical, role}`. |
| `firms` | object\[] | `{nameRaw, nameCanonical}` for filer law firms. |
| `attorneys` | string\[] | Named attorneys on the docket. |
| `assignedToJudge` | string | Federal judge assigned. |
| `referredToJudge` | string | Magistrate judge if applicable. |
| `docketUrl` | string | Direct link to the docket page. |
| `fieldCompletenessScore` | integer | 0-100. |
| `agentMarkdown` | string | LLM-ready card. |

The record below came from the verified current build, not a hand-written fixture:

```json
{
  "recordType": "docket",
  "outputSchemaVersion": "2026-07-17",
  "docketNumber": "2:26-cv-02178",
  "caseName": "Doe v. Apple, Inc.",
  "courtCitationString": "D. Nev.",
  "dateFiled": "2026-07-15",
  "natureOfSuitCategory": "tort_personal_injury",
  "plaintiffs": [{ "nameRaw": "Jane Doe", "nameCanonical": "Jane Doe", "role": "plaintiff" }],
  "defendants": [{ "nameRaw": "Apple Inc.", "nameCanonical": "Apple", "role": "defendant" }],
  "assignedToJudge": "Anne R. Traum",
  "docketUrl": "https://www.courtlistener.com/docket/73637870/doe-v-apple-inc/"
}
```

### During the Actor run

The actor calls CourtListener's `/api/rest/v4/search/?type=r` endpoint with your filters, paging via cursor through results. Each result becomes one dataset row. The CourtListener Search API returns up to 100 results per page; the actor follows cursor pagination automatically until `maxItems` is hit or no more results exist.

Run artifacts:

- `OUTPUT`: counts, unique courts, by-nature-of-suit breakdown, open vs terminated counts.
- `AGENT_BRIEFING`: markdown digest with the 10 most recent filings.

### FAQ

#### How does this differ from PACER?

PACER is the official federal courts records system. CourtListener is a public mirror operated by Free Law Project and sourced from RECAP uploads. Coverage depends on what CourtListener and RECAP index; very recent, sealed, and unevenly covered state matters may be absent.

#### How reliable is plaintiff / defendant classification?

CourtListener's search result contains a flat `party` array and its order is not reliable. The Actor compares each party name with the two sides of the case caption. It emits `plaintiff` or `defendant` only when that match is supportable; otherwise it emits `other`. Verify important role decisions against the linked source docket.

#### Can I get every case naming a specific company without listing every name variation?

Use `partyName: "Apple"` to search the source by substring. The output also includes a best-effort `nameCanonical` value for common suffix and punctuation cleanup, but it is not an authoritative entity-resolution ID. Keep `nameRaw` and the source URL for verification.

#### What about appellate / state / bankruptcy / specialized courts?

The Actor can filter any court ID exposed by CourtListener. Check the [coverage page](https://www.courtlistener.com/help/coverage/) for the current federal, specialized, appellate, and state inventory. The Actor passes through what CourtListener indexes; coverage and freshness vary by court.

#### Do I need an API token?

Strongly recommended. CourtListener's anonymous rate limit is low. Free tokens are processed automatically at https://www.courtlistener.com/help/api/rest/ in 1-2 minutes. The actor uses the token only if you supply it; without one, it gracefully accepts lower throughput.

#### Can I use this with Python / Make / Zapier / n8n / Slack?

Yes. All four integrations work first-class. The `agentMarkdown` field is designed for direct posting into a Slack channel or LLM context.

#### What about full docket entries (motions, orders)?

This actor pulls docket-level metadata (one row per case). Full per-entry docket sheets are also available via CourtListener but are a separate scrape target - not in v0.1 of this actor. Open an issue if you want it added.

#### How fresh is the data?

Freshness follows CourtListener's own index. Use overlapping filing-date windows and deduplicate on `docketId` when monitoring time-sensitive filings.

#### Your feedback

Hit a bug or want a feature? Open an issue on the [Issues tab](https://apify.com/skootle/courtlistener-federal-dockets/issues/open) rather than the reviews page, and we'll fix it fast (typically within 48 hours).

### Why choose this CourtListener docket monitor?

- **Caption-backed party roles, with uncertain matches preserved as `other`.**
- **Nature-of-suit taxonomy** - 17 canonical categories, filterable in one expression.
- **Raw plus best-effort cleaned names** on parties and firms.
- **Date arithmetic baked in** - `daysSinceFiled`, `isTerminated` boolean.
- **Versioned schema** (`outputSchemaVersion: "2026-07-17"`).
- **`fieldCompletenessScore`** per record.
- **`agentMarkdown`** per record + **`AGENT_BRIEFING.md`** per run for LLM / Slack consumption.

### Other Skootle actors you might want to check

- [SEC Form 4 Insider Trades](https://apify.com/skootle/sec-form4-insider-trades) - corporate-insider transaction data.
- [Federal Rulemaking Monitor](https://apify.com/skootle/federal-rulemaking-monitor) - FR + Regulations.gov joined.
- [SAM.gov + USAspending Federal Contracts](https://apify.com/skootle/sam-gov-federal-contracts) - federal contract opportunities.
- [SEC EDGAR Filings](https://apify.com/skootle/sec-edgar-filings) - generalist EDGAR full-text search.

### Support and contact

Open an issue at the [Issues tab](https://apify.com/skootle/courtlistener-federal-dockets/issues/open) for bugs or feature requests. Typical response time 48 hours.

# Actor input Schema

## `searchTerm` (type: `string`):

Free-text search across case names, parties, and docket text.

## `courts` (type: `array`):

Filter by court ID, e.g. \['cand', 'nysd', 'txed']. See https://www.courtlistener.com/help/coverage/ for IDs.

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

Filter to cases where this name appears as a party (plaintiff or defendant). Substring match.

## `dateFiledFrom` (type: `string`):

ISO date (YYYY-MM-DD).

## `dateFiledTo` (type: `string`):

ISO date (YYYY-MM-DD).

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

JFC code (e.g. '830' for patent) or keyword (e.g. 'antitrust').

## `contactEmail` (type: `string`):

CourtListener asks scrapers to identify themselves. Use your work email; included only in User-Agent.

## `courtlistenerApiToken` (type: `string`):

Free token from https://www.courtlistener.com/help/api/rest/. Increases your rate limit substantially. Stored encrypted.

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

Upper bound on dockets returned. Default 10 (trial); production 100-1000.

## Actor input object example

```json
{
  "courts": [],
  "maxItems": 10
}
```

# Actor output Schema

## `datasetItems` (type: `string`):

No description

## `runSummary` (type: `string`):

No description

## `agentBriefing` (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 = {
    "courts": []
};

// Run the Actor and wait for it to finish
const run = await client.actor("skootle/courtlistener-federal-dockets").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 = { "courts": [] }

# Run the Actor and wait for it to finish
run = client.actor("skootle/courtlistener-federal-dockets").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 '{
  "courts": []
}' |
apify call skootle/courtlistener-federal-dockets --silent --output-dataset

```

## MCP server setup

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

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "⚖ CourtListener Docket Monitor",
        "description": "Stop checking PACER by hand. Scrape and monitor federal dockets by party, court, filing date, or nature of suit. Get case names, docket numbers, judges, parties, attorneys, status, ISO dates, and direct links. Export, run via API, schedule, or integrate with other tools.",
        "version": "0.1",
        "x-build-id": "Za1HCzkBnLqxaQ037"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/skootle~courtlistener-federal-dockets/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-skootle-courtlistener-federal-dockets",
                "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/skootle~courtlistener-federal-dockets/runs": {
            "post": {
                "operationId": "runs-sync-skootle-courtlistener-federal-dockets",
                "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/skootle~courtlistener-federal-dockets/run-sync": {
            "post": {
                "operationId": "run-sync-skootle-courtlistener-federal-dockets",
                "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": {
                    "searchTerm": {
                        "title": "Search term",
                        "type": "string",
                        "description": "Free-text search across case names, parties, and docket text."
                    },
                    "courts": {
                        "title": "Courts (CourtListener IDs)",
                        "type": "array",
                        "description": "Filter by court ID, e.g. ['cand', 'nysd', 'txed']. See https://www.courtlistener.com/help/coverage/ for IDs.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "partyName": {
                        "title": "Party name",
                        "type": "string",
                        "description": "Filter to cases where this name appears as a party (plaintiff or defendant). Substring match."
                    },
                    "dateFiledFrom": {
                        "title": "Date filed from",
                        "type": "string",
                        "description": "ISO date (YYYY-MM-DD)."
                    },
                    "dateFiledTo": {
                        "title": "Date filed to",
                        "type": "string",
                        "description": "ISO date (YYYY-MM-DD)."
                    },
                    "natureOfSuit": {
                        "title": "Nature of suit",
                        "type": "string",
                        "description": "JFC code (e.g. '830' for patent) or keyword (e.g. 'antitrust')."
                    },
                    "contactEmail": {
                        "title": "Contact email (recommended)",
                        "type": "string",
                        "description": "CourtListener asks scrapers to identify themselves. Use your work email; included only in User-Agent."
                    },
                    "courtlistenerApiToken": {
                        "title": "CourtListener API token (optional)",
                        "type": "string",
                        "description": "Free token from https://www.courtlistener.com/help/api/rest/. Increases your rate limit substantially. Stored encrypted."
                    },
                    "maxItems": {
                        "title": "Max dockets",
                        "minimum": 1,
                        "maximum": 10000,
                        "type": "integer",
                        "description": "Upper bound on dockets returned. Default 10 (trial); production 100-1000.",
                        "default": 10
                    }
                }
            },
            "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
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
