Skip to content

Earnings Calls & Commentary ​

Management commentary arrives through several channels: full call transcripts, prepared remarks furnished to the SEC, and interviews. xnews covers each one.

NeedAPIKey
Full transcripts, keylessfetchEarningsCallTranscripts, provider hf-transcriptsNo
One quarter on demandfetchAlphaVantageTranscriptAlpha Vantage key
Remarks, transcripts, and investor-day material furnished in SEC filingsSEC_COMMENTARY_QUERIES + fetchSecFullTextFilingsNo (declared User-Agent)
Executive interviewsCOMPANY_COMMENTARY_YOUTUBE_CHANNELS + fetchYoutubeSubscriptionsNo

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.

ts
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. limit defaults to 8 and is capped at 100 rows per page (HF_MAX_PAGE_LENGTH); use offset to 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 empty provider status in feeds), not an error.
  • Rows run around 50 KB each, so keep limit small 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:

ts
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:

ts
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:

ts
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).

ts
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.

xbbg is independent open-source software and is not affiliated with, endorsed by, sponsored by, or approved by Bloomberg Finance L.P.