Guide · 16 min read
Choosing a financial data API for AI agents
Last updated 31 July 2026
Market data APIs were designed for dashboards and backtests, where a human writes the query, reads the response, and knows what a CIK is. Agents behave differently: they fan out, they pay for every byte you return, and they pick endpoints from a text description. An API that is excellent for a charting app can be unusable behind an agent. This guide covers what changes, the nine requirements that decide it, how to evaluate a provider in a week, and what it actually costs.
On this page
- The short version
- Why agent workloads break normal APIs
- Nine requirements
- What a good tool schema looks like
- Coverage checklist by dataset
- Budget by workflow, not by question
- Architecture patterns that cut cost 5–10x
- Evaluate a provider in one week
- Licensing and compliance
- Seven common mistakes
- Glossary
The short version
- Judge an API by its tool schemas and identifier model first. Coverage differences between the main providers are smaller than the integration cost differences.
- Budget by workflow, not per question. One agent question is 30–80 calls; a 500-name screen is over 1,500.
- Field selection and caching are worth more than a cheaper per-call price. They routinely cut both the bill and the token spend by an order of magnitude.
- Sort out point-in-time history and licensing before you build, not after your first customer asks for a backtest.
Why agent workloads break normal APIs
A dashboard makes a handful of predictable calls that a developer wrote by hand and tested. An agent makes a variable number of calls that nobody wrote, chosen at runtime from an endpoint description, in bursts, with the entire response body flowing into a context window that costs money per token. Four things change:
Call volume is unpredictable
The same question can cost 12 calls or 200 depending on how the plan decomposes. Monthly quotas designed for dashboards are the wrong unit.
Response size is a direct cost
Every byte returned is read into context and billed twice: once by the data provider, once by the model.
Endpoint choice is probabilistic
The model picks from descriptions. Ambiguous naming produces wrong-endpoint calls that still return 200 OK and quietly wrong data.
Errors must be machine-readable
A human retries a 429. An agent needs a structured error it can reason about, or it invents a plausible answer instead.
Nine requirements
01Typed tool schemas, not just REST docs
An agent picks tools from descriptions. If the provider only ships OpenAPI meant for humans, you will spend weeks writing and tuning tool definitions — and the model will still call the wrong endpoint. Look for schemas designed for function calling, with argument descriptions that disambiguate similar endpoints and explicitly say what each tool is not for.
02Consistent identifiers across datasets
Prices keyed by ticker, fundamentals keyed by CIK and news keyed by company name is three joins the agent has to invent, and inventing joins is how hallucinations get into otherwise correct pipelines. A single entity ID across every dataset, plus one resolver endpoint that maps tickers, ISINs, CUSIPs and names onto it, removes the entire class of error. Ask specifically how ticker changes, mergers and dual listings are handled.
03Predictable pagination and response size
Agents pay for every token they read. An endpoint that returns a 400 KB JSON blob for one query will blow the context window and the budget. Prefer providers with field selection, hard caps on rows per call, and compact key names. A statement endpoint that returns 15 line items instead of 240 is not a minor optimisation — it is the difference between a workable agent and an expensive one.
04Rate limits that survive a fan-out
One agent question routinely becomes 30–80 parallel calls. A 5 requests/second limit that is fine for a dashboard will stall an agent run and, worse, produce partial answers when your retry logic gives up. Check burst limits and concurrency, not just monthly quotas, and check whether 429s carry a Retry-After header.
05Point-in-time correctness
If restated financials silently overwrite history, every backtest you build on the API is wrong and every “what did we know in March” question is unanswerable. Ask whether the data is point-in-time, whether restatements are versioned, and whether index constituents are historical or current-only (survivorship bias hides here).
06Structured, honest errors
There is a large difference between “no data exists for this period”, “you are not licensed for this dataset” and “you are rate limited”. If all three arrive as an empty array, the agent will treat missing data as a zero and report a margin collapse that never happened. Insist on distinct, typed error responses.
07Latency budgets you can plan around
Agent runs are sequential chains of parallel bursts. A p99 of two seconds on a chain of five hops is a ten-second answer before the model has written a word. Ask for p50 and p99 by endpoint, not an average, and test from your own region.
08Coverage that matches your universe
Most providers look identical on US large caps. The differences appear in small caps, non-US listings, OTC names, ADRs, recent IPOs, and anything delisted. Test on the ugliest fifty tickers you care about, never on the demo list.
09Licensing for what you are actually doing
Internal research, client-facing display and redistribution are three different licences. Real-time exchange data usually carries per-user reporting obligations. Sort this out before launch, not after.
What a good tool schema looks like
The description field is not documentation — it is the routing logic. This is the level of specificity that stops a model from calling the fundamentals endpoint when it wanted estimates:
{
"name": "get_income_statement",
"description": "Quarterly or annual income statement for one company, as filed. Use for revenue, margins, EPS. Do NOT use for market prices or estimates.",
"parameters": {
"entity_id": { "type": "string", "description": "Qveris entity ID. Resolve tickers with resolve_entity first." },
"period": { "type": "string", "enum": ["quarterly", "annual"] },
"limit": { "type": "integer", "maximum": 20, "default": 8 },
"fields": { "type": "array", "items": { "type": "string" },
"description": "Return only these line items. Always set this - full statements are ~15x larger." },
"as_of": { "type": "string", "description": "ISO date. Returns data as known on that date (point-in-time)." }
}
}
Three details matter here: the tool says what it is not for, it forces entity resolution rather than accepting a raw ticker, and it nudges the model toward field selection with a stated cost consequence. Schemas written this way cut wrong-endpoint calls dramatically without any change to the underlying data.
Coverage checklist by dataset
Run this list against any provider before signing. The right answer is not “yes” to everything — it is “yes” to the rows your workflows actually touch.
| Dataset | What to verify | Common gap |
|---|---|---|
| Prices | Adjustment methodology, delisted history, corporate actions | Splits applied, dividends not |
| Fundamentals | As-reported and adjusted, fiscal calendars, restatement versions | Only latest restated figures |
| Filings | Full text, section segmentation, exhibits, non-US equivalents | US only, no section structure |
| News | Entity tagging accuracy, source licensing, dedup of syndicated copies | Headlines licensed, body not |
| Estimates | Consensus history, per-analyst detail, revision timestamps | Current consensus only |
| Ownership & insiders | 13F/13D lag handling, insider transaction codes | Filing date vs trade date confusion |
| Reference data | Sector schemes, share counts, index membership over time | Current constituents only |
Budget by workflow, not by question
Rough call volumes for common agent workflows, so you can size a plan before you build.
| Workflow | Typical calls | What controls the cost |
|---|---|---|
| Screen 500 tickers on 3 metrics | ~1,500 calls | Field selection matters most |
| Deep dive on one company | ~40 calls | Filings parsing dominates cost |
| Daily portfolio digest, 25 holdings | ~120 calls / day | Cache overnight, refresh deltas |
| Backtest a signal, 5 years, 200 names | ~50,000 calls | Bulk endpoints, not per-symbol loops |
| Real-time watchlist, 50 names, market hours | ~23,000 calls / day | Use streaming, not polling |
| Earnings-season sweep, 80 companies | ~3,200 calls / week | Transcript and filing length |
A 40-call deep dive that returns full statement objects can push 200k+ tokens through the model. The same workflow with field selection lands nearer 25k. Measure both lines before you decide a provider is expensive.
Architecture patterns that cut cost 5–10x
- Cache by (entity, dataset, period). Fundamentals change four times a year. Caching them for a day is not staleness, it is arithmetic. Most agent workloads are 60–80% cache-hittable.
- Resolve entities once per run. Map every ticker in the question to an entity ID up front and pass IDs thereafter. This kills a whole class of duplicate lookups.
- Prefer bulk endpoints over loops. A screen written as 500 single-symbol calls is a bug, not a workload. One bulk call with a field mask does the same job.
- Summarise before the context window. Reduce a 60-page filing to the sections that answer the question in a cheap pre-pass, then reason over that.
- Set a per-run call budget. Hard-cap calls per question and surface the cap in the answer. Runaway agents are a billing incident waiting to happen.
- Log every tool call with its arguments. Without this you cannot debug a wrong answer, and you cannot prove where a figure came from later.
Evaluate a provider in one week
Day 1–2: the ugly universe test
Take fifty of your hardest tickers — small caps, foreign listings, a recent IPO, a delisted name, a company that changed ticker. Pull the same three fields for all of them. Record coverage gaps and silent nulls.
Day 3: the fan-out test
Fire 100 concurrent requests. Measure p50, p99, error rate, and whether 429s are informative. This is the test that most often eliminates a provider.
Day 4: the wrong-endpoint test
Give the raw schemas to a model with ten ambiguous questions and count how often it picks the right tool without your custom prompt engineering.
Day 5: the point-in-time test
Query a company with a known restatement, as-of a date before it. If you get today's numbers back, the API cannot support backtests, whatever the docs say.
Licensing and compliance, in plain terms
Three questions decide most of it. Answer them in writing before you build.
- Who sees the data? Only your team (internal use, usually included), your customers (display licence), or third parties (redistribution, always negotiated).
- How fresh is it? Delayed and end-of-day data is far cheaper and lighter on obligations. Real-time exchange data typically brings per-user reporting and exchange fees that dwarf the API price.
- Does model training count? Many agreements permit querying but prohibit using the data to train or fine-tune models. If your roadmap includes that, raise it at contract time.
A useful rule: if an answer your agent produces could be forwarded outside your company, you need a display licence, not an internal-use one.
Seven common mistakes
- Choosing on headline price per call rather than calls per completed workflow.
- Testing coverage on AAPL, MSFT and NVDA, then discovering the gaps in production.
- Treating an empty response as zero instead of unknown.
- Letting the model see raw tickers instead of resolved entity IDs.
- Polling for real-time data instead of subscribing to a stream.
- Building the backtest before checking whether history is point-in-time.
- Shipping a customer-facing feature on an internal-use licence.
Glossary
| Term | What it means here |
|---|---|
| Fan-out | One agent question expanding into many parallel API calls. |
| Field selection / field mask | Asking the API to return only named fields, cutting payload and token cost. |
| Point-in-time | Data as it was known on a given date, before later restatements. |
| Entity resolution | Mapping a ticker, ISIN, CUSIP or name onto one stable internal identifier. |
| Survivorship bias | Error from building a historical universe out of today's surviving companies. |
| Burst limit | Peak concurrent or per-second requests allowed, distinct from a monthly quota. |
How Qveris handles this
One entity ID across prices, filings, fundamentals and news; tool schemas written for function calling rather than adapted from REST docs; field selection on every endpoint; typed errors that distinguish missing from unlicensed from rate-limited; point-in-time history with versioned restatements; and burst limits sized for agent fan-out. Pricing is per call with the same metric on every plan, so a workflow estimate translates directly into a bill. 1,000 calls per month free to run the tests above.
