ParseForge Scrapers

CourtListener Oral Arguments Scraper - Court Audio

parseforge/courtlistener-oral-arguments-scraper

AutomationDeveloper toolsNews & media

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.

Run this scraper See the API call
Total runs
26
Bookmarked
0
Last modified
2 days ago

This scraper was last updated on .

What does the CourtListener Oral Arguments Scraper - Court Audio return?

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 litigators Hear how a panel questioned counsel before you argue in front of it
Legal tech and AI teams Transcript corpora with case, court, panel and date metadata attached
Law schools and clinics Build a moot court library filtered by circuit, judge or subject
Journalists and podcasters Pull the audio of a newsworthy argument the day it happens
Judicial analytics vendors Argument 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.

Field Description
โš–๏ธ caseName Case caption as the court published it
๐Ÿ”— url Recording page on courtlistener.com, with the in-browser player
๐Ÿ†” id CourtListener recording ID, stable across runs
๐Ÿ› court / ๐Ÿท courtId / ๐Ÿ“Ž courtCitationString Court name, CourtListener court ID (for example ca9), reporter-style abbreviation
๐Ÿ”ข docketNumber Appellate docket number, for example 25-5252
๐Ÿ“… dateArgued Date the argument was heard
โฑ durationSeconds / ๐Ÿ•ฐ durationFormatted Length of the recording in seconds and as H:MM:SS
๐ŸŽง audioUrl CourtListener's permanent MP3 mirror on storage.courtlistener.com
๐Ÿ“ฅ sourceAudioUrl The MP3 on the court's own server, which courts do reorganise
๐Ÿงฎ fileSizeBytes / ๐Ÿ’พ fileSizeMb Size of the MP3
๐Ÿ‘ฉโ€โš–๏ธ judges / judgeIds / ๐Ÿ”ข judgeCount Panel as the court named it, the CourtListener judge IDs, and the panel size
๐Ÿ“ hasTranscript Yes when CourtListener has speech-to-text for the recording
๐Ÿ—ฃ transcriptExcerpt The opening of the transcript, roughly 500 characters
๐Ÿ“„ transcript / transcriptCharacters The complete transcript and its length, only when the transcript option is on
๐Ÿ†” docketId / ๐Ÿ“‚ docketUrl The docket the recording hangs off, and its page
๐Ÿงพ pacerCaseId PACER's internal case ID, where the court supplies one
๐Ÿ—ƒ sourceCode CourtListener's provenance code for the file, for example C for the court's own website
๐Ÿ” sha1 SHA-1 of the audio file, for change detection
๐Ÿ•“ dateAdded When the recording entered CourtListener
๐Ÿ•’ scrapedAt ISO timestamp of the collection
โŒ error null 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 query SCOTUS, 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 rot Every 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 said The 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 request Each 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 it judges 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 needed CourtListener 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 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 Court websites Generic CourtListener actors
Courts in one query 16, the whole archive One per site Usually opinions and dockets, audio rarely
Search by what was said Yes, over the transcript No No
Permanent audio link Mirror plus the court's own URL Court URL only, and it moves Sometimes the court URL
Panel names and judge IDs On the row where published Rarely Rarely
Full transcript Opt-in, complete Not published No
Rows a free account can preview 10 Not applicable Varies
Ceiling Anonymous API throttle of 5 requests a minute per IP, lifted by a free key or the proxy; 20 rows per request, no page-size control Manual browsing Same 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.

๐Ÿง  Build a legal speech corpus

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.

๐Ÿ”— Recommended Actors

๐Ÿ’ก 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.

What input does the CourtListener Oral Arguments Scraper - Court Audio accept?

FieldTypeWhat it doesDefault
query string Full-text query across the case caption and the machine transcript of the recording, so a phrase a judge said is searchable. Supports quoted phrases and AND/OR/NOT. Leave empty to browse with the filters alone. not set
maxItems integer Free users: Limited to 10 items (preview). Paid users: Optional, max 1,000,000. Leave empty on a paid plan for 100 rows. 10
courts array Restrict to one or more courts. These 16 courts hold every one of the 103,018 recordings in the archive (measured 2026-09-08). Leave empty for all of them. ["ca9"]
arguedAfter string Earliest argument date, as MM/DD/YYYY or YYYY-MM-DD. The archive starts in 1969 and the bulk of it is 2005 onwards. not set
arguedBefore string Latest argument date, as MM/DD/YYYY or YYYY-MM-DD. not set
caseName string Match words in the case caption, for example "smith" or "united states". not set
docketNumber string Exact appellate docket number, for example 25-727 or 22-1008. not set
judge string Surname of a judge on the panel, for example thomas or kagan. CourtListener names the panel on about a quarter of the recordings, so this filter narrows to those. not set
orderBy string (3 options) How to order recordings. Relevance only means anything when a search query is set. dateArgued desc
includeTranscript boolean Add the complete machine transcript of every recording, often 30,000 characters or more, as the transcript and transcriptCharacters columns. Costs one extra request per recording, so runs are slower. Off by default, when each row still carries the opening of the transcript. false
courtListenerKey string A free CourtListener API key (Profile > API on courtlistener.com) lifts the anonymous throttle and makes long runs faster. Leave empty to run anonymously. not set
proxyConfiguration object Off by default: the CourtListener API is open. Turn it on for long anonymous runs so each request gets a fresh exit IP and its own throttle allowance. Not used when an API key is supplied. {"useApifyProxy":false}

How much does the CourtListener Oral Arguments Scraper - Court Audio cost?

from $3.62 per 1,000 results

Charged forWhat it isPrice each
result Single result in the default dataset. $0.00362 to $0.004

Tiered: the lower figure is the price on a higher Apify plan. Billing and the free credit live on Apify.

How do I call the CourtListener Oral Arguments Scraper - Court Audio API?

One POST returns the dataset directly. Same shape for every scraper in the library, so swapping the slug is the only change.

POST ยท run and get results
curl -X POST "https://api.apify.com/v2/acts/parseforge~courtlistener-oral-arguments-scraper/run-sync-get-dataset-items?token=$APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "maxItems": 10,
    "courts": [
      "ca9"
    ],
    "orderBy": "dateArgued desc",
    "includeTranscript": false,
    "proxyConfiguration": {
      "useApifyProxy": false
    }
  }'

What example inputs can I use?

Use these inputs to see how a run is configured.

input.json
{
  "maxItems": 10,
  "courts": [
    "ca9"
  ],
  "orderBy": "dateArgued desc",
  "includeTranscript": false,
  "proxyConfiguration": {
    "useApifyProxy": false
  }
}

What do users say about the CourtListener Oral Arguments Scraper - Court Audio?

No reviews yet. Be the first.

How do I report an issue with the CourtListener Oral Arguments Scraper - Court Audio?

We build and maintain this scraper, so a problem with it comes to us. Report it on the Apify listing and the thread stays attached to the scraper where the next person can find it: open an issue.

Broken and urgent, or you would rather not post in public? Write to parseforge@protonmail.com and it reaches the people who wrote it.

What related scrapers can I use?

Run CourtListener Oral Arguments Scraper - Court Audio on Apify All scrapers