# CourtListener Citation Scraper - Case Law Citation Graph (`parseforge/courtlistener-citation-scraper`) Actor

Scrape US court opinions from CourtListener with every reporter citation, times-cited counts and the citation graph. Export to CSV, JSON, Excel or XML.

- **URL**: https://apify.com/parseforge/courtlistener-citation-scraper.md
- **Developed by:** [ParseForge](https://apify.com/parseforge) (community)
- **Categories:** Developer tools, Automation, Business
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $3.62 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

![ParseForge Banner](https://github.com/ParseForge/apify-assets/blob/ad35ccc13ddd068b9d6cba33f323962e39aed5b2/banner.jpg?raw=true)

## 📗 CourtListener Citation Scraper

> 🚀 **Export US case law citations and the citation graph from CourtListener in seconds.** Search 8,308,570 opinions, sort by how often each one is cited, and get one 39-field row per case with every reporter citation, the times-cited count, and the opinions it cites in turn. 92,525 opinions have been cited more than 100 times.

A citation is how a case is found, cited and shepardized, and a citation graph is what tells you whether a case still carries weight. This Actor reads CourtListener's public case-law index and returns, for every opinion it collects, the official reporter citation and every parallel one, how many later opinions cite it, a link to those citing opinions, and the list of opinions it cites itself. No login and no API key required, and the results export to CSV, JSON, Excel, or XML.

The archive holds 8,308,570 opinions from the US Supreme Court, the 13 federal circuits, the federal district courts and the state courts, going back to the early 1800s. Ordering is what makes it a citation dataset rather than a news feed: the default is most-cited first, because a slip opinion filed last week has no reporter citation yet and no case has cited it. Measured on 2026-09-08, every one of the top 20 most-cited results carried reporter citations and a citation graph, against 2 of 20 for the newest-first ordering.

| 🎯 Target Audience | 💡 Primary Use Cases |
|---|---|
| Litigators and appellate counsel | Check whether the case in a brief is still heavily cited, and by whom |
| Legal researchers and law librarians | Pull citation lists and parallel reporters for a doctrine or a court |
| Legal tech and AI teams | Build a citation graph, a retrieval corpus or a Shepard's-style index |
| Law schools and empirical scholars | Measure how doctrine spreads across circuits and decades |
| Publishers and citation-checkers | Resolve a reporter citation to the case, with every parallel cite |

### 📋 What the CourtListener Citation Scraper does

> 💡 **Why it matters:** commercial citators cost thousands a year and give you a web page, not a dataset. CourtListener publishes the same citation relationships for free, but its public API returns them anonymously only through the search index, and only if you know that `cites:` and `citation:` are queryable fields. This Actor sends those queries for you, flattens each cluster into one row, and never bills for a record it did not deliver.

Give it a phrase, an exact citation, or the ID of a case whose citing opinions you want, and the Actor queries CourtListener's search API live, following the cursor until it has the rows you asked for.

- 📗 **One row per case, 39 fields.** The official reporter citation picked out of the parallel ones, every citation the case carries, LEXIS and neutral cites, times cited, the opinions it cites, court and jurisdiction, docket number, precedential status, opinion type, judges, counsel, the SCOTUS database ID, the court's own PDF and CourtListener's permanent mirror.
- 🕸 **The citation graph, both directions.** `citedByCount` is how many later opinions cite the case and `citedByUrl` lists them; `citedOpinionIds` is what the case cites itself. Put an opinion ID in **Cited-by graph** and the run collects every opinion citing it: Ashcroft v. Iqbal returns 12,095.
- 📖 **Exact citation lookup.** Type `556 U.S. 662` in **Exact citation** and the run returns that one case with all four of its parallel citations. It is the anonymous route to what CourtListener's citation-lookup endpoint does behind an API key.
- 📈 **Slice the citation curve.** **Minimum times cited** at 100 gives you landmark case law, at 1,000 the few hundred opinions that anchor a doctrine. Combine it with a maximum to take a band.
- 🏛 **66 high courts pickable, every court searchable.** The US Supreme Court, the 13 federal circuits and 52 state and territorial high courts, read from CourtListener's own courts endpoint. Leave the picker empty and the search covers every court in the archive, district courts included.
- 📎 **Resolved cited cases (opt-in).** Turn the cited opinion IDs into names, citations, courts and dates. Costs one extra request per 20 references, so it is off by default.
- 🏷️ **No blanks.** Values the source can carry but did not fill read `Not Disclosed`; values that do not apply read `N/A`; booleans read `Yes` or `No`.

### 🎬 Full Demo (🚧 Coming soon)

A short walkthrough video is in production.

### 📊 Output

Each row is one opinion cluster. Fields, in dataset order:

| Field | Type | Description |
|---|---|---|
| `clusterId` | Integer | CourtListener opinion cluster ID, the stable key for the case |
| `caseName` | String | Short case caption, for example `Ashcroft v. Iqbal` |
| `caseNameFull` | String | Full caption as the reporter prints it |
| `url` | String | CourtListener page for the case |
| `citation` | String | The official reporter citation, picked over the parallel ones |
| `allCitations` | String | Every citation the case carries, semicolon separated |
| `reporterCount` | Integer | How many parallel citations the case has |
| `lexisCitation` | String | LEXIS citation when the archive has one |
| `neutralCitation` | String | Court-assigned neutral citation, common in state courts |
| `citedByCount` | Integer | How many later opinions cite this case |
| `citedByUrl` | String | CourtListener search listing every opinion that cites it |
| `citedOpinionCount` | Integer | How many earlier opinions this case cites |
| `precedentialStatus` | String | `Published`, `Unpublished`, `Errata`, `Separate`, `In-chambers`, `Relating-to` or `Unknown` |
| `isPrecedential` | String | `Yes` when the opinion is published and therefore binding |
| `court` | String | Full court name |
| `courtId` | String | CourtListener court slug, for example `scotus` or `ca9` |
| `courtCitationString` | String | How the court is abbreviated inside a citation |
| `courtJurisdiction` | String | Federal appellate, state supreme, federal district and so on |
| `dateFiled` | String | Date the opinion was filed, `YYYY-MM-DD` |
| `dateArgued` | String | Date the case was argued, when the archive records it |
| `docketNumber` | String | Docket number the court assigned |
| `docketId` | Integer | CourtListener docket ID |
| `opinionType` | String | Combined opinion, lead opinion, plurality and so on |
| `opinionCount` | Integer | How many sub-opinions the case holds, dissents included |
| `perCuriam` | String | `Yes` or `No` |
| `judges` | String | Judges on the opinion |
| `attorneys` | String | Counsel of record as the reporter lists them |
| `scdbId` | String | Supreme Court Database ID, for SCOTUS cases |
| `dataSource` | String | Which archives the record was merged from |
| `snippet` | String | First few hundred characters of the opinion text |
| `courtDocumentUrl` | String | The court's own PDF, on the court's site |
| `pdfUrl` | String | CourtListener's permanent PDF mirror |
| `dateAdded` | String | When the record entered the archive |
| `citationStrings` | Array | Every citation as separate strings |
| `opinionIds` | Array | Opinion IDs inside the cluster, the input for a cited-by graph run |
| `citedOpinionIds` | Array | Opinion IDs this case cites |
| `citedCases` | Array | Resolved cited cases with name, citation, court and date (opt-in) |
| `scrapedAt` | String | ISO timestamp of the run |
| `error` | String | Only present on an error row; `null` on data rows |

Three real records from a run with `query` `qualified immunity`, `orderBy` `citeCount desc`, `maxItems` `5`:

```json
[
  {
    "clusterId": 145875,
    "caseName": "Ashcroft v. Iqbal",
    "caseNameFull": "ASHCROFT, FORMER ATTORNEY GENERAL, Et Al. v. IQBAL Et Al.",
    "url": "https://www.courtlistener.com/opinion/145875/ashcroft-v-iqbal/",
    "citation": "556 U.S. 662",
    "allCitations": "173 L. Ed. 2d 868; 129 S. Ct. 1937; 556 U.S. 662; 2009 U.S. LEXIS 3472",
    "reporterCount": 4,
    "lexisCitation": "2009 U.S. LEXIS 3472",
    "neutralCitation": "Not Disclosed",
    "citedByCount": 157704,
    "citedByUrl": "https://www.courtlistener.com/?type=o&q=cites%3A(9435340%20OR%209435339%20OR%20145875)",
    "citedOpinionCount": 43,
    "precedentialStatus": "Published",
    "isPrecedential": "Yes",
    "court": "Supreme Court of the United States",
    "courtId": "scotus",
    "courtCitationString": "SCOTUS",
    "courtJurisdiction": "Federal appellate",
    "dateFiled": "2009-05-18",
    "dateArgued": "Not Disclosed",
    "docketNumber": "07-1015",
    "docketId": 191796,
    "opinionType": "Combined opinion",
    "opinionCount": 3,
    "perCuriam": "No",
    "judges": "Kennedy, Souter, Stevens, Ginsburg, Breyer",
    "attorneys": "Former Solicitor General Garre argued the cause for petitioners. With him on the briefs were Assistant Attorney General Katsas, Deputy Assistant Attorney General Cohn, Curtis E. Gannon, Barbara L. Herwig, and Robert M. Loeb. Michael L. Martinez, David E. Bell, and Matthew F. Scarlato filed briefs for Dennis Hasty as respondent under this Court’s Rule 12.6 urging reversal. Brett M. Schuman, Lauren J. Resnick, and Thomas D Warren filed briefs for Michael Rolince et al. as respondents under this Court’s Rule 12.6 urging reversal., Alexander A. Reinert argued the cause for respondents. With him on the brief for respondent Javaid Iqbal were Joan M. Magoolaghan, Elizabeth L. Koob, and Rima J. Oken*",
    "scdbId": "2008-056",
    "dataSource": "Lawbox; Court website; Harvard Caselaw Access Project",
    "snippet": "129 S.Ct. 1937 (2009)\nJohn D. ASHCROFT, Former Attorney General, et al., Petitioners,\nv.\nJavaid IQBAL et al.\nNo. 07-1015.\nSupreme Court of United States.\nArgued December 10, 2008.\nDecided May 18, 2009.\n*1942 Gregory G. Garre, Solicitor General, Washington, DC, for Petitioners.\nAlexander A. Reinert, for Res",
    "courtDocumentUrl": "http://www.supremecourt.gov/opinions/08pdf/07-1015.pdf",
    "pdfUrl": "https://storage.courtlistener.com/pdf/2009/05/18/Ashcroft_v._Iqbal.pdf",
    "dateAdded": "2016-01-29T22:18:21.469986Z",
    "citationStrings": [
      "173 L. Ed. 2d 868",
      "129 S. Ct. 1937",
      "556 U.S. 662",
      "2009 U.S. LEXIS 3472"
    ],
    "opinionIds": [
      9435340,
      9435339,
      145875
    ],
    "citedOpinionIds": [
      2716,
      145730,
      84992,
      92277,
      104695,
      105573,
      106285,
      108375,
      109469,
      109881,
      110075,
      110097,
      110098,
      110763,
      110965,
      111218,
      111481,
      111742,
      112254,
      112594,
      112881,
      117906,
      117950,
      117996,
      118038,
      118289,
      118466,
      118505,
      145662,
      145677,
      145705,
      145918,
      201947,
      511655,
      516408,
      609804,
      692283,
      783945,
      790530,
      1087956,
      7275134,
      8487689,
      9435339
    ],
    "citedCases": [
      {
        "clusterId": 145730,
        "caseName": "Bell Atlantic Corp. v. Twombly",
        "citation": "550 U.S. 544",
        "allCitations": "167 L. Ed. 2d 929; 127 S. Ct. 1955; 550 U.S. 544; 2007 U.S. LEXIS 5901; 41 Communications Reg. (P&F) 567; 20 Fla. L. Weekly Fed. S 267; 68 Fed. R. Serv. 3d 661; 75 U.S.L.W. 4337",
        "court": "Supreme Court of the United States",
        "courtCitationString": "SCOTUS",
        "dateFiled": "2007-05-21",
        "citedByCount": 154417,
        "url": "https://www.courtlistener.com/opinion/145730/bell-atlantic-corp-v-twombly/",
        "opinionIds": [
          145730,
          9435068,
          9435069
        ]
      },
      {
        "clusterId": 2716,
        "caseName": "Iqbal v. Hasty",
        "citation": "490 F.3d 143",
        "allCitations": "490 F.3d 143",
        "court": "Court of Appeals for the Second Circuit",
        "courtCitationString": "2d Cir.",
        "dateFiled": "2007-06-18",
        "citedByCount": 614,
        "url": "https://www.courtlistener.com/opinion/2716/iqbal-v-hasty/",
        "opinionIds": [
          2716,
          9413360,
          9413361
        ]
      },
      {
        "clusterId": 84992,
        "caseName": "Dunlop v. Munroe",
        "citation": "11 U.S. 242",
        "allCitations": "11 U.S. 242; 3 L. Ed. 329; 7 Cranch 242; 1812 U.S. LEXIS 391",
        "court": "Supreme Court of the United States",
        "courtCitationString": "SCOTUS",
        "dateFiled": "1812-03-14",
        "citedByCount": 45,
        "url": "https://www.courtlistener.com/opinion/84992/dunlop-v-munroe/",
        "opinionIds": [
          84992
        ]
      }
    ],
    "scrapedAt": "2026-09-08T06:24:14.881Z",
    "error": null
  },
  {
    "clusterId": 109881,
    "caseName": "Monell v. New York City Dept. of Social Servs.",
    "caseNameFull": "MONELL Et Al. v. DEPARTMENT OF SOCIAL SERVICES OF THE CITY OF NEW YORK Et Al.",
    "url": "https://www.courtlistener.com/opinion/109881/monell-v-new-york-city-dept-of-social-servs/",
    "citation": "436 U.S. 658",
    "allCitations": "56 L. Ed. 2d 611; 98 S. Ct. 2018; 436 U.S. 658; 1978 U.S. LEXIS 100; 16 Empl. Prac. Dec. (CCH) 8345; 17 Fair Empl. Prac. Cas. (BNA) 873",
    "reporterCount": 6,
    "lexisCitation": "1978 U.S. LEXIS 100",
    "neutralCitation": "Not Disclosed",
    "citedByCount": 42895,
    "citedByUrl": "https://www.courtlistener.com/?type=o&q=cites%3A(9427233%20OR%209427232%20OR%20109881%20OR%209427234%20OR%209427235)",
    "citedOpinionCount": 109,
    "precedentialStatus": "Published",
    "isPrecedential": "Yes",
    "court": "Supreme Court of the United States",
    "courtId": "scotus",
    "courtCitationString": "SCOTUS",
    "courtJurisdiction": "Federal appellate",
    "dateFiled": "1978-06-06",
    "dateArgued": "Not Disclosed",
    "docketNumber": "75-1914",
    "docketId": 266243,
    "opinionType": "Combined opinion",
    "opinionCount": 3,
    "perCuriam": "No",
    "judges": "Blackmun, BrennaN, Brennan, Marshall, Powell, Rehnquist, Stevens, Stewart, White",
    "attorneys": "Oscar Chase argued the cause for petitioners. With him on the briefs were Nancy Stearns, Jack Greenberg, and Eric Schnapper., L. Kevin Sheridan argued the cause for respondents. With him on the brief was W. Bernard Richland.*",
    "scdbId": "1977-103",
    "dataSource": "Lawbox; public.resource.org; Harvard Caselaw Access Project",
    "snippet": "436 U.S. 658 (1978)\nMONELL ET AL.\nv.\nDEPARTMENT OF SOCIAL SERVICES OF THE CITY OF NEW YORK ET AL.\nNo. 75-1914.\nSupreme Court of the United States.\nArgued November 2, 1977.\nDecided June 6, 1978.\nCERTIORARI TO THE UNITED STATES COURT OF APPEALS FOR THE SECOND CIRCUIT\n*660 Oscar Chase argued the cause for pet",
    "courtDocumentUrl": "N/A",
    "pdfUrl": "N/A",
    "dateAdded": "2016-01-29T20:40:07.127891Z",
    "citationStrings": [
      "56 L. Ed. 2d 611",
      "98 S. Ct. 2018",
      "436 U.S. 658",
      "1978 U.S. LEXIS 100",
      "16 Empl. Prac. Dec. (CCH) 8345",
      "17 Fair Empl. Prac. Cas. (BNA) 873"
    ],
    "opinionIds": [
      9427233,
      9427232,
      109881,
      9427234,
      9427235
    ],
    "citedOpinionIds": [
      84759,
      96537,
      96819,
      101894,
      104285,
      104614,
      106170,
      107705,
      107841,
      108154,
      108362,
      108375,
      108730,
      108782,
      108810,
      108913,
      108990,
      109199,
      109503,
      109508,
      109574,
      109716,
      109723,
      109763,
      109776,
      109823,
      249412,
      334135,
      1460310,
      84894,
      85272,
      85827,
      86231,
      86293,
      87371,
      87413,
      87567,
      87795,
      87903,
      87904,
      87985,
      87989,
      87995,
      88010,
      88174,
      88308,
      90041,
      90262,
      92688,
      97779,
      103172,
      103360,
      103833,
      105221,
      106440,
      106629,
      106630,
      106658,
      107706,
      107707,
      107971,
      107993,
      108016,
      108094,
      108153,
      108316,
      108751,
      108813,
      108844,
      109009,
      109027,
      109102,
      109349,
      109397,
      109499,
      109520,
      109728,
      1415269,
      1480162,
      1490664,
      6507289,
      6599360,
      6633878,
      7036523,
      7037170,
      7652067,
      8639091,
      8939977,
      9004895,
      9299595,
      9300237,
      9301445,
      88079,
      103531,
      104135,
      104272,
      104455,
      104709,
      106285,
      107685,
      108987,
      109509,
      282871,
      3876939,
      6607492,
      8632804,
      8822445,
      8903338,
      9427232
    ],
    "citedCases": [
      {
        "clusterId": 96819,
        "caseName": "Ex Parte Young",
        "citation": "209 U.S. 123",
        "allCitations": "209 U.S. 123; 28 S. Ct. 441; 52 L. Ed. 714; 1908 U.S. LEXIS 1726",
        "court": "Supreme Court of the United States",
        "courtCitationString": "SCOTUS",
        "dateFiled": "1908-03-23",
        "citedByCount": 9804,
        "url": "https://www.courtlistener.com/opinion/96819/ex-parte-young/",
        "opinionIds": [
          96819,
          9418117,
          9418118
        ]
      },
      {
        "clusterId": 84759,
        "caseName": "Marbury v. Madison",
        "citation": "5 U.S. 137",
        "allCitations": "5 U.S. 137; 2 L. Ed. 60; 1 Cranch 137; 1803 U.S. LEXIS 352",
        "court": "Supreme Court of the United States",
        "courtCitationString": "SCOTUS",
        "dateFiled": "1803-02-24",
        "citedByCount": 6047,
        "url": "https://www.courtlistener.com/opinion/84759/marbury-v-madison/",
        "opinionIds": [
          84759
        ]
      },
      {
        "clusterId": 96537,
        "caseName": "Chattanooga Foundry & Pipe Works v. City of Atlanta",
        "citation": "203 U.S. 390",
        "allCitations": "203 U.S. 390; 27 S. Ct. 65; 51 L. Ed. 241; 1906 U.S. LEXIS 1603",
        "court": "Supreme Court of the United States",
        "courtCitationString": "SCOTUS",
        "dateFiled": "1906-12-03",
        "citedByCount": 384,
        "url": "https://www.courtlistener.com/opinion/96537/chattanooga-foundry-pipe-works-v-city-of-atlanta/",
        "opinionIds": [
          96537
        ]
      }
    ],
    "scrapedAt": "2026-09-08T06:24:14.882Z",
    "error": null
  },
  {
    "clusterId": 108786,
    "caseName": "McDonnell Douglas Corp. v. Green",
    "caseNameFull": "McDONNELL DOUGLAS CORP. v. GREEN",
    "url": "https://www.courtlistener.com/opinion/108786/mcdonnell-douglas-corp-v-green/",
    "citation": "411 U.S. 792",
    "allCitations": "36 L. Ed. 2d 668; 93 S. Ct. 1817; 411 U.S. 792; 1973 U.S. LEXIS 154; 5 Empl. Prac. Dec. (CCH) 8607; 5 Fair Empl. Prac. Cas. (BNA) 965",
    "reporterCount": 6,
    "lexisCitation": "1973 U.S. LEXIS 154",
    "neutralCitation": "Not Disclosed",
    "citedByCount": 38977,
    "citedByUrl": "https://www.courtlistener.com/?type=o&q=cites%3A(108786)",
    "citedOpinionCount": 15,
    "precedentialStatus": "Published",
    "isPrecedential": "Yes",
    "court": "Supreme Court of the United States",
    "courtId": "scotus",
    "courtCitationString": "SCOTUS",
    "courtJurisdiction": "Federal appellate",
    "dateFiled": "1973-05-14",
    "dateArgued": "Not Disclosed",
    "docketNumber": "72-490",
    "docketId": 409902,
    "opinionType": "Combined opinion",
    "opinionCount": 1,
    "perCuriam": "No",
    "judges": "Powell",
    "attorneys": "Veryl L. Riddle argued the cause for petitioner. With him on the briefs were R. H. McRoberts and Thomas C. Walsh., Louis Gilden argued the cause for respondent. With him on the brief were Jack Greenberg, James M. Nabrit III, William L. Robinson, and Albert Rosenthal.*",
    "scdbId": "1972-118",
    "dataSource": "Lawbox; public.resource.org; Harvard Caselaw Access Project",
    "snippet": "411 U.S. 792 (1973)\nMcDONNELL DOUGLAS CORP.\nv.\nGREEN.\nNo. 72-490.\nSupreme Court of United States.\nArgued March 28, 1973.\nDecided May 14, 1973.\nCERTIORARI TO THE UNITED STATES COURT OF APPEALS FOR THE EIGHTH CIRCUIT.\n*793 Veryl L. Riddle argued the cause for petitioner. With him on the briefs were R. H.",
    "courtDocumentUrl": "N/A",
    "pdfUrl": "N/A",
    "dateAdded": "2015-11-04T18:46:10.682096Z",
    "citationStrings": [
      "36 L. Ed. 2d 668",
      "93 S. Ct. 1817",
      "411 U.S. 792",
      "1973 U.S. LEXIS 154",
      "5 Empl. Prac. Dec. (CCH) 8607",
      "5 Fair Empl. Prac. Cas. (BNA) 965"
    ],
    "opinionIds": [
      108786
    ],
    "citedOpinionIds": [
      103153,
      104923,
      108284,
      289439,
      291916,
      291925,
      294671,
      297540,
      298273,
      302977,
      303251,
      304478,
      1468898,
      1480855,
      2346563
    ],
    "citedCases": [
      {
        "clusterId": 108284,
        "caseName": "Griggs v. Duke Power Co.",
        "citation": "401 U.S. 424",
        "allCitations": "28 L. Ed. 2d 158; 91 S. Ct. 849; 401 U.S. 424; 1971 U.S. LEXIS 134; 3 Empl. Prac. Dec. (CCH) 8137; 3 Fair Empl. Prac. Cas. (BNA) 175",
        "court": "Supreme Court of the United States",
        "courtCitationString": "SCOTUS",
        "dateFiled": "1971-03-08",
        "citedByCount": 3600,
        "url": "https://www.courtlistener.com/opinion/108284/griggs-v-duke-power-co/",
        "opinionIds": [
          108284
        ]
      },
      {
        "clusterId": 103153,
        "caseName": "National Labor Relations Board v. Fansteel Metallurgical Corp.",
        "citation": "306 U.S. 240",
        "allCitations": "306 U.S. 240; 59 S. Ct. 490; 83 L. Ed. 627; 1939 U.S. LEXIS 1092; 123 A.L.R. 599; 4 L.R.R.M. (BNA) 515",
        "court": "Supreme Court of the United States",
        "courtCitationString": "SCOTUS",
        "dateFiled": "1939-02-27",
        "citedByCount": 367,
        "url": "https://www.courtlistener.com/opinion/103153/national-labor-relations-board-v-fansteel-metallurgical-corp/",
        "opinionIds": [
          103153,
          9419015,
          9419016,
          9419017
        ]
      },
      {
        "clusterId": 104923,
        "caseName": "Garner v. Board of Public Works of Los Angeles",
        "citation": "341 U.S. 716",
        "allCitations": "95 L. Ed. 2d 1317; 71 S. Ct. 909; 341 U.S. 716; 1951 U.S. LEXIS 1731; 95 L. Ed. 1317",
        "court": "Supreme Court of the United States",
        "courtCitationString": "SCOTUS",
        "dateFiled": "1951-06-04",
        "citedByCount": 271,
        "url": "https://www.courtlistener.com/opinion/104923/garner-v-board-of-public-works-of-los-angeles/",
        "opinionIds": [
          104923,
          9420626,
          9420623,
          9420624,
          9420625,
          9420627
        ]
      }
    ],
    "scrapedAt": "2026-09-08T06:24:14.882Z",
    "error": null
  }
]
```

### ✨ Why choose this Actor

| | What you get |
|---|---|
| **Citations, not just opinions** | The official reporter citation is picked out of the parallel ones, so `556 U.S. 662` lands in `citation` and `129 S. Ct. 1937` and `173 L. Ed. 2d 868` stay in `allCitations`. Most CourtListener scrapers hand you the raw array. |
| **The citation graph in both directions** | Times cited and a working link to the citing opinions, plus the list of opinions the case cites. Ashcroft v. Iqbal comes back with 157,704 citing opinions and 43 cited ones. |
| **Ordering that fills the columns** | Most-cited first is the default. Newest-first returns slip opinions that no reporter has cited yet, which is a valid search and a useless citation dataset. |
| **Exact citation lookup, anonymously** | `citation:` is a queryable field on the public search index, so a reporter citation resolves to its case with no API key. CourtListener's dedicated citation-lookup endpoint needs one. |
| **66 courts verified, not typed from memory** | Read from CourtListener's courts endpoint on 2026-09-08, in use and still sitting. A single wrong court slug silently returns zero results, which is why the list is a picker. |
| **No API key needed** | CourtListener throttles anonymous callers at about 5 requests a minute per IP, and each request returns 20 rows. Turn the proxy on for a fresh exit IP per request, or paste your own free CourtListener key and the throttle disappears. |
| **You pay for what you keep** | Rows are billed as they are written and capped at `maxItems`, so a page that overshoots the cap is trimmed before it is charged. Duplicates are dropped before billing, never after. |

### 📈 How it compares to alternatives

| | This Actor | General CourtListener scrapers | Commercial citators |
|---|---|---|---|
| What a row is | A case with its citations and its citation graph | An opinion record | A citator entry behind a login |
| Official citation picked out | Yes, parallel cites kept separately | Raw array, if at all | Yes |
| Times cited | On every row, filterable both ways | Rarely | Yes |
| Opinions this case cites | Yes, IDs always, resolved on request | No | Yes |
| Cited-by listing | A working CourtListener search link per row | No | Yes |
| Exact citation lookup | Yes, anonymously | Sometimes, with a key | Yes |
| Rows a free account can preview | 10 | Varies | None |
| Ceiling | Anonymous API throttle of about 5 requests a minute per IP, lifted by a free key or the proxy | Same source, same ceiling | Seat licence |

### 🚀 How to use

1. [Create a free Apify account with $5 in credit](https://console.apify.com/sign-up?fpr=vmoqkp).
2. Open the [CourtListener Citation Scraper](https://apify.com/parseforge/courtlistener-citation-scraper?fpr=vmoqkp).
3. Type a phrase or a citation, set your courts, dates and minimum times cited, and click **Start**.
4. Export the results as CSV, Excel, JSON, or XML from the **Dataset** tab.

One typical run: `query` `qualified immunity`, `courts` `["scotus","ca9"]`, `minCitedByCount` `100`, `maxItems` `200`. Run it programmatically through the [Apify API](https://docs.apify.com/api/v2) or the [ApifyClient](https://docs.apify.com/api/client/js) for JavaScript and Python.

### 💼 Business use cases

#### 📗 Check whether a case still carries weight

Pull the case by its citation, read `citedByCount`, then open `citedByUrl` to see who has cited it and when. A doctrine that stopped being cited in 2014 shows up as a flat number.

#### 🕸 Build a citation graph around a leading case

Put the case's opinion ID in **Cited-by graph** and collect every opinion that cites it, with each one's own court, date and times-cited count. That is the raw edge list for a network of how a rule spread.

#### 📚 Assemble a reading list for a doctrine

Search the phrase, set **Minimum times cited** to 100, and take the top 200. You get the cases that practitioners actually cite, not the 90,000 that merely mention the words.

#### 🏛 Compare how circuits cite each other

Run the same query per circuit with the courts picker and compare the citation counts and the cited-opinion lists. Splits show up as circuits citing different ancestors.

### 🔌 Automating CourtListener Citation Scraper

- **Make / Zapier:** trigger a run on a schedule, then push new rows to a CRM, a Google Sheet or a Slack channel.
- **Slack:** post each newly published opinion that cites a case you are watching to a research channel.
- **Airbyte:** land the dataset in Snowflake, BigQuery or Postgres for analytics.
- **GitHub:** commit the JSON export to a repository to keep a versioned history of the citation graph.
- **Google Drive:** drop the CSV or Excel export into a shared folder for the practice group.

### 🌟 Beyond business use cases

- **Research:** measure how long a Supreme Court holding takes to reach state courts, or which dissents get cited more than the majority they answered.
- **Personal:** look up the citation for a case you read about in the news, with every parallel reporter.
- **Non-profit:** track the case law behind an access-to-justice issue and see which opinions courts keep returning to.
- **Experimentation:** train a citation-prediction model, or build a Shepard's-style checker on top of the JSON export.

### 🤖 Ask an AI assistant about this scraper

Give an AI agent live access to US case law citations through the Model Context Protocol:

```bash
claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/courtlistener-citation-scraper"
```

Then prompt it in plain language:

- *"What is the citation for Ashcroft v. Iqbal, and how many cases cite it?"*
- *"Find the twenty most-cited Ninth Circuit opinions on qualified immunity since 2015."*
- *"Which opinions does Farmer v. Brennan cite?"*

Copy this into ChatGPT, Claude, or Cursor to start:

```
Use the Apify Actor "parseforge/courtlistener-citation-scraper" to search US case law citations. Input: { "query": "<phrase>", "citation": "556 U.S. 662", "citedOpinionId": <opinion id>, "courts": ["scotus","ca9"], "minCitedByCount": <n>, "filedAfter": "YYYY-MM-DD", "orderBy": "citeCount desc", "includeCitedCases": true, "maxItems": <n> }. It returns per row the official reporter citation, every parallel citation, times cited, a link to the citing opinions, the opinion IDs it cites, court, jurisdiction, docket number, precedential status, judges and counsel. Call it with the ApifyClient and my APIFY_TOKEN.
```

### ❓ Frequently Asked Questions

#### ❓ Which citation ends up in the `citation` column?

The official reporter one. Commercial and annotation reporters (LEXIS, Westlaw, BNA, CCH, U.S.L.W.) are ruled out first, and among what is left the official reporter always has the shortest abbreviation. For Ashcroft v. Iqbal that picks `556 U.S. 662` over `129 S. Ct. 1937` and `173 L. Ed. 2d 868`. Every citation is still in `allCitations` and `citationStrings`.

#### ❓ Do I need a CourtListener account?

No. The search index answers anonymously. A free CourtListener key only lifts the throttle, and you can paste one into the **API key** field if you have it.

#### ❓ How do I find every case that cites a given case?

Run the case once, take a number out of its `opinionIds` column, and put that number in **Cited-by graph: opinion ID**. Ashcroft v. Iqbal is `145875` and returns 12,095 citing opinions.

#### ❓ Why is the default sort most-cited first?

Because it is the ordering that fills the citation columns. Reporters assign citations months after an opinion is filed, so a newest-first run returns slip opinions with no citation and a times-cited count of zero. Measured on 2026-09-08: 18 of the 20 newest results had no reporter citation, against 0 of the top 20 most-cited.

#### ❓ Does it return the full opinion text?

No, and nothing on the public surface does. CourtListener's `opinions/` endpoint carries the full text but answers HTTP 401 without an API key, so this Actor ships the first few hundred characters in `snippet` plus two PDF links: the court's own document and CourtListener's permanent mirror.

#### ❓ Why is a case missing its neutral citation or argument date?

Because the archive does not have it. Neutral citations are assigned by some state courts and not by the federal ones, and argument dates are recorded for a minority of opinions. Those cells read `Not Disclosed` rather than sitting empty.

#### ❓ How complete is `citedOpinionIds`?

It is what the search index carries for the case, taken from every sub-opinion in the cluster and de-duplicated. It reflects the citations CourtListener's parser recognised in the opinion text, so a case whose text was scanned badly can list fewer than it really cites.

#### ❓ What does turning on **Resolve the cases this opinion cites** cost?

One extra request per 20 references, so an opinion citing 40 cases costs two. Anonymously that is roughly 24 seconds of throttle per opinion, which is why it is off by default and capped by **Cited cases per opinion**.

#### ❓ Which courts can I pick?

66: the US Supreme Court, the 13 federal circuits, and 52 state and territorial high courts, all read from CourtListener's own courts endpoint on 2026-09-08. Leave the picker empty and the search covers every court in the archive, including the federal district courts and the state intermediate appellate courts.

#### ❓ How fast is it, and what is the ceiling?

Each request returns 20 rows. Anonymously CourtListener allows about 5 requests a minute per IP, so roughly 100 rows a minute, and a burst answers HTTP 429 with a `Retry-After` the Actor waits out, up to 300 seconds. Turning the proxy on gives a fresh exit IP per request; a free CourtListener key removes the limit.

#### ❓ Why am I getting no results?

Every filter is combined with AND. A minimum times-cited of 1,000 with a date range starting in 2020 returns nothing, because no opinion has been cited a thousand times in five years. Widen the dates, lower the minimum, or drop the court filter.

#### ❓ Why fewer rows than Max Items?

Either the search genuinely has fewer matches, or **Only cases with a reporter citation** dropped uncited slip opinions, or the run reached its time budget while waiting out a throttle. The log says which.

#### ❓ Does it deduplicate?

Yes, on the opinion cluster ID, before anything is written or charged. A case with a lead opinion, a concurrence and a dissent is one cluster and one row.

#### ❓ How fresh is the data?

CourtListener adds opinions within hours of a court publishing them, and this Actor reads the live index every run. Citation counts and reporter citations lag by design: a reporter assigns a citation months later, and other courts take longer still to cite it.

#### ❓ How many rows per run?

Free accounts preview 10. Paid accounts go up to 1,000,000, subject to how many opinions match and how long the throttle allows.

### 🔌 Integrate with any app

The dataset is available through the Apify API and the JavaScript and Python clients, and every run can be scheduled, triggered by webhook or wired into Make, Zapier, n8n, Airbyte, Google Sheets, Slack and GitHub from the **Integrations** tab.

### 🔗 Recommended Actors

- [CourtListener Opinions Scraper](https://apify.com/parseforge/court-listener-opinions-scraper?fpr=vmoqkp): full opinion text, walked by court feed.
- [CourtListener Adversary Proceedings Scraper](https://apify.com/parseforge/courtlistener-adversary-scraper?fpr=vmoqkp): the bankruptcy lawsuits filed inside a Chapter 7, 11 or 13 case.
- [CourtListener Business Bankruptcy Scraper](https://apify.com/parseforge/business-bankruptcy-filings-scraper?fpr=vmoqkp): Chapter 7, 11 and 13 petitions from the same archive.
- [CourtListener State Court Dockets Scraper](https://apify.com/parseforge/courtlistener-dockets-scraper?fpr=vmoqkp): state court dockets from the same archive.
- [Caselaw Access Project Scraper](https://apify.com/parseforge/caselaw-access-scraper?fpr=vmoqkp): historical US case law from the Harvard Caselaw Access Project.

> 💡 **Pro Tip:** browse the complete [ParseForge collection](https://apify.com/parseforge) for more court, government and public-records scrapers.

**🆘 Need Help?** [Open our contact form](https://tally.so/r/BzdKgA) with your run ID, your input, and what you expected.

> **⚠️ Disclaimer:** This Actor is an independent tool and is not affiliated with, endorsed by, or sponsored by the Free Law Project or CourtListener. It collects only publicly available court data through the public API. You are responsible for using the data in compliance with CourtListener's terms and applicable laws. Court records concern real people: do not use this data to identify, profile, or target individuals.

# Actor input Schema

## `query` (type: `string`):

Full-text search across opinion text, case names and citations, for example <code>qualified immunity</code> or <code>chevron deference</code>. Leave it empty to list every opinion that matches the filters below. Boolean operators (AND, OR, NOT) and quoted phrases work.

## `maxItems` (type: `integer`):

How many opinions to return. Free users: the run stops at 10 items, which is the preview. Paid users: optional, up to a maximum of 1,000,000 items. Leave it empty on a paid plan and the run defaults to 100.

## `citation` (type: `string`):

One reporter citation, for example <code>556 U.S. 662</code> or <code>410 U.S. 113</code>. Returns the single case that carries it, with every parallel citation. Combine it with a search phrase to search inside that case.

## `citedOpinionId` (type: `integer`):

Collect every opinion that cites this one. Take the number from the <code>opinionIds</code> column of an earlier run, for example <code>145875</code> for Ashcroft v. Iqbal, which returns over 12,000 citing opinions.

## `courts` (type: `array`):

Limit the search to these courts. Leave it empty to search every court CourtListener indexes, including the district, appellate and state courts that are not in this list. The 66 courts offered here are the federal appellate courts and the state high courts, the ones that produce citable precedent.

## `precedentialStatus` (type: `array`):

Which kinds of opinion to include. Leave it empty and CourtListener applies its own default, which is published opinions only.

## `minCitedByCount` (type: `integer`):

Only return opinions cited at least this many times by later cases. Set it to 100 for landmark case law, 1000 for the few hundred opinions that anchor an entire doctrine.

## `maxCitedByCount` (type: `integer`):

Only return opinions cited fewer than this many times. Useful with the minimum above to slice a band of the citation curve.

## `filedAfter` (type: `string`):

Only opinions filed on or after this date, written <code>YYYY-MM-DD</code>, for example <code>2015-01-01</code>.

## `filedBefore` (type: `string`):

Only opinions filed on or before this date, written <code>YYYY-MM-DD</code>.

## `caseName` (type: `string`):

Match against the case caption only, for example <code>Roe v. Wade</code>. Narrower than the search phrase, which also reads the opinion text.

## `judge` (type: `string`):

Match the authoring or panel judge, for example <code>Scalia</code>.

## `docketNumber` (type: `string`):

Match the docket number the court assigned, for example <code>19-1392</code>.

## `orderBy` (type: `string`):

Most cited first is the default because it is the ordering that fills every citation column: a slip opinion filed last week has no reporter citation yet and no case has cited it.

## `withCitationsOnly` (type: `boolean`):

Drop opinions that no reporter has assigned a citation to yet. Recent slip opinions are the usual case. Off by default so nothing is hidden.

## `includeCitedCases` (type: `boolean`):

Turn the <code>citedOpinionIds</code> numbers into a <code>citedCases</code> array with the name, citation, court and date of each cited case. This costs one extra request per 20 references, so a run with it on is several times slower.

## `citedCasesLimit` (type: `integer`):

How many cited cases to resolve for each opinion when the option above is on. Landmark opinions cite hundreds, so the default of 20 keeps a run fast.

## `courtListenerKey` (type: `string`):

Optional free CourtListener key. Anonymous callers are throttled at about 5 requests per minute; a key lifts that and makes large runs much faster. Get one at <a href="https://www.courtlistener.com/help/api/rest/" target="_blank">courtlistener.com/help/api/rest</a>. Leave it empty and the Actor runs anonymously.

## `proxyConfiguration` (type: `object`):

CourtListener is open, so the proxy is off by default. Turn it on to spread a long anonymous run across several exit IPs and dodge the 5 requests per minute throttle.

## Actor input object example

```json
{
  "query": "qualified immunity",
  "maxItems": 10,
  "orderBy": "citeCount desc",
  "withCitationsOnly": false,
  "includeCitedCases": false,
  "citedCasesLimit": 20,
  "courtListenerKey": "",
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}
```

# Actor output Schema

## `overview` (type: `string`):

Key fields: case, citation, times cited, court, date filed, status, judges, citation graph

## `fullData` (type: `string`):

Complete dataset with all 39 fields, including the citation arrays and the resolved cited cases

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "query": "qualified immunity",
    "maxItems": 10,
    "citedCasesLimit": 20
};

// Run the Actor and wait for it to finish
const run = await client.actor("parseforge/courtlistener-citation-scraper").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "query": "qualified immunity",
    "maxItems": 10,
    "citedCasesLimit": 20,
}

# Run the Actor and wait for it to finish
run = client.actor("parseforge/courtlistener-citation-scraper").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "query": "qualified immunity",
  "maxItems": 10,
  "citedCasesLimit": 20
}' |
apify call parseforge/courtlistener-citation-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,parseforge/courtlistener-citation-scraper"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/eY2FqLo8IXw4OA1X2/builds/WXSBnirBn55dD3h5t/openapi.json
