CourtListener Court Cases & Opinions Scraper
Pricing
from $6.15 / 1,000 results
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
Maintained by CommunityActor stats
0
Bookmarked
1
Total users
0
Monthly active users
20 hours ago
Last modified
Categories
Share
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
Table of contents
- What it does
- Quickstart
- Input reference
- Output reference
- Example output record
- Run via API and CLI
- Fetch results
- Billing and limits
- FAQ and troubleshooting
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
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
query | string | no | (empty) | Search terms across case names, opinion text, parties and citations, for example first amendment, qualified immunity, patent infringement. |
type | enum | no | opinions | What to collect: opinions (case law), dockets (parties, attorneys, filings) or oral-arguments (audio recordings). |
court | string | no | (all) | Restrict to a single court by its code, for example scotus, ca9, nysd. |
precedentialStatus | array | no | (all) | Restrict opinions to these statuses, for example Published, Unpublished, Errata, Separate. |
dateFrom | string | no | (empty) | Earliest date a case was filed (YYYY-MM-DD). |
dateTo | string | no | (empty) | Latest date a case was filed (YYYY-MM-DD). |
sort | enum | no | relevance | Order of the results: relevance, newest, oldest, most cited. |
maxRecords | integer | no | 10 | Maximum records to collect. Free Apify plans are capped at 10 per run. |
withDetails | boolean | no | true | Include full nested data (every opinion in the cluster, or every party/attorney/filing for a docket) plus resolved judge biographies. |
withSummary | boolean | no | false | Add a plain-English AI summary of each record. Paid add-on, disabled on free plans. |
withExtract | boolean | no | false | Add 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.
| Field | Type | Description |
|---|---|---|
caseName | string | Short case name. |
caseNameFull | string | Full case name, or null. |
recordType | string | Record type, for example opinion, docket, oralArgument. |
court | string | Deciding court name. |
courtId | string | CourtListener court code, for example ohioctapp. |
courtCitation | string | Court citation abbreviation. |
dateFiled | string | Date filed (YYYY-MM-DD), or null. |
dateArgued | string | Date argued (YYYY-MM-DD), or null. |
docketNumber | string | Docket number. |
citations | array | Reporter citations for the case. |
lexisCitation | string | Lexis citation, or null. |
scdbId | string | Supreme Court Database ID, or null. |
citedByCount | number | Number of times the case is cited. |
precedentialStatus | string | Precedential status, for example Published. |
judge | string | Deciding judge name(s) as text, or null. |
natureOfSuit | string | Nature of suit, or null. |
snippet | string | Opinion text snippet. |
documentUrl | string | Link to the source opinion document (often a PDF). |
url | string | CourtListener case page URL. |
clusterId | number | CourtListener opinion cluster ID. |
docketId | number | CourtListener docket ID. |
opinions | array | Nested opinions in the cluster (with text snippet and document link). Present with withDetails. |
judges | array | Resolved judge biographies, or null. Present with withDetails. |
fullText | string | Full opinion text when available, or null. |
aiSummary | string | AI plain-English summary. Present only when withSummary is enabled. |
aiExtract | object | AI structured extract (parties, court, holding, legalIssues, citations, outcome, monetaryAmounts). Present only when withExtract is enabled. |
observedAt | string | ISO 8601 timestamp of when the record was collected. |
error | string | null 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:
# JSONcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=json"# CSVcurl "https://api.apify.com/v2/datasets/<DATASET_ID>/items?token=<TOKEN>&clean=true&format=csv"# Paginate large datasetscurl "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 (
resultevent). See the pricing tab for the current per-result price. - Detail enrichment billed separately. With
withDetailson, adetailsevent is charged per record only when detail enrichment succeeds (not for oral arguments, which carry no nested enrichment). - AI add-ons billed separately.
withSummaryandwithExtracteach 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
errorfield and does not charge for it. Empty runs cost nothing. - Spend cap respected. Set
maxTotalChargeUsdon 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.
Related scrapers
- USAspending Federal Award & Contract Scraper: US federal contracts, grants and loans with recipients and amounts.
- SEC EDGAR Filings Scraper: company filings and disclosures from the SEC EDGAR system.
- SAM.gov Contract Opportunities Scraper: federal contract and grant opportunities from SAM.gov.
- OFAC Sanctions List Scraper: sanctioned individuals and entities from the US Treasury OFAC lists.
- Federal Register Scraper: US federal rules, notices and executive orders.
- NPPES NPI Provider Scraper: US healthcare provider records from the national NPI registry.
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.
