Get financial facts
Facts endpoints return the verified numbers. There are three views over the same data, each in whole-company form and in by-series form:
| Endpoint | Returns | Use when |
|---|---|---|
POST /api/b2b/facts/core |
Every consolidated fact (no segment/product slices) | Building statement-style views |
POST /api/b2b/facts/latest |
The most recent fact per consolidated series | “Current snapshot” cards |
POST /api/b2b/facts/full |
Everything, including dimensional slices | Segment/geo/product analysis |
…/by-series variants |
Same shapes, restricted to specific series_keys |
You already searched and know what you want |
All are POST with a JSON body identifying one company by ticker or cik,
plus an optional metric_id filter.
Fetch all consolidated revenue facts
Section titled “Fetch all consolidated revenue facts”curl -s https://api.stockalloy.com/api/b2b/facts/core \ -H "Content-Type: application/json" \ -H "X-API-Key: $STOCKALLOY_API_KEY" \ -d '{"ticker": "DECK", "metric_id": "us-gaap#RevenueFromContractWithCustomerExcludingAssessedTax"}'Each row looks like:
{ "fact_key": "3f6c1f0a9d…", "series_key": "91b2c4d6e8…", "cik": "0001011570", "current_ticker": "DECK", "metric_id": "us-gaap#RevenueFromContractWithCustomerExcludingAssessedTax", "metric_label": "Revenue", "period_key": "duration:2023-04-01..2024-03-31", "period_kind": "duration", "period_start": "2023-04-01", "period_end": "2024-03-31", "period_end_year": 2024, "period_end_quarter": 1, "unit_signature": "monetary:USD", "unit_class": "monetary", "currency": "USD", "value_num": "4287763000", "value_scaled_int": "4287763", "scale": 3, "source_accession": "0001011570-24-000039", "source_form_type": "10-K", "source_is_amendment": false, "source_is_current_filing_period": true, "source_filed_at": "2024-05-24", "evidence_key": "01HYX…", "evidence_url": "https://stockalloy.com/api/evidence/01HYX…/open?cik=0001011570&accession=0001011570-24-000039"}Rows are sorted newest period first, then newest filing first.
Exact values, no floats
Section titled “Exact values, no floats”Values are transmitted as strings so nothing is lost to floating point:
value_num— the exact decimal value in full units (dollars, not thousands), as a string.value_scaled_int+scale— the same number as an integer significand and a power-of-ten exponent:value_num = value_scaled_int × 10^scale.
In the example above: 4287763 × 10³ = 4,287,763,000 — Deckers’ FY2024
revenue of $4.29B, exactly as filed.
Period semantics
Section titled “Period semantics”period_kind: "duration"— flows (revenue, net income).period_keyisduration:START..END.period_kind: "instant"— balances (assets, cash).period_keyisinstant:DATEandperiod_startis null.period_end_year/period_end_quarterare calendar year and quarter of the period end — for companies with offset fiscal years (like Deckers’ March year-end), the calendar year of the period end is not necessarily the fiscal-year label the company uses.- To classify a duration row as annual vs. quarterly, use the day span: ~355–380 days is a fiscal year, ~84–99 days is a quarter.
Revenue/income series that mix annual and quarterly filings are normalized server-side so a Q4 slot never silently contains a full-year value.
Provenance fields
Section titled “Provenance fields”Every row tells you exactly which filing “won” for that period:
source_accession— the SEC accession number.source_form_type/source_is_amendment— e.g.10-K,10-K/A. When a company amends or restates, the winner logic serves the authoritative value.source_is_current_filing_period—truewhen the period is the filing’s own reporting period,falsewhen it’s a restated prior-year comparative.evidence_url— the proof link.
Fetching by series key
Section titled “Fetching by series key”When you already know the series (from search or the catalog), skip the full export:
curl -s https://api.stockalloy.com/api/b2b/facts/full/by-series \ -H "Content-Type: application/json" \ -H "X-API-Key: $STOCKALLOY_API_KEY" \ -d '{ "ticker": "DECK", "series_keys": ["91b2c4d6e8f0a2b4c6d8e0f2a4b6c8d0e2f4a6b8c0d2e4f6a8b0c2d4e6f8a0b2"] }'Up to 100 series_keys per call; results come back grouped in your requested
key order, newest period first within each series. Dimensional rows include
dimension_path_label (e.g. Direct-to-Consumer) so you can label charts
without touching raw XBRL axis names.
Discovering what exists: the series catalog
Section titled “Discovering what exists: the series catalog”POST /api/b2b/series/catalog lists every series a company has, with period
coverage and observation counts — useful for building pickers or auditing
coverage:
curl -s https://api.stockalloy.com/api/b2b/series/catalog \ -H "Content-Type: application/json" \ -H "X-API-Key: $STOCKALLOY_API_KEY" \ -d '{"ticker": "RKLB"}'And POST /api/b2b/dims/catalog lists the dimension combinations
(axis/member paths) the company reports, with semantic flags
(contains_geo_like, contains_business_like, contains_product_like) so
you can group slices without parsing XBRL yourself.
One caveat worth knowing: XBRL tag succession
Section titled “One caveat worth knowing: XBRL tag succession”Around 2018 most US companies switched revenue tags
(SalesRevenueNet → RevenueFromContractWithCustomerExcludingAssessedTax,
the ASC 606 adoption). Raw series are keyed by XBRL concept, so a single
concept’s series can show a gap near 2018 — the older data lives under the
predecessor tag’s series. If you need a continuous headline-metric history,
query both concepts, or use the MCP server’s search_facts with a
plain-English metric name, which bridges the succession automatically.