XBRL · Competitive Read · One-off

Fundamentals vs. sifting.io

How our XBRL stack answers the sifting.io pitch — and where they legitimately differ.
Snapshot 2026-07-20

Sifting.io pitched us on the premise that XBRL concept renames break ratios permanently, and that their fundamentals API solves that pain. Both halves of the pitch are worth taking seriously — the first has been our default mode for three months; the second is a productization question, not a data-quality one. Held against what they publish at sifting.io/docs, the underlying substrate we already run is more comprehensive on every dimension the pitch names, and covers ground their docs don't mention at all — PIT semantics, IFRS foreign filers, per-period currency, restatement flags.

16,812
CIKs covered
us-gaap + IFRS foreign filers
854
IFRS filers
post-transition + native IFRS
66
Columns per row
raw + Tier 1/2/3 derived
1 hr
SEC → live
hourly incremental + weekly full

01The pitch, in their words

“When a company amends a prior period, the XBRL concept can change name, and every ratio built on it has to be rebuilt. That work never ends, and it runs per ticker. […] That is the job our fundamentals API does: ratios and individual XBRL concepts per ticker across periods.” — sifting.io outbound, 2026-07-20

The pain they describe is real. It is also exactly the pain extract_fundamentals.py was built to absorb. Three things we do about it today:

02Capability, side-by-side

Columns compare what each side publishes. Anything absent from sifting.io/docs is marked Not published — not asserted as absent from their product, but a fair signal of where their pitch does and does not go.

Capability XBRL Fundamentals sifting.io
Tag normalization Concept renames per taxonomy Documented Per-taxonomy priority chain across us-gaap + ifrs-full. Bank-revenue fallback, REIT rental fallback, RFC-vs-RAO disambiguation, per-period currency handling. Not published Endpoints exist (/v1/fnd/stocks/:ticker/financials, /…/financials/:concept) but no docs section on how renames are handled.
Amendment handling What happens on restatement PIT-correct Earliest-filed wins. is_restated flag when the value later moved >2%. 16.5% of rows carry it. Strict-PIT subset via one WHERE clause. Not published No mention of PIT semantics, first-reported dates, or restatement flags on any docs page we could reach.
Pre-computed ratios Growth, margins, direction 28+ derived Six direction booleans, nine YoY growth rates, four margin ratios, cash runway, accruals ratio, three margin-delta YoY. Cooked into every row. Endpoint exists /v1/fnd/stocks/financials/ratios is listed; which ratios and how they're defined are not on the docs index.
Coverage universe Total CIK count 16,812 CIKs 15,958 us-gaap domestic + 854 IFRS. Includes Toyota, Sony, Honda, VALE, Petrobras, Barrick, Alcon, HSBC, BBVA, GMAB, argenx. Not published Discovery endpoint returns "US issuers"; no total stated, no IFRS coverage stated.
Foreign filers & IFRS 20-F, 40-F, ifrs-full Full extractor Taxonomy-aware extraction with per-taxonomy priority. Wave 11 recency rule catches post-transition filers whose legacy us-gaap tags would otherwise freeze the timeline. Not published Docs describe US SEC surface (10-K/Q, 8-K, DEF 14A, 13D/G, 13F, Form 3/4/5). No IFRS mention.
Per-period currency Native vs. converted Per row Native units, with reporting_currency on every row. Handles mid-history switchers — 39 CIKs on record (UBS CHF→USD, Diageo GBP→USD, YPF ARS→USD, Genmab DKK→USD). Not published A currency-converter endpoint exists (/v1/convert/rate). No detail on how the fundamentals endpoint reports currency per period.
Refresh cadence SEC → queryable Hourly + weekly Hourly incremental picks up every new 10-K / 10-Q / 20-F / 40-F. Sunday full-refresh is the drift safety net. Business-day-aware alerting. Not published No cadence stated for fundamentals.
Historical depth How far back Full XBRL era Since SEC XBRL mandate (~2009). Cumulative companyfacts.zip parsed end-to-end. Not published No history window stated.
Dividends Same row shape In-row dividends_paid is a column on every quarterly and annual row. Adjacent Implied via earnings / ownership surfaces; no dedicated dividends endpoint in the docs index.
Insiders (Form 3/4/5) Filer trading activity Same client Handled by argos-mcp-server in the same request flow: insiders_of_company, insider_flow, insider_cluster_screen, more. Composable with fundamentals. In their API /v1/holdings/insiders. Genuine convenience of a single-vendor surface.
Corporate actions Splits, spinoffs, M&A recasts Recasts flagged M&A / spinoff recasts land in is_restated alongside real restatements. Splits/spinoffs handled downstream, not in-row. Not published No corporate-action endpoint in docs.
Cross-signal capability What management said × what they did 469 classifiers Divergence between classifier signal and the fundamentals row is unique to us. Company says pricing power expanding; margin says the opposite. Nobody else has both sides. Not offered Fundamentals-only vendor surface. Not in their pitch.
Pipeline transparency Auditable computation trail Full trail first_reported_date + accession_number on every row. Sanity gates block bad loads (NEGATIVE_BALANCE / NEGATIVE_FLOW threshold). Extract logic is source-visible. Vendor black box Standard for a hosted API. Their disclaimer notes outputs are "synthetic reference values" from proprietary aggregation.

03Where they legitimately differ

The one honest asymmetry

They surface fundamentals as a public REST API with a single key. We surface ours via internal MCP tools and Postgres / Qdrant against our own workloads. For a customer who wants a hosted endpoint to hit directly, sifting.io is a shape we don't currently offer — regardless of who has the better underlying data. If a client comes back saying "we want the sifting shape," the question is whether we productize an endpoint on top of our substrate, not whether we have the substrate.

Beyond that, three things they publish that we don't sell in the same shape:

04Five questions to hold against them

If the pitch continues, these five questions determine whether the comparison is close or lopsided. From their public docs, none of the five is addressed.