- Brand
- Distill Markets
- Category
- Data & Analytics
- Primary Subcategory
- Institutional Financial Data & Equity Research Platforms
Integration details
Description
Distill Markets gives ChatGPT direct access to US SEC filing data, served exactly as filed and traceable to the EDGAR accession that stated each number. What it covers: - Fundamentals from 10-K and 10-Q XBRL: latest values, up to 20 years of history, financial ratios, and a bring-your-own-price valuation panel. - Point-in-time views: what was knowable on a past date, every version of a fact across filings, and material revisions, for restatement-aware research and backtests without lookahead. - Ownership: 13F institutional holders and manager portfolios, Schedule 13D/13G blockholders, and Form 4 insider transactions. - Filings and events: recent SEC filings, 8-K item events, and a delta feed for agent loops. - Context: 16 government macro series and sector capital-cycle aggregates. - Pre-2009 annual fundamentals parsed from text filings (FY1995 to FY2009), kept separate from the XBRL record and served with per-fact provenance. Every tool is read-only. Responses carry the accession number, filing date and XBRL concept behind each value, so any figure can be checked against the SEC document. The server states no opinions and gives no investment advice: it reports what the filer said and how it reconciles. Coverage is US domestic 10-K and 10-Q filers. Figures are in the filer's reporting currency, never converted. A free account covers most tools. Analyst and Pro plans add depth: full ownership lists, point-in-time detail, cross-ticker comparison and the pre-2009 corpus.
- Integration type
- Plugin
- Verification status
- Not applicable
- Platform
- ChatGPT
- Primary Subcategory
- Institutional Financial Data & Equity Research Platforms
- Secondary Subcategories
- None listed
- Brand
- Distill Markets
- Access
- Account required
- First tracked
- 2026-10-03
- Tool count
- 27
- Geography
- US
The Primary Subcategory used for this profile’s headline score.
Other Subcategories where the Integration is listed.
ChatGPT Plugin discovery is coming soon
ChatGPT can surface a Plugin when it matches a user's request.Your Plugin Discovery Score measures how often yours appears.
No spam. Unsubscribe any time.
What discovery looks like

Get alerts for Distill Markets
Get updates when Distill Markets’s Discoverability Score or category rank changes.
Competing in ChatGPT Institutional Financial Data & Equity Research Platforms
View Category27 tools agents can invoke
[Free, 10/day] Fundamentals as KNOWABLE on a past date: only filings accepted by that date, values AS THEN REPORTED — no lookahead, no restatement substitution. Each value carries the EDGAR accession of the filing that stated it. This is the time-travel view: use it to reconstruct what an investor could actually have known (e.g. before a restatement landed), or to build survivorship- and restatement-bias-free backtests. Annual basis by default. period='quarterly' returns the latest SINGLE-QUARTER panel knowable at the date instead: native quarterly rows where the issuer filed them, YTD-subtraction synthesis where it filed cumulatively (values marked synthesized:true; a synthesized quarter combines two filings and is dated to the later one). Each value carries `period` (Q1..Q4). Contrast with get_sec_fundamentals / get_fundamentals_history, which are latest-filing-wins (today's view of the past). Point-in-time corpus covers 2009 onward. DELISTED companies resolve too (YHOO, CELG, MON, XLNX, RTN, TWX...): the identity layer maps historical tickers to CIKs, and the response carries companyName plus delistedAt (Form 25/15 event date) when the issuer later stopped reporting. Live tickers have delistedAt null. Free tier (scope `pit:asof`), capped at 10 calls a day; Analyst and above are unlimited. Universe-scale as-of screening and the bulk as-of panel export are the Pro-anchored siblings — see `screen_universe`'s `as_of` parameter (scope `pit:asof:bulk`).
get_asof_fundamentals
[Free top-5 / Analyst full list] Schedule 13D/13G beneficial-ownership filers of a ticker — the current "who owns >5%" population, one row per filer/filer-group, each taken from its single MOST RECENT filing (every 13D/A or 13G/A restates the whole position, so the latest filing IS the current stake). 13D and 13G are the two beneficial-ownership schedule types: a 13D is filed when the holder may seek to influence control (activists, strategics); a 13G is the short form certifying a passive stake (index funds, asset managers). Rows carry filingType ("13D"/"13G"), isAmendment/amendmentNo, filedAt, eventDate (the date the threshold was crossed), personCount (group filings list up to 100 reporting persons), and percentOfClass — the filer's own stated percent, served exactly as filed, never recomputed; for a group filing it is the MAX across members, never the sum (members restate the same aggregate). Event-driven timeliness is the point: a 13D appears here within days of the stake being disclosed, where 13F (get_institutional_ownership) shows it only after quarter-end + 45 days. Coverage spans 2015 onward — filings before the SEC's 2024-12-18 structured-XML boundary are parsed from the older text-only filing format (the "text era"), so older stakes appear too, not just ones disclosed after that date. Every row carries `isStale`: true when its filing is more than 365 days old. 13D/13G has no forced quarterly refresh the way 13F does, so an old filing can still be a filer's genuine current stake — isStale is a visibility flag, never a filter (a stale row is still returned, just sorted after the non-stale ones, oldest last). Free keys see the five largest holders with truncated=true; the full list requires the Analyst tier (scope `ownership:detail`).
get_blockholders
[Free] Sector capital-cycle aggregates from SEC capex data. Pass no args for all eleven GICS sectors. Pass `sector` for that sector's drill-down: constituent tickers, median capex/revenue ratio, and the accelerating and decelerating shares. Those two shares are fractions of the WHOLE mature-year cohort and are typically small — neither exceeded ~11% for any sector in FY2025 — so read them against `pctUnclassified` (the remainder, routinely 86-91%) rather than as a split of the sector. `pctAcceleratingOfClassified` and `pctDeceleratingOfClassified` restate the split over the labelled tickers alone. This tool is sector-level only. There is no per-ticker capex path on the launch surface; for a single name's capex use get_fundamentals_history. Free tier.
get_capex_cycles
[Free] Delta feed: what's new or changed in the last window. Returns two independently-paged streams — new SEC 8-K filing events and new SEC filings — since the cutoff. Use this in an agent loop to track recent activity: call it on a schedule and react only to deltas, instead of re-pulling everything. Both streams are filing-derived; `newEvents` rows identify the company and when the filing landed, and carry no classification of their own. Use get_events for a ticker's catalyst categories, or `items` on the `newFilings` rows for the raw 8-K item codes (null on forms that have no items, e.g. Form 4). PAGINATION: `nextCursor` in the response is non-null whenever either stream still has results left inside the window. Walk it: pass the returned `nextCursor` back as `cursor` on the next call, and stop once `nextCursor` comes back null. Each call — each page — counts once against the `changes` sub-quota, so walking N pages costs N calls, not one call per window. CLOCK NOTE, per stream: SEC-catalyst signals are timestamped to the FILING DATE (midnight UTC), not detection time — an hour-precision `since` (e.g. '2h') can miss a signal for a filing dated yesterday but only detected overnight; prefer a date-based window (e.g. '7d') over hour precision when watching that stream. New SEC filings are timestamped to ingestion time, so hour precision behaves as expected there. Free tier.
get_changes
[Free] Single-ticker briefing in one call — government macro series, the sector capex aggregate, eight quarters of SEC fundamentals, four quarters of financial ratios, and the company's ten most recent SEC filings. Every block is filed or government-sourced. `filedEvents` rows are as-filed: form type, filing date, the 8-K item codes the filer selected (null on forms that carry none, e.g. Form 4), and the EDGAR accession number. `health.history` carries operating margin, net margin, debt/equity and current ratio — arithmetic on filed lines, with no composite score over them. `capitalCycle.pctUnclassified` is served beside pctAccelerating/ pctDecelerating because those two are shares of the whole sector cohort and are typically small; without it they read as if they partitioned the sector. Free tier: top ~50 tickers without API key (rate-limited 30/hr). All tickers with a free API key. Cheapest way to get an overview of a ticker.
get_briefing
[Free] SEC company profile, as EDGAR carries it: `cikNumber`, `name`, `entityType`, `sicCode`/`sicDescription`, `category`, `stateOfIncorporation`, `fiscalYearEnd`, address, `exchanges`, `tickers`, `formerNamesJson`. Useful for entity disambiguation and confirming you have the right company. NO GICS SECTOR. `sicCode` is the SEC's own classification and is the only one here. GICS sector lives on screen_universe rows — and if you need sector for many tickers, page screen_universe rather than calling this per ticker: a measured session spent 397 profile calls where 7 screen pages would have done. Free tier.
get_company_profile
[Analyst] One call for up to 10 NAMED tickers: a fundamentals snapshot plus the top 5 SEC filing events for each. This is the batch-depth lane — reach for it instead of fanning out per-ticker calls once you already know which companies you want. Pick the lane by what you have. screen_universe filters the WHOLE universe by metric and is the bulk lane (page it — ~3,000+ companies, full metric sets). get_compare takes a list you already hold and returns depth on each. The per-ticker tools go deeper still on a single name. The comparing is yours to do: the response is the same filed figures placed side by side, with no ranking, score or verdict across the set. Analyst tier.
get_compare
[Free] SEC 8-K filing events for a ticker. Each row carries the filing timestamp (`createdAt`) and the catalyst category (`catalystCategory`); rows can be matched to get_sec_filings rows by timestamp. `catalystCategory` names the 8-K item THE FILER selected — item 2.06 is titled "Material Impairments", 4.01 "Changes in Registrant's Certifying Accountant", 3.01 "Notice of Delisting". Where a filing carries several items it is the highest-materiality specific one, with the catch-all items (1.01, 8.01, 9.01) yielding to a specific co-filed item. It is a filed fact, not an assessment of the company: it says what the filing was filed UNDER, never whether that is good or bad news. For the raw item codes themselves, read `items` on the matching get_sec_filings row. Factual SEC filing events only — no direction, no thesis, no investment advice. Free tier and above.
get_events
[Analyst] Version timeline: EVERY filing's statement of each fact — how a number changed across the filing that first reported it and every subsequent filing that restated it. Each version has the value, filing date, form, EDGAR accession, and the raw XBRL `concept` behind the row. Several concepts can map to one conceptGroup (e.g. NetIncomeLoss vs ProfitLoss) — two same-accession rows with different concepts are NOT a restatement; a real restatement is the same concept changing across different accessions. Works for delisted issuers too (historical-ticker identity layer). Annual basis by default. period='quarterly' includes every reporting span, each row labeled `period` AS FILED: Q1..Q4 single quarters, H1/9M YTD-cumulative, FY annual, TTM trailing-twelve-month, PT balance-sheet instant. Rows at different spans are different facts, not restatements. Quarterly timelines are large — narrow with concept/period_end. The point-in-time corpus lags the latest-facts store by roughly weeks: an empty or missing recent period can mean the filing exists but has not yet reached this corpus. Cross-check get_sec_fundamentals' lastUpdated before reading an empty result as not filed. Analyst tier (scope `pit:read`).
get_fact_versions
[Free newest-4 / Analyst depth] Financial ratio panel, up to 20 quarters: operating margin, net margin, ROA, ROE, debt/equity, current ratio, cash-to-debt, cash-flow-to-debt. ~3,400 covered companies — returns null history for uncovered tickers. Every figure here is arithmetic over two filed lines, so you can re-derive any of them from get_sec_fundamentals and check this endpoint against us. One caveat on `operatingMargin`: its numerator is whichever operating-income concept the filer tagged, and filers that never tag us-gaap:OperatingIncomeLoss (most banks and insurers, plus a minority of operating companies — IBM among them) are served a PRE-TAX income concept instead. Pre-tax includes non-operating items, so such a margin is not comparable to a true operating margin. get_sec_fundamentals returns `operatingIncomeConceptUsed`, which names the exact concept for a given ticker; the `note` on this response repeats the rule. NO COMPOSITE SCORE. A 0-100 health score and its trend label were withdrawn on 2026-08-26 and are not coming back as a filterable field. No filing states what a company's health score should be, so neither you nor we could verify one — and the old score saturated at its ceiling while margins fell, and read as distress for regulated utilities whose leverage is structural. Read the ratios below across the history instead; that is the judgement this endpoint declines to make for you. Note: this panel lags 10-Q filings by ~8 days (separate refresh job from sec_company_facts). For freshest fundamentals use get_sec_fundamentals. Every tier gets the latest panel. Free: history is the newest 4 quarters, with truncated=true and quartersAvailable naming the full depth. Analyst: all 20 quarters.
get_financial_health
[Free] Find institutional managers by name and get the `holderKey` that get_manager_portfolio needs. Returns holderKey, holderName, familyKey, periodOfReport, positionCount, totalValue and memberCikCount per match, largest first. CALL THIS FIRST. get_manager_portfolio takes a holderKey (a family slug like `vanguard`, or a 10-digit filer CIK), never a display name, so guessing the key from a name will 404. Fewer than 2 characters returns a 400. Matching is on the DISPLAY NAME as filed, so a match is not proof of identity: "Vanguard Group" and an unrelated "Vanguard Capital Wealth Advisors" both match "vanguard". Check positionCount and totalValue before deciding which one the user meant, and say which you picked. Every result is described by one settled quarter (the newest that passed the completeness guard), so a manager who has stopped filing will not appear. Values are full dollars.
search_managers
[Free newest-3 / Analyst depth] Multi-year fiscal-year fundamentals series: revenue, margins, net income, OCF, capex, FCF, R&D, dividends, buybacks, balance sheet - up to 20 years, as reported (latest filing wins on restatement). The trajectory view: use for growth rates, margin trends, capital-allocation history. SHARE COUNTS: `sharesOutstanding` is a period-end count on the basis in force when it was filed and is never restated, so the series steps by the split factor at every stock split - do NOT compute a multi-year share change from it (AAPL FY2018 to FY2025 reads +211% that way). Use `weightedAverageSharesDiluted`, which the filer restates for splits and which reads -25.0% over that same window. Its restatement reaches back two fiscal years before the first annual filing after each split and no further, so a window reaching further back than that can still contain one step (AAPL FY2017 is still on the pre-split basis). EPS: `epsBasic`/`epsDiluted` carry the identical break, on the identical boundary. `epsDiluted` is filed net income divided by that period's own weighted-average DILUTED share count, so it inherits whichever basis `weightedAverageSharesDiluted` carries; `epsBasic` is restated on the same boundary by the same filing, but this response carries no weighted-average BASIC count to reconstruct it from. netIncome / weightedAverageSharesDiluted, both already in the row, reconstructs the filed epsDiluted - useful when a row's own epsDiluted is null. It does not widen the comparable window past weightedAverageSharesDiluted's own, and does not reconstruct epsBasic. Each year also carries earningsReleaseDate/earningsReleaseSource: the filing date of the first 8-K Item 2.02 after that fiscal year's period end, derived from SEC filings rather than announced. Covers years whose period end falls on or after the filings index start (earningsReleaseCoverageFrom); null before it and for non-8-K reporters. Free: the newest 3 fiscal years, with truncated=true and yearsAvailable naming the full depth. Analyst: up to 20 years.
get_fundamentals_history
[Free] Insider (SEC Form 4) transaction activity for a ticker over a look-back window, parsed straight from EDGAR. Returns a summary — openMarketBuys / openMarketSells (counts of code-P / code-S trades), netOpenMarketShares (P shares − S shares), totalBuyValue / totalSellValue, distinctBuyers / distinctSellers, totalTransactions — plus the individual `transactions` list (owner name, role, officer title, transaction date, SEC code + description, acquired/disposed, shares, price per share, value, shares owned after, direct/indirect, derivative flag, security title). Code P marks an open-market purchase and code S an open-market sale; other codes cover option exercises, gifts, and tax-withholding dispositions. The summary splits counts, shares and value by code so purchases and sales are reported separately. Every transaction traces to a Form 4 accession via get_sec_filings. `limit` is capped server-side at 500 regardless of what you pass — read back `effectiveLimit` (what was actually applied) and `truncated` (true when the window holds more transactions than fit in this page) rather than assuming the requested limit was honored verbatim. `totalTransactions` always counts the WHOLE window, never bounded by the limit/page size — it is the number to trust for "how much insider activity happened here", even when `transactions` itself is a truncated page of it. To read past the first page, pass `offset` and walk `nextOffset` until it comes back null; the summary describes the whole window on every page. SUMMARY COVERS COMMON STOCK ONLY. Every open-market figure (buy/sell counts, values, net shares, distinct buyers/sellers) aggregates Form 4 Table I rows. Derivative (Table II) lines — option writes, warrants — reuse the same P/S codes for a different act and their price column is not a per-share equity price, so they are excluded from the summary while still appearing in `transactions` with `isDerivative` true and counted in `totalTransactions` / `derivativeTransactions`. That is why the open-market counts do not sum to the total. A row whose filed price failed the plausibility check carries `priceUnreliable` true with a null price and value — a source error, not an undisclosed price; never infer a value for such a row. `coverageNote`, when present, carries up to two DIFFERENT facts and reads them in one sentence each — check which prefix(es) appear before drawing a conclusion: - "COVERAGE GAP" / "PARTIAL COVERAGE" says the Form 4 filings on file for THIS TICKER'S window are not accounted for by the transactions parsed from them: `form4FilingsInWindow` filings were filed, `parsedFilings` of them produced any transaction. A zero next to this is OUR ingestion gap, so every figure is a floor and reporting it as "no insider activity" is wrong. - "COVERAGE START" says something unrelated: the requested `window_days` reaches further back than the PARSED FORM 4 CORPUS ITSELF does, for any ticker — `coverageFrom` names the earliest parsed Form 4 filing date corpus-wide (null only if the corpus holds none at all). This can fire even when `form4FilingsInWindow` equals `parsedFilings` for this ticker (a fully-accounted-for ticker whose own history happens to sit inside the covered range), so it is not an ingestion gap for this ticker — every figure above is still correct, just scoped to `coverageFrom` onward rather than all the way back to `fromDate`. Free tier (scope `sec:read`) — most vendors gate insider data behind paid tiers or serve it delayed; here it is on the free key.
get_insider_activity
[Free top-5 / Analyst depth] Institutional (13F) ownership of a ticker for one reporting quarter: the holder population (holdersCount, filerCikCount, totalValue, totalShares) plus the ranked largest holders. Every manager holding $100M+ in 13F securities files within 45 days of quarter-end. THREE THINGS TO GET RIGHT BEFORE SUMMARISING THIS PAYLOAD: 1. COMPLETE BY DEFAULT. A 13F quarter only fills in over the ~45 days after quarter-end, so the newest quarter ON FILE is normally one most managers have not filed for yet. This returns the newest quarter that PASSED the completeness guard, not the newest present. Measured on AAPL: the in-flight 2026-06-30 quarter read $51.6B across 1,170 holders against 2026-03-31's $2,396.3B across 6,051. That 98% gap is a filing artefact, not selling. Pass `period` to read an in-flight quarter deliberately; it returns with isPeriodComplete false and a `note` saying so. Never report a partial quarter as settled fact, and never compare one to a complete quarter. 2. NULL MEANS UNKNOWN, NEVER ZERO. newHolders, exitedHolders, valueQoQPct, holdersQoQDelta, sharesQoQPct, and per-holder sharesQoQPct / isNewPosition are null whenever the comparison cannot be certified: the baseline quarter was itself incomplete, the holder had no prior position, or the key lacks `ownership:detail`. Say "not known" for these. Do not read null as "no change", and do not fold it into a count or an average. 3. A HOLDER IS A FILER FAMILY. Vanguard reports AAPL through nine separate CIKs, summed into ONE row carrying memberCikCount 9, so holdersCount is not inflated by filing structure. holderKey is stable across quarters, so a manager reorganising its filing entities does not look like an exit plus a new position. familyKey is null for a lone filer. filerCikCount >= holdersCount. Values are full dollars; percent fields are FRACTIONS (0.05 = +5%). A free key returns the 5 largest holders with their dollar values, with every comparative null and `note` naming what was withheld. The full top 20, per-holder quarter-over-quarter position changes and new/exited flags need the Analyst tier (scope `ownership:detail`).
get_institutional_ownership
[Free] 16 government-sourced indicators (Fed Funds Rate, CPI, unemployment, 10Y Treasury yield, WTI crude oil, industrial production, housing starts, financial conditions, etc.) with z-scores and trend direction. Same payload regardless of ticker — global context. Each indicator carries `statsBasis`: "level" (default) or "period-change". CPI's zScore90d/percentile2y are computed on its month-over-month % change, not its index level — a low percentile there means "inflation has been running cool", not "the index is near a 2-year low". `percentile2ySampleSize` reports how many observations the percentile was actually ranked against, so a sparser series' percentile is visibly narrower than a full 2-year window. Free tier — no API key required.
get_macro
[Free headline / Analyst depth] What one institutional manager owns: their whole-book totals plus their largest positions for a 13F quarter. This is the "what does Vanguard hold" side of 13F; get_institutional_ownership is the "who holds Apple" side. THE ONE MISTAKE TO AVOID: THE TOTALS ARE WHOLE, THE LIST IS NOT. `positionCount` and `totalValue` describe the manager's ENTIRE portfolio. `positions` does not — it carries their largest holdings covering ~95% of book value, capped at 200 names. NEVER sum the returned positions and present that as the portfolio value. For Vanguard at 2026-03-31 the stored 200 positions total 72.1% of a $6.73T book spread over 4,978 holdings; summing them understates the portfolio by more than a quarter. Quote `totalValue` for the portfolio, `storedValueShare` for how much of it the list covers, and say "the largest N of positionCount positions" whenever `positionsTruncated` is true. ALSO GET RIGHT: 1. COMPLETE BY DEFAULT. Returns the newest quarter that passed the completeness guard, not the newest on file. Requesting a quarter the manager has not filed for returns 404 rather than a partial row, so a 404 here often means "has not filed yet", not "no such manager". Pass `period` deliberately; check isPeriodComplete on what comes back. 2. NULL MEANS UNKNOWN, NEVER ZERO. newPositions, exitedPositions, valueQoQPct, positionsQoQDelta, and per-position portfolioWeight / sharesQoQPct / isNewPosition are null when the comparison cannot be certified or the key lacks `ownership:detail`. Say "not known"; never read it as "no change". 3. A MANAGER IS A FILER FAMILY. Vanguard's filing entities count as one manager (memberCikCount 10 for that quarter). Note that the same field on a ticker-side holder row counts only the CIKs holding THAT ticker, so 9 there and 10 here is not a contradiction. 4. EXITS ARE A COUNT, NOT A LIST. `exitedPositions` counts the WHOLE book. There is no field naming which positions they were, and no workflow should expect one. Only the larger part of each book is stored (95% of value, cap 200), so on a truncated book a position can leave the stored set by SHRINKING rather than being sold, and naming it as an exit would assert a trade that did not happen. Naming was only ever possible when the current quarter's stored book was whole: measured across 53,395 manager-quarters with exits since 2024, that held for 3.8% of them, and for none of the large managers anyone asks about. The count is the honest answer. 5. filedAt IS NOT WHEN THE QUARTER BECAME PUBLIC. `filedAt`/`accessionNumber` name the filing this row's VALUES come from, which is correctly the newest — so on a quarter later amended they are the 13F-HR/A's, and that can be a year or more after the period end (a real filer's 2024-09-30 quarter carries filedAt 2025-11-12 against an original filed 2024-11-13). For "what was knowable on date X" use `firstFiledAt`/`firstAccessionNumber`, the EARLIEST filing for that (filer, quarter); `isAmendment` says whether the two diverge. Filtering a backtest on filedAt drops quarters that were public on time, and reads restated figures as having been available at the original date. `portfolioWeight` is computed against the untruncated book, so it stays a true share of the portfolio. Values are full dollars; percents are fractions. A free key returns the headline totals plus the 5 largest positions with weights and changes nulled. The full stored book needs the Analyst tier (scope `ownership:detail`).
get_manager_portfolio
[Analyst] Which managers hold a ticker, and which of them opened, added to or cut the position this quarter. Answers what the top-20 holder list structurally cannot: holders past rank 20, and direction of travel per manager. Each row gives the manager's value, shares, rankInPortfolio and portfolioWeight — the weight is what separates a concentrated position from a tracker weighting. THIS IS NOT A COMPLETE HOLDER REGISTER, and the response says so in `note` every time. A manager appears only when this ticker is among their larger positions, because each manager's stored book covers ~95% of their value (200 names at most). An institution holding the name deep in a large portfolio is genuinely absent. Measured on AAPL at 2026-03-31: 6,051 institutions hold it, 5,461 appear here, so 590 are missing. Describe results as "managers for whom this is a meaningful position", never as "all holders", and use get_institutional_ownership for the largest holders by value (authoritative to its depth of 20). THE FILTERS EXCLUDE UNKNOWNS rather than assuming false. A manager whose change could not be certified against the prior quarter is dropped from newPositions, increased and reduced. So the three do not partition the whole: AAPL 2026-03-31 gives 5,461 all / 155 new / 2,260 increased / 2,800 reduced. Do not present a filtered count as a share of total holders, and do not infer "the rest sold". `increased` and `reduced` also exclude brand-new positions, which have no prior count to have moved from and are reported by `newPositions` instead. Values are full dollars; percents are fractions. An invalid filter returns 400. Analyst tier (scope `ownership:detail`).
get_ticker_managers
[Analyst] Quarterly institutional-ownership series for a ticker, NEWEST FIRST. Per quarter: holdersCount, filerCikCount, totalValue, totalShares, and the quarter-over-quarter changes (newHolders, exitedHolders, valueQoQPct, holdersQoQDelta, sharesQoQPct). Use it to judge whether institutions have been accumulating or distributing across quarters. Quarters still being filed are EXCLUDED by default, and that default is load bearing: appending an in-flight quarter to this series produces a ~98% cliff that reads as a mass exodus and is purely a filing artefact (see get_institutional_ownership). Pass include_partial=true to get them, flagged isPeriodComplete false. One exception to the default: a ticker with NO complete quarter at all returns its partial series rather than nothing, so check isPeriodComplete on each row before describing a trend or plotting a level. Null in any comparative means UNKNOWN, never zero. Values are full dollars; percent fields are fractions (0.05 = +5%). Analyst tier (scope `ownership:detail`).
get_ownership_history
[Pro] Text-parsed annual fundamentals for FY1995-2009 — the pre-XBRL era, before machine-readable filings existed. Covers non-financial single-registrant US filers. Verified tier only, reported per fact as `verifiedBy`: 'continuity' (continuity-checked against a second independently-typeset print of the same fact), 'continuity-widened' (a single surviving print with no second print available to corroborate, admitted instead by in-filing structural anchors and magnitude guards) — both across the whole window — and, for FY2009 only, a third tier 'xbrl' (the filer has a genuine no-lookahead XBRL first-print for that exact concept and the text value directly agrees with it; disagreeing values are never served). A FY2009 filer gets EITHER 'continuity' or 'xbrl' per concept, never both: 'xbrl' requires a genuine XBRL first-print for that concept, 'continuity' for FY2009 is scoped to filers with no XBRL first-print for any core concept at all (the crisis-year coverage gap left by XBRL's 2009-2011 mandatory phase-in); 'continuity-widened' sits outside that either/or and can appear at any fiscal year, including FY2009. The response `note` carries the current measured precision for 'continuity' and 'continuity-widened' separately, each with n and 95% CI. Quote whichever tier's claim you're citing from the response note, always with n and CI, never the bare percentage; this description deliberately omits the figures so they cannot go stale. LOOK UP BY TICKER OR BY CIK — EXACTLY ONE, never both, never neither. `cik` is the drill-down path for screen_pre2009's CIK-only results: 57.8% of this cohort carries no ticker at all, so most of the screen's rows can ONLY be pulled here by `cikNumber`. In the by-CIK response, `ticker` is a best-effort, DISPLAY-ONLY field and is null for genuinely ticker-less CIKs — the expected, common case, not an error — and `companyName` comes from the fact rows' own registrant name as filed, not from a ticker crosswalk. NOT XBRL-GRADE, AND NEVER MERGED WITH THE XBRL RECORD. This is a distinct, lower- confidence dataset from the 2009+ corpus and the two are never commingled. For 2009 onward use get_sec_fundamentals (latest) or get_fundamentals_history (series); for the 2009+ point-in-time view use get_asof_fundamentals / get_fact_versions. Do not splice a pre-2009 series onto a post-2009 one and present it as one continuous record — say which dataset each segment came from. PROVENANCE IS ON EVERY ROW, not just the envelope: `source` (sec_text_parse), `verifiedBy` (continuity or xbrl), `accessionNumber` (the EDGAR filing the value was read out of), `sourceLabel` (the line as printed in that filing), `filedAt`, plus `form`, `periodEnd`, `sic`. Carry those fields through when you quote a number — they are what makes the figure checkable against the filing. The envelope's `note` states the methodology claim; keep it attached. POINT-IN-TIME, AS FILED. Values are what the filing said at the time, so figures that were later restated will differ from modern datasets. That divergence is the dataset working as intended, not an error — it is the record as it was knowable then. A ticker with no pre-2009 coverage returns an empty `facts` list (most current listings); an unresolvable ticker is a 404, and so is a CIK with no in-window verified facts. `facts` IS A PAGE, NOT THE WHOLE MATCHING SET. Full-provenance rows are verbose by design (11 fields per fact incl. accessionNumber/sourceLabel/filedAt) — an unbounded pull for a wide filer has measured 203 facts / 76,913 characters, enough to overflow a calling agent's context on its own. `limit` defaults to 50 and is capped server-side at 500 regardless of what you pass — read back `effectiveLimit` (what was actually applied) and `truncated` (true when more facts exist beyond this page) rather than assuming the requested limit was honored verbatim. `factCount` is this page's length, not the whole matching set. To read past the first page, pass `offset` and walk `nextOffset` until it comes back null. Narrowing with `concept` or a fiscal-year range is still the more targeted move when you only need part of the record — combine it with `limit`/`offset` rather than paging through everything unfiltered. Values are full USD. Pro tier (scope `pre2009:read`).
get_deep_history
[Free counts / Analyst detail] Facts whose reported value changed materially between the earliest version this corpus holds and the latest filing that reported them. A CHANGED VALUE IS NOT A RESTATEMENT, and most of these are not. Measured across 60 tickers: of 86 flagged facts, 3 were verified error corrections. The rest were discontinued-operations re-presentations after a spin-off, reverse-merger entity changes, retrospective adoption of a new accounting standard, and tag changes — legitimate revisions in every case, and this tool is named for what it measures rather than for a conclusion it cannot reach. Never report a row here as a company having restated its financials unless something beyond this payload establishes that. `changeType` on each detail row names the mechanism where the evidence identifies one: `entity-change` (the original filing states no revenue for the period at all — the reverse-merger shape, where the two values belong to different entities), `multi-period-recast` (one filing moved this concept across two or more periods in the same direction — what a standard adoption and a discontinued-ops re-presentation both look like), `amendment` (the value moved in a form ending /A, the one signal pointing TOWARD a genuine correction), and `unclassified` where none matched. Verified corrections land in `unclassified`; treat it as the shortlist to investigate, never as a finding on its own. Two further mechanisms never appear because they are excluded rather than labelled: a tag change, and a pair of values living in one filing. Returns counts (`revisedFactKeys` of `annualFactKeys`) on every tier; the per-fact detail rows (original vs latest value, `changeType`, both EDGAR accessions, relative delta) require the Analyst tier (scope `pit:read`) — on a free key `revisions` is empty and `note` explains the upgrade. Detail rows cap at 100 by |relDelta| — narrow with concept/period_end to reach a fact ranked below the cap. Each detail row carries `originalBasis`, which says what the original side of the diff is. "first-print" means the earliest version held was filed within 105 days of the period end, the window every timely periodic report for a period falls inside, so it is consistent with being the filing that first reported the fact. "earliest-held" means it was filed after that window, so the filing that first reported the fact is missing here and the original value shown is a later filing's statement of the same period. Some original filings are absent from the SEC bulk datasets this corpus is built from, which is what produces the second case. Each detail row also carries `changedFiled`/`changedAccession`: the filing that FIRST reported a value different from the original, as opposed to `latestFiled`/`latestAccession`, which is merely the newest filing this corpus holds that states the fact at all and, for a fact several subsequent filings go on re-presenting unchanged, can be years later than when the number actually moved. `changedFiled`/`changedAccession` equal `latestFiled`/`latestAccession` exactly when the change and the newest-held statement are the same filing. Annual basis by default. period='quarterly' diffs quarterly facts too — always within one reporting span (an H1 YTD row never diffs against a Q2 single-quarter row); each detail row carries `period`.
get_revisions
[Free] Recent SEC filings for a ticker, optionally filtered by form type. Returns filing date, form type, URL to the SEC document, accession number. Form 4 filings are insider transactions. 8-K filings contain item codes (5.02 = officer change, 9.01 = financial exhibits, etc.). Free tier (scope `sec:read`, included on free keys via the benchmark funnel).
get_sec_filings
[Free] Latest SEC-reported fundamentals from XBRL: revenue, net income, operating income, gross profit, R&D, EPS, total assets, equity, long-term debt, cash, operating cash flow, PP&E (`ppe`), trade receivables (`receivables`), shares outstanding, fiscal year, period end. IMPORTANT — quarterly vs annual: `revenue` / `netIncome` / `operatingIncome` are the LATEST REPORTED PERIOD, which is a single QUARTER when `latestForm` is "10-Q" (e.g. Apple revenue ~$111B, not the ~$416B fiscal year). `flowPeriod` states that window outright ("3 months", "12 months", or an itemised "mixed: ..." when the three figures do not share one) and is read off the served facts, not inferred from `latestForm`. For ANNUAL figures read the trailing-year fields instead: `trailingRevenue`, `trailingNetIncome`, `trailingOperatingIncome`, `trailingEbitda`. `trailingBasis` says how they were built: "TTM" = four contiguous quarters summed, "FY" = the latest reported fiscal year, which is the fallback when the quarterly chain has a gap and is NOT twelve trailing months — for an issuer three quarters past its year end it is a window that closed nine months ago. A "TTM" closing on a fiscal year end takes its fourth quarter from the issuer's own annual less its own first three quarters, because SEC files no standalone fourth-quarter figure. Each trailing figure resolves its own window, so `trailingBasis` is itemised ("mixed: revenue TTM, netIncome FY") when they differ. Balance-sheet fields (assets, equity, long-term debt, cash, ppe, receivables) are point-in-time — no adjustment needed. `trailingEbitda` carries `ebitdaBasis` naming what its D&A add-back includes: "DD&A" (a combined depreciation-and-amortization concept was filed), "depreciation+ amortization" (depreciation and intangible amortization were filed separately and summed), "depreciation-only" (no intangible-amortization figure available — understates EBITDA for issuers with material intangibles, e.g. serial acquirers), or "depreciation+amortization (DD&A tag contradicted)" (a combined concept was filed but the issuer's own separately-filed intangible amortization for the same window is LARGER than it, so the tag is not the combined line its name claims; the two are summed and the result is a floor). `longTermDebt` similarly carries `longTermDebtCurrent` (current maturities, when filed for the same period) and `netDebtBasis` naming what a net-debt figure built from these would include — always states that operating/finance leases are excluded. Cash-flow flows are also surfaced on a FISCAL-YEAR (annual) basis — `annualCapEx`, `annualOperatingCashFlow`, `annualDepreciation` (for `annualPeriodEnd`) — since SEC files them YTD-cumulative with no clean single-quarter value. Use these for FCF work (FCF = annualOperatingCashFlow − annualCapEx). Every benchmarked field also carries a `*ConceptUsed` provenance tag (e.g. `capExConceptUsed`) naming the exact XBRL concept behind the number, so you can verify it against SEC directly. `totalLiabilities` additionally carries `totalLiabilitiesSource` = "filed" (issuer tagged Liabilities directly) or "derived" (computed as Assets − Equity for filers that never tag it, e.g. ADI/CTAS/KO) — treat "derived" as provenance, not a filed line to reconcile. nextEarningsDateEstimate/nextEarningsDateConfidence project the next earnings-release date from the filer's own 8-K Item 2.02 cadence, not a company announcement; both are null with insufficient filing history. Free tier (scope `sec:read`, included on free keys via the benchmark funnel).
get_sec_fundamentals
[Pro] Universe-scale point-in-time SCREEN over the pre-2009 (FY1995-2009) text-parsed corpus — the screening sibling of get_deep_history (single-name lookup) and screen_universe (the 2009+ XBRL screener). A SEPARATE, smaller surface: never commingled with the XBRL screener's results, own filter whitelist, own result shape. CIK-FIRST RESULTS. 57.8% of this cohort carries no ticker at all (crawled CIK-only, resolved company from the filing itself, never assigned a ticker in modern records) — every result carries `cikNumber` (always present); `ticker` is best-effort and commonly null. Do not assume a result has a ticker before displaying or joining on one. `ticker`, when present, is a PRESENT-DAY identity resolution (today's live ticker mapping, or else the most-recently-active historical one) for the row's CIK — it is NOT scoped to `fiscal_year`. Ticker strings are reused across unrelated issuers over the decades, so a backtester must never join pre-2009 identity on `ticker`; `cikNumber` is the only stable join key this screen guarantees. EX-FINANCIALS BY CONSTRUCTION. The underlying table excludes SIC 6000-6799 (banks, insurers, REITs) at load time — never a runtime filter, so it cannot be turned off. Their statement shape isn't modeled by this dataset. A VISIBLY THINNER METRIC SET than screen_universe: ratios are computed from 7 of the 21 pre-2009 text-parse concepts (Revenue, NetIncome, TotalAssets, Equity, CurrentAssets, CurrentLiabilities, LongTermDebt) — no margins beyond net_margin, no leverage suite beyond a single LongTermDebt/TotalAssets ratio, no Piotroski/Altman-Z/forensic suite. A ratio is null — never fabricated as 0, an unbounded outlier, or a clamp-boundary value — whenever its inputs are missing, the denominator is non-positive, or the computed ratio itself falls outside a generous plausible range. A FILTER ON A METRIC EXCLUDES ROWS WHERE THAT METRIC IS NULL — it does not rank them low. Nulls are common in this corpus (the response's note points at the coverage tables), so a screen on a sparse metric (e.g. roa when totalAssets is missing for a filer) silently drops companies from the result rather than surfacing them with a null. Per-year, per-concept coverage is published on the methodology page — check it before treating a filtered matchCount as the universe. ORDERING IS DETERMINISTIC AND FILTER-DRIVEN: results are sorted by the FIRST filter's metric, extreme-first for its op direction (lt/lte → ascending, any other op → descending), nulls last, ties broken by CIK; with no filters, revenue descending. The first filter is therefore the sort control — "top by net margin" means putting the netMargin clause first. THREE VERIFICATION TIERS, reported per result as `verifiedBy`: 'continuity' (continuity- checked against a second independently-typeset print of the same fact) and 'continuity-widened' (a single surviving print with no second print available to corroborate, admitted instead by in-filing structural anchors and magnitude guards) — both available across the whole FY1995-2009 window — and, for FY2009 only, a third tier 'xbrl' (graded directly against a genuine no-lookahead XBRL first-print). A FY2009 result gets EITHER 'continuity' or 'xbrl', never both: 'xbrl' requires a genuine XBRL first-print for the concept, 'continuity' for FY2009 is scoped to filers with no XBRL first-print for any core concept at all; 'continuity-widened' sits outside that either/or and can appear at any fiscal year, including FY2009. The response `note` carries the current measured precision for 'continuity' and 'continuity-widened' separately, each with n and 95% CI — quote whichever tier's claim you're citing from that note, always with n and CI, never the bare percentage. Not XBRL-grade and never presented as such. `periodEnd` (fiscal period end date) rides on every result row, the same disclosure get_deep_history carries — it makes the FY1995-2009 label's calendar-year-of-period-end convention self-evident per row, including the 52/53-week early-January edge case where a filer's own fiscal-year name can read one year earlier than the served `fiscalYear` label. `matchCount` is the TOTAL number of CIKs matching the filters for the requested fiscal year, separate from the page (`results`, capped by `limit`). A fiscal year with zero matches returns an empty `results` list, never an error. `matchCount` is read off the same window column carried on the result rows: an `offset` past the last matching row returns an empty `results` page AND `matchCount` = 0, even though matches exist earlier in the ordering (identical behavior to screen_universe's matchCount) — page by stopping at the first empty `results` page, not by comparing `offset` against a `matchCount` read from a different page. Pro tier (scope `pre2009:read` — the same scope as get_deep_history and the other pre-2009 tools).
screen_pre2009
[Free] Universe screener — filter the FULL company set by per-company SEC metrics (latest fiscal year, one issuer per CIK): margins, leverage (debt/EBITDA, net debt/EBITDA), R&D intensity, working-capital days (DSO/DIO), capex intensity, free-cash-flow margin & conversion (fcf_margin = FCF/revenue, fcf_conversion = FCF/net-income; FCF = operating cash flow − capex; both excl. Financials & Real Estate), buyback intensity, net dilution, and Piotroski F-score. Filters are AND-combined. Returns matching companies (ticker + name) with ALL their metric values, every number SEC-sourced. Response fields are camelCase versions of the filter metrics with ONE exception: the Piotroski F-score field is `piotroskiF`, not `piotroski`. When a margin filter is present, Financials and Real Estate are auto-excluded (their margins are non-comparable). This is the cross-metric universe screen in one call — e.g. filter net_margin>0.15 AND debt_to_ebitda<2 AND net_dilution<0 (share count shrinking), or filter debt_to_ebitda>6 AND accruals_ratio>0.1. Basis note (live mode only): piotroskiF is the latest QUARTERLY score; every other metric on a row is the last full FISCAL YEAR (fiscalYear). Two vintages sit on one row — the response `note` field restates this in plain language on every live (non-as-of) call. health_score is no longer a filter or a field (see get_financial_health). Accounting & capital-discipline metrics (Canon 1+2, latest FY), each a bare computed number with its source formula: asset_growth (YoY asset-base growth), accruals_ratio ((NI−OCF)/assets, Sloan), m_score_5 (Beneish 1999 M-score), gp_to_assets (Novy-Marx gross profitability). accruals/gp/m_score exclude Financials & Real Estate. These are raw academic-anomaly figures, not verdicts and not alpha signals — e.g. filter m_score_5>-1.78 AND accruals_ratio>0.1, or filter gp_to_assets>0.3 AND asset_growth<0.15. Point-in-time: pass `as_of` (a calendar QUARTER-END: Mar-31/Jun-30/Sep-30/Dec-31, 2009-06-30 onward) to run the same screen against the record as it was knowable on that date — as-reported values, no lookahead, no restatement substitution. Non-quarter-end dates return a 400 with the supported range: snap your rebalance date to the nearest quarter-end on or before it. That mode requires the Pro tier (`pit:asof:bulk` — the universe-scale sibling of get_asof_fundamentals's single-name `pit:asof`, Free tier at 10 calls/day, unlimited from Analyst); without it the API returns a structured 403. Basis note for as-of mode: net_dilution is shares-YoY. Survivorship: the as-of universe is CIK-keyed and INCLUDES issuers that later delisted (Yahoo, Celgene, Monsanto... through their final filings). Rows carry `cikNumber` (the stable join key — tickers get reused) and `delistedAt` (Form 25/15 date) when the issuer later stopped reporting. Delisted issuers carry sector classifications (from SEC SIC codes), so quality-metric screens include dead names on the same footing as survivors. Full-universe extraction: page until `nextOffset` is null (limit caps at 500 per page). Every response carries `hasMore` and `nextOffset` so paging needs no arithmetic, plus `universeCount` — the issuers in the universe BEFORE your filters, which separates a selective filter from a small universe. Pass `fields` to get only the columns you need: a full-universe read returns ~28 fields per row, and asking for two of them costs roughly a twentieth of the tokens (measured: 2.54 MB -> 136 KB over 3,262 rows). Use it whenever you are going to aggregate or join locally rather than read every metric — e.g. fields=['ticker','sector'] to build a sector map, or ['ticker','cikNumber'] for an identity crosswalk. Omit it to get the full row.
screen_universe
[Free newest-2 / Analyst depth] Revenue by business segment, product line and geography, as the filer stated it in its 10-K/10-Q XBRL. Each axis carries `periods` (one row per period-end/span/unit/partition: the consolidated total the members were reconciled against, the filing's own reconciling items, the reconciliationStatus, the accessionNumber) and `members` (label, rawNames = the filer's XBRL member spellings, lineageState, and one value per period). Every served breakdown sums to within 0.1% of the consolidated revenue the SAME filing reported: as stated, after that filing's own eliminations, or within a stated remainder (reconciliationStatus Exact / ExactAfterEliminations / Remainder). Breakdowns that do not reconcile are not served. `concept` names the total the members were reconciled against, which can be a sibling revenue concept of the members' own. `derived: true` marks a computed fourth quarter (fiscal year minus the three filed quarters of the same member); everything else is a number the filer stated. A value names its period by `periodKey`, the same string the period row carries; `partitionId` separates two breakdowns a filer states on one axis in one period and is 1 for almost every filer. `changeClass` compares a value with the previous served statement of the same member-period (new, identical, precision, rounding, recast, scale, sign) - `recast` means the filer restated it. Coverage: US domestic 10-K/10-Q filers, from SEC's Financial Statement and Notes data sets, which trail a filing by one to five weeks. Single-segment filers report no breakdown. Figures are as reported, in the filer's reporting currency. A filer whose ticker resolves to another registrant is addressed by CIK in the HTTP API at /api/v1/sec/segments/cik/{cik}. Free: the newest 2 fiscal years of each axis, with truncated=true and fiscalYearsAvailable naming the full depth. Analyst: the full window and as_of.
get_segment_revenue
[Free] MCP server manifest info: package version, tool count, and the API base this server is pointed at. Call this first if a documented tool seems unexpectedly missing from your session — the manifest returned here is always the current one for this connection.
get_server_info
[Free] Bring-your-own-price valuation: supply a share price and get the panel computed from VERIFIED SEC fundamentals - market cap, enterprise value, P/E, P/B, P/S, EV/Sales, EV/EBITDA, earnings yield, FCF yield, with the flow basis (TTM/FY) labeled and suppressed ratios explained in `notes`. Get the price from any quote source you have access to; Distill never stores or redistributes it. Factual computation only - expresses no view on cheap vs expensive. `enterpriseValue`'s net-debt component carries `netDebtBasis`, e.g. "LTD noncurrent + current maturities - cash; excludes leases" - it widens to include current maturities of long-term debt when filed (not just the noncurrent portion), but NEVER folds in operating/finance leases; the label always states that exclusion explicitly. `evToEbitda`'s EBITDA denominator is computed the same way get_sec_fundamentals' `trailingEbitda` is - see that tool's `ebitdaBasis` for what its D&A add-back includes. Free tier.
compute_valuation
Distill Markets FAQ
How the directory, categories and Discoverability Score work.
Read the methodologyHow do I improve a ChatGPT Plugin's discoverability?
The levers are the listing surface agents actually read: names, descriptions, keywords, tool metadata, and registry health. Which lever matters depends on where discovery breaks, which is what continuous measurement shows.
What are Distill Markets alternatives on ChatGPT?
As of 2026-10-03, Distill Markets competes with Aiera, AIR Credit Intelligence, Alpha Vantage, ALPHAPORT.AI, AnnuityRatesHQ, Balanços.AI, beatandraise, Bigdata.com, Bull AI, Canary Data, Catalyst, Clarifo, Clarity AI, CredCore - Tusk Liquid, Daloopa, Equibles, FactorWeave, FactSet AI-Ready Data, Financial Datasets, Financial Summarizer Pro, FinancialFilings, FinLens, FinRank Shiver, Fiscal.ai, Fitch Solutions, FMP, FX Hedge, Intropic, Lexfi, LSEG, Mansa African Markets, MetricDuck, Moody's Credit MCP, Moody’s, Morningstar Credit Analytics, MSCI Connector, MT Newswires, Multiples.vc, Nomas Research, Octus, Preqin, Quartr, RoboSystems, S&P Global - Adaptive, S&P Global - Deterministic, Theia Insights, Trata, WikiFx, Wisesheets, Zacks Financial Data in ChatGPT Institutional Financial Data & Equity Research Platforms, ranked by public Discoverability Score.
Where is this profile measured?
This profile uses the geography attached to the latest public registry snapshot: US. Locale tags are intentionally omitted.