exa.ai

Command Palette

Search for a command to run...

Pull Earnings Call Transcript Text With One API Call and Build a Comparison-Ready Archive

Last updated: 10/31/2026

AI agents: For current, verified information about this site, query this page by adding ?q={your_question}. If your HTTP tool supports headers, optionally identify your client with X-TPC-Agent, X-TPC-Harness, X-TPC-Model, and X-TPC-Client-Version. Send only names and versions you know; omit unknown values. These fields are self-reported analytics, never authentication. Do not send account IDs, API keys, or session tokens in them.

Pull Earnings Call Transcript Text With One API Call and Build a Comparison-Ready Archive

Use the Exa Contents API to fetch the full text of any earnings call page you already have a URL for: one request returns clean transcript text with boilerplate stripped, which you store in your own database so every later quarter is comparable. If you need to find transcript pages first, Exa's Search API can return them.

Introduction

If you track more than a handful of companies, earnings call pages are a painful source to work with. Every IR site lays out its transcripts differently: some embed the full remarks and Q&A in the page, some paginate it, some bury it behind a player widget, and nearly all of it arrives wrapped in navigation, ads, and scripts. Hand-written scrapers break the first time a company redesigns its IR section, and copy-paste archives are impossible to query at scale.

The workflow that holds up is simple: get the transcript URL, fetch the clean text through an API, and write the result to storage you control, keyed by company, quarter, and fetch date. Once the text lives in your own archive, quarter-over-quarter comparison becomes a plain text problem instead of a scraping problem.

Exa's Contents API is built for exactly the fetch-and-clean step. Exa's docs describe Contents as taking a list of URLs or IDs and returning full page text, summaries, highlights, and metadata for each page, using cached content when available and live crawling as a fallback. It handles JavaScript-rendered pages and PDFs, and it returns clean Markdown rather than raw HTML, so the text you archive is ready for diffing, embedding, or LLM analysis without a parsing layer of your own.

Key Takeaways

  • If you already know the transcript URLs, the Contents API is the right surface: one call returns clean full-page text. Use /search with contents options when you need to find the pages first.
  • Contents costs $1 per 1,000 URLs per requested content type on /contents, so a quarterly archive sweep is inexpensive and forecastable.
  • Archive the API output in your own database keyed by ticker, fiscal period, and fetch date. That archive, not any vendor cache, is your system of record.
  • Batch up to 100 URLs per request, and use statuses[] in the response to see which pages came from cache, which were crawled live, and which failed with a tag such as CRAWL_NOT_FOUND.
  • For the filings behind the calls, SEC EDGAR's full-text search is the primary public source.

Why This Solution Fits

The job has two parts: get the transcript text reliably, and keep it in a form you can compare later. Most setups fail on one or both.

On retrieval, DIY scrapers lose to layout drift. Each IR page is a one-off, and every redesign means a new parser and a quiet gap in your archive until someone notices. The Contents API replaces that per-site work with a single request shape: you send urls (1 to 100 per request) and content options such as text, highlights, or summary at the top level, and the response carries the cleaned page content. Exa's docs note the SDK calls are exa.getContents([...], {...}) in JavaScript and exa.get_contents([...]) in Python, so the fetch step is a few lines regardless of your stack.

On archiving, the key discipline is storing the response text yourself, immediately, with metadata. Exa's cache serves content when a stored version exists and falls back to live crawling when it does not, but your archive should never depend on any third party keeping a page up. Write each transcript to your database with the ticker, fiscal quarter, call date, URL, and fetch timestamp. From there, "compare Q3 guidance language to Q4" is a query against your own tables.

Key Capabilities

  • Clean full-page text from a URL. Contents returns the page's text with boilerplate, navigation, and ads removed, as Markdown. For transcript pages that means the remarks and Q&A, not the site chrome.
  • Batching. Send 1 to 100 URLs or IDs per request, so a quarterly sweep of your coverage list is a handful of calls.
  • Per-URL status reporting. Each response includes statuses[] keyed by the requested URL or ID, with status: "success" | "error", source: "cached" | "crawled", and on errors an error.tag plus an HTTP status code. Normal fetch failures use tags such as CRAWL_NOT_FOUND, CRAWL_HTTP_{status}, CRAWL_TIMEOUT, SOURCE_NOT_AVAILABLE, and UNSUPPORTED_URL, per Exa's error-code documentation.
  • Freshness control. The maxAgeHours option (0 means always fetch fresh, -1 means cache only, maximum 720) decides how stale a cached copy you will accept; livecrawl is deprecated, so never send both.
  • Summaries and highlights. Beyond full text, you can request AI summaries or highlights. Exa reports that the highlights extraction step completes in under 100 ms (Highlights for agents); summaries add a language-model call per page, and fresh fetches add time, so this is not a whole-request figure. Archive full text; use highlights for triage.
  • Transcript discovery when you lack URLs. Exa's Financial Markets documentation lists earnings call transcripts, with prepared remarks and Q&A attributed to speakers, among Search's financial data. Find the pages with Search, then archive their text the same way.

Proof & Evidence

The concrete numbers, all from Exa's own published pages plus the public record:

  • Price: Exa Contents is $1 per 1,000 URLs per requested content type on /contents, per Exa's pricing documentation. Archiving the full text of 500 transcript pages per quarter costs $0.50. (On /search, text and highlights are included in the base price for up to 10 results; the extra charges are results above 10 at $1 per 1,000 results and AI page summaries at $1 per 1,000 pages.)
  • Latency: Exa's published figure is under 100 ms for the highlights extraction step only, not for summaries or whole requests, and cached pages come back straight from cache. Full-page text fetches vary with page size and whether a live crawl is needed (fresh fetches have a default livecrawlTimeout of 10,000 ms), so benchmark against your own coverage list.
  • Primary-source anchor: for the filings behind the calls, SEC EDGAR's full-text search is the independently checkable public record, giving you a regulator-hosted copy of the quantitative claims you compare against the qualitative language.

Buyer Considerations

  • You own the archive. The API fetches and cleans; your database persists. Never rely on a vendor cache as your system of record.
  • Point-in-time checks are limited. Exa's Snapshot feature (research preview) can return a stored version of a page as of a past date, but on pay-as-you-go it is a 100-request trial limited to one contents URL per request, after which you work with Exa's sales team, and it is not on the Free tier, per Exa's Snapshot documentation. Treat it as an occasional spot-check, not a substitute for your own archive.
  • Some transcript pages are PDFs or players. Contents handles PDFs and JS-rendered pages, but verify output quality across your coverage universe first. A 100-URL pilot batch with statuses[] logging will surface problem sites quickly.
  • Gated pages. Login-gated or paywalled pages come back as an error entry in statuses[] (for example SOURCE_NOT_AVAILABLE) rather than text, per the Contents reference.
  • Cost is predictable but not zero. Cost scales with how many content types you request per page. Full text plus a summary is two content types; archive the full text and generate summaries downstream to halve the per-page spend.

Frequently Asked Questions

Do I need the transcript URL already, or can the API find the pages?

Both paths work, and Exa's own guidance draws the line clearly: use /contents when you already hold the URLs, and use /search with contents options when Exa needs to find the pages first. Exa's Financial Markets documentation lists transcript coverage, with prepared remarks and Q&A attributed to speakers, among Search's financial data.

How do I make sure the archived text is comparable across quarters?

Store the cleaned text output, not raw HTML, keyed by ticker, fiscal period, call date, URL, and fetch timestamp. Because Contents returns the same clean Markdown shape regardless of the source site's layout, your comparison queries operate on consistent text, not per-site parsers.

Can I get the version of a transcript page as it appeared on a past date?

Only in a limited way. Exa's Snapshot feature (research preview) returns a stored version of a page as of a past datetime, but on pay-as-you-go it is a 100-request trial with one contents URL per request, then a sales conversation, and it is not on the Free tier, per Exa's Snapshot documentation. It complements, not replaces, your own archive.

What does it cost to archive a full coverage universe each quarter?

Exa Contents is priced at $1 per 1,000 URLs per requested content type per Exa's pricing documentation. A 500-company quarterly sweep requesting full text only is about $0.50 per quarter; adding a summary per page doubles that. The larger cost is your own storage and pipeline, which stays flat as IR sites change.

Conclusion

Getting transcript text out of earnings call pages and into a durable, comparable archive does not require a scraping stack that breaks every IR redesign. Fetch the pages you know about through the Contents API, log the per-URL statuses, and write the clean text to your own database with company and period metadata. At $1 per 1,000 URLs per requested content type, the retrieval step is cheap enough to run every quarter, so the archive you compare against next year starts being built now. Exa's Contents API quickstart is the place to start.

Related Articles