Earnings Calls & Commentary
Management commentary arrives through several channels: full call transcripts, prepared remarks furnished to the SEC, and interviews. xnews covers each one.
| Need | API | Key |
|---|---|---|
| Full transcripts, keyless | fetchEarningsCallTranscripts, provider hf-transcripts | No |
| One quarter on demand | fetchAlphaVantageTranscript | Alpha Vantage key |
| Remarks, transcripts, and investor-day material furnished in SEC filings | SEC_COMMENTARY_QUERIES + fetchSecFullTextFilings | No (declared User-Agent) |
| Executive interviews | COMPANY_COMMENTARY_YOUTUBE_CHANNELS + fetchYoutubeSubscriptions | No |
Keyless transcripts (hf-transcripts)
xnews reads an MIT-licensed snapshot of S&P 500 earnings-call transcripts through the Hugging Face datasets-server. Coverage is roughly 685 US large-cap issuers from 2005 onward: much of, but not all of, the S&P 500.
import { fetchEarningsCallTranscriptNews, fetchEarningsCallTranscripts } from "@xbbg/xnews";
const [latest] = await fetchEarningsCallTranscripts("MSFT", { limit: 1 });
if (latest) {
console.log(latest.companyName, latest.year, latest.quarter, latest.publishedAt);
console.log(latest.turns[0]); // { speaker, text }
console.log(latest.content.length); // the whole transcript as one string
}
// Pin one call.
const q2 = await fetchEarningsCallTranscripts("NVDA", { year: 2025, quarter: 2 });
// As NewsItems for a feed (the summary is the opening remarks; the url opens the dataset row).
const items = await fetchEarningsCallTranscriptNews("NVDA", { limit: 4 });
console.log(q2.length, items.map((item) => item.title));- Results are newest first.
limitdefaults to 8 and is capped at 100 rows per page (HF_MAX_PAGE_LENGTH); useoffsetto page further back. - Years and quarters are the fiscal labels the company reports.
- The dataset is a periodically republished snapshot, not a live wire. New quarters appear when it is refreshed. Names outside its coverage return no rows (an
emptyprovider status in feeds), not an error. - Rows run around 50 KB each, so keep
limitsmall when you only need recent calls.
Add hf-transcripts to a company feed's sources to mix transcripts into the feed; it needs a ticker.
Query any public dataset
The generic datasets-server URL builders are network-free and also exported from @xbbg/xnews/catalog:
import {
HF_EARNINGS_TRANSCRIPTS_DATASET,
hfDatasetFilterUrl,
hfDatasetSearchUrl,
} from "@xbbg/xnews/catalog";
console.log(hfDatasetSearchUrl(HF_EARNINGS_TRANSCRIPTS_DATASET, "share repurchase", { length: 20 }));
console.log(
hfDatasetFilterUrl(HF_EARNINGS_TRANSCRIPTS_DATASET, {
where: `"symbol"='AAPL'`,
orderby: `"date" DESC`,
length: 4,
}),
);hfDatasetRowsUrl, hfDatasetFilterUrl, and hfDatasetSearchUrl work with any public dataset reference ({ dataset, config?, split? }).
One quarter from Alpha Vantage
When the snapshot lags or lacks a company, fetchAlphaVantageTranscript fetches a single fiscal quarter from Alpha Vantage's EARNINGS_CALL_TRANSCRIPT endpoint:
import { fetchAlphaVantageTranscript } from "@xbbg/xnews";
const call = await fetchAlphaVantageTranscript("IBM", "2024Q1", {
apiKey: process.env.ALPHAVANTAGE_API_KEY!,
});
for (const turn of call.turns.slice(0, 3)) {
console.log(turn.speaker, turn.title, turn.sentiment, turn.content.slice(0, 80));
}
console.log(call.text.length);Turns are speaker-attributed with roles (title) and Alpha Vantage's own per-turn sentiment score; xnews passes that value through and does not compute sentiment itself. Free keys allow 25 requests per day at 5 per minute. The key is redacted from every URL xnews reports.
Commentary furnished to the SEC
Prepared remarks, call transcripts, fireside chats, and investor-day decks are routinely furnished as 8-K exhibits under Regulation FD. SEC_COMMENTARY_QUERIES curates EDGAR full-text phrases for them:
import { SEC_COMMENTARY_QUERIES, fetchSecFullTextFilings } from "@xbbg/xnews";
for (const { query, forms, description } of SEC_COMMENTARY_QUERIES) {
const filings = await fetchSecFullTextFilings(query, {
forms,
ticker: "MSFT", // scopes the search to one filer
since: "2026-01-01",
secUserAgent: "my-app/1.0 ops@example.com",
limit: 5,
});
console.log(description, filings.map((filing) => filing.url));
}The query is searched as one exact phrase, and ticker (or a numeric CIK) scopes it to one filer through EDGAR's entity filter. The four entries are "prepared remarks", "earnings call transcript", "fireside chat", and "investor day", each limited to 8-K filings. Requests to sec.gov need secUserAgent and count toward SEC's 10 requests per second.
Executive interviews on YouTube
COMPANY_COMMENTARY_YOUTUBE_CHANNELS is a verified starter set of channels where executives speak in their own words: CNBC Television, CNBC, Bloomberg Television, Bloomberg Podcasts, Yahoo Finance, the All-In Podcast, and Norges Bank Investment Management (its In Good Company CEO interviews).
import { COMPANY_COMMENTARY_YOUTUBE_CHANNELS, fetchYoutubeSubscriptions } from "@xbbg/xnews";
const subs = await fetchYoutubeSubscriptions(
COMPANY_COMMENTARY_YOUTUBE_CHANNELS.map((channel) => channel.channelId),
{ hideShorts: true, limit: 50 },
);
const mentions = subs.items.filter((video) => /nvidia|earnings/i.test(video.title));
console.log(mentions.map((video) => `${video.publishedAt} ${video.title}`));Pair a matching video with fetchYoutubeTranscript to read what was said (YouTube Channels & Captions).
Rights
Transcript text remains the editorial content of the underlying call, whatever the license on the dataset that distributes it. Review rights before republishing full text; quoting, summarizing, and linking are the safer defaults.
Related
- Company Feeds: combine
hf-transcriptswith news and filings. - Realtime Transcription: transcribe a live call's audio when no captions exist.
