CourtListener Court Opinions Scraper — Free Case Law Search
Pricing
Pay per event
CourtListener Court Opinions Scraper — Free Case Law Search
Search 240,000+ U.S. court opinions on CourtListener's free, keyless full-text API and export clean, paginated case-law rows — case name, court, filing date, citations, cite count, and a direct opinion URL. No API key, no PACER account, no docket-reseller subscription.
Pricing
Pay per event
Rating
0.0
(0)
Developer
DevilScrapes
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
19 hours ago
Last modified
Categories
Share
🎯 What this scrapes
This Actor searches CourtListener's free, keyless full-text case-law API (opinions only — not RECAP/PACER dockets) and returns one structured row per matching case. Each row carries the case name, court, filing date, citation(s), cite count, and a direct link to the opinion.
CourtListener's search already covers 240,000+ U.S. court opinions for free — the work we sell is the handling: following CourtListener's cursor-based pagination correctly, isolating one malformed result so it doesn't crash the whole run, and shipping a clean, nullable dataset schema instead of a raw API passthrough.
🔥 What we handle for you
- 🛡️ We rotate browser fingerprints (curl-cffi impersonation) so every request looks like a real browser, not Python.
- 🔁 We retry with exponential backoff on
408 / 429 / 503and honourRetry-After— up to 5 attempts per page. - 🌐 We rotate residential proxies through Apify Proxy on every retry — fresh session, fresh exit IP.
- 🧱 We isolate per-row failures — one malformed result is skipped and logged, the run keeps going.
- 🧊 We keep the dataset clean — Pydantic-validated rows, nullable fields typed correctly, a stable
urlon every row. - 💰 You pay only for cases that land. A search that matches nothing still succeeds — you're never charged for a failed run.
💡 Use cases
- Legal research — pull every opinion matching a legal question, party name, or topic for a memo or brief.
- Litigation support — build a bulk case-law dataset for a matter without a PACER/docket subscription.
- Legal-tech products — feed a clean, structured case-law dataset into your own search or citation tool.
- Compliance / due diligence — check whether a party, company, or topic shows up in published case law.
- Academic research — pull opinions filed within a date range or court for empirical legal studies.
⚙️ How to use it
- Click Try for free at the top of the page.
- Enter a Query — free text, e.g.
"miranda rights". - Optionally narrow with Court (a CourtListener short code like
scotus), Filed after / Filed before dates, or change Order by. - Set Max results (up to 1,000).
- Click Start. Rows stream into the run's dataset as CourtListener's cursor pages are followed.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
query | string | yes | — | Free-text search against CourtListener's full-text opinion index. |
court | string | no | — | Court short code (e.g. scotus). Omit to search all courts. |
filedAfter | string | no | — | YYYY-MM-DD — only opinions filed on or after this date. |
filedBefore | string | no | — | YYYY-MM-DD — only opinions filed on or before this date. |
orderBy | string | no | "score desc" | One of score desc, dateFiled desc, dateFiled asc, citeCount desc. |
maxResults | integer | no | 100 | Cap on total rows across all cursor pages (1-1,000). |
proxyConfiguration | object | no | {"useApifyProxy": true} | Apify Proxy configuration. |
Example input
{"query": "miranda rights","maxResults": 100,"proxyConfiguration": {"useApifyProxy": true}}
📤 Output
Every row is one matched court opinion.
| Field | Type | Notes |
|---|---|---|
cluster_id | integer | CourtListener's internal opinion-cluster ID. |
case_name | string | Short case name (e.g. "Miranda v. Arizona"). |
case_name_full | string | Full case name/caption as filed. |
court | string | Human-readable court name. |
court_id | string | CourtListener's court short code (e.g. "scotus"). |
court_citation_string | string | Court's citation-reporter abbreviation. |
court_jurisdiction | string | null | Court jurisdiction label, when published. |
date_filed | string | null | ISO YYYY-MM-DD filing date, when published. |
date_argued | string | null | ISO YYYY-MM-DD argument date, when published. |
citation | array<string> | Reporter citation(s) for this opinion (may be empty). |
cite_count | integer | Number of times this opinion has been cited. |
attorney | string | null | Attorney(s) of record, when published. |
url | string | Direct CourtListener URL to the full opinion page. |
Example output
{"cluster_id": 10353022,"case_name": "Miranda v. Arizona","case_name_full": "Ernesto A. Miranda v. State of Arizona","court": "Supreme Court of the United States","court_id": "scotus","court_citation_string": "U.S.","court_jurisdiction": null,"date_filed": "1966-06-13","date_argued": null,"citation": ["384 U.S. 436"],"cite_count": 8421,"attorney": "","url": "https://www.courtlistener.com/opinion/10353022/miranda-v-arizona/"}
💰 Pricing
Pay-Per-Event — you pay only when these events fire:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.05 | One-off warm-up charge per run |
result-scraped | $0.005 | Per case-opinion row written to the dataset |
Example: 100 matched rows ≈ $0.55 total per run; at 1,000 rows that's $5.05/1,000 ($0.05 start + 1000 x $0.005). No subscription, no minimum, no card to start — Apify gives every new account free credit.
🚧 Limitations
This Actor covers opinion search only (type=o) — RECAP/PACER
dockets and oral arguments are out of scope for v1. It returns
metadata and search snippets, not full opinion-body text. CourtListener's
rate limits aren't stress-tested beyond a handful of requests, so
sustained heavy pagination may hit retries. maxResults is capped at
1,000 rows per run.
❓ FAQ
Does this need a CourtListener account or API key?
No. CourtListener's /api/rest/v4/search/ endpoint is free and keyless
for opinion search.
Does this cover PACER/RECAP dockets?
No — v1 is opinion search (type=o) only. Dockets and oral arguments
are a candidate for a future version.
What happens if my query matches nothing?
The run finishes successfully with zero rows and a status message naming the query — you're not charged for a failed run.
Can I filter by court or date range?
Yes — set court to a CourtListener short code (e.g. scotus) and/or
filedAfter/filedBefore to narrow results server-side.
💬 Your feedback
Spotted a bug, hit a weird edge case, or need dockets/oral-argument coverage? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.