CourtListener Court Cases & Opinions Scraper avatar

CourtListener Court Cases & Opinions Scraper

Pricing

from $6.15 / 1,000 results

Go to Apify Store
CourtListener Court Cases & Opinions Scraper

CourtListener Court Cases & Opinions Scraper

Scrape US court cases, opinions and dockets: case name, court, date filed, docket number, citations, judges and opinion text. Search by keyword, court and date. Export to JSON, CSV or Excel.

Pricing

from $6.15 / 1,000 results

Rating

0.0

(0)

Developer

Scrapers Lat

Scrapers Lat

Maintained by Community

Actor stats

0

Bookmarked

1

Total users

0

Monthly active users

20 hours ago

Last modified

Share

CourtListener Court Cases & Opinions Scraper

CourtListener Court Cases & Opinions Scraper

Here is one real result, with every field the actor returns for an opinion (this record has withDetails and both AI add-ons enabled; the long opinion text in snippet is trimmed with a note, values real):

{
"caseName": "Kim v. Randal Lowry & Assocs.",
"caseNameFull": null,
"recordType": "opinion",
"court": "Ohio Court of Appeals",
"courtId": "ohioctapp",
"courtCitation": "Ohio Ct. App.",
"dateFiled": "2021-01-13",
"dateArgued": null,
"docketNumber": "29680",
"citations": ["166 N.E.3d 146", "2021 Ohio 51"],
"lexisCitation": null,
"scdbId": null,
"citedByCount": 5,
"precedentialStatus": "Published",
"judge": "Schafer",
"natureOfSuit": null,
"snippet": "[Cite as Kim v. Randal Lowry & Assocs., 2021-Ohio-51.] STATE OF OHIO ) IN THE COURT OF APPEALS ...",
"documentUrl": "http://www.supremecourt.ohio.gov/rod/docs/pdf/9/2021/2021-Ohio-51.pdf",
"url": "https://www.courtlistener.com/opinion/4847328/kim-v-randal-lowry-assocs/",
"clusterId": 4847328,
"docketId": 29102152,
"opinions": [
{
"id": 4651107,
"type": "combined-opinion",
"perCuriam": false,
"authorId": null,
"snippet": "[Cite as Kim v. Randal Lowry & Assocs., 2021-Ohio-51.] STATE OF OHIO ) IN THE COURT OF APPEALS NINTH JUDICIAL DISTRICT ...",
"documentUrl": "http://www.supremecourt.ohio.gov/rod/docs/pdf/9/2021/2021-Ohio-51.pdf",
"sourcePath": "pdf/2021/01/13/kim_v._randal_lowry__assocs..pdf",
"citesCount": 6
}
],
"judges": null,
"fullText": null,
"aiSummary": "The case 'Kim v. Randal Lowry & Assocs.' involves an appeal by John Y. Kim and others against Randal Lowry & Associates. The details of the court's holding or outcome are not provided in the excerpt.",
"aiExtract": {
"parties": { "plaintiffs": ["John Y. Kim"], "defendants": ["Randal Lowry & Associates"] },
"court": "Ninth Judicial District Court of Appeals, State of Ohio",
"holding": "The court affirmed the judgment.",
"legalIssues": [],
"citations": ["Kim v. Randal Lowry & Assocs., 2021-Ohio-51"],
"outcome": "Affirmed the judgment.",
"monetaryAmounts": []
},
"observedAt": "2026-08-14T05:46:45.289Z",
"error": null
}

The most complete CourtListener scraper available. It returns every field the CourtListener search exposes for opinions, dockets and oral arguments, including citations, precedential status, judges and nested opinion text, plus optional judge biographies and two AI add-ons, and gives you court, date, precedential-status and sort filters to target exactly the records you need.

📥 Input · 📤 Output · 💰 Pricing · ▶️ Examples

Apify Coverage Output Billing

Table of contents

What it does

The actor queries the public CourtListener search for the record type you choose (opinions, dockets or oral arguments), applies the filters you pass, paginates through the matches, and writes one normalized record per case to the run's dataset. Citations, precedential status and dates are surfaced as structured fields, and when withDetails is on the actor resolves judge biographies and returns the full nested opinion or docket data. Missing source values are returned as null, never invented.

Data covers US federal and state courts served by CourtListener (Free Law Project), including the Supreme Court, federal circuit and district courts, and many state appellate courts. Two optional AI add-ons (withSummary, withExtract) can enrich each record; they are opt-in, billed only when they produce output, and disabled on free Apify plans.

Quickstart

Open the actor, paste this into the input, and press Run. It returns 2 opinions on qualified immunity with full details.

{
"query": "qualified immunity",
"type": "opinions",
"maxRecords": 2,
"withDetails": true
}

Change type to dockets for case timelines with parties and filings, or oral-arguments for audio recordings. Leave the AI add-ons off (default) for the raw fields.

Input reference

FieldTypeRequiredDefaultDescription
querystringno(empty)Search terms across case names, opinion text, parties and citations, for example first amendment, qualified immunity, patent infringement.
typeenumnoopinionsWhat to collect: opinions (case law), dockets (parties, attorneys, filings) or oral-arguments (audio recordings).
courtstringno(all)Restrict to a single court by its code, for example scotus, ca9, nysd.
precedentialStatusarrayno(all)Restrict opinions to these statuses, for example Published, Unpublished, Errata, Separate.
dateFromstringno(empty)Earliest date a case was filed (YYYY-MM-DD).
dateTostringno(empty)Latest date a case was filed (YYYY-MM-DD).
sortenumnorelevanceOrder of the results: relevance, newest, oldest, most cited.
maxRecordsintegerno10Maximum records to collect. Free Apify plans are capped at 10 per run.
withDetailsbooleannotrueInclude full nested data (every opinion in the cluster, or every party/attorney/filing for a docket) plus resolved judge biographies.
withSummarybooleannofalseAdd a plain-English AI summary of each record. Paid add-on, disabled on free plans.
withExtractbooleannofalseAdd AI structured data (parties, holding, legal issues, citations, outcome, monetary amounts). Paid add-on, disabled on free plans.

Output reference

One dataset item per record. Field set varies by type; the table below covers the opinion shape. Types: string, number, boolean, array, object, or null when the source value is absent.

FieldTypeDescription
caseNamestringShort case name.
caseNameFullstringFull case name, or null.
recordTypestringRecord type, for example opinion, docket, oralArgument.
courtstringDeciding court name.
courtIdstringCourtListener court code, for example ohioctapp.
courtCitationstringCourt citation abbreviation.
dateFiledstringDate filed (YYYY-MM-DD), or null.
dateArguedstringDate argued (YYYY-MM-DD), or null.
docketNumberstringDocket number.
citationsarrayReporter citations for the case.
lexisCitationstringLexis citation, or null.
scdbIdstringSupreme Court Database ID, or null.
citedByCountnumberNumber of times the case is cited.
precedentialStatusstringPrecedential status, for example Published.
judgestringDeciding judge name(s) as text, or null.
natureOfSuitstringNature of suit, or null.
snippetstringOpinion text snippet.
documentUrlstringLink to the source opinion document (often a PDF).
urlstringCourtListener case page URL.
clusterIdnumberCourtListener opinion cluster ID.
docketIdnumberCourtListener docket ID.
opinionsarrayNested opinions in the cluster (with text snippet and document link). Present with withDetails.
judgesarrayResolved judge biographies, or null. Present with withDetails.
fullTextstringFull opinion text when available, or null.
aiSummarystringAI plain-English summary. Present only when withSummary is enabled.
aiExtractobjectAI structured extract (parties, court, holding, legalIssues, citations, outcome, monetaryAmounts). Present only when withExtract is enabled.
observedAtstringISO 8601 timestamp of when the record was collected.
errorstringnull on success. On a failed run, a single item with a populated error field is written instead.

Dockets return the case timeline with parties, attorneys, law firms and filed documents; oral arguments return the recording metadata and audio link.

Example output record

Real record from a live run (input {"query":"qualified immunity","type":"opinions","maxRecords":2,"withDetails":true}), with the long opinion text trimmed for readability:

{
"caseName": "Kim v. Randal Lowry & Assocs.",
"recordType": "opinion",
"court": "Ohio Court of Appeals",
"courtId": "ohioctapp",
"courtCitation": "Ohio Ct. App.",
"dateFiled": "2021-01-13",
"docketNumber": "29680",
"citations": ["166 N.E.3d 146", "2021 Ohio 51"],
"citedByCount": 5,
"precedentialStatus": "Published",
"judge": "Schafer",
"snippet": "[Cite as Kim v. Randal Lowry & Assocs., 2021-Ohio-51.] STATE OF OHIO ) IN THE COURT OF APPEALS ...",
"documentUrl": "http://www.supremecourt.ohio.gov/rod/docs/pdf/9/2021/2021-Ohio-51.pdf",
"url": "https://www.courtlistener.com/opinion/4847328/kim-v-randal-lowry-assocs/",
"clusterId": 4847328,
"docketId": 29102152,
"observedAt": "2026-08-14T05:46:45.289Z",
"error": null
}

Run via API and CLI

Start a run and wait for it to finish, then read the dataset. Replace <TOKEN> with your Apify API token.

Run synchronously and get dataset items in one call:

curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~courtlistener-scraper/run-sync-get-dataset-items?token=<TOKEN>" \
-H "Content-Type: application/json" \
-d '{"query":"qualified immunity","type":"opinions","maxRecords":25,"withDetails":true}'

Start a run asynchronously:

curl -X POST "https://api.apify.com/v2/acts/scrapers_lat~courtlistener-scraper/runs?token=<TOKEN>" \
-H "Content-Type: application/json" \
-d '{"query":"first amendment","type":"opinions","court":"scotus","sort":"most cited","maxRecords":100}'

Apify CLI:

apify call scrapers_lat/courtlistener-scraper \
--input '{"query":"antitrust","type":"dockets","maxRecords":10}'

Fetch results

Every run writes to a dataset. Fetch items as JSON, CSV, or Excel by changing format:

# JSON
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"
# CSV
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"
# Paginate large datasets
curl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&offset=1000&limit=1000"

<DATASET_ID> is returned as defaultDatasetId in the run object. Use offset and limit to page through large result sets. clean=true drops empty and internal fields.

Billing and limits

  • Pay per result. You are charged per record returned (result event). See the pricing tab for the current per-result price.
  • Detail enrichment billed separately. With withDetails on, a details event is charged per record only when detail enrichment succeeds (not for oral arguments, which carry no nested enrichment).
  • AI add-ons billed separately. withSummary and withExtract each charge their own event only when they produce output, and are disabled on free plans.
  • No charge on failure. If a run errors, the actor writes a single item with a populated error field and does not charge for it. Empty runs cost nothing.
  • Spend cap respected. Set maxTotalChargeUsd on the run; once reached, the actor stops emitting and charging further billable results.
  • Free Apify plans are capped at 10 records per run. Upgrade for higher maxRecords.

FAQ and troubleshooting

A run returned 0 records. Why? The query and filters matched nothing. Broaden the query, remove the court filter, or widen the date range. Zero-result runs are not charged.

What is the difference between opinions and dockets? Opinions return decided case law with citations, deciding judges and opinion text. Dockets return the case timeline with parties, attorneys, law firms and filed documents. Set type to choose.

Can I filter by court and date? Yes. Restrict to one court by its code (for example scotus, ca9), set dateFrom/dateTo, and sort by relevance, newest, oldest or most cited.

Why is a field like lexisCitation or natureOfSuit null? Not every case carries every field. Missing source values are returned as null, never guessed, so every row keeps the same shape.

Do the AI add-ons work on a free plan? No. The AI add-ons require a paid Apify plan and are disabled automatically for free users. The base record fields are always returned.

Is this an official CourtListener tool? No. This actor is independent and has no affiliation with CourtListener or the Free Law Project. It reads only data that is publicly available. Use it in accordance with the source platform's terms of service.

More scrapers at scrapers.lat

Built and maintained by scrapers.lat, where we publish scrapers for US and Latin American public platforms: company registries, government data, finance, e-commerce and more. Browse the catalog or request a custom scraper at scrapers.lat.


Independent tool, not affiliated with CourtListener or the Free Law Project. Accesses only publicly available court data. Use in accordance with the source platform's terms of service.