Two matching fundamentals feeds can still be wrong
Agreement measures independence only when the sources are independent. Shared normalization, stale restatements, and field semantics can make two plausible rows repeat the same mistake.
Buying a second data feed feels like independent verification. Sometimes it is. Sometimes both vendors transform the same upstream statement through the same template and return identical derived numbers that never appeared in the filing.
The right architecture asks three separate questions: Is the statement current? Does each field mean what the screen assumes? Is the comparison source independent enough to verify the disputed fact?
1. Test what agreement means
StockQL compared EODHD and Financial Modeling Prep with SEC XBRL company facts across a labeled 24-symbol corpus. The ordinary result was encouraging: core values such as net income, assets, equity, and operating cash flow were overwhelmingly accurate, and the commercial feeds agreed on more than 135 of 136 quarterly comparisons.
One row showed why that agreement was not sufficient. JPMorgan’s fiscal 2025 filing reported negative $147.782 billion of operating cash flow. Both feeds returned positive $100.867 billion. Their rows were line-for-line identical, including a net-income value that also differed from the filing. A generic industrial transformation had reclassified $248.6 billion of bank operating items into investing activity.
The adjacent JPMorgan years were correct, and a ten-company follow-up—including Goldman Sachs—did not reproduce the defect. This was not evidence that every bank cash-flow row was broken. It was proof that the feeds shared enough upstream transformation for one provider to be an invalid independent check on the other in this domain.
2. Separate freshness from correctness
Freshness produced a different comparison. FMP served a Walmart quarter two days before EODHD and a Deere quarter three days before it; Nvidia appeared in both feeds on the same observed day. Those measured lags supported a narrow patch strategy rather than a wholesale serving-feed migration.
Restatements can matter more than a few days. For Super Micro Computer’s restated fiscal 2024, SEC XBRL reported net income of $1,152.666 million. FMP matched the restated value; EODHD still carried the original $1,208.1 million, 4.6% higher, and retained pre-restatement values in other statement fields.
A freshness monitor and a restatement monitor therefore answer different questions. The first asks whether the latest period has arrived. The second asks whether a previously stored period has changed.
3. Preserve statement semantics
Even correct numbers can be joined incorrectly. EODHD normalizes some 52- or 53-week fiscal period ends to month-end, while FMP retains the actual fiscal date. Equity can include or exclude noncontrolling interests. ADR statements may remain in local currency while a nearby per-share field is denominated in dollars.
EPS is a particularly sharp example. EODHD’s epsActual is an analyst-adjusted earnings figure, not GAAP diluted EPS. FMP’s epsDiluted is designed for the GAAP concept and matched the SEC in most tested cases. A screen that maps both to a generic eps column destroys that distinction.
StockQL normalizes statements into dated periods and exposes a statement only from its filing-derived effective date, with a conservative lag when the provider supplies no credible filing date. That prevents a period-end date from leaking information into a point-in-time screen before the market could have known it.
4. Use an independent arbiter
StockQL keeps EODHD as the primary fundamentals feed and uses FMP as a freshness and restatement arbiter. For US filers, SEC XBRL remains the independent verifier when the commercial feeds disagree—or when their suspiciously exact agreement needs provenance.
This three-part composition assigns each source a job it demonstrated well: broad serving coverage, fast alternate observations, and filing-level ground truth. It also limits cost. The arbiter can focus on fresh quarters, revised years, and anomalous derived fields rather than duplicating every serving query.