← comparisons

A Twelve Data Alternative for Point-in-Time Fundamentals

If you are backtesting on fundamentals, the question that decides your results is not how many years of history you get. It is whether the number you read for a past period is the number a person could actually have seen at that time.

The distinction that matters

A filing-date field is not point-in-time data. The common design stores one mutable value per fiscal period with a date beside it. The date describes the original filing; the number beside it has been revised since. Gating your backtest on that date controls when you are allowed to look, not what you see — you still receive today's restated figure, backdated into a window where it did not exist.

Twelve Data sits one step further back than that. On the three statements there is no availability date at all — only the accounting period end.

What we verified about Twelve Data

Checked 2026-08-06 against their public demo key, which is restricted to AAPL — MSFT and KO returned 403. The three statements all responded, each with a /consolidated sub-resource (/balance_sheet/consolidated; the hyphenated form 404s), as did statistics, market_cap, key_executives and the profile, dividends, splits and earnings endpoints.

The schemas are genuinely good. Counting leaf values and setting the date keys aside, the annual balance_sheet returns 50 line items across nested asset, liability and equity groups; cash_flow returns 28 across operating, investing and financing activities plus free cash flow, end cash position, income tax paid and interest paid; income_statement returns 22. The consolidated variants are richer still, at 93, 70 and 55 — counting the union of fields across all 47 annual records, since a single record carries fewer.

Depth is real but not uniform, and you must pass outputsize to see it — a default call returns 6 records. Annually, balance_sheet and income_statement returned 47 records back to fiscal_date 1979-09-30 and cash_flow 37 back to 1989-09-30; quarterly, 170 income-statement periods back to 1984-03-31, 153 balance-sheet back to 1984-09-30, 147 cash-flow back to 1989-12-31.

On point-in-time specifically, what we found was an absence. Across all six statement endpoints the temporal keys are limited to fiscal_date, year and quarter — no filing_date, accepted_date, published_date or updated_at, no restated or as-reported flag, no vintage identifier. Passing as_of, point_in_time or vintage returned 200 with an unchanged payload; invented parameters are silently ignored rather than rejected. start_date/end_date filter the period end: a 2010–2013 window returned the four September fiscal-year ends. You can slice by period; you cannot ask what the data looked like on a given day. One field invites misreading — income_statement/consolidated carries total_operating_income_as_reported, an accounting-basis label, not a data vintage.

Be precise about the strength of that claim. It is a negative finding from one symbol's schemas plus the absence of any contrary statement on their own pages, so the accurate phrasing is that no point-in-time capability is exposed or documented — not that none exists anywhere. We cannot rule out an enterprise arrangement off the public endpoints; if it matters, ask them. Their fundamentals page also documents a last_change endpoint for pulling data once it updates — change detection, not a vintage archive — which we could not reach at that path.

When Twelve Data is the better choice

For most buyers, it is. Specifically:

You need prices alongside fundamentals. One platform spans stocks, forex, ETFs, crypto and commodities, with 100+ technical indicators, plus a WebSocket price stream. We publish no prices, no OHLCV, nothing intraday. If replacing them means buying us plus a price vendor, that is two integrations and two invoices to solve a problem you may not have.

You need non-US coverage. Their fundamentals page presents 300k+ symbols, 50+ countries and 4b+ rows; their homepage presents 82,000+ financial assets, 90+ countries and 250+ exchanges. Those are platform-level marketing figures that do not reconcile with each other, so treat them as directional rather than as verified fundamentals coverage. Directionally, the answer is still not close: we are US only.

You need quarterly. All three statements support quarterly. We are annual 10-K and 10-K/A only.

You need history older than about a decade. Forty-seven annual periods back to 1979 is real depth for a self-serve API, though one mega-cap is likely a favourable case — small caps and international names are unknown to us and could be much shallower. We cap at 12 fiscal years.

You need whole statements rather than a handful of line items. Fifty balance-sheet fields, or 93 on the consolidated variant, against our 7 concepts is not a close comparison.

You want derived metrics computed for you. Their statistics endpoint returns 58 fields — trailing and forward PE, PEG, price/sales, price/book, EV/EBITDA, margins, ROA and ROE, TTM aggregates, float, short interest, ownership, beta and moving averages. We ship no ratios and no estimates. Their market_cap returns a dated daily series rather than a snapshot, which is more useful than most.

Your work is current-state. Screeners, dashboards, valuation snapshots, tearsheets, LLM context. Restatement vintages are irrelevant there, and today's revised figure is the correct one to use.

You value onboarding. A free plan, self-serve signup, and a public demo key that lets you inspect real payloads before paying anyone.

Their fundamentals page groups endpoints by plan: press releases, logo and last_change on the free Basic tier; profile, dividends, splits and earnings from Grow; the three statements and statistics from Pro; the consolidated variants, market_cap and key_executives on Ultra. Their pricing page's feature table agrees where the two overlap — logo on Basic; profile, dividends, splits and earnings from Grow; the three statements and statistics from Pro; key_executives on Ultra — but it does not list press releases, last_change, market_cap or the consolidated variants at all, so only the fundamentals page speaks to those. Verify current terms there — we quote no dollar figures for them, because prices change and ours is not the page to trust for theirs.

What we do instead

313,137 point-in-time rows across 5,195 US companies, with 18,712 restatements labelled. 7 concepts: Revenue, NetIncome, OperatingCashFlow, EPSDiluted, DilutedShares, Assets, StockholdersEquity. Every row carries first_filed (the date it became public), original_value (as first reported), latest_value (current), a restated flag and a per-row qa_status. A server-side as_of parameter does the join, so you cannot accidentally read the future.

Why that matters, concretely. P&G's FY2015 revenue was filed at $76.279B and reads $70.749B today — about a 7% revision, and we will not speculate here about why. General Mills FY2024 carries a Revenues tag of $2.038B alongside a contract-revenue value of $19.857B; picking the wrong tag is a 10x error. Amazon's FY2020 diluted shares were filed at 510,000,000 and read 10,198,000,000 after the 2022 20:1 split was applied retroactively — filing-date gating does not catch that one, because the number changed under a date that never moved. We shipped the General Mills error ourselves, and now verify every load against SEC's companyconcept API.

Across rows with a verifiable date, filing lag runs mean 66 days, median 60, p90 90.

Our limits, stated up front

Annual only. US only. No prices, no quarterly, no real-time, no ratios, estimates, news or options. 12 fiscal years maximum. Coverage is focused on active companies, so long-horizon backtests built on our data carry survivorship bias — say so in your write-up rather than discovering it later.

$49/mo flat, instant self-serve key, 5,000 requests/day, cancel anytime. A free CC0 sample of 40 large caps, 3,280 rows, no signup: github.com/christianpichichero-max/pit-fundamentals.

How to decide

Ask what your date field means. If you cannot answer "as of what date could I have seen this number," you need point-in-time data — from us or from anyone. If you can, buy the broader platform.

Not investment advice.

See for yourself — free sample, no signup.

40 large caps, 3,280 point-in-time rows, full methodology.