CourtListener Scraper | 16 Fields, Opinions & Dockets avatar

CourtListener Scraper | 16 Fields, Opinions & Dockets

Pricing

from $0.60 / 1,000 court records

Go to Apify Store
CourtListener Scraper | 16 Fields, Opinions & Dockets

CourtListener Scraper | 16 Fields, Opinions & Dockets

Scrape US federal and state court opinions, case law, and dockets from CourtListener. Filter by query, court, and date. Get case name, judge, citations, docket number as structured JSON, no API key. Use it as an MCP server in Claude, ChatGPT & AI agents.

Pricing

from $0.60 / 1,000 court records

Rating

0.0

(0)

Developer

The Mine Works

The Mine Works

Maintained by Community

Actor stats

0

Bookmarked

12

Total users

2

Monthly active users

9 days ago

Last modified

Share

200 US court opinions in 40 seconds

From The Mine Works, makers of Threads Scraper and B2B Leads Finder, with over 140,000 runs across 170+ public actors. This actor ranks #1 for "courtlistener" in Apify Store search.

Search US case law and federal court dockets on CourtListener, the free legal research database run by the nonprofit Free Law Project. Type words or a quoted phrase, optionally pick a court and a filing date range, and get one row per court opinion or per docket, with case name, court, filing date, docket number, judge, reporter citations, citation count and a CourtListener link.

Why choose this actor?

  • Hundreds of opinions in under a minute, ranked by relevance. In our 2 October test, trade secret misappropriation returned 200 published opinions from 74 courts in 40 seconds, out of 9,011 matches. Each row carries the reporter citations and how often later opinions cite it.
  • No CourtListener key and no PACER fees. CourtListener's search is free and needs no account; a free CourtListener token is optional and only raises your rate limit. You pay only for records delivered.
  • Filters run on CourtListener's side, so you pay only for matches. Court and filing date filters are sent with the search: a Ninth Circuit search for 2024 returned exactly 12 records, all from the Ninth Circuit and all filed in 2024. Searches that match nothing charge only the start fee.

Run it on Apify

Part of The Mine Works Science, health and government data family: data.gov.in Scraper, Socrata Open Data Scraper, Academic Research MCP, OpenAlex Scraper, FDA 510(k) Clearances Scraper, Crossref Scraper.

Try it in one minute

Paste this into the JSON tab of the input page. It returns 10 opinions in a few seconds.

{
"query": "patent infringement",
"maxResults": 10
}

query is the only required input: plain words (trade secret misappropriation) or a phrase in quotes ("summary judgment"). Choose resultType opinions for written court decisions (case law) or dockets for federal case dockets from CourtListener's RECAP archive. Narrow with court (a CourtListener court ID such as scotus, ca9, cafc or ded) and with dateFrom and dateTo in YYYY-MM-DD.

Apify's free plan includes $5 of credit every month, which covers about 4,900 records at this actor's price (Free tier $1.00 per 1,000 records, plus the $0.005 start fee on each run, in runs of 500).

Copy to your AI assistant

themineworks/courtlistener-court-records on Apify. Searches CourtListener (Free Law Project) for US court opinions or federal RECAP dockets and returns one row per record with case name, court, court ID, filing date, docket number, judge, reporter citations, cite count, precedential status, nature of suit, cluster and docket IDs and a CourtListener URL (opinions only). Call ApifyClient("TOKEN").actor("themineworks/courtlistener-court-records").call(run_input={...}), then client.dataset(run["defaultDatasetId"]).list_items().items. Required: query (string; quoted phrases allowed). Optional: resultType ("opinions" default, or "dockets"), court (CourtListener court ID such as scotus, ca9, cafc, ded; blank = all courts), dateFrom and dateTo (YYYY-MM-DD, filing date), maxResults (integer 1 to 10000, default 5), apiToken (free CourtListener token, raises rate limits). Results are ordered by relevance, or newest filed first when monitorMode is true. Rows with _type "summary" or "info" are run reports and are never billed. Full spec: GET https://api.apify.com/v2/acts/themineworks~courtlistener-court-records/builds/default (Bearer TOKEN), which returns inputSchema and readme. Token: https://console.apify.com/account/integrations?fpr=ymnoit&utm_source=apify-readme&utm_medium=referral

Key features

  • Two record types. opinions returns written decisions with up to 16 fields each; dockets returns RECAP docket records (case name, court, filing date, docket number, nature of suit and docket ID).
  • Every US court CourtListener covers. Leave court empty to search all courts at once; the 200 opinion test spanned 74 courts. Put one court ID in court to restrict a search.
  • Filing date range. dateFrom and dateTo are applied by CourtListener before results come back.
  • Up to 10,000 records per run, paged automatically through CourtListener's own result cursor, most relevant first (newest filed first in monitor mode).
  • Citation data for research. Opinion rows carry every reporter citation CourtListener holds (for example 578 F. Supp. 2d 711 and its LEXIS and Westlaw IDs) and cite_count, the number of later opinions that cite it.
  • IDs on every row, links on opinions. Every row carries CourtListener's docket_id; opinion rows also carry cluster_id and the CourtListener page url, for joining and deduplication.

How to use it

Basic: case law on a topic, all courts

{
"query": "trade secret misappropriation",
"maxResults": 200
}

Our test of this input returned 200 published opinions in 40 seconds, the most relevant first.

One court, one year

{
"query": "patent infringement",
"court": "ca9",
"dateFrom": "2024-01-01",
"dateTo": "2024-12-31",
"maxResults": 100
}

This returned all 12 matching Ninth Circuit opinions filed in 2024. Court IDs are CourtListener's short codes: scotus (US Supreme Court), ca1 to ca11 and cadc (circuit courts of appeals), cafc (Federal Circuit), and district courts such as ded (Delaware) or cand (Northern District of California). Every row carries its court_id, so a broad search first is an easy way to find the codes you need.

Several searches at once

The actor takes one query per run. For several topics or courts, start one run per search from the API (they can run in parallel), or save each as its own task.

from apify_client import ApifyClient
client = ApifyClient("TOKEN")
for q in ["non-compete agreement", "trade secret misappropriation", "inevitable disclosure"]:
run = client.actor("themineworks/courtlistener-court-records").call(
run_input={"query": q, "maxResults": 300})
rows = [r for r in client.dataset(run["defaultDatasetId"]).iterate_items() if "_type" not in r]
print(q, len(rows))

New federal filings in a practice area

{
"query": "securities class action",
"resultType": "dockets",
"dateFrom": "2026-01-01",
"maxResults": 200
}

Our test returned dockets filed between January and September 2026 from 11 federal courts, mostly district courts, each with its docket number and nature of suit (for example 850 Securities/Commodities). Save it as a task with monitorMode on and schedule it weekly to watch new cases; leave dateFrom as it is, because changing the input starts a fresh history.

Building a case law corpus for research or RAG

{
"query": "\"fair use\" software",
"court": "cafc",
"maxResults": 1000
}

Store each opinion by cluster_id, keep citations for reference strings and cite_count as a rough authority signal, and use url to fetch the full opinion text from CourtListener for your index.

Citation check for a brief

{
"query": "\"inevitable disclosure\"",
"maxResults": 100
}

Sort the rows by cite_count to see which decisions later courts lean on most, then read the top ones on CourtListener.

Input parameters

ParameterTypeDefaultWhat it does
querystringrequired (form prefill: patent infringement)Words or a quoted phrase to search for in case text.
resultTypestringopinionsopinions for written decisions (case law) or dockets for federal RECAP docket records.
courtstringnone (form prefill: scotus)A CourtListener court ID such as scotus, ca9, cafc or ded. Leave blank for all courts.
dateFromstringnone (form prefill: 2024-01-01)Only records filed on or after this date, YYYY-MM-DD.
dateTostringnone (form prefill: 2024-12-31)Only records filed on or before this date, YYYY-MM-DD.
maxResultsinteger (1 to 10,000)5Most records to return.
apiTokenstring (secret)noneYour free CourtListener API token. Optional; it raises CourtListener's rate limit for large pulls.

"Form prefill" values fill the Console form for you but are not defaults. The Console form comes with scotus and the year 2024 filled in, so a Console run of the prefilled form searches only the Supreme Court in 2024; clear those fields to search every court and every year. An API call that leaves them out applies no court or date filter.

Large pulls and the timeout. Our 200 record test took 40 seconds, so the default 300 second run timeout fits roughly 1,500 records. For more, raise the timeout in the run options (about 35 minutes for 10,000 records). If a run does hit its timeout, the records already delivered stay in the dataset.

What data do you get?

One row per opinion or per docket. A value CourtListener has as blank is sent as an empty string ("") or an empty list ([]); a value CourtListener does not send at all, such as a missing argument date, is left out of the row.

The case: case_name (short name, such as TianRui Group Co. v. International Trade Commission), case_name_full (full caption; empty for 117 of the 200 opinions in our test), docket_number, nature_of_suit (the federal nature of suit code and label, such as 850 Securities/Commodities; mostly empty for opinions).

The court and dates: court (full court name), court_id (CourtListener's court code), date_filed (YYYY-MM-DD), date_argued (opinions only, and only when an argument date is on file: 6 of 200 in our test).

The decision (opinions only): judge (empty for about half of opinions), citations (list of reporter citations), cite_count (how many later opinions cite this one), status (precedential status, such as Published).

Links and IDs: cluster_id (CourtListener's opinion ID; opinions only), docket_id (CourtListener's docket ID; every row), url (the CourtListener opinion page; opinions only), scraped_at (ISO timestamp).

Docket rows are shorter. In dockets mode CourtListener's search returns less per record, so each row has 9 fields: case_name, court, court_id, date_filed, docket_number, citations (always empty for dockets), nature_of_suit, docket_id and scraped_at. Docket rows do not include a link, a judge or a status today; look a docket up on CourtListener by its court and docket number.

Each run also ends with a _type: "summary" row (query, records, total_available, the number of matches CourtListener reports, and charged_for) and a _type: "info" row. Neither is a court record and neither is ever charged.

Stable fields for automations

These 8 fields were present in every row we sampled, opinions and dockets alike (237 rows across three test runs and a scheduled platform run):

FieldWhat it holds
case_nameShort case name
courtFull court name
court_idCourtListener court code, such as cafc
date_filedFiling date, YYYY-MM-DD
citationsList of reporter citations (empty for dockets)
nature_of_suitNature of suit code and label, or empty
docket_idCourtListener docket ID, a number
scraped_atISO timestamp when the row was captured

Opinion rows also carried case_name_full, judge, cite_count, status, cluster_id and url in every sampled row, and docket_number in all but one. We will not rename these fields. New fields may be added over time; existing ones keep their names.

Output examples

Real rows from our 2 October test runs.

An opinion, from the trade secret misappropriation search:

{
"case_name": "TianRui Group Co. v. International Trade Commission",
"case_name_full": "TIANRUI GROUP COMPANY LIMITED and TianRui Group Foundry Company Limited, Appellants, and Standard Car Truck Company, Inc. and Barber TianRui Railway Supply, LLC, Appellants, v. INTERNATIONAL TRADE COMMISSION, Appellee, and Amsted Industries Incorporated, Intervenor",
"court": "Court of Appeals for the Federal Circuit",
"court_id": "cafc",
"date_filed": "2011-10-11",
"docket_number": "18-2007",
"judge": "Bryson, Schall, Moore",
"citations": ["661 F.3d 1322", "100 U.S.P.Q. 2d (BNA) 1401", "33 I.T.R.D. (BNA) 1385", "2011 U.S. App. LEXIS 20607"],
"cite_count": 11,
"status": "Published",
"nature_of_suit": "",
"cluster_id": 615096,
"docket_id": 13649,
"url": "https://www.courtlistener.com/opinion/615096/tianrui-group-co-v-international-trade-commission/",
"scraped_at": "2026-10-02T08:01:04.672Z"
}

An opinion with an argument date, from the Ninth Circuit 2024 search (empty strings where CourtListener has no value):

{
"case_name": "Cpc Patent Technologies Pty Ltd. v. Apple Inc.",
"case_name_full": "",
"court": "Court of Appeals for the Ninth Circuit",
"court_id": "ca9",
"date_filed": "2024-10-24",
"date_argued": "2024-09-24",
"docket_number": "23-3449",
"judge": "",
"citations": ["119 F.4th 1126"],
"cite_count": 3,
"status": "Published",
"nature_of_suit": "",
"cluster_id": 10160745,
"docket_id": 69032034,
"url": "https://www.courtlistener.com/opinion/10160745/cpc-patent-technologies-pty-ltd-v-apple-inc/",
"scraped_at": "2026-10-02T08:01:37.727Z"
}

A docket, from the securities class action dockets search:

{
"case_name": "In Re: Microsoft Corporation Securities Litigation",
"court": "District Court, W.D. Washington",
"court_id": "wawd",
"date_filed": "2026-06-12",
"docket_number": "2:26-cv-02071",
"citations": [],
"nature_of_suit": "850 Securities/Commodities",
"docket_id": 73481059,
"scraped_at": "2026-10-02T08:01:34.116Z"
}

The summary row that ends a run (never charged; from a scheduled platform run on 1 October that asked for 5 records):

{
"_type": "summary",
"query": "patent infringement",
"records": 5,
"total_available": 59697,
"charged_for": 5,
"scraped_at": "2026-10-01T09:00:31.971Z"
}

Pricing

Pay per event: you pay for each court record delivered to your dataset, plus a small start fee per run.

EventFreeBronzeSilverGold and above
record-scraped, per record$0.001$0.0009$0.00075$0.0006
record-scraped, per 1,000 records$1.00$0.90$0.75$0.60
apify-actor-start, per run$0.005 per GB of run memory, minimum one eventsamesamesame

The start fee, exactly. Apify's apify-actor-start event is charged once when a run starts, at $0.005 for each GB of memory the run uses, with a minimum of one event. This actor runs on 512 MB by default, so a default run pays one event: $0.005. It does not need more memory.

Worked examples. On the Free tier, 200 opinions cost $0.20 plus $0.005. On the Gold tier, 1,000 records cost $0.60 plus $0.005, and a full 10,000 record backfill costs $6.00 plus $0.005.

Never charged: the summary and info rows, searches that match nothing, and requests CourtListener refuses or rate limits. A run with an error from CourtListener stops and pays only for the records already delivered.

There is no scheduled price change for this actor. The Pricing tab on this page always shows the rate for your own plan; if it and this table ever differ, the Pricing tab is right.

Run it on a schedule

Turn on monitorMode and each run delivers only the records you have not received before, so a daily run costs you only for what is new.

  1. Enter your input, switch on Monitor mode and click Save as a task.
  2. In Apify Console open Schedules, click Add schedule and pick Daily (or any time and timezone you like).
  3. Under Actors or tasks to run, add the task you saved and save the schedule.
{
"query": "securities class action",
"resultType": "dockets",
"dateFrom": "2026-01-01",
"maxResults": 200,
"monitorMode": true
}

The first run delivers everything it finds. After that, each run delivers only records that were not in an earlier run with the same input, and records it skips are never charged. The summary row at the end shows new_this_run and skipped_duplicates. Changing the input starts a fresh history; changing only the result limit does not. Changing only apiToken keeps the history too. In monitor mode the search runs newest filed first, so new filings come at the top, and the run stops after three pages in a row of records you already have.

FAQ

What is CourtListener? CourtListener (courtlistener.com) is a free legal research website run by the Free Law Project, a US nonprofit. It holds millions of US court opinions from federal and state courts and the RECAP archive of federal court dockets gathered from PACER. This actor uses its public search API.

How many records can I get? Up to 10,000 per run, most relevant first (newest filed first in monitor mode). The summary row's total_available tells you how many CourtListener matched (9,011 for trade secret misappropriation, 59,697 for patent infringement), so you can see how much of the result set you pulled. For more than 10,000, split the search by court or by date range.

How fresh is the data? Every run queries CourtListener live, so new opinions and dockets appear as soon as CourtListener has them. Our dockets test included cases filed as recently as 1 September 2026.

Do I need a CourtListener account, API token or PACER login? No. The search works without an account. A free CourtListener API token is optional; put it in apiToken to raise CourtListener's rate limit on big pulls. PACER is never used and never charged.

Does it use a proxy? No. CourtListener's API is public and the actor calls it directly, with automatic retries when CourtListener asks it to slow down.

What is the difference between opinions and dockets? Opinions are written court decisions, the case law you cite. Dockets are the case files of federal lawsuits from the RECAP archive: what was filed, where and when, whether or not a decision was written. Opinion rows are richer (judge, citations, cite count, status, link); docket rows have 9 fields and no link.

Why are judge, case_name_full or nature_of_suit empty? Because CourtListener has no value on file for that record. In our 200 opinion test, judge was empty for 96 and case_name_full for 117, and nature_of_suit is mostly used for federal dockets. The actor passes on what CourtListener holds rather than guessing.

Does it return the full text of opinions? No. Each opinion row has the CourtListener url, where the full opinion text can be read.

Can I run it on a schedule and get only new records? Yes. Save your input as a task with monitorMode on, then in Apify Console open Schedules, click Create new, and pick a cron expression such as 0 6 * * 1 for Mondays. Each run then delivers and charges only records that no earlier run with the same input delivered (see "Run it on a schedule").

How do I export the data? From the run's Storage tab as JSON, CSV, Excel, XML or HTML, or through the Apify API. Skip rows that have a _type field if you want court records only.

Can I use it from Claude, ChatGPT or another AI assistant?

  • Connector URL: https://mcp.apify.com/?tools=themineworks/courtlistener-court-records.
  • Claude: Settings > Connectors > Add custom connector, paste the URL, sign in with Apify.
  • ChatGPT: developer mode, add an MCP connector with the URL, sign in with Apify.
  • Cursor or VS Code: add it as an HTTP MCP server with that URL.
  • Claude Code: claude mcp add -t http courtlistener-court-records "https://mcp.apify.com/?tools=themineworks/courtlistener-court-records".

Is it legal to use this data? Court opinions and dockets are public records, and CourtListener publishes them for free reuse through its API. Records can name private individuals who were parties to a case; you are responsible for how you use the data, including CourtListener's terms and data protection laws such as GDPR and CCPA. This actor is not affiliated with the Free Law Project, and nothing it returns is legal advice.

Integrations

  • Google Sheets: export a run to a sheet, or append each scheduled run to a tracking sheet.
  • Make, Zapier and n8n: use the Apify app or node to start a run and send new dockets or opinions to Slack, email or a matter management tool.
  • Webhooks: have Apify call your URL when a run succeeds, then fetch the dataset.
  • API and client libraries: start runs and read datasets from Python, JavaScript or any HTTP client. The "Copy to your AI assistant" block above has the exact call.
  • MCP clients: Claude, ChatGPT, Cursor, VS Code and Claude Code can call the actor through https://mcp.apify.com.

More from The Mine Works

Science, health and government data

Social media and video

Leads and business directories

Marketing, SEO and reviews

LinkedIn

Real estate

Jobs and hiring

E-commerce and marketplaces

Company and business data

Food and local services

Developer and AI tools

More tools

Support

Found a bug or need a field we do not return yet? Open an issue on the Issues tab of this page and we will reply there. To ask for a new legal data source, email dmineworks@gmail.com. A guide and FAQ for this actor also live at themineworks.com.

CourtListener Scraper turns a legal search into clean rows of US court opinions and federal dockets, with citations and IDs, billed per record and with no PACER fees.