Getting StartedIntroduction

Distill Markets API

Distill Markets serves SEC data as it was filed. Each financial fact carries the filing it came from, by accession and filing date. Point-in-time reads return what was on file at a past date. Institutional ownership (13F, 13D and 13G) and Form 4 insider transactions are read from the filings themselves, and macro series from the government agencies that publish them. Everything served is factual information, never advice.

Two ways in

Hosted MCP server: https://mcp.distillmarkets.com
Point any MCP client at the URL with your key in a header, or sign in through a connector with OAuth. Nothing to install. See MCP Server.
REST API: https://api.distillmarkets.com/api/v1
JSON over HTTPS with one key in X-Api-Key; your tier decides which scopes the key carries. See Authentication.

What each dataset is, where it comes from, its range and how often it refreshes: What this data is. Every dated change to served values and rules: the change log. Terms used on these pages: Concepts.

Overview

All requests use HTTPS and return JSON. Authenticate with an API key in the X-Api-Key header. Your tier decides which scopes, and so which endpoints, the key can reach: see Tiers & scopes.

Base URL

bash
https://api.distillmarkets.com

Endpoints sit under /api/v1: /sec for SEC and XBRL data, /macro for macro series, and ticker search under /market.

Quickstart

Create a free key on the settings page (no card required), then make a call:

curl
curl https://api.distillmarkets.com/api/v1/macro \
-H "X-Api-Key: dmk_your_key_here"
TipStart with POST /api/v1/sec/screen. A free key screens the whole SEC universe by margins, leverage, R&D, working capital, capex, buybacks and more. The four scored metrics (Altman Z, Piotroski, accruals, M-score) need quality:read (Analyst) and are null on Free.

Run any documented call against your own key in the API Playground. Your first call walks through the claude.ai connector, the ChatGPT plugin, Claude Code or Cursor, and curl or Python, each ending with filed data on the free plan.

Measured accuracy

A nightly benchmark compares our values with the SEC companyfacts API, the feed we ingest from, and publishes every differing cell at /benchmark. A hand audit on 2026-08-06 re-derived sampled values from the filings themselves: 72 of 72 XBRL facts and 29 of 30 Form 4 transactions exact. Both, with their limits: Measured accuracy.

API stability

An agent that loses a field does not get an error. It gets undefined, carries on, and the answer built on it is wrong without saying so. The guarantees below exist because that failure is silent, and because nothing consuming this API reads release notes.

Response shape is additive only

A field served today keeps being served, under the same name and the same type. New behaviour ships as a new field; an existing one is never repurposed. Documented endpoints stay documented.

This is checked rather than intended. The route list and every response field are recorded in snapshots held in the repository, and a removal, rename or retype fails the build before it can reach a release.

A change that cannot be made additively goes to a new version path. The version it replaces keeps serving for at least six months from the date it is marked deprecated, and key holders are told by email when it is. That is policy and has not yet been exercised: no endpoint has been deprecated.

Values change under stated rules

Shape is frozen. Values are not: companies amend their own filings, and a corpus that ignored that would be wrong on purpose.

A point-in-time read returns the filing record we hold, under the methodology version in force when it is computed. It changes for three reasons only: a filing that reaches us late (fact versions arrive with the SEC’s quarterly financial statement datasets, so a read for a recent date fills in when the SEC publishes, each filing keeping its real filing date); a correction to our own parsing or computation; or a rule change, which moves the methodology version. Corrections and rule changes are listed, dated, at /changelog, and every as-of screen response and panel export row names the build that produced it in vintage and built_at.

Latest-value reads follow the filings. Fundamentals, events, health and the screener report the most recent filed position, and they move when a company revises a figure; the as-of routes exist beside them for that reason.

If a figure you relied on has moved, contact support with the value and the date you read it, and we will say which change moved it and when. The full statement: How the data changes.

Data notices

Every change that moved a served value or widened a field’s meaning, newest first. A field can keep its name and type while what it describes widens, and the snapshots cannot see that, so each one is recorded here. A shape change never appears here: a removed, renamed or retyped field goes to a new version path.

  1. rule changed

    The methodology page, version 2026.10.1, and the X-Methodology-Version header on every API response

    The methodology now states the as-of universe rules in force since 2026-10-21 (rows keyed on CIK, one holder per symbol per date, the older revenue concepts for pre-2018 filings, the bank revenue basis) and restates how a point-in-time read changes. A point-in-time read returns the filing record we hold, under the methodology version in force when it is computed. It changes for three reasons only: a filing that reaches us late (fact versions are loaded from the SEC’s quarterly financial statement datasets, so a read for a recent date fills in when the SEC publishes, each filing keeping its real filing date); a correction to our own parsing or computation; or a rule change, which moves the methodology version. Corrections and rule changes are listed, dated, at /changelog, and every as-of screen response and panel export row names the build that produced it in vintage and built_at. This replaces the earlier statement that point-in-time reads are reproducible and change only for a correction. The full statement is under How the data changes.
  2. values changed

    /api/v1/sec/screen with as_of and /api/v1/sec/screen/export

    The as-of universe was rebuilt at all 70 dates (vintage pit.4313732ece93). Tickers read from a filing’s document names rather than from a trading symbol (TMB, NONE, FIL, NA, and digit-bearing tokens such as C004) are refused, and where one sat beside a real symbol it is removed: the row carries the real symbol or a CIK label instead. isListedEquity (is_listed_equity in the export) is dated against the listing end and reads false on rows dated on or after the issuer’s listed_until; 17,417 rows on 4,933 CIKs moved to false. The export already left those rows out, so its rows did not change. No row was added or removed and no revenue value changed; a stored copy of an as-of screen response should be pulled again.
  3. values changed

    /api/v1/sec/screen with as_of, /api/v1/sec/screen/export and /api/v1/sec/fundamentals/{ticker}/as-of/{asOf}

    Every as-of date of the panel was rebuilt (70 dates, 2009-06-30 to 2026-09-30); a stored copy of any as-of response should be pulled again. The panel is keyed on CIK: a company whose symbol is now held by another filer with its own row at the date appears under a CIK label (CIK0000886158 for the original Bed Bath & Beyond) instead of being displaced; join on cikNumber in the screen response and the cik column in the export. Revenue is filled for pre-2018 filings tagged with the older revenue concepts, so rows that carried a fiscal year and no revenue now carry one. Banks that file net interest income and noninterest income get revenue_financial_basis in the export, kept apart from revenue. The entry rule and the ticker convention are stated under Known limits on the as-of page. Nothing was removed or renamed.
  4. values changed

    /api/v1/sec/fundamentals/{ticker}, /api/v1/sec/financial-health/{ticker}, /api/v1/analysis/compare, /api/v1/analysis/entity/{tickerOrId}

    The fields listed under Rolling Out are now served on production: the bank revenue basis (revenueFinancialBasis and its three basis fields), the four bank ratios with their *Basis fields on the financial-health panel, ffoNareit and the realEstate block for real estate filers, and accountingStandard for foreign private issuers (interestPaidClassification is in the shape but served for no filer yet: its three IFRS cash-flow tags are not in the corpus). Each is absent, not null, where it is not computed for the filer.
  5. values changed

    /api/public/benchmark

    Two cell classes added: ahead (our value comes from a filing the SEC companyfacts feed has not published yet) and stale (companyfacts has a newer period and nothing at ours). Neither is graded. The headline match rate still divides exact and close cells by all cells, so a run with many ungraded cells reads lower, not wrong. Per-field and per-sector rows carry ahead and stale counts.
  6. values changed

    /api/v1/sec/fundamentals/{ticker} and every surface built from the fact table

    A 10-K or 10-Q that companyfacts has not published within five days of filing is now read from the filing’s own XBRL instance document and loaded under the same key, with its accession and filing date. Latest-value reads can therefore lead the SEC feed by days to weeks. Values are the filer’s own, from the same document companyfacts is built from.
  7. values changed

    derived totalLiabilities on /api/v1/sec/fundamentals/{ticker} and /history

    Where a filer tags no liabilities total and the figure is derived from the balance-sheet identity, it now subtracts total equity including noncontrolling interests; before, it subtracted parent-only equity and so counted NCI as a liability. Filers with no NCI are unchanged; for the rest the derived total falls by the NCI amount (Coca-Cola’s moves from 70,584M to 68,483M). totalLiabilitiesConceptUsed still says when the figure is derived. The screener’s altman_z input and the as-of panel keep the parent-only derivation for now and are noted under Coverage.
  8. values changed

    /api/public/delisted/{ticker}

    facts, firstFiscalYear, lastFiscalYear and factCount now describe the company’s record as filed up to the day its listing ended, from both the pre-2009 text corpus and the XBRL record. Before, they covered pre-2009 only. A consumer that assumed every fiscalYear was at most 2009 should stop.
  9. values changed

    13F ownership comparatives for the 2025-03-31 and 2025-06-30 quarters

    Both quarters had lost their quarter-over-quarter comparatives during an earlier targeted recompute, which overwrote them with null instead of preserving values it could not recompute. Their raw holdings were re-imported from the SEC’s bulk 13F data sets and the comparatives rebuilt, so which managers added, increased or cut a position reports real counts again instead of null.
  10. fixed

    13F ownership recompute

    Recomputing a quarter whose baseline raw holdings had been reclaimed overwrote that quarter’s certified comparatives with null, so a repair moved the gap one quarter back instead of closing it. The compute now carries a value forward only for a row whose identity and levels are unchanged; a certified baseline still overwrites with fresh values. Invariant INV-83 checks that a certified quarter’s comparatives never vanish this way again.
  11. values changed

    The ticker carried per CIK on the as-of panel, the live screener and display labels

    One ticker per CIK was picked by shortest-then-alphabetical, so DTE Energy was keyed to a baby bond (DTB), Prudential to PFH and Comcast to CCZ. One rule now picks the primary security everywhere: preferred, warrant, unit and right siblings are demoted first, then EDGAR’s own ticker order, falling back to the old rule only where a CIK’s tickers differ by a single class letter. 32 CIKs were re-keyed; no company lost sector or facts. Invariant INV-82 pins the rule.
  12. values changed

    Weighted-average share counts on /api/v1/sec/fundamentals/{ticker} and history

    Bruker’s weighted-average diluted share count was served as 156, 154, 152 and 149 for FY2019 to FY2022 against filed values between 157,200,000 and 147,200,000: the filer tagged the concept in millions. A guard now withholds a value below 1% of a ceiling built from the same period’s share count or the series median, gated to values that look like a units error rather than a reverse split; 6,044 rows across 748 tickers on the corpus as measured then. Withheld values serve as null and are never rescaled. Invariant INV-81 detects a recurrence.
  13. values changed

    ConocoPhillips in the text-derived history (get_deep_history, /api/v1/sec/pre2009)

    Three cells read a LUKOIL equity-method note instead of the filed income statement: FY2005 revenue of 96,367M and FY2006 of 113,607M, against filed totals of 183,364M and 188,523M. Corrected to the filed statement.
  14. values changed

    Fiscal years, share counts and depreciation and amortization across the fundamentals corpus

    A fiscal-year binning defect that dropped January-1 period ends colliding with the following December was fixed: 2,904 tickers had a fiscal year restored and 986 revenue-bearing rows were recovered. A share count that disagreed with both the period before and the period after it, the signature of a split re-presented mid-series, is dropped rather than served on a mixed basis: 9,094 rows over 2,255 tickers. A combined depreciation-and-amortization tag smaller than the issuer’s own separately filed intangible amortization for the same window now sums the two, with the basis label saying so: 2,635 coordinates over 573 tickers. Separately, the nightly data-quality audit had run truncated for three nights and now reports a failing check by name instead of stopping.
  15. values changed

    The text-derived history, parser v15

    A scale-selection bug that let one outsized value override a filing’s stated scale (balance sheets off by a factor of a thousand or a million, the Pfizer FY2008 class) was fixed, and a cross-fact coherence check now withholds any fact whose magnitude is impossible against its own filing’s other statements: 2,642 rows withheld from the verified tier, plus 7 rows individually confirmed wrong. Verified rows went from 441,932 to 440,472. Precision on the audit protocol: 192 of 196 (97.96%).
  16. values changed

    The text-derived history, parser v14

    Reprocessed under parser v14: precision on the n=200 independent reread rose from 95.5% to 97.5%, with no regressions against v13. The served window widened one year to FY2009, and FY2009 rows carry a verifiedBy tier (xbrl or continuity). Endpoint shapes were unchanged.
  17. added

    Schedule 13D/13G blockholders

    Coverage reaches back to 2015: 1,050,999 filings from before the SEC’s 2024-12-18 structured-XML boundary, parsed from the older text format and verified at 99.2% on a sampled audit. Percent is served exactly as filed.
  18. values changed

    XBRL fundamentals preprocessing

    Values that violate an accounting identity (for example long-term debt exceeding total liabilities) are dropped rather than served. The rule is stated under Plausibility and staleness on the methodology page.

Full change log

General information & developer tooling only, not financial advice. All data is derived from public SEC filings; filing-derived figures and computed metrics can contain errors and should be verified against the source filing. Conduct your own due diligence.