Every 8-K a US public company files lands on SEC EDGAR within minutes, and every earnings call gets transcribed somewhere. Turning either into analyzable data is the grind: EDGAR hands you raw HTML filings, and transcripts live scattered across sites that hate being parsed. This post covers what the free official route gives you, where it stops, and the shortcut: the Earnings Call Transcript API on Apify, which returns parsed 8-Ks and speaker-tagged transcripts as JSON records.
Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.
Standard note for anything finance-shaped: this is a data tool. Nothing here is investment advice.
Doesn't SEC EDGAR already have an API?
It does, and it is genuinely free: EDGAR offers full-text search and per-company submission feeds, no key required. What it returns is raw. An 8-K arrives as a filing envelope full of HTML, with the item codes, press release, and guidance language buried inside for you to parse. And earnings call transcripts are not in EDGAR at all, since companies rarely file them. The gap is structure: something that reads the filing for you, tags the items, pulls the guidance sentences, and pairs each call's questions with their answers. That parsing layer is what this Actor sells; the underlying documents were always free.
What the Earnings Call Transcript API returns
The Earnings Call Transcript API returns two record types as structured JSON: parsed 8-K filings with item codes, press releases, guidance sentences, and sentiment, and earnings call transcripts with participants, prepared remarks, and Q&A pairs.
| Field | Example | Notes |
|---|---|---|
recordType |
filing |
Or transcript
|
itemCodes / itemNames
|
["2.02", "9.01"] |
What the 8-K actually announces |
pressRelease |
{ "headline": "Apple reports second quarter results" } |
Extracted from the filing |
guidanceSentences |
"We expect June quarter revenue to grow..." |
Forward-looking language, isolated |
qaPairs |
{ "question": { "speaker": "Erik Woodring", "affiliation": "Morgan Stanley" }, "answers": [...] } |
Analyst question matched to executive answers |
sentiment |
{ "positive": 18.94, "negative": 16.57, "netScore": 0.067 } |
Deterministic finance-dictionary scoring |
Every record links back to its source with EDGAR url and documentUrl fields, so claims stay checkable.
Who this is for
Data engineers building event feeds off itemCodes instead of regex. Fintech and AI builders who want qaPairs as a clean corpus for LLM and RAG work. And analysts who screen disclosures, material weakness, going concern, guidance withdrawals, across every US filer with a keyword instead of a browser.
The manual way, and where it breaks
I have written the DIY version: hit the EDGAR feeds, download each 8-K, and parse item codes out of HTML that formats differently per filer. It works until a filing arrives with exhibits arranged some new way, and then your parser silently mislabels events. Transcripts are worse, since there is no official source to parse at all, just third-party pages with their own layouts and access rules. Each piece is a solvable weekend project; keeping both alive across thousands of filers is a job.
The faster way: run the earnings call scraper
Apify Console
- Open the Earnings Call Transcript API and click Try for free.
- Enter
tickersand pick adataType:filings,transcripts, orboth. - Run it and export the records as JSON, CSV, or Excel.
REST
curl -X POST "https://api.apify.com/v2/acts/johnvc~earnings-call-transcript-api/runs?token=YOUR_APIFY_TOKEN" \
-H "Content-Type: application/json" \
-d '{ "tickers": ["AAPL"], "dataType": "both", "filingsLimit": 5, "transcriptsLimit": 1 }'
Details in the Apify API docs.
Parse filings and transcripts in Python
from apify_client import ApifyClient
client = ApifyClient("YOUR_APIFY_TOKEN")
run = client.actor("johnvc/earnings-call-transcript-api").call(
run_input={"tickers": ["AAPL"], "dataType": "both", "transcriptsLimit": 1}
)
for rec in client.dataset(run["defaultDatasetId"]).iterate_items():
print(rec["recordType"], rec["ticker"], rec.get("title"))
for sentence in rec.get("guidanceSentences", [])[:3]:
print(" guidance:", sentence)
Grab a ticker's earnings call transcript
There is a ready-made task per major ticker, each returning the speaker-tagged call in JSON: AAPL, NVDA, TSLA, and MSFT, with more on the Actor's examples tab.
Pull parsed 8-Ks by ticker
The filings surface on its own: SEC EDGAR 8-K filings API by ticker returns recent filings per company, and 8-K item codes, guidance, and sentiment shows the parsed structure in full.
Screen EDGAR for red-flag language
Full-text keyword search across all US filers powers the screener tasks: material weakness disclosures, going concern warnings, guidance withdrawals, and financial restatements.
Monitor material events as a feed
With onlyNew set, scheduled runs return only fresh records, which turns item-code filters into event trackers: material events watchlist, cybersecurity incidents under Item 1.05, and executive departures under Item 5.02.
Build an LLM dataset from Q&A pairs
Because qaPairs ships pre-matched, the task Earnings call Q&A dataset for LLM and RAG produces a training-ready corpus, and Earnings guidance monitor does the same for forward-looking statements.
Query filings from Claude over MCP
Through the Model Context Protocol, Claude, Claude Code, and Cursor can call the Actor mid-conversation, so "summarize Apple's latest 8-K and its guidance language" runs against the actual filing. You can read more about Claude at claude.ai.
FAQ about scraping earnings calls and SEC filings
EDGAR is free, so why pay for a scraper at all?
Because EDGAR returns documents and this scraper returns data. You are paying for the parsing: item codes tagged, press releases extracted, guidance sentences isolated, Q&A matched to speakers, plus transcripts that EDGAR never had.
What does the earnings call scraper cost per record?
One event per record returned, a parsed filing or a structured transcript, with no start fee. One hundred records cost about a cent, so a quarterly refresh of a 50-ticker watchlist runs about that.
What does a transcript from the scraper include?
Participants with roles, prepared remarks tagged by speaker, analyst questions paired with executive answers, guidance sentences, and a sentiment score. No audio, and typically available within hours of the call.
Can Claude run this scraper through MCP?
Yes. Connect the Apify MCP server and the Actor becomes a callable tool, which makes filings and transcripts available to an agent as grounded context instead of recall.
Can I schedule the scraper to watch for new 8-Ks?
That is what onlyNew is for. Save a task with your tickers or item codes, attach an Apify schedule, and each run returns only records you have not seen. Start from the Earnings Call Transcript API.
Where does the scraper's coverage end?
Transcripts cover roughly 1,000 to 1,500 mostly large and mid cap US companies per quarter, with an archive back to about 2007, so thin micro caps may have filings but no call. Sentiment comes from a deterministic finance dictionary rather than an LLM, and there are no 10-K or 10-Q statements and no XBRL fundamentals here.
More from Truffle Pig Data
Event data pairs naturally with prices and context: the Google Finance API adds live quotes and financial statements, the Congress Financial Disclosures API tracks another primary-source signal, and the Crunchbase Company API fills in firmographics for the same names.
Wrapping up
The filings were always public; the structure was the missing part. Point the Earnings Call Transcript API at your watchlist and get 8-Ks and calls back as records you can actually compute on.
Top comments (0)