CourtListener Oral Arguments Scraper - Court Audio avatar

CourtListener Oral Arguments Scraper - Court Audio

Pricing

from $3.62 / 1,000 results

Go to Apify Store
CourtListener Oral Arguments Scraper - Court Audio

CourtListener Oral Arguments Scraper - Court Audio

Scrape US courtroom oral argument recordings from CourtListener by court, judge, date and case, with MP3 links and transcripts. Export to CSV, JSON, Excel or XML.

Pricing

from $3.62 / 1,000 results

Rating

0.0

(0)

Developer

ParseForge

ParseForge

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

ParseForge Banner

๐ŸŽง CourtListener Oral Arguments Scraper

๐Ÿš€ Export US courtroom oral argument recordings in seconds. Pick a court, a judge or a date range and get one 27-field row per recording with a permanent MP3 link, the panel, the docket number and the machine transcript. The archive holds 103,018 recordings across 16 courts, and the Ninth Circuit alone accounts for 33,830 of them.

Appellate courts record their oral arguments and publish the audio, but each court posts it on its own website in its own layout, and the files disappear or move when the court reorganises its archive. CourtListener, run by the non-profit Free Law Project, collects those recordings, mirrors the MP3 on its own storage, runs speech to text over it, and exposes the lot through a public REST API. This Actor queries that API, flattens each recording into one row, and hands you the audio link, the case it belongs to and the transcript in a single export.

Coverage measured on 2026-09-08: 103,018 recordings, from the Supreme Court of the United States, all thirteen federal circuits, the Illinois Supreme Court and the Illinois Appellate Court. The oldest argument in the index was recorded in 1969 and the newest is added within hours. Every row carries 27 fields, and every recording carries a machine transcript that runs from roughly 19,000 to 34,000 characters on a typical thirty-minute argument.

๐ŸŽฏ Target Audience๐Ÿ’ก Primary Use Cases
Appellate litigatorsHear how a panel questioned counsel before you argue in front of it
Legal tech and AI teamsTranscript corpora with case, court, panel and date metadata attached
Law schools and clinicsBuild a moot court library filtered by circuit, judge or subject
Journalists and podcastersPull the audio of a newsworthy argument the day it happens
Judicial analytics vendorsArgument length, panel composition and cadence, court by court

๐Ÿ“‹ What the CourtListener Oral Arguments Scraper does

๐Ÿ’ก Why it matters: the audio exists, but it is scattered. cdn.ca9.uscourts.gov names files by docket number with no index, the Supreme Court publishes a separate MP3 page per term, and none of them tell you who sat on the panel or what was said. This Actor turns that scatter into rows: search across all 16 courts at once, filter by judge or date, get a permanent mirrored MP3 URL that does not rot when the court reorganises, and take the transcript with it.

  • Search 103,018 oral argument recordings by court, judge, case name, docket number, argument date or full text.
  • Full-text search runs over the transcript, so a phrase a judge actually said is a query.
  • Two audio links per row: the court's own file and CourtListener's permanent mirror on storage.courtlistener.com.
  • Panel names and CourtListener judge IDs where the court publishes them.
  • The opening of the machine transcript on every row, and the complete transcript on request.
  • Duration in seconds and as H:MM:SS, plus file size in bytes and megabytes.
  • Stable IDs (recording ID, docket ID, SHA-1 of the audio file) so runs can be diffed and deduplicated.
  • Export to CSV, Excel, JSON or XML, or pull the dataset straight from the Apify API.

๐ŸŽฌ Full Demo (๐Ÿšง Coming soon)

A walkthrough video is on the way.

๐Ÿ“Š Output

One row per oral argument recording.

FieldDescription
โš–๏ธ caseNameCase caption as the court published it
๐Ÿ”— urlRecording page on courtlistener.com, with the in-browser player
๐Ÿ†” idCourtListener recording ID, stable across runs
๐Ÿ› court / ๐Ÿท courtId / ๐Ÿ“Ž courtCitationStringCourt name, CourtListener court ID (for example ca9), reporter-style abbreviation
๐Ÿ”ข docketNumberAppellate docket number, for example 25-5252
๐Ÿ“… dateArguedDate the argument was heard
โฑ durationSeconds / ๐Ÿ•ฐ durationFormattedLength of the recording in seconds and as H:MM:SS
๐ŸŽง audioUrlCourtListener's permanent MP3 mirror on storage.courtlistener.com
๐Ÿ“ฅ sourceAudioUrlThe MP3 on the court's own server, which courts do reorganise
๐Ÿงฎ fileSizeBytes / ๐Ÿ’พ fileSizeMbSize of the MP3
๐Ÿ‘ฉโ€โš–๏ธ judges / judgeIds / ๐Ÿ”ข judgeCountPanel as the court named it, the CourtListener judge IDs, and the panel size
๐Ÿ“ hasTranscriptYes when CourtListener has speech-to-text for the recording
๐Ÿ—ฃ transcriptExcerptThe opening of the transcript, roughly 500 characters
๐Ÿ“„ transcript / transcriptCharactersThe complete transcript and its length, only when the transcript option is on
๐Ÿ†” docketId / ๐Ÿ“‚ docketUrlThe docket the recording hangs off, and its page
๐Ÿงพ pacerCaseIdPACER's internal case ID, where the court supplies one
๐Ÿ—ƒ sourceCodeCourtListener's provenance code for the file, for example C for the court's own website
๐Ÿ” sha1SHA-1 of the audio file, for change detection
๐Ÿ•“ dateAddedWhen the recording entered CourtListener
๐Ÿ•’ scrapedAtISO timestamp of the collection
โŒ errornull on success; error rows carry only this field and are never charged

Three real records from a run against the Ninth Circuit, newest first. The transcriptExcerpt values are shortened here for readability; the Actor returns them in full.

[
{
"caseName": "Natalia Golban v. Todd Blanche",
"url": "https://www.courtlistener.com/audio/106164/natalia-golban-v-todd-blanche/",
"id": 106164,
"court": "Court of Appeals for the Ninth Circuit",
"courtId": "ca9",
"courtCitationString": "9th Cir.",
"docketNumber": "15-73093",
"dateArgued": "2026-09-03",
"durationSeconds": 1361,
"durationFormatted": "0:22:41",
"audioUrl": "https://storage.courtlistener.com/mp3/2026/09/03/natalia_golban_v._todd_blanche_cl.mp3",
"sourceAudioUrl": "https://cdn.ca9.uscourts.gov/datastore/media/2026/09/03/15-73093.mp3",
"fileSizeBytes": 8240697,
"fileSizeMb": 7.86,
"judges": "THOMAS, GOULD, BYBEE",
"judgeIds": "488; 1254; 3205",
"judgeCount": 3,
"hasTranscript": "Yes",
"transcriptExcerpt": "May it please the Court, my name is Sergei Shevchenko, I'm a counsel for the petitioner Natalia Golban, and I would like to reserve two minutes for rebuttal. Manage your own time. Thank you, Your Honor. ...",
"docketId": 74746630,
"docketUrl": "https://www.courtlistener.com/docket/74746630/",
"pacerCaseId": "Not Disclosed",
"sourceCode": "C",
"sha1": "c7c69119451b4b666e916ebd38c4fec5ea33a4ce",
"dateAdded": "2026-09-03T19:31:29.136135Z",
"scrapedAt": "2026-09-08T05:29:59.724Z",
"error": null
},
{
"caseName": "Rushing v. Williams-Sonoma, Inc.",
"url": "https://www.courtlistener.com/audio/106163/rushing-v-williams-sonoma-inc/",
"id": 106163,
"court": "Court of Appeals for the Ninth Circuit",
"courtId": "ca9",
"courtCitationString": "9th Cir.",
"docketNumber": "25-5252",
"dateArgued": "2026-09-03",
"durationSeconds": 1839,
"durationFormatted": "0:30:39",
"audioUrl": "https://storage.courtlistener.com/mp3/2026/09/03/rushing_v._williams-sonoma_inc._cl.mp3",
"sourceAudioUrl": "https://cdn.ca9.uscourts.gov/datastore/media/2026/09/03/25-5252.mp3",
"fileSizeBytes": 11108315,
"fileSizeMb": 10.59,
"judges": "THOMAS, GOULD, BYBEE",
"judgeIds": "488; 1254; 3205",
"judgeCount": 3,
"hasTranscript": "Yes",
"transcriptExcerpt": "Good morning. May it please the Court, Craig Cardone on behalf of Williams-Sonoma, and I would like to reserve four minutes for rebuttal. Now, notwithstanding the numerous exemplars and webpages ...",
"docketId": 74746627,
"docketUrl": "https://www.courtlistener.com/docket/74746627/",
"pacerCaseId": "Not Disclosed",
"sourceCode": "C",
"sha1": "ba28ef2e363371a685018245c03ab07fe627d43d",
"dateAdded": "2026-09-03T19:31:26.489099Z",
"scrapedAt": "2026-09-08T05:29:59.724Z",
"error": null
},
{
"caseName": "Montenegro v. CVS Pharmacy, Inc.",
"url": "https://www.courtlistener.com/audio/106156/montenegro-v-cvs-pharmacy-inc/",
"id": 106156,
"court": "Court of Appeals for the Ninth Circuit",
"courtId": "ca9",
"courtCitationString": "9th Cir.",
"docketNumber": "24-6404",
"dateArgued": "2026-09-02",
"durationSeconds": 2095,
"durationFormatted": "0:34:55",
"audioUrl": "https://storage.courtlistener.com/mp3/2026/09/02/montenegro_v._cvs_pharmacy_inc._cl.mp3",
"sourceAudioUrl": "https://cdn.ca9.uscourts.gov/datastore/media/2026/09/02/24-6404.mp3",
"fileSizeBytes": 12643531,
"fileSizeMb": 12.06,
"judges": "THOMAS, BYBEE, BRESS",
"judgeIds": "488; 3205; 14459",
"judgeCount": 3,
"hasTranscript": "Yes",
"transcriptExcerpt": "Good morning. May it please the court, Brent Wisner on behalf of the appellants. If the court would allow, I'd like to reserve three minutes for rebuttal. The ACME monograph prohibits the sale ...",
"docketId": 74740849,
"docketUrl": "https://www.courtlistener.com/docket/74740849/",
"pacerCaseId": "Not Disclosed",
"sourceCode": "C",
"sha1": "e7889f30d110f07c7b91c0ee5bfb8fe730382a42",
"dateAdded": "2026-09-02T20:31:42.029387Z",
"scrapedAt": "2026-09-08T05:29:59.724Z",
"error": null
}
]

โœจ Why choose this Actor

What you get
All 16 courts in one querySCOTUS, all thirteen federal circuits, the Illinois Supreme Court and the Illinois Appellate Court. Those 16 ids were queried together on 2026-09-08 and returned all 103,018 recordings, so the court list in the input is the whole archive, not a sample.
Audio that does not rotEvery row carries CourtListener's permanent mirror on storage.courtlistener.com next to the court's own URL. The mirror was verified to answer HTTP 200 with audio/mpeg and a byte length equal to the fileSizeBytes column.
Search inside what was saidThe full-text query runs over the machine transcript, not just the caption. Searching a phrase from the bench is a supported query.
The whole transcript, on requestEach row carries roughly the first 500 characters. Turn on the transcript option and you get the complete text, 19,000 to 34,000 characters on a typical argument, plus a character count.
The panel, where the court names itjudges and judgeIds come straight from CourtListener. The Ninth Circuit names its panel on every recording; across the whole archive it is about one recording in four, and the field says Not Disclosed rather than guessing.
No API key neededCourtListener throttles anonymous callers at 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 keepRows 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 ActorCourt websitesGeneric CourtListener actors
Courts in one query16, the whole archiveOne per siteUsually opinions and dockets, audio rarely
Search by what was saidYes, over the transcriptNoNo
Permanent audio linkMirror plus the court's own URLCourt URL only, and it movesSometimes the court URL
Panel names and judge IDsOn the row where publishedRarelyRarely
Full transcriptOpt-in, completeNot publishedNo
Rows a free account can preview10Not applicableVaries
CeilingAnonymous API throttle of 5 requests a minute per IP, lifted by a free key or the proxy; 20 rows per request, no page-size controlManual browsingSame source, same ceiling

๐Ÿš€ How to use

  1. Create a free Apify account with $5 in credit.
  2. Open the CourtListener Oral Arguments Scraper.
  3. Pick one or more courts, set a date range or a search phrase, and click Start.
  4. Export the results as CSV, Excel, JSON, or XML from the Dataset tab.

One typical run: courts ["ca9"], arguedAfter 01/01/2026, orderBy dateArgued desc, maxItems 200. Run it programmatically through the Apify API or the ApifyClient for JavaScript and Python.

๐Ÿ’ผ Business use cases

๐ŸŽ™๏ธ Prepare for a panel before you argue

Filter by court and judge surname, sort by argument date, and pull the last two years of recordings for the panel you are about to face. The transcript column makes the questions searchable, so an appellate team can see how a specific judge presses on standing or on harmless error before writing the reply brief.

Every row pairs an MP3 URL with a transcript, a court, a date and a docket number. AI teams use it to fine-tune legal speech models, to benchmark their own speech-to-text against CourtListener's, or to ground a retrieval system in what was argued rather than what was written.

๐Ÿ“ฐ Cover an argument the day it happens

Run it on a schedule against a court, sort newest first, and diff against the previous run. Newsrooms and legal podcasters get the audio link and the opening exchange within hours of the argument, without watching fourteen court websites.

๐Ÿ“Š Measure how courts actually work

durationSeconds, judgeCount, dateArgued and courtId on every row turn into argument-length distributions by circuit, panel composition over time, or the gap between argument and decision when joined to a docket export.

๐Ÿ”Œ Automating CourtListener Oral Arguments Scraper

  • Make / Zapier: trigger a run on a schedule, then push new recordings to a CRM, a Google Sheet or a Slack channel.
  • Slack: post each new case caption, court and audio link to a practice-group 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 arguments.
  • Google Drive: drop the CSV or Excel export into a shared folder, with the MP3 links ready to click.

๐ŸŒŸ Beyond business use cases

  • Research: compare argument length and panel composition across circuits, or track how often a court hears argument at all.
  • Personal: listen to the argument in a case you are following, straight from a link in a spreadsheet.
  • Non-profit: build an accessible, searchable archive of arguments in the areas of law you work in.
  • Experimentation: train a speaker-diarisation model, or index the transcripts for a question-answering demo.

๐Ÿค– Ask an AI assistant about this scraper

Give an AI agent live access to US oral argument recordings through the Model Context Protocol:

$claude mcp add --transport http apify "https://mcp.apify.com?tools=parseforge/courtlistener-oral-arguments-scraper"

Then prompt it in plain language:

  • "Find Ninth Circuit arguments heard this month and give me the audio links."
  • "Which Federal Circuit arguments mention claim construction, and how long were they?"
  • "Pull every Supreme Court argument from last term with its transcript."

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

Use the Apify Actor "parseforge/courtlistener-oral-arguments-scraper" to search US oral argument recordings. Input: { "query": "<phrase>", "courts": ["ca9"], "judge": "<surname>", "arguedAfter": "MM/DD/YYYY", "arguedBefore": "MM/DD/YYYY", "docketNumber": "<number>", "includeTranscript": true, "maxItems": <n> }. It returns case name, court, docket number, argument date, duration, two MP3 links, the panel and the transcript per row. Call it with the ApifyClient and my APIFY_TOKEN.

โ“ Frequently Asked Questions

โ“ Do I need a CourtListener account?

No. The oral argument API is open to anonymous callers. A free CourtListener API key is optional and only lifts the rate limit, which makes long runs faster.

โ“ Which courts are covered?

Sixteen: the Supreme Court of the United States, the First through Eleventh Circuits, the D.C. Circuit, the Federal Circuit, the Illinois Supreme Court and the Illinois Appellate Court. Those sixteen hold every recording in the index, verified by querying them together and getting the full 103,018 back. No federal district court and no other state court publishes argument audio through CourtListener today.

โ“ How far back does the archive go?

The oldest recording is dated 1969 and there are only a handful before 2005. The bulk of the archive is 2005 onwards, and 37,837 arguments were heard in 2020 or later.

โ“ Can I download the audio?

The row gives you two URLs. audioUrl is CourtListener's own mirror and is the one to use in a pipeline: it answers HTTP 200 with audio/mpeg and does not move when a court reorganises. sourceAudioUrl is the court's original file. The Actor returns links, not the audio bytes, so your storage bill stays yours.

โ“ How good are the transcripts?

They are machine transcripts produced by CourtListener, not certified court reporting. They are accurate enough to search and to feed a model, and wrong often enough that you should not quote one without listening. hasTranscript tells you whether text exists for a recording.

โ“ Why is the transcript column empty on my run?

The full transcript is opt-in. Turn on Include the full transcript and each row gains transcript and transcriptCharacters. Without it every row still carries transcriptExcerpt, roughly the first 500 characters.

โ“ Why does the transcript option make runs slower?

CourtListener has no bulk endpoint for transcripts, so the Actor fetches one per recording. Anonymously that runs into the 5 requests a minute throttle quickly. Add a free API key or turn the proxy on before pulling transcripts in volume.

โ“ Why do some rows say Not Disclosed for the judges?

Because the court did not publish the panel with the recording. Across the archive about one recording in four names its panel; the Ninth Circuit names it on every one. The Actor never guesses a panel, so the sentinel is the honest answer.

โ“ Why am I getting no results?

Every filter is ANDed. A court plus a judge surname plus a narrow date range can easily match nothing. Drop a filter or widen the dates. The log prints the total CourtListener reports for your search, which tells you immediately whether the query itself is empty.

โ“ How fast is it, and what is the ceiling?

Each request returns 20 rows and takes about a second. There is no page-size parameter, so 1,000 rows means 50 requests. Anonymously CourtListener allows 5 requests a minute per IP; the Actor waits out Retry-After when it is throttled, rotates the proxy session when the proxy is on, and skips the limit entirely with an API key.

โ“ Does it deduplicate?

Yes, on the CourtListener recording ID, before the row is written and before it is charged. A recording re-published under a second docket number is delivered once.

โ“ Why fewer rows than Max Items?

Because the search ran out of matches. maxItems is a cap, not a target. Free accounts are also capped at 10 rows per run as a preview.

โ“ How fresh is the data?

The Ninth Circuit sample above was collected five days after the arguments were heard, and CourtListener typically indexes a recording within hours of the court posting it. dateAdded on every row tells you exactly when it landed.

โ“ Am I charged for failed requests?

No. Error rows carry only the error field and are pushed without a charge event. You pay per delivered recording.

๐Ÿ”Œ 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.

๐Ÿ’ก Pro Tip: browse the complete ParseForge collection for more court, government and public-records scrapers.

๐Ÿ†˜ Need Help? Open our contact form 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 and the audio in compliance with CourtListener's terms and applicable laws. Court recordings capture real people speaking: do not use them to identify, profile, or target individuals.