A Finnhub Alternative for Point-in-Time Fundamentals
If you are weighing Finnhub against something else for point-in-time fundamentals, the useful question is narrower than "which API is better." Finnhub is a broad, well-documented vendor — its Swagger spec at finnhub.io/static/swagger.json lists 116 paths behind a single API key, with official Python, Go and JavaScript clients. On surface area it does far more than Tradevo Data does. The narrow question is whether the fundamentals it returns are vintaged — whether you can ask "what did the market know on 2021-06-30?" and get an answer excluding everything filed afterward and everything revised since. This page is written by a competitor, so we will be specific about where Finnhub wins, and name our own limits before you find them.
A filing date is not point-in-time
A filing-date field tells you when a number first became public. Necessary, not sufficient. If a vendor stores one mutable value per fiscal period next to that date, the date describes the original filing while the number beside it may have been revised years later. The row looks point-in-time. It is a current value wearing a historical timestamp.
Two cases, both checked against SEC's companyconcept API:
- P&G FY2015 revenue. Filed at $76.279B. Reads $70.749B today — about 7% apart. We verified the revision; we are not going to guess at its cause.
- Amazon FY2020 diluted shares. Filed at 510,000,000. Reads 10,198,000,000 today, after the 2022 20-for-1 split was applied retroactively. Filing-date gating does not catch this. The filing date never moved; only the number did.
Any backtest reading the second number while trusting the first date is using information from the future.
What Finnhub actually provides — read from its own docs
We have not exercised their API with a live key. Everything below comes from their docs, Swagger spec and pricing page as of August 2026 — a starting point for your own verification, not a test result.
Their as-reported endpoint carries real SEC provenance. /stock/financials-reported returns, per filing, accessNumber (the SEC accession), cik, year, quarter, form (e.g. 10-K), startDate, endDate, filedDate and acceptedDate — timed to the second in their sample. You can pull a single filing by accession number, and values sit in a report object split into bs, cf and ic maps keyed by the issuer's own XBRL tags. That is genuine provenance, and their pricing table shows it on the free tier.
But point-in-time is not a product feature there. The strings "point-in-time," "as-of," "restated" and "vintage" appear zero times in that Swagger spec, and no fundamentals endpoint takes an as_of parameter. The from and to parameters on financials-reported are both documented as "Filter for endDate" — period end, not filing date — so the "what was knowable on date X" query is not expressible; you pull history and filter on filedDate yourself. Their standardized /stock/financials sample response documents line items plus period and year: no filing date, no accession, no amendment flag.
Two things we could not verify and will not assert either way: whether financials-reported returns amended filings (10-K/A) as additional records for the same period — structurally possible via form plus accessNumber, but never documented, and an amend boolean appears only on their filings-search objects, not on financials data — and whether /stock/financials overwrites historical values when a restatement lands. Those answers decide whether original-versus-restated is reconstructable at all, so ask their sales team or test against a restatement you know. Same for as-reported history depth: their docs say "30+ years" for standardized statements and publish no figure for as-reported.
Side by side
| Finnhub | Tradevo Data | |
|---|---|---|
| Point-in-time query | No as_of; from/to filter endDate |
Server-side as_of; only rows where first_filed <= as_of |
| Original vs current value | Not documented either way | original_value and latest_value on every row |
| Restatement labeling | No restated or amend field on financials objects | restated flag; 18,712 labelled |
| Concept breadth | Standardized and as-reported statements | 7 concepts |
| Periodicity | Annual, quarterly, plus TTM and YTD | Annual 10-K/10-K-A only |
| Geography | Coverage row reads US on Free, Global on All-In-One; as-reported scope not stated separately | US only |
| Pricing shape | Free tier plus paid plans; figures render at runtime — read their pricing page | $49/mo flat, 5,000 req/day, cancel anytime |
When Finnhub is the better choice
Often. Pick Finnhub if any of this describes you:
- You want as-reported fundamentals for free. On their Free column, "Financials As Reported," "SEC filings" and "Key Metrics" all carry checks, and their FAQ answers "Is credit card required for free accounts?" with "No, credit card is not required. You can use the free account forever without ever entering your card." Our free offering is a 40-company sample; the API is paid. If budget is the binding constraint, this is not a close call.
- You need anything beyond 7 annual concepts. Full balance sheet, income statement and cash flow, quarterly and TTM, analyst estimates across eleven line items, dividends, ownership and fund holdings, insider transactions, revenue breakdowns, earnings-call transcripts, filings sentiment. We have none of it, and no roadmap that gets you it soon.
- You need prices, non-US companies, or real-time anything. We have no OHLCV, no international coverage, no intraday, no options, no news, no ratios, no estimates. Finnhub has that surface under one key — one vendor, one contract, one token in your config.
- You want speed at the earnings print. Setting
preliminary=trueon their standardized statements endpoint returns figures their docs describe as "usually available within an hour of the earnings announcement if finalized data is not available yet," currently for US companies, with"preliminary": truemarked in the payload so you can tell. Well-labelled and genuinely useful; their docs badge that endpoint as premium. - You are doing current-state research rather than historical simulation. Screening, dashboards, tear-sheets, alt-data exploration — vintaging buys you nothing there, and breadth buys you a lot.
Three structural terms to read first, quoted from their own materials. Their signup form asks you to confirm you are "either a qualified non-professional (personal use) under our terms or a commercial/professional user with our written approval." Their FAQ answers "Do I get to keep the data after the subscription ended?" with "No, you must delete all of our proprietary data at the end of your subscription" — the subscribe confirmation extends that to "derived data" and states no refunds, worth thinking through if you store computed features. And their Fundamental-1 and Fundamental-2 plan tables carry an Access row reading "1 market per subscription," so global coverage multiplies the bill. Prices render at runtime, so read current figures off finnhub.io/pricing rather than trusting any number quoted anywhere, including here.
Our limits, stated first
- Annual only. 10-K and 10-K/A. No quarterly.
- US only. 5,195 companies, 313,137 point-in-time rows.
- 7 concepts: Revenue, NetIncome, OperatingCashFlow, EPSDiluted, DilutedShares, Assets, StockholdersEquity. No ratios — you compute those.
- Up to 12 fiscal years. Not 30.
- Active-company focus. No delisted-company history, so long-horizon backtests on this data carry survivorship bias. Say it out loud in your results.
- Filing lag is real. Across rows with a verifiable date: mean 66 days, median 60.
- We have shipped errors. We served a General Mills FY2024 figure of $2.038B from the
Revenuestag when the contract-revenue tag read $19.857B — the same tag-selection trap you inherit when you consume raw as-reported XBRL maps. See also P&G FY2014, whereRevenuesreads $29.400B against aSalesRevenueNetof $83.062B. We now verify every load against SEC's API and carry a per-rowqa_statusthat is flagged, not hidden.
When we are the better choice
When lookahead bias is what would invalidate your work. One request — ?ticker=AAPL&as_of=2021-06-30 — does the vintage join server-side, and every row carries first_filed, original_value, latest_value, a restated flag and qa_status.
Judge it without paying: the CC0 sample is 40 large caps, 3,280 rows, no signup, at github.com/christianpichichero-max/pit-fundamentals. Check original_value against a restatement you already know.
If breadth is what you need, use Finnhub. If vintaged core fundamentals are what you need, that is what we built.
Not investment advice. Finnhub's features, pricing and terms change — verify on their docs and pricing page before deciding.