CourtListener Court Opinions Scraper — Free Case Law Search avatar

CourtListener Court Opinions Scraper — Free Case Law Search

Pricing

Pay per event

Go to Apify Store
CourtListener Court Opinions Scraper — Free Case Law Search

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

DevilScrapes

Maintained by Community

Actor 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 / 503 and honour Retry-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 url on 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

  1. Click Try for free at the top of the page.
  2. Enter a Query — free text, e.g. "miranda rights".
  3. Optionally narrow with Court (a CourtListener short code like scotus), Filed after / Filed before dates, or change Order by.
  4. Set Max results (up to 1,000).
  5. Click Start. Rows stream into the run's dataset as CourtListener's cursor pages are followed.
  6. Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.

📥 Input

FieldTypeRequiredDefaultNotes
querystringyesFree-text search against CourtListener's full-text opinion index.
courtstringnoCourt short code (e.g. scotus). Omit to search all courts.
filedAfterstringnoYYYY-MM-DD — only opinions filed on or after this date.
filedBeforestringnoYYYY-MM-DD — only opinions filed on or before this date.
orderBystringno"score desc"One of score desc, dateFiled desc, dateFiled asc, citeCount desc.
maxResultsintegerno100Cap on total rows across all cursor pages (1-1,000).
proxyConfigurationobjectno{"useApifyProxy": true}Apify Proxy configuration.

Example input

{
"query": "miranda rights",
"maxResults": 100,
"proxyConfiguration": {"useApifyProxy": true}
}

📤 Output

Every row is one matched court opinion.

FieldTypeNotes
cluster_idintegerCourtListener's internal opinion-cluster ID.
case_namestringShort case name (e.g. "Miranda v. Arizona").
case_name_fullstringFull case name/caption as filed.
courtstringHuman-readable court name.
court_idstringCourtListener's court short code (e.g. "scotus").
court_citation_stringstringCourt's citation-reporter abbreviation.
court_jurisdictionstring | nullCourt jurisdiction label, when published.
date_filedstring | nullISO YYYY-MM-DD filing date, when published.
date_arguedstring | nullISO YYYY-MM-DD argument date, when published.
citationarray<string>Reporter citation(s) for this opinion (may be empty).
cite_countintegerNumber of times this opinion has been cited.
attorneystring | nullAttorney(s) of record, when published.
urlstringDirect 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:

EventUSDWhat it is
actor-start$0.05One-off warm-up charge per run
result-scraped$0.005Per 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.