Skip to content

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.

Terminal window
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.

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_kind: "duration" — flows (revenue, net income). period_key is duration:START..END.
  • period_kind: "instant" — balances (assets, cash). period_key is instant:DATE and period_start is null.
  • period_end_year / period_end_quarter are 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.

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_periodtrue when the period is the filing’s own reporting period, false when it’s a restated prior-year comparative.
  • evidence_url — the proof link.

When you already know the series (from search or the catalog), skip the full export:

Terminal window
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:

Terminal window
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 (SalesRevenueNetRevenueFromContractWithCustomerExcludingAssessedTax, 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.