CourtListener Opinion Scraper - US Court Case Law API
Pricing
Pay per event
CourtListener Opinion Scraper - US Court Case Law API
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.
Pricing
Pay per event
Rating
0.0
(0)
Developer
BowTiedRaccoon
Actor stats
0
Bookmarked
2
Total users
1
Monthly active users
a day ago
Last modified
Share
CourtListener Opinion Scraper — US Court Case Law & Opinions
Extract structured US court opinion records from CourtListener, 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
- 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.
- 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. - It follows the cursor-based
nextURL through subsequent pages until it reaches yourmaxItemslimit or exhausts the result set. - 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
{"query": "qualified immunity","orderBy": "dateFiled desc","maxItems": 200}
All SCOTUS opinions, newest first
{"query": "*","court": "scotus","orderBy": "dateFiled desc","maxItems": 500}
Federal Circuit patent cases in a specific year
{"query": "patent","court": "cafc","filedAfter": "2023-01-01","filedBefore": "2023-12-31","maxItems": 100}
Look up a specific case by citation
{"citation": "\"410 U.S. 113\"","maxItems": 5}
All opinions authored by a given judge
{"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
{"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.
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