CourtListener Legal Search Feed Scraper
Pricing
from $0.03 / 1,000 legal opinions
CourtListener Legal Search Feed Scraper
⚖️ Monitor recent US court opinions by keyword through CourtListener's public feeds. Export stable IDs, courts, dates, links, and matched excerpts.
Pricing
from $0.03 / 1,000 legal opinions
Rating
0.0
(0)
Developer
Stas Persiianenko
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
6 days ago
Last modified
Categories
Share
Monitor recent US legal opinions by keyword with CourtListener's public custom-search feeds.
This Apify Actor turns Atom XML into clean, deduplicated dataset rows for legal research, compliance monitoring, journalism, and legal-tech workflows.
Give it topics such as antitrust, a party name, or an existing CourtListener search-feed URL.
Get case titles, courts, publication dates, stable opinion IDs, source links, and matched excerpts.
Scope: this Actor extracts the recent public opinion-search feed. It does not promise complete historical backfills, docket details, REST API records, or full opinion text.
What does CourtListener Legal Search Feed Scraper do?
The Actor queries CourtListener's anonymous custom-search Atom feed.
It converts each matching opinion into a structured record suitable for JSON, CSV, Excel, API, webhook, and database workflows.
It can:
- ⚖️ search recent legal opinions by one or more keywords;
- 🔗 process existing CourtListener custom-search feed URLs;
- 🏛️ extract case title and court;
- 📅 preserve opinion publication and feed update timestamps;
- 🆔 expose a stable numeric opinion ID for upserts;
- 🧹 remove duplicate opinions found by multiple searches;
- 📝 clean the feed's HTML excerpt into readable text;
- 📦 stop at a user-defined global result limit.
Why use this CourtListener opinion scraper?
CourtListener already provides a useful public feed, but raw Atom XML is awkward in recurring data pipelines.
This Actor handles XML parsing, retries, normalization, limits, deduplication, dataset storage, and exports.
Use it when you need a lightweight monitoring feed rather than a broad docket or full-text data service.
No CourtListener login, API token, browser, or proxy is required for the supported feed.
Who is it for?
Legal research teams
Watch topics, doctrines, parties, industries, or statutes and review new matching opinions.
Compliance teams
Schedule searches for regulatory, sanctions, privacy, competition, or enforcement terms.
Journalists
Track companies, public bodies, and high-interest legal subjects across recent opinions.
Legal-tech developers
Feed normalized opinion records into alerting systems, RAG intake queues, knowledge bases, or case-monitoring products.
Data engineers
Use stable opinionId values to upsert records and avoid duplicate downstream processing.
What legal opinion data can I extract?
| Field | Type | Meaning |
|---|---|---|
query | string | Keyword or feed query associated with the record |
caseTitle | string | Case name from the Atom entry |
opinionUrl | string | Canonical CourtListener opinion page |
opinionId | string | Stable numeric CourtListener opinion identifier |
court | string | Court name provided by the feed |
publishedAt | string | Opinion publication timestamp |
feedUpdatedAt | string | Search feed update timestamp |
summary | string | Cleaned matched excerpt when available |
sourceUrl | string | Exact CourtListener feed URL requested |
How to scrape recent CourtListener opinions
- Open the Actor input page.
- Enter one or more legal search keywords.
- Optionally add existing CourtListener search feed URLs.
- Choose the maximum number of unique opinions.
- Click Start.
- Review the Legal opinions dataset view.
- Export results or connect an integration.
The default antitrust example is intentionally small and should finish quickly.
Input
{"keywords": ["antitrust", "data privacy"],"maxItems": 40}
You can also provide a custom feed URL:
{"feedUrls": [{"url": "https://www.courtlistener.com/feed/search/?type=o&q=Google"}],"maxItems": 20}
At least one keyword or feed URL is required.
A maximum of 50 combined searches is accepted per run.
Only HTTPS CourtListener URLs under /feed/search/ are allowed.
Output example
{"query": "antitrust","caseTitle": "Sensory, Inc. v. Google LLC","opinionUrl": "https://www.courtlistener.com/opinion/10927366/sensory-inc-v-google-llc/","opinionId": "10927366","court": "District Court, District of Columbia","publishedAt": "2026-07-13T00:00:00-07:00","feedUpdatedAt": "2026-07-13T00:00:00-07:00","summary": "INTRODUCTION Before the court is another antitrust case brought against Defendant Google LLC...","sourceUrl": "https://www.courtlistener.com/feed/search/?type=o&q=antitrust"}
Exact records change as CourtListener updates its search feed.
How deduplication works
CourtListener gives each Atom entry a stable opinion URL/ID.
The Actor uses that stable entry identity to deduplicate across every keyword and feed URL in one run.
If one opinion matches both antitrust and Google, it is saved once under the first processed query.
Use opinionId as the downstream database key.
How much does it cost to monitor CourtListener opinions?
This Actor uses pay-per-event pricing.
A small one-time Start event covers run initialization.
A Legal opinion event is charged for each dataset record produced.
Tiered per-result discounts apply automatically by Apify plan.
| Apify tier | Price per legal opinion |
|---|---|
| Free | $0.000058381 |
| Bronze | $0.000050766 |
| Silver | $0.000039598 |
| Gold | $0.00003046 |
| Platinum | $0.000020306 |
| Diamond | $0.000014215 |
The one-time Start event is $0.005 on every tier. The live pricing tab remains authoritative before you start a run.
You can set a maximum total charge in Apify for additional control.
Runs that naturally return fewer recent matches only charge for the records produced, plus the start event.
Scheduling legal search monitoring
Choose Schedules in Apify Console to run the same searches hourly, daily, or weekly.
For each scheduled run:
- fetch the dataset;
- upsert rows by
opinionId; - alert only on IDs not seen before;
- retain
feedUpdatedAtfor freshness checks.
This pattern turns a recent search feed into a practical topic monitor.
Integrations
Webhooks
Send a run-finished webhook to Slack, Microsoft Teams, Zapier, Make, or your own API.
Google Sheets
Export new rows for researchers who prefer a shared review queue.
Databases
Upsert by opinionId into PostgreSQL, BigQuery, Snowflake, or another warehouse.
Alerting
Filter rows by court or phrase, then route high-priority matches to email or incident tooling.
AI and RAG intake
Use the summary and opinion URL to triage relevant opinions before a separate authorized document-retrieval step.
API usage with Node.js
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: process.env.APIFY_TOKEN });const run = await client.actor('automation-lab/courtlistener-legal-search-feed-scraper').call({keywords: ['antitrust', 'data privacy'],maxItems: 40,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
API usage with Python
from apify_client import ApifyClientclient = ApifyClient('YOUR_APIFY_TOKEN')run = client.actor('automation-lab/courtlistener-legal-search-feed-scraper').call(run_input={'keywords': ['antitrust'], 'maxItems': 20})items = client.dataset(run['defaultDatasetId']).list_items().itemsprint(items)
API usage with cURL
curl -X POST \"https://api.apify.com/v2/acts/automation-lab~courtlistener-legal-search-feed-scraper/runs?token=$APIFY_TOKEN" \-H "Content-Type: application/json" \-d '{"keywords":["antitrust"],"maxItems":20}'
After the run completes, fetch items from its default dataset.
Use with Apify MCP
Connect the Actor to Claude and other MCP clients through Apify MCP Server:
https://mcp.apify.com/?tools=automation-lab/courtlistener-legal-search-feed-scraper
Example prompts:
- “Run the CourtListener opinion monitor for antitrust and return new cases by court.”
- “Extract recent legal opinions mentioning a named company and summarize the result metadata.”
- “Schedule this legal search and key downstream records by opinion ID.”
Claude Code
Register the Actor as an HTTP MCP server:
$claude mcp add --transport http courtlistener-legal-search "https://mcp.apify.com/?tools=automation-lab/courtlistener-legal-search-feed-scraper"
Claude Desktop
Add this entry to the mcpServers object in Claude Desktop's configuration:
{"mcpServers": {"courtlistener-legal-search": {"url": "https://mcp.apify.com/?tools=automation-lab/courtlistener-legal-search-feed-scraper"}}}
Cursor
Open Settings → Tools & MCP → Add custom MCP and use the same mcpServers JSON entry shown for Claude Desktop.
VS Code
Open the MCP configuration for your workspace, choose Add Server → HTTP, and enter the Apify MCP URL above.
Authenticate the MCP connection with your Apify token when prompted.
Tips for reliable legal monitoring
- 🎯 Use precise phrases when broad keywords produce noisy excerpts.
- 🧪 Start with one keyword and 20 items before creating a larger watchlist.
- 🆔 Store
opinionId, not only the title, as your durable key. - 🕐 Compare
feedUpdatedAtbetween scheduled runs. - 🏛️ Filter the exported dataset by
courtdownstream. - 🔗 Keep
sourceUrlso researchers can reproduce the search. - 📚 Use another source when you require historical backfills or docket-level data.
Limits and freshness
CourtListener's public custom-search feed is a recent, sparse monitoring surface.
It is not guaranteed to expose every historical opinion matching a query.
The Actor cannot paginate beyond what the public feed returns.
maxItems limits output; it does not make additional historical records available.
Some opinions may have brief excerpts, and summary content depends on CourtListener.
The Actor does not fetch or interpret the linked full opinion.
Error handling
Transient requests are retried up to three times with bounded exponential delay.
Each request has a 30-second timeout.
Persistent non-200 or non-Atom responses fail with the affected source URL.
Unsupported hostnames and paths are rejected before fetching.
Malformed entries missing a title, URL, or publication timestamp are logged and skipped.
Data quality
All core values come directly from CourtListener's Atom feed.
Summary HTML is converted to plain text for easier export.
URLs remain canonical CourtListener links.
Dates remain ISO 8601 strings with source timezone offsets.
Court names are preserved as published by CourtListener.
No AI inference is used to invent missing legal metadata.
Legality: is it legal to scrape CourtListener?
This Actor accesses an anonymous public Atom feed published by CourtListener and the Free Law Project.
You are responsible for using the data in accordance with applicable law, CourtListener terms, attribution expectations, and your organization's policies.
Do not treat extracted metadata or excerpts as legal advice.
Do not assume a search feed is a complete record of litigation or precedential authority.
For high-stakes work, verify information against the linked source and official court materials.
FAQ
Does this scrape full opinion text?
No. It returns feed metadata, a matched excerpt when available, and the canonical opinion URL.
Does it include dockets or RECAP documents?
No. The supported v1 surface is the recent legal-opinion custom-search feed.
Do I need a CourtListener API key?
No. The public Atom feed is anonymous.
Can it backfill all matching historical cases?
No. Use it as a recent monitoring feed, not a complete historical search API.
Why did my query return only a few records?
The public feed may have few recent matches. Try a broader phrase and verify the same search on CourtListener.
Why was my feed URL rejected?
For safety and product consistency, URLs must use courtlistener.com/feed/search/ over HTTPS.
How do I avoid repeat alerts?
Persist opinionId values and notify only when a scheduled run returns an unseen ID.
Related legal and regulatory scrapers
- FTC Enforcement Actions Scraper for FTC enforcement-library records.
- CFPB Consumer Complaint Database Scraper for consumer complaint data.
These sources cover different datasets and should not be treated as CourtListener substitutes.
Support
If a run fails, share the run URL and a redacted copy of the input through the Actor's Issues tab.
Include the affected keyword or CourtListener feed URL.
For result-quality questions, compare the output with the current public feed because source records change over time.
Start monitoring CourtListener opinions
Use the default antitrust input for a quick test.
Then replace it with the parties, doctrines, statutes, industries, or compliance topics your team follows.
Schedule repeat runs and upsert records by opinionId to build a focused legal-opinion alert workflow.