Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Live → Recently observed
Changed the definition of "get_cash_position", "get_dilution_snapshot" and "screen_companies"
⟨151 unchanged words⟩ not infer them from shelf or ATM capacity. CURRENCY: amounts are in the filer's REPORTING currency, which is not always USD (Canadian, European, Japanese and Chinese filers report in their own currency). Read top-level `currency` (ISO 4217; null = not determined) and `currencySource` ("presumed_usd" means no foreign-currency marker was found, not a measurement). Every money object is {usd, native: {amount, currency}}: `usd` (and scenarios.closed.estimatedCashUsd / adjustedEstimatedCashUsd / netCapitalRaisesUsd) is null when the block is not in USD; nothing is converted. Never present `native.amount` as dollars. monthsOfCashLeft is currency-neutral and stays populated. Included in Signal8 Pro (403 FEATURE_NOT_AVAILABLE, requiredTier ⟨20 unchanged words⟩
⟨35 unchanged words⟩ ), the float block, and `meta` provenance. Cash amounts are in the filer's REPORTING currency, not always USD: read `cashPosition.currency` (ISO 4217; null = not determined) and `cashPosition.currencySource` ("presumed_usd" = no foreign marker found, not a measurement) before calling a figure dollars. Runway months are currency-neutral. DOES NOT INCLUDE INSTRUMENT ROWS — call get_dilution_instruments ⟨457 unchanged words⟩
⟨317 unchanged words⟩ minCash / maxCash can only return covered companies. A company whose filings report cash in another currency has a null estimatedCurrentCash (no FX conversion) and is never matched by minCash / maxCash; its cash_runway_months is still published. Each row also carries listingMarket ("exchange" / ⟨74 unchanged words⟩
⟨33 unchanged words⟩ exchange":{"description":"Filter by listing exchange: NASDAQ (exacteverymatchtier): NASDAQ, NYSE (includes NYSE Arca), orAMEX.AMEX (NYSE American). Each matches every spelling of that exchange; names that moved to OTC never match. For OTC use market=\"otc\" instead","type ⟨252 unchanged words⟩ cash projection in USD (estimatedCurrentCash). Snapshot-covered companies
Authorization not required, issuer https://api.signal8.ai/
Changed the definition of "get_cash_runway_calendar", "get_upcoming_reverse_splits", "screen_companies" and 1 more
⟨51 unchanged words⟩ Default window is today to 90 days out. When the window starts today or earlier it also lists, first, companies whose ESTIMATED cash is already exhausted (cash_runway_months null, cashRunwayReason "estimate_would_be_negative", cashRunwayAsOf = the date of the cash figure that was rolled forward) — an estimate, never a reported zero balance.
⟨48 unchanged words⟩ "minimum":1,"type":"number"},"market":{"description":"Listing market: \"otc\" (OTC Markets) or \"exchange\" (NASDAQ / NYSE / NYSE American / Arca / Cboe)","enum":["exchange","otc"],"type":"string"},"offset":{"description":"Offset for pagination ( ⟨28 unchanged words⟩
Changed the definition of "get_dilution_snapshot", "get_float", "get_premarket_scanner" and 1 more
⟨148 unchanged words⟩ percent-of-float, a short-interest ratio or a comparison;rendersayitinwithwords that the float is at most that figure (a≤bound)and—saynever print itisas abound.bare number and never with a ~ / ≤ / ≥ glyph (2026-10-18).
Changed the definition of "get_dilution_snapshot" and "get_quote"
⟨159 unchanged words⟩ ≤ and say it is a bound. 🔴 BOUNDED TOTALS: a null share total (`potentialNewShares`, `totalWarrantShares`, `totalConvertibleShares`, `totalEquityPlanShares`, `totalExchangeableShares`, and `potentialDilutionPercent`) may sit beside `<key>Bound: "ceiling"`, `<key>Ceiling` and `<key>Floor`: some rows could not be placed on one split basis, but they can add at most a provably small amount. Report the ceiling as "at most X" and the floor as the measured part — NEVER the ceiling as the measured total, and never feed it to a ratio or comparison as if measured. The null key itself still means not measured. 🔴 RUNWAY: a runway figure beside `goingConcern: true` ⟨225 unchanged words⟩
⟨159 unchanged words⟩ split basis): `sharesOutstandingEstimated: true`, `sharesOutstandingEstimateKind` ("
Changed the definition of "get_news"
Get recent news articlesand, press releases and AI-analysed SEC filings for a company. Use when researching recent developments, catalysts, or sentiment drivers. Filing rows (category "sec_filing") are event-bearing forms only (8-K, 6-K, 424B prospectus supplements, S-1/F-1, 10-K/10-Q/20-F, SC 13D, proxies, delisting notices; never Form 3/4/5, 13G or bank-note 424B2) and carry formType + accessionNumber; a filing that repeats a press release is omitted in favour of the release. For a small foreign issuer that files its news as 6-Ks, the filing IS the news. Set pressReleasesOnly to return only official company pressreleases.releases (no filings).
Certificate changed, valid to 2027-01-09
Authorization not required, issuer https://api.signal8.ai/
Changed the definition of "get_short_interest"
⟨97 unchanged words⟩ implausible or the split basis could not beresolved.resolved; "float_class_scope_mismatch" = the float on record POOLS more than one separately listed share class (e.g. Class A + Class D) while short interest is reported for this symbol's class only — do NOT divide "shortInterest" by get_float's figure yourself for that ticker. A null percent is NOT MEASURED, never 0%.
Changed the definition of "get_dilution_risk", "get_float", "get_float_history" and 2 more
⟨35 unchanged words⟩ , offering ability, overhead supply, cash need. When the filings state no current share count, components that need the share count or market cap (warrants in the money, shelf / ATM capacity) are scored on the best-estimate share count — `details.sharesOutstandingEstimate` {shares, kind, asOf, source} and `details.marketCapSource: "derived_price_x_estimated_os"` say so; report those components as resting on an estimate. 🔴 THE SCORE IS MEANINGLESS WITHOUT `scoreMaxMeasured` AND ⟨236 unchanged words⟩ filed issuances since — floors `historical` + `overall`) or `os_growth_rebased_partial` (growth measured on the company's own filed share history put onto one split basis, but some counts could not be placed — floors `historical` + `overall`) or `overhead_capacity_unquantified` (a live ATM, equity line or S-1 could not be converted to shares — size not stated or no current price — floors `overheadSupply` + `overall`). Name the stated reason, never another. `details.levelBounds` (since 2026-10-15) gives, per level, `floor` (the published level, unsized instruments counted at zero), `ceiling` (each unsized instrument at its filed maximum; null = some instrument has no filed maximum), `exact` (floor and ceiling agree, or the floor is high — the unsized instruments cannot move it, and the level is NOT in `levelsLowerBoundScope`), `bestEstimate` (each unsized instrument at its most likely size, never below the floor), `estimated` and `estimateBasis` (the assumptions, e.g. `atm_total_no_sales_reported`, `convertible_original_principal`). Signal8 surfaces show an estimated level as its `bestEstimate`; when you report one, say it is a best estimate and give the floor and ceiling — never present it as a measurement. `offeringAbilityBasis` / `overheadSupplyBasis` `atmRemainingBasis` / `elocRemainingBasis` say how a remaining was read: `total_minus_reported_sales` / `total_no_sales_reported` are the authorised total less reported sales, or the full total for a program started after the last periodic report — "up to". `details.osGrowthSource` names the share series behind `details.osGrowthRate`. When the rate is null, `details.osGrowthFacts` {fromShares, fromDate, toShares, toDate, splitsInWindow, basis} may carry two dated share counts from the filed history: a FACT, never a rating — the historical level stays not measured; with `basis: "as_filed"` the two counts are not on one split basis and must not be compared as growth.
Changed the definition of "get_dilution_risk"
⟨254 unchanged words⟩ , not annualized — floors `historical` + `overall`) or `os_growth_issuance_floor` (the latest share count could not be reconciled with the share history, so growth counts the last balance sheet plus only the filed issuances since — floors `historical` + `overall`). Name the stated reason, never another. `levelsAreLowerBound` ⟨309 unchanged words⟩
Changed the definition of "get_politician_disclosures" and "get_politician_late_filers"
⟨130 unchanged words⟩ ~8h), so items lag the filing byhours.hours; a report that GROWS materially afterwards (+25 trades or +20%) is emitted once more with a higher `revision`, and `replacesPrevious: true` when you already had it — replace it by `id`. filingDelayDays (longest lag), isLateFiling (>45 days) and lateTradeCount EXCLUDE trades with transactionDateSuspect=true: a date lagging its own otherwise on-time report by ~one year is a probable mistyped year upstream, listed as filed and counted in suspectDateCount — never quote it as a filing lag. owner null means the filing did not state one ("Not stated"), NEVER "Self". Render amountRange (the filed bracket); amountMin ⟨24 unchanged words⟩
Changed the definition of "get_dilution_risk"
⟨160 unchanged words⟩ : a "medium" then means AT LEASTmedium,medium.becauseState it as a lower bound; presenting a floor as a measurement understates the risk of a named issuer. `levelsLowerBoundScope` names WHICH levels are floors and ONLY those carry the at-least qualifier; `levelsLowerBoundReason` says why: `unquantified_live_instruments` (instruments that could not bequantifiedsized were excludedfrom—thefloorssum.`overall`State+it
Changed the definition of "get_baby_shelf_capacity", "get_company_profile", "get_compliance" and 6 more
Get the SEC Form S-3 General Instruction I.B.6 "baby shelf" capacity(10 credits): how much the issuer may raise off ⟨495 unchanged words⟩
⟨19 unchanged words⟩ other fundamental data. This is a lightweight lookup(1 credit)-- use this when you only need basic ⟨66 unchanged words⟩
Changed the definition of "get_baby_shelf_capacity", "get_dilution_instruments", "get_dilution_risk" and 2 more
⟨212 unchanged words⟩ is "at most", never a figure. 🔴 `suppressedReason: "issuer_not_ib6_limited"` means the issuer's own current prospectus offers MORE than the cap our float valuation would strike, on a cover with no I.B.6 limitation (`issuerUnlimitedOffer` echoes it): whether the cap applies is NOT MEASURED (`constraintApplies: null`) — never report it as $0, as constrained, or as unlimited. `floatValueBasis: "issuer_stated"` means the issuer's own printed I.B.6 float value (`issuerStatedFloat`, a prospectus no older than 60 days) was lower than the live valuation and was used. A null remaining capacity is likewise not measured, ⟨211 unchanged words⟩
⟨295 unchanged words⟩ row is unquantified, not zero. 🔴 ON
Changed the definition of "get_float" and "search_sec_filings"
⟨636 unchanged words⟩ or its answer was refused (2026-10-11). 🔴 SUPERSEDED LATER ON 2026-10-11: EVERY "shares_outstanding_ceiling" now carries a "reason" (the declared floor, or "the filings do not size the insider holdings, so none are deducted") and HEADLINES even at the share count — a vendor figure then rides "otherSourceFloat" only. A "floatEstimate" may also carry "qualifier" (a short label — quote it with the figure, e.g. "insider holdings not sized") and "offBasis" (an array): "pre_split_as_filed" = the figure is AS OF "asOf", BEFORE the split(s) in "splitsAfter" [{ratio, effectiveDate, status}], NOT restated across them; "ordinary_shares_unconverted" = in ORDINARY shares on an ADS whose ratio is unresolved, NOT ADSs; "count_predates_issuances" = struck from a dated filing-cover count ("countSource") with later issuances not counted. An "offBasis" figure is true ONLY with its label: never compare it with a price, a market cap, another float or a threshold, and never state it without the label. Since 2026-10-01 that fall-through is GUARDED: a lower-tier ⟨404 unchanged words⟩ disclosure. (4) "vendorFallback" is a third-partyfree-float figure {floatShares, provenance:"vendor", floatDefinition:"free_float", asOfDate, splitAdjusted} offered beside the withhold — NOT our number, NOT on the tradeable definition, already refused when our filings refute it. Present it as the vendor free float as of its own date, never in the "Float" slot. "restrictedShares":null means NOT MEASURED (a block exists whose size the filings do not state), NEVER zero; "restrictedBlockCount":0 is an answer, not an absence. "affiliateBasisStale" (with basisSpanDays/affiliateAnchorDate) labels a float whose affiliate table is materially older than its share count — the number itself is unchanged. "tradeableBasis":"convention_conservative" means the filings did not answer and a published convention resolved it — see "tradeableConvention" and do not present the figure as exact.
Changed the definition of "get_dilution_coverage", "get_filing_document", "get_filing_documents" and 6 more
⟨171 unchanged words⟩ the analysis is real but predates recent filings. `statusDetail` refines it: `newer_filing_unread` (a material filing — new/amended instrument, 424B5 pricing, split, 10-K — was filed after the snapshot and it has not read it; `unreadFilings` names them) and `delisting_filed` (a Form 25/25-NSE/15 filed after the snapshot; `delistingFiled` names it) both report `status: stale` — say the analysis predates that filing, never present it as current. A null `unreadFilings` is NOT MEASURED, never "nothing filed since". NULL, absent or withheld means NOT MEASURED — ⟨90 unchanged words⟩
⟨105 unchanged words⟩ Coverage: Signal8's archive of SEC EDGAR filings in the archive's held range (see `archiveFrom` in each response; currently
Authorization not required, issuer https://api.signal8.ai/
Authorization not required, issuer https://api.signal8.ai/
Added "get_politician_scorecard"; changed the definition of "get_company_profile", "get_float", "get_ownership" and 4 more (107 tools before, 108 now)
⟨52 unchanged words⟩ normally); a halted-but-listed ticker reports delisted:false. `sharesOutstanding` is DATED: `sharesOutstandingAsOf` + `sharesOutstandingAsOfKind` ("stated" = the issuer's statement date; "checked" = when it was last confirmed against a vendor; "none" = date not recorded) and a vendor-free `sharesOutstandingSource`. Quote the date with the count; null is NOT MEASURED, never zero.
⟨24 unchanged words⟩ that replace it. Use when analyzing share supply. The share count the float was judged against (`basisSharesOutstanding`) is DATED: `sharesOutstandingAsOf` + `sharesOutstandingAsOfKind` ("stated" / "checked" / "none" = date not recorded) and a vendor-free `sharesOutstandingSource`; never present the count without its date.
Changed the definition of "search_filing_text" and "search_sec_filings"
⟨66 unchanged words⟩ "minimum":1,"type":"number"},"match":{"description":"Word matching. exact = a word matches only itself (\"split\" does NOT match \"splits\") — EDGAR full-text search's behaviour; stemmed = English word variations also match. Default when omitted: stemmed. The mode actually applied is reported in the response's meta.matchMode.","enum":["exact","stemmed"],"type":"string"},"pattern":{"description":"Search query (minimum ⟨46 unchanged words⟩ ":1000,"minimum":50,"type":"number"},"sort":{"description":"Result order: newest (default) or relevance (best match first)","enum":["newest","relevance"],"type":"string"}},"required":["pattern"],"type":"object"}
⟨258 unchanged words⟩ Added "define_term", "get_learn_guide" and "search_learn_guides"; changed the definition of "get_float" (104 tools before, 107 now)
⟨490 unchanged words⟩ . Floors and point estimates are never stripped. EXCEPT (2026-10-08): a "floatEstimate" with rung "affiliate_sizing_estimate" carries a "reason" built from the filings' itemised insiders (e.g. "no reported insider holdings (4 affiliates at zero); 1 unreported: <name> (CFO, since <date>)") and "unsizedAffiliates" [{holder, role, since}]; it is KEPT even at the share count because the reason is a finding — quote the reason with the figure, and never present it as floatShares. Since 2026-10-01 that fall-through is GUARDED: a lower-tier ⟨12 unchanged words⟩ own floor / ceiling / point estimate, or (since 2026-10-08) COUNTED before share issuances the snapshot records totalling at least 10% of it, is REFUSED and the withheld envelope is served with "fallbackRefusal" {reason: "fallback_predates_split" | "fallback_predates_issuance" | "fallback_outside_snapshot_bounds", refusedSource, detail} beside the snapshot's ⟨229 unchanged words⟩ ("non_affiliate_estimate" | "shares_outstanding_ceiling" | "rolled_forward_lower_bound" | "recital_rolled_forward_estimate" | "affiliate_sizing_estimate"), "bound" ("point" = about ⟨200 unchanged words⟩
Authorization not required, issuer https://api.signal8.ai/
Changed the definition of "get_dilution_instruments"
⟨126 unchanged words⟩ read"; an unavailable response is not. 🔴 STATUS `disputed` (warrants / convertibles / preferred / exchangeables) means the ISSUER'S LATEST FILING DISPUTES THE INSTRUMENT'S EXISTENCE OR VALIDITY and its financial statements do not carry it: the row is SHOWN and EXCLUDED from every total (`summary.disputedInstrumentCount` / `disputedInstrumentShares`) — report it as a disputed claim against the company, never as outstanding and never as retired. 🔴 `contingencyTrigger: "event_of_default"` marks an instrument that converts ONLY on an event of default; it is still outstanding and still COUNTED — say "converts only on an event of default", never that it is not dilutive. 🔴 ON `convertibles` ROWS `principalBasis` says HOW `principalOutstanding` was arrived at: `aggregate_only` / `fair_value_only` / `conflict` / `undisclosed_since_issue` mean the current balance is NOT MEASURED (principalOutstanding is null) — report `principalOriginal` as the ORIGINAL principal with the balance undisclosed, never as the current balance. `conversionBasis: "formula_unanchored"` means the conversion mechanism is disclosed but no price input exists, so no share count can be computed — the row is unquantified, not zero. 🔴 ON `warrants` ROWS a null `sharesUnderlying` beside `aggregateExerciseValueDollars` / `exercisePriceFloor` / `sharesCeilingAsFiled` is a DOLLAR-DENOMINATED or capped warrant: `summary.warrantSharesCeiling` is the MOST such rows could deliver — a ceiling (`≤`), never a count, never in `potentialNewShares`. `warrantCount` is a count of WARRANTS, not shares. 🔴 ON `shelfs` ROWS `babyShelfCurrentCapacityDollars` IS A STORED, DATED ⟨286 unchanged words⟩
Changed the definition of "get_insider_transactions"
⟨52 unchanged words⟩ identifying "first insider buy since X" patterns. IMPORTANT: each row's sharesOwnedFollowing is the holding on THAT row's ownership line only (securityTitle + directOrIndirect + natureOfOwnership), NOT the insider's total position — insiders often report several lines. holdingsByInsider lists every line with its as-of filing; its sumOfReportedLines is not beneficial ownership (lines can be stale). Never compute a "% of position" from one row; use 13D/13G totals, or omit the percentage. A trade re-reported in a later filing is listed once.
Changed the definition of "get_dilution_risk", "get_insider_cross_company" and "screen_companies"
⟨165 unchanged words⟩ measurement understates the risk of a named issuer. The floor applies to `overall` and `overheadSupply`; `levelsAreLowerBound` is always present and `levelsLowerBoundReason` says why. A null `overall` with a non-null `levelsWithheldReason` is WITHHELD — not low. `offeringAbility` is a capability profile, not pressure today: a live ATM/equity line whose drawable capacity is a MEASURED $0 (e.g. clamped by the I.B.6 cap) reads medium, while the score prices the $0 — do not describe that as the company being unable to raise. ALWAYS RETURNS 200 — read `available` and `reason`, ⟨201 unchanged words⟩
⟨38 unchanged words⟩ insider name, transaction type, or date range. Cluster buying is computed only for purchases (transactionType P, the default).
Added "get_filing_documents" and "get_filing_structured"; changed the definition of "get_exhibit_content", "get_filing_document", "get_filing_exhibits" and 7 more (102 tools before, 104 now)
⟨28 unchanged words⟩ parameter to truncate large exhibits. Find exhibit IDsusingwith get_filing_documents (`exhibitId`, by accession number) or get_filing_exhibitsfirst.(by filing ID), or from search_filing_text matches (`exhibit_id`).
⟨6 unchanged words⟩ of an SEC filing by its internal filingID.
Authorization not required, issuer https://api.signal8.ai/
Changed the definition of "get_float", "get_insider_positions_by_ticker", "get_premarket_scanner" and 2 more
⟨408 unchanged words⟩ when the snapshot carries no figure at all. 🔴 SINCE 2026-10-04 A TRIVIAL CEILING IS NOT A FIGURE: a snapshot ceiling ("tradeableFloatCeiling", a "floatEstimate" with bound "ceiling", or an upper-only "affiliateBasis" range) at or above 99% of the share count says only "the float is at most every issued share" and is STRIPPED from the response (null), so the lower tier may headline under its own "source" with "snapshotFloatWithheldReason" as context (GELS: Polygon 5.12M, not "<= 11.18M" on 11.18M shares). Floors and point estimates are never stripped. Since 2026-10-01 that fall-through is GUARDED: a lower-tier ⟨476 unchanged words⟩
Get per-insiderlifetime
Changed the definition of "get_float"
⟨323 unchanged words⟩ as provenance, never as a second refusal. 🔴 SINCE 2026-10-03 THE SNAPSHOT FIGURE ALWAYS HEADLINES: when the snapshot carries ANY figure — "floatEstimate" (~ point / <= ceiling / >= floor), "tradeableFloatCeiling", or an "affiliateBasis" range — "floatShares" stays null and THAT figure is the answer, with its label; a lower tier that also answered and passed the guard rides "otherSourceFloat" {floatShares, source, provenance:"other_source", floatDefinition, asOfDate} as a SECONDARY "other source" line — never the float, never arithmetic. A lower tier fills "floatShares" ONLY when the snapshot carries no figure at all. Since 2026-10-01 that fall-through is GUARDED: a lower-tier figure dated before a split the snapshot names, or outside the snapshot's own floor / ceiling / point estimate, is REFUSED and the withheld envelope is served with "fallbackRefusal" {reason: "fallback_predates_split" | "fallback_outside_snapshot_bounds", refusedSource, detail} beside the snapshot's "floatWithheldReason". The refused figure is NOT in the response and must not be fetched from a vendor to fill the gap — the detail says why no lower tier is shown either. A snapshot that stated a float never carries it. A withheld result may carry up to four ⟨388 unchanged words⟩
Authorization not required, issuer https://api.signal8.ai/
Added "get_politician_disclosures"; changed the definition of "get_baby_shelf_capacity", "get_dilution_instruments", "get_float" and 4 more (101 tools before, 102 now)
⟨82 unchanged words⟩ capacity" and NOT a favourable finding. 🔴 `constraintApplies: null` means the float value was NOT MEASURED (`suppressedReason: "float_unmeasured"`): neither the $75M test nor the cap could be answered — report it as not measured, NEVER as "the cap does not bind" and NEVER as unlimited. 🔴 A `suppressed` response means the figure is WITHHELD ⟨300 unchanged words⟩
⟨125 unchanged words⟩ filings read"; an unavailable response is not. 🔴 ON `shelfs` ROWS `babyShelfCurrentCapacityDollars` IS A STORED, DATED FIGURE, NOT TODAY'S HEADROOM: it was struck at extraction time from a float value that may be the issuer's own cover recital months old, less a takedown pool anchored to the corpus window. Always report it WITH its `babyShelfCapacityAsOf` date (`babyShelfCapacityBasis` says which float it rests on); a null date means undated, never current. For the raisable-now figure recomputed from the live float and 60-day-high price call `get_baby_shelf_capacity` — never present the stored figure as current.
Authorization not required, issuer https://api.signal8.ai/
Changed the definition of "get_baby_shelf_capacity" and "get_dilution_snapshot"
⟨122 unchanged words⟩ as $0 raisable, which is a claim. 🔴 `suppressedReason: "ib6_pool_unattributed"` means the cap DOES apply but the trailing sales that would exhaust it could not all be attributed to an I.B.6 registration, so the derived $0 is a lower BOUND, not a measurement — `remainingCapacity` is null and `capacityUpperBoundDollars` is "at most", never a figure. A null remaining capacity is likewise not measured, ⟨211 unchanged words⟩
⟨65 unchanged words⟩ credits for an uncovered ticker. 🔴 FLOAT: a declined float block (`available: false`) carries the read tier's `reason` and, when the extraction recorded a veto, a `refusal` object whose `withheldReason` is the exact value get_float serves — read that, not the bare reason, when reconciling the two. 🔴 FLOAT:
Authorization not required, issuer https://api.signal8.ai/
Changed the definition of "get_baby_shelf_capacity", "get_cash_position", "get_dilution_coverage" and 6 more
⟨306 unchanged words⟩ counted rather than published on a mixed basis.Requires theIncludedDilutioninSnapshotsSignal8add-onPro — without it the call returns 403 with codeADDON_REQUIRED,FEATURE_NOT_AVAILABLEwhichand `requiredTier: "pro"`. That is a subscription-tier upgrade, not an add-onpurchase requirementpurchase;
Authorization not required, issuer https://api.signal8.ai/
Authorization not required, issuer https://api.signal8.ai/
Added "get_baby_shelf_capacity", "get_dilution_coverage", "get_dilution_history" and 6 more; changed the definition of "get_premarket_scan_history", "get_premarket_scanner", "get_rvol_history" and 2 more (92 tools before, 101 now)
⟨26 unchanged words⟩ its relative volume (RVOL) vs the trailing90-day30-day same-session baseline — the SAME RVOL math as ⟨207 unchanged words⟩ is visible instead of quietly returning full-session numbers. A price / market-cap / float filter can only be applied to a ticker company_screener_data holds a value for, so a just-renamed or just-listed symbol cannot be rated against it. Those rows are NEVER silently dropped: "meta.unscreened" always reports their count, the filter families involved and the tickers, and includeUnscreened=true returns them in "rows" tagged with "unscreenedFilters". Treat that tag as NOT MEASURED — the value is unknown, not out of range. Charged per your API tier.
⟨41 unchanged words⟩ premarket volume known BY that cutoff ÷ the
Authorization not required
Authorization not required, issuer https://api.signal8.ai/
Certificate recorded, valid to 2026-11-11
Authorization not required, issuer https://api.signal8.ai/
First tool surface recorded: 92 tools (server version 0.15.0)
Showing the latest 45 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
⟨63 unchanged words⟩ market cap, float in SHARES, and price. floatShares is on the SAME split basis as the market cap. floatBasis says what it is: "measured", or "estimate" / "estimate_rebased" (the float ladder's point estimate, moved across this split when it predates it) — present an estimate as an estimate. 🔴 floatShares: null MEANS NOT MEASURED OR WITHHELD ⟨327 unchanged words⟩
⟨191 unchanged words⟩ cap, industry, listing exchange (NASDAQ/NYSE/AMEX), listing market (market="otc" / "exchange" — the reliable OTC test; the exchange label is inconsistent on OTC rows), float data sourceand, TTM dividendyield.yield and snapshot cash (minCash / maxCash). CASH RUNWAY: a null cash_runway_months carries cashRunwayReason saying why. "estimate_would_be_negative" means the last cash figure rolled forward by the burn rate is below zero today — ESTIMATED exhausted, not a reported zero balance (cashRunwayAsOf is the cash figure's date). Such rows have no months, so maxCashRunway drops them unless includeRunwayExhausted=true. Any other reason, or a null reason, is NOT a runway claim. CASH: estimatedCurrentCash (with estimatedCashAsOf) is the dilution snapshot's cash PROJECTION in USD, present only for snapshot-covered companies — null means NOT MEASURED, never "no cash", and minCash / maxCash can only return covered companies. Each row also carries listingMarket ("exchange" / "otc", null = unknown). Each row carries dividendYield (trailing-twelve-month cash dividends ⟨62 unchanged words⟩
⟨39 unchanged words⟩ (exact match): NASDAQ, NYSE, orAMEXAMEX. For OTC use market=\"otc\" instead","type":"string"},"excludeHalted":{" ⟨39 unchanged words⟩ ,"external"],"type":"string"},"includeRunwayExhausted":{"description":"When true, maxCashRunway also returns companies whose estimated cash is already exhausted (cash_runway_months null, cashRunwayReason \"estimate_would_be_negative\"); they sort first on an ascending runway sort. Default false","type":"boolean"},"industry":{"description":"Filter by company industry ⟨21 unchanged words⟩ "minimum":1,"type":"number"},"market":{"description":"Listing market: \"otc\" (OTC Markets) or \"exchange\" (NASDAQ / NYSE / NYSE American / Arca / Cboe). Companies with no listing record match neither","enum":["exchange","otc"],"type":"string"},"maxCash":{"description":"Maximum dilution-snapshot cash projection in USD (estimatedCurrentCash). Snapshot-covered companies only — an uncovered company is not measured, not excluded for having cash","minimum":0,"type":"number"},"maxCashRunway":{"description":"Maximum estimated months of ⟨68 unchanged words⟩ trading volume","type":"number"},"minCash":{"description":"Minimum dilution-snapshot cash projection in USD (estimatedCurrentCash). Snapshot-covered companies only","minimum":0,"type":"number"},"minCashRunway":{"description":"Minimum estimated months of ⟨105 unchanged words⟩ ","computed_float","market_cap_computed","updated_at","dividend_yield","estimated_current_cash"],"type":"string"},"sortOrder": ⟨12 unchanged words⟩
⟨41 unchanged words⟩ catalysts. Runway is estimated from current burn rate. Companies whose ESTIMATED cash is already exhausted are included by default and listed first: they carry cash_runway_months null with cashRunwayReason "estimate_would_be_negative" (the last cash figure, dated cashRunwayAsOf, rolled forward by the burn rate is below zero today). That is an estimate from a dated balance, never a reported zero balance — say "estimated exhausted as of today, last cash figure <cashRunwayAsOf>", not "has no cash". Rows also carry estimatedCurrentCash / estimatedCashAsOf (dilution-snapshot cash projection; null = not measured) and listingMarket.
{"$schema":"http://json-schema.org/draft-07/schema#","additionalProperties":false,"properties":{"includeExhausted":{"description":"Include companies whose estimated cash is already exhausted (default: true)","type":"boolean"},"industry":{"description":"Filter by company industry ⟨20 unchanged words⟩ ":100,"minimum":1,"type":"number"},"market":{"description":"Listing market: \"otc\" (OTC Markets) or \"exchange\" (NASDAQ / NYSE / NYSE American / Arca / Cboe)","enum":["exchange","otc"],"type":"string"},"maxMonths":{"description":"Maximum months ⟨27 unchanged words⟩
⟨377 unchanged words⟩ snapshot carries ANY figure — "floatEstimate" (~bound "point" /<="ceiling" />="floor"), "tradeableFloatCeiling", or an "affiliateBasis" range — "floatShares" stays null and THAT figure is theansweranswer. 🔴 RENDERING RULE (2026-10-18): print NO "~",with"<="itsorlabel;">=" glyph. A "point" (or a "floatEstimate" carrying "statedAsOf" {asOf, source, events[]}, the issuer's own dated count) is printed as the PLAIN number followed by "as of <asOf>" and the caveat (the unsized later issuances in "statedAsOf.events"); a "ceiling" / "floor" / range is NOT a figure — write "float not stated (the filings put it at most / at least N; <reason>)" and never the bare number. A lower tier that also answered and passed the ⟨704 unchanged words⟩ | "shares_outstanding_ceiling" | "rolled_forward_lower_bound" | "recital_rolled_forward_estimate" | "successor_exchange_estimate" | "affiliate_sizing_estimate" | "restricted_block_ceiling" — at most O/S less affiliates, less the restricted blocks the filings place outside them and the part of the unplaced blocks too large to fit inside them), "bound" ("point" = about X, render "~X"; "ceiling" = AT MOST X, render "<= X"; "floor" = AT LEAST X, render ">= X") and "asOf"; a floor or ceiling is a BOUND, never a point value. null means norecital_rolled_forward_estimat
⟨40 unchanged words⟩ "floatEstimate" {shares, bound: "point"~| "ceiling"<=| "floor">=, basis}, the.snapshot'sRENDERINGown(2026-10-18):labelledafigure:"point"presentisitprinted as the plain number with itsmarkeras-of and caveat; a "ceiling" / "floor" is a BOUND, not a figure — say "float not stated (at most / at least N)" and neverastheabarepointnumber, neverina "~" / "<=" / ">=" glyph, never arithmetic; neither present = not measured, never 0. The low-float board admits on that figure's VALUE:a <=an 8M ceiling is in, a>=26M floor or a~27M27M estimate is out), short interest, dilution, ⟨268 unchanged words⟩
⟨36 unchanged words⟩ (shares) + "floatEstimateBound" ("point"~/ "ceiling"<=/ "floor">=) + "floatEstimateBasis" (the working).—RENDERINGpresent(2026-10-18):itaas"point" is the plain number with itsmarkerbasis as the caveat; a "ceiling" / "floor" is a BOUND,e.g.not a figure — write "<=float not stated (at most / at least 7,953,957)"., never the bare number and never a "~" / "<=" / ">=" glyph. minFloat / maxFloat and the computed_float sort compare ⟨165 unchanged words⟩
⟨320 unchanged words⟩ names that tier (computed / sec-10k /polygona/market-datafmpvendor tier), "floatShares" is ITS figure under ITS ⟨174 unchanged words⟩ "source" with "snapshotFloatWithheldReason" as context (GELS:e.g.Polygona vendor figure of 5.12M, not "<= 11.18M" on 11.18M shares ⟨668 unchanged words⟩ BOUND, never a point value. null means nofigure could be deriv
⟨85 unchanged words⟩ delisted company. Each row carries "source" ("polygon" | "computed" | "sec_10k"|or"fmp"a market-data vendor tier) because float quality varies by provider — ⟨15 unchanged words⟩
⟨566 unchanged words⟩ within the last day (the source isanaFMPvendor screener that lags a rename by ~a day ⟨403 unchanged words⟩
⟨129 unchanged words⟩ `sharesOutstandingSource` — quote the date with the count. When no MEASURED count exists, `sharesOutstanding` and `marketCap` are a BEST ESTIMATE (the newest dated filed or reference count, moved onto today's split basis): `sharesOutstandingEstimated: true`, `sharesOutstandingEstimateKind` ("at_least" = the filings record later issuances of unstated size, so the true count is likely higher) and `marketCapEstimated: true`. Say it is an estimate and give its date.
⟨32 unchanged words⟩ rules. This is the most thorough compliance checkavailable (25 credits).available.
Cheap pre-check(1 credit)for whether Signal8 holds a dilution analysis for ⟨333 unchanged words⟩
Get the historical shares-outstanding and cash series(10 credits)from SEC XBRL filings, with offering and material-cash-event ⟨321 unchanged words⟩
Get ONE instrument family's rows(10 credits)with per-field SEC citations — each figure carries ⟨688 unchanged words⟩
Get post-offering price performance(10 credits): for each recorded offering, how the stock ⟨284 unchanged words⟩
Get the dilution pressure score(5 credits): a 0-100 score with its seven-component breakdown ⟨507 unchanged words⟩
Get the dilution snapshot header (25 credits —themost expensiveheaviesttooldilutionherecall): summary totals (potential new shares and ⟨37 unchanged words⟩ those, and call get_dilution_coverage first to avoidpayinga25wastedcreditscallforon an uncovered ticker. 🔴 FLOAT: a declined ⟨329 unchanged words⟩
⟨98 unchanged words⟩ treat a low numerator as a low-risk finding. When `scoreDenominatorThin` is true the score rests on fewer than 70 measured points — report it as a PARTIAL reading ("N of M measured"), never as a full one. A non-null `scoreWithheldReason` (e.g.`unmeasured_score_components`, `unquantified_live_instruments`,`no_dilution_snapshot`) means there is NO score — not ⟨117 unchanged words⟩ that as the company being unable to raise. `overheadSupply` bands in-the-money supply PLUS `details.registeredResaleOverhangShares` (/`…Pct`): already-issued affiliate-held shares outside the tradeable float on an EFFECTIVE resale registration — existing shares that can be sold today, never new shares, so never add them to `totalDilutiveShares`; null means not measured. ALWAYS RETURNS 200 — read `available` and `reason` ⟨201 unchanged words⟩
⟨987 unchanged words⟩ so state the ends that exist as inequalities. They bound the NON-AFFILIATE float, which still INCLUDES restricted shares held by non-affiliates — NOT the tradeable floatShares. This object also appears on PUBLISHEDfloatsfloats;withtherebothitendsisequalcontext,tonever a bound on floatShares—(a "convention_conservative" tradeable figure can sit BELOW floatLowerBound because itisalsoadeducts the restricted shares the boundonlyincludeswhen—floatSharesthat isnull.not a contradiction). (3) "floatEstimate" is a BADGED ESTIMATE ⟨60 unchanged words⟩ | "rolled_forward_lower_bound" | "recital_rolled_forward_estimate" | "successor_exchange_estimate" | "affiliate_sizing_estimate" | "restricted_block_ceiling" — at most O/S ⟨61 unchanged words⟩ point value. null means no figure could bederived from the snapshot's structured fields. An estimate never becomes floatShares — present shares WITH basis and direction, never alone. Unrelated to the boolean "floatEstimated", which flags a published floatShares back-derived from a USD public-float disclosure. (4) "vendorFallback" is a third-party frderiv
⟨619 unchanged words⟩ SCHEDULE 13D/G are dropped and listed in `companyFilter.droppedForms` — unless `companyFilter.subjectMatch` is true, in which case they ARE searched, matched by the company they are about — and with no formTypes the default is 10-K ⟨130 unchanged words⟩
⟨353 unchanged words⟩ },"industries":{"description":"COMPANY FILTER.Comma-separated industryIndustry names separated by \"|\", exact and case-sensitive (e.g. \"Biotechnology\Biotechnology|Airlines, Airports & Air Services\" — some names contain \", \", so prefer \"|\"; a bare comma with no space after it also separates). An unknown name returns a 400 listing ⟨530 unchanged words⟩ },"sectors":{"description":"COMPANY FILTER.Comma-separated sectorSector names separated by \"|\" (or a bare comma), exact and case-sensitive (e.g. \"Healthcare,Technology\Healthcare|Technology\"). An unknown name returns a 400 ⟨69 unchanged words⟩
⟨149 unchanged words⟩ Coverage: Signal8's archive of SEC EDGAR filings in the archive's held range (see `archiveFrom` in each response; currently fromOctoberlate 2021, expanding back totoday2016(aboutas3.9Mthefilingshistory backfill fills in), updated through theday;day. The archive only holds filingsolderfromthanits2021-10`archiveFrom`maydate;bebeforeabsentthat it holds only a scatter (well under 1% of most years), soanABSENCEemptyBEFOREresultarchiveFromisISnotNOTproofEVIDENCEsomethinga filing was neverfiled.filed — check SEC EDGAR for earlier periods. Some rows are record-only (bodyStored: false — ⟨22 unchanged words⟩
⟨243 unchanged words⟩ Coverage: Signal8's archive of SEC EDGAR filings in the archive's held range (see `archiveFrom` in each response; currently fromOctoberlate 2021, expanding back totoday2016(aboutas3.9Mthefilingshistory backfill fills in), updated through theday;day. The archive only holds filingsolderfromthanits2021-10`archiveFrom`maydate;bebeforeabsentthat it holds only a scatter (well under 1% of most years), soanABSENCEemptyBEFOREresultarchiveFromisISnotNOTproofEVIDENCEsomethinga filing was neverfiled.filed — check SEC EDGAR for earlier periods. Some rows are record-only (bodyStored: false — ⟨22 unchanged words⟩
⟨590 unchanged words⟩ figure, and never present it as floatShares. A "shares_outstanding_ceiling" whose "reason" states a declared affiliate floor ("the insider holdings the filings size total at least N shares") may likewise be served at the share count, but ONLY as the last resort when no lower tier answered or its answer was refused (2026-10-11). Since 2026-10-01 that fall-through is GUARDED: a lower-tier ⟨289 unchanged words⟩ "rolled_forward_lower_bound" | "recital_rolled_forward_estimate" | "affiliate_sizing_estimate" | "restricted_block_ceiling" — at most O/S less affiliates, less the restricted blocks the filings place outside them and the part of the unplaced blocks too large to fit inside them), "bound" ("point" = about ⟨200 unchanged words⟩
⟨103 unchanged words⟩ , short interest, dilution, and news/catalyst flags. Listing-compliance data (row "compliance", the compliance/split badges, "reverseSplitSignal", "deficiencySignal") is Signal8 Pro: for any other caller "compliance" is null with "complianceWithheld": "pro_required" — WITHHELD, which is not "not measured" and never "no deficiency". Off-hours it falls back to the last session. ⟨223 unchanged words⟩
⟨167 unchanged words⟩ Coverage: Signal8's archive of SEC EDGAR filings in the archive's held range (see `archiveFrom` in each response; currently fromOctoberlate 2021, expanding back totoday2016(aboutas3.9Mthefilingshistory backfill fills in), updated through theday;day. The archive only holds filingsolderfromthanits2021-10`archiveFrom`maydate;bebeforeabsentthat it holds only a scatter (well under 1% of most years), soanABSENCEemptyBEFOREresultarchiveFromisISnotNOTproofEVIDENCEsomethinga filing was neverfiled.filed — check SEC EDGAR for earlier periods. Some rows are record-only (bodyStored: false — ⟨22 unchanged words⟩
⟨231 unchanged words⟩ Coverage: Signal8's archive of SEC EDGAR filings in the archive's held range (see `archiveFrom` in each response; currently fromOctoberlate 2021, expanding back totoday2016(aboutas3.9Mthefilingshistory backfill fills in), updated through theday;day. The archive only holds filingsolderfromthanits2021-10`archiveFrom`maydate;bebeforeabsentthat it holds only a scatter (well under 1% of most years), soanABSENCEemptyBEFOREresultarchiveFromisISnotNOTproofEVIDENCEsomethinga filing was neverfiled.filed — check SEC EDGAR for earlier periods. Some rows are record-only (bodyStored: false — ⟨22 unchanged words⟩
⟨105 unchanged words⟩ Coverage: Signal8's archive of SEC EDGAR filings in the archive's held range (see `archiveFrom` in each response; currently fromOctoberlate 2021, expanding back totoday2016(aboutas3.9Mthefilingshistory backfill fills in), updated through theday;day. The archive only holds filingsolderfromthanits2021-10`archiveFrom`maydate;bebeforeabsentthat it holds only a scatter (well under 1% of most years), soanABSENCEemptyBEFOREresultarchiveFromisISnotNOTproofEVIDENCEsomethinga filing was neverfiled.filed — check SEC EDGAR for earlier periods. Some rows are record-only (bodyStored: false — ⟨294 unchanged words⟩ has not confirmed full coverage of the range. Every response carries `archiveFrom` and `rangeStartsBeforeArchive`: a range with no dateFrom, or starting before archiveFrom, is NEVER definitive (`searchIndex.complete: false`, `reason: "outside_held_range"`, `heldFrom`) and `notes` says so — report "the archive only holds filings from <archiveFrom>; absence before that is not evidence", never "no such filing exists". Pass a dateFrom on or after archiveFrom for a definitive empty answer. The `ciks` filter matches the filing's own CIK ⟨206 unchanged words⟩
⟨85 unchanged words⟩ "Start filing date (YYYY-MM-DD). The archivestartsonly2021-10.holds filings from its `archiveFrom` date (stated in every response; currently late 2021, expanding back to 2016): omitting dateFrom, or starting earlier, makes an empty result non-definitive.","type":"string"},"dateTo":{ ⟨871 unchanged words⟩
⟨107 unchanged words⟩ because the counted filings exceed the shares outstanding. 🔴 A bucket (`institutional` / `insider` / `beneficial`) whose shares exceed the shares outstanding by more than a 2% timing tolerance has its `percentOfOutstanding` WITHHELD — null, with `percentWithheldReason: "ownership_exceeds_outstanding"` — and its `totalShares` still published: the percent would not be a measurement (filings on another share basis such as ordinary shares against an ADS count, another class reported under this one, shares lent and reported by both lender and buyer, or filings dated before a buyback or redemption). Report the share figure and the reason; NEVER present such a bucket as 100%, as 0%, or as any percent. When any bucket is withheld, `retail.reason` is `ownership_exceeds_outstanding` and `filedSumPercent` is absent. A null percent with NO `percentWithheldReason` means no share count was available — not measured for a different reason. `sharesOutstanding` is the denominator of every percentage and is DATED: `sharesOutstandingAsOf` + `sharesOutstandingAsOfKind` ("stated" = the issuer's statement date; "checked" = when the figure was last confirmed against a vendor; "none" = date not recorded) and `sharesOutstandingSource` (a vendor-free label). Never present a count without its date. `beneficial.staleShares` / `stalePercentOfOutstanding` / `staleHolderCount` is a MEASURED SUBSET of the counted 5%+ total resting on 13D/G schedules >= 24 months old with no newer reaffirming filing by the same holder family — not a deduction; the total still includes it. A row's `reaffirmedBy` names the newer family filing; `staleFiling.ageMonths` marks a counted row with none. `stalePercentOfOutstanding: null` is not measurable (no share count), never zero.
⟨88 unchanged words⟩ never "no market cap" and never $0. The count itself rides as `sharesOutstanding` with `sharesOutstandingAsOf` + `sharesOutstandingAsOfKind` ("stated" = the issuer's statement date; "checked" = when it was last confirmed against a vendor; "none" = date not recorded) and a vendor-free `sharesOutstandingSource` — quote the date with the count.
⟨122 unchanged words⟩ , volume, cash runway, float, shares outstanding (each row's `shares_outstanding` is DATED by `sharesOutstandingAsOf` + `sharesOutstandingAsOfKind` (stated / checked / none = date not recorded) and a vendor-free `sharesOutstandingSource`; never present the count without its date), market cap, industry, listing exchange (NASDAQ/NYSE/AMEX ⟨76 unchanged words⟩
⟨23 unchanged words⟩ `exhibit_id`, `exhibit_type`) and the snippet with context.WebsearchQuery syntax: unquoted words must ALL appear (any order, any distance); "quoted phrase",= exact wording; OR between alternatives (merger OR acquisition); -word or -"phrase" to exclude; w1 NEAR/10 w2 (also NEAR(10),-excludeor bare NEAR = within 10) = words close together; word* = prefix of 4+ letters (dilut* matches dilution, dilutive);unquoted$AAPL or a capitalised ticker scopes to that company; a form code (8-K, 10-Q, S-1), "item 5.02" / "8-K 1.05" and a bare year (2024) scope to that form / 8-K item / year. Unquoted words match anywhere in the filing, so quote multi-word phrases. When the archive states how it read the query it is in meta.understanding. Best for locating specific clauses ("change of ⟨46 unchanged words⟩ CIK), filing, accession number, or formtype.type, restrict matching to sections (section=risk_factors, mdna, ex99 …; confirmed by meta.sections, otherwise meta.unsupported says the whole filing was searched) and filter by exhibit type (exhibitTypes=EX-10). Coverage: Signal8's archive of SEC EDGAR filings ⟨59 unchanged words⟩
⟨27 unchanged words⟩ CIK number","type":"string"},"exhibitTypes":{"description":"Keep only filings carrying ANY of these exhibit types (comma-separated): a family such as EX-10 (material contracts) matches every member (EX-10.1, EX-10.2…); an exact type such as EX-99.1 (usually the press release) only itself. Others: EX-97 clawback policy, EX-3 charter/bylaws, EX-4 instruments/warrants, EX-21 subsidiaries, EX-23 consents. \"10.1\" is accepted for EX-10.1. Listed in appliedFilters when the rows prove it; otherwise in ignoredFilters / meta.unsupported — treat the rows as unfiltered then.","maxLength":400,"type":"string"},"facets":{"description":"true = also return `facets` { forms, years, items } — [{ value, count }] over the whole match set. Absent when not measured (never zero). Default false.","type":"boolean"},"filingId":{"description":"Filter to a specific ⟨79 unchanged words⟩ ,"stemmed"],"type":"string"},"matchedSections":{"description":"Per-row `matchedSections` (default true): the sections the text matched in. ABSENT on a row means not measured (index without sections), never \"matched nowhere\".","type":"boolean"},"pattern":{"description":"Search query (minimum 2 characters), websearch syntax: \"exact phrase\", OR,-exclude.-exclude, w1 NEAR/n w2, word*, $TICKER. A CIK/filing-scoped search whose text is not indexed ⟨14 unchanged words⟩ "minLength":2,"type":"string"},"section":{"description":"Restrict MATCHING to sections (comma-separated): business, risk_factors, cybersecurity, legal_proceedings, mdna, market_risk, controls (10-K/10-Q/20-F narrative items, by meaning — mdna is 10-K Item 7, 10-Q Part I Item 2 and 20-F Item 5), ex99 (press-release / EX-99.x exhibit text) and item_X_YY (the text under an 8-K item, e.g. item_5_02). Aliases: mda, risk, legal, cyber, press_release, 5.02. Unknown names are a 400. Needs q. Applied ONLY when the response's meta.sections names it — otherwise meta.unsupported says why (e.g. the archive index does not have sections yet) and matches may come from ANYWHERE in the filing.","maxLength":400,"type":"string"},"
⟨165 unchanged words⟩ open them at their sec.gov URL. Full-text `q`uses:websearchQuery syntax: unquoted words must ALL appear (any order, any distance); "quoted phrase"for an= exactphrase;wording; OR betweenalternatives;alternatives (merger OR acquisition); -word or -"phrase" toexclude.exclude; w1 NEAR/10 w2 (also NEAR(10), or bare NEAR = within 10) = words close together; word* = prefix of 4+ letters (dilut* matches dilution, dilutive); $AAPL or a capitalised ticker scopes to that company; a form code (8-K, 10-Q, S-1), "item 5.02" / "8-K 1.05" and a bare year (2024) scope to that form / 8-K item / year. The archive's reading of the query (tickers/companies, forms, items, years, synonym expansions such as buyback → share repurchase) is returned in `meta.understanding` when stated; pass understand=false to search the words literally. Pass facets=true for `facets` — counts of matching filings per form type, per year and per 8-K item over the WHOLE result set (absent when not measured, e.g. on the Postgres engine — never read absence as zero). With sort=relevance, page 1 shows at most a few filings per company; meta.diversity { maxPerCompany, hidden: [{cik, count}] } names who has more — page on with nextCursor (not page) or filter by that CIK. SECTION SEARCH: section=risk_factors (or mdna, business, ex99 for press releases, item_5_02, …) restricts matching to those sections; rows then carry matchedSections and meta.sections confirms it — if meta.unsupported names section instead, the whole filing was searched. exhibitTypes=EX-10 keeps filings with a material contract (EX-99.1 press release, EX-97 clawback, …); facets=true adds facets.sections / facets.exhibitTypes when measured. An empty text result is only definitive when ⟨233 unchanged words⟩
⟨132 unchanged words⟩ Exact match.","type":"string"},"exhibitTypes":{"description":"Keep only filings carrying ANY of these exhibit types (comma-separated): a family such as EX-10 (material contracts) matches every member (EX-10.1, EX-10.2…); an exact type such as EX-99.1 (usually the press release) only itself. Others: EX-97 clawback policy, EX-3 charter/bylaws, EX-4 instruments/warrants, EX-21 subsidiaries, EX-23 consents. \"10.1\" is accepted for EX-10.1. Listed in appliedFilters when the rows prove it; otherwise in ignoredFilters / meta.unsupported — treat the rows as unfiltered then.","maxLength":400,"type":"string"},"facets":{"description":"true = also return `facets`: { forms, years, items }, each a list of { value, count } over the WHOLE result set (not just this page). Present only when the archive measured them (its OpenSearch engine); absent means NOT MEASURED, never zero. Default false.","type":"boolean"},"foreignIssuer":{"description":"COMPANY FILTER. true = ⟨190 unchanged words⟩ ,"stemmed"],"type":"string"},"matchedSections":{"description":"Per-row `matchedSections` (default true): the sections the text matched in. ABSENT on a row means not measured (index without sections), never \"matched nowhere\". Ignored without q.","type":"boolean"},"maxFloat":{"description":"COMPANY FILTER. Maximum public ⟨125 unchanged words⟩ ":{"description":"Full-text query over filingbodies,bodies.websearchQuery syntax:allunquoted words mustappear;ALL appear (any order, any distance); \"quoted phrase\"for= exact wording; OR
Get Politician P&L Scorecard — Top 5 and bottom 5 politicians (Congress + executive-branch officials) by ESTIMATED trading P&L over a trailing window (default and only supported window: 90 days), plus SPY's return over the same window as a benchmark, and imageUrl — a ready-to-attach 2160x2700 PNG card of the same ranking (null when unavailable; card.reason says why). ALL P&L FIGURES ARE ESTIMATES (estimate: true, estimateRange "±25–40%"): disclosed amount RANGES are converted to shares at the historical close, FIFO-matched, and open positions marked to the latest quote. State that they are estimates whenever you publish th…
Define a Market / SEC Term — Look up a term in the Signal8 Academy glossary (signal8.ai/learn/glossary) — dilution, SEC filing and trading jargon such as "ATM offering", "baby shelf", "full ratchet", "pre-funded warrant", "going concern", "LULD", "days to cover", "Form 25". Accepts a glossary slug ("atm-offering"), the term itself, or a common alias ("ATM", "price reset"); matching is case- and punctuation-insensitive. Returns the term, a one-line short definition, the long definition as Markdown, related terms, the Academy guides that use it, and the public url. A TERM_NOT_FOUND error means the glossary has no entry for…
Get Signal8 Academy Guide — Get one Signal8 Academy guide as Markdown, by track and slug (both come from search_learn_guides, or from a signal8.ai/learn/<track>/<slug> URL). Returns title, description, section, lastVerified, the public url, the full Markdown body (links already rewritten to absolute signal8.ai URLs), the related guides, the glossary terms it uses (with one-line definitions) and its SEC sources (accession numbers). Guides use hypothetical examples ("Company X") unless a source is cited; they are education, not advice about any named company. When you quote or paraphrase a guide, cite its url. Works witho…
Search Signal8 Academy Guides — Search the free Signal8 Academy (signal8.ai/learn) — plain-English guides that explain dilution (ATMs, warrants, convertibles, baby shelf, cash runway), how to read SEC filings (8-K items, Form 4 codes, 13D/13G, 424B5, S-1/S-3), market structure (halts, short interest, float, reverse splits, STOCK Act disclosures) and how to use Signal8. Returns matching guides with title, description, track, section, reading time, lastVerified date, the public url and the signal8:// resource uri — no bodies; call get_learn_guide for the full Markdown. Keyword match: every query word must appear somewhere in …
⟨6 unchanged words⟩ ":{"endDate":{"description":"End datefor transaction range in ISO,formatYYYY-MM-DD (e.g., \"2025-12-31\"); a full ISO timestamp is cut to its date.","type":"string"},"insiderName":{ ⟨42 unchanged words⟩ "},"startDate":{"description":"Start datefor transaction range in ISO,formatYYYY-MM-DD (e.g., \"2025-01-01\"); a full ISO timestamp is cut to its date. Either bound may be given alone. An unparseable date is rejected, never ignored.","type":"string"},"transactionType":{ ⟨21 unchanged words⟩
⟨129 unchanged words⟩ cap, industry, listing exchange (NASDAQ/NYSE/AMEX),andfloat datasource.source and TTM dividend yield. Each row carries dividendYield (trailing-twelve-month cash dividends with an ex-date in the last 365 days / current price, in percent), nextExDate and lastExDate — null means NOT MEASURED or not a payer, never 0%. Sort results by any sortable column. Returns matching ⟨27 unchanged words⟩
⟨127 unchanged words⟩ cash remaining","type":"number"},"maxDividendYield":{"description":"Maximum TTM dividend yield in percent. Rows with no measured yield never match.","minimum":0,"type":"number"},"maxFloat":{"description":"Maximum computed public float ⟨49 unchanged words⟩ cash remaining","type":"number"},"minDividendYield":{"description":"Minimum TTM dividend yield in percent (e.g. 3 for 3%). Rows with no measured yield never match.","minimum":0,"type":"number"},"minFloat":{"description":"Minimum computed public float ⟨70 unchanged words⟩ ","shares_outstanding","computed_float","market_cap_computed","updated_at","dividend_yield"],"type":"string"},"sortOrder": ⟨12 unchanged words⟩
Listallthe readable exhibits (individual documents with stored text) within an SECfiling.filing, by internal filing ID. Returnsexhibiteachmetadataexhibit'sincluding`id`, exhibit type, description,andcontentsize.size and sec_url. Usethistheto`id`identifywithwhichget_exhibit_content.exhibitsExcludestoXML/XBRL.readFor the COMPLETE document list of a filing by accession number (including files withget_exhibit_content.noExcludesstoredXML/XBRLtext),exhibits.use get_filing_documents.
⟨234 unchanged words⟩ | "share_count_unavailable" | "split_post_dates_basis" | "split_unconfirmed" | "snapshot_float_unconfirmed" | "refusal_evaluation_failed") means the figure ⟨735 unchanged words⟩
⟨68 unchanged words⟩ always excluded (intraday ordering is unknowable).Unlike get_donor_trade_overlap, executive-branchExecutive-branch (exec-) slugs return REAL data here: ⟨89 unchanged words⟩
⟨63 unchanged words⟩ market cap, float in SHARES, and price. 🔴 floatShares: null MEANS NOT MEASURED OR WITHHELD — never zero, never "no float". Such rows ARE included (they have a valid market cap); floatWithheldReason says why. Do not substitute a float from another source. floatUnknownCount counts those null-float rows IN the list; it is not a withholding count (withheldCount is). price is on the SAME split basis as the market cap (null when it cannot be stated on one basis), so never pair it with a pre-split price from elsewhere. WHAT THIS IS: rows are splits scheduled AS ⟨243 unchanged words⟩
⟨25 unchanged words⟩ company name, form type, filing date, exhibit count andexhibit`filingId`count.(for get_filing_document / get_filing_exhibits). If the filing is held intheSignal8'slocalarchivedatabase,(isInDatabase:returnstrue)fullitsmetadata;content can be read here; if it is only found on SEC EDGAR,returnsthe response has isInDatabase: false and basic metadatawithonly.anForisInDatabase:thefalsefullflag.document list use get_filing_documents.
⟨121 unchanged words⟩ / maxMarketCapComputed and returns a real total COUNT. Searches only the 500 largest matching companies by market cap (narrow the filters to reach smaller ones); for float, price, company-type, foreign-issuer or recent-IPO filters, full-text queries, or 8-K item codes, use search_sec_filings with its company filters. Coverage: Signal8's archive of SEC EDGAR filings from October 2021 to today (about 3.9M filings), updated through the day; filings older than 2021-10 may be absent, so an empty result is not proof something was never filed. Some rows are record-only (bodyStored: false — metadata from the EDGAR index with no document body), so their text cannot be read here; open them at their sec.gov URL.
Full-text search across SEC filing content,websearchthatsyntaxreturns("quotedthephrase"MATCHING PASSAGE: one match per filing,OReach with the exhibit it was found in (`exhibit_id`,-exclude`exhibit_type`),ranked,andonethematchsnippetperwithfiling.context.QuoteWebsearchmulti-wordsyntaxphrases("quoted—phrase", OR, -exclude); unquoted words match anywhere in thefiling. Returns matching snippets withfiling,contextsoaroundquoteeachmulti-wordmatch.phrases.PowerfulBest forfindinglocating specific clauseslike("change of control", "anti-dilution", "right of first refusal",) and for getting the excerpt for a known filing (pass accessionNumber oranyfilingId).specificUselanguagesearch_sec_filingsacrosswithfilings.`q` instead when you need filing-level paging (cursor), totals, date ranges, 8-K item codes, excluded forms, or company filters. Optionally filter by company (CIK), filing, accession number, or form type. Coverage: Signal8's archive of SEC EDGAR filings from October 2021 to today (about 3.9M filings), updated through the day; filings older than 2021-10 may be absent, so an empty result is not proof something was never filed. Some rows are record-only (bodyStored: false — metadata from the EDGAR index with no document body), so their text cannot be read here; open them at their sec.gov URL.
Search and list SEC filingswith filteringby company (CIK), form type, date ⟨6 unchanged words⟩ forms, optionally with a full-text query overthefilingbodies.bodies,Returnsandfilingoptionallymetadataby COMPANY FACTS (formmarkettypecap,filingfloat,dateprice, sector, industry, exchange, companynametype,accessionforeignnumberissuer,acceptancerecenttimeIPO). Returns rows with `id` (the filingId for get_filing_document / get_filing_exhibits),primarycik,documentcompany_name,8-Kaccession_number,items)form_type, filing_date, acceptedAt, primaryDocument, bodyStored and itemNumbers, plus `pagination` with `total`, `totalRelation` ("eq" exact; "gte" a lower bound when the count was cut at 10,000 — then `totalEstimate`, when present, is "about N"), `hasMore` and `nextCursor`. With `q`, unfiltered rows also carrya`rank`rankedand a `snippet`.UseCoverage:thisSignal8's archive of SEC EDGAR filings from October 2021 tofindtoday (about 3.9M filings),beforeupdatedreadingthroughtheirthecontentday; filings older than 2021-10 may be absent, so an empty result is not proof something was never filed. Some rows are record-only (bodyStored: false — metadata from the EDGAR index withget_filing_documentnoordocumentget_filing_exhibits.body), so their text cannot be read here; open them at their sec.gov URL. Full-text `q` uses websearch syntax: unquoted words must ALL appear (any order, any distance); "quoted phrase" for an exact phrase; OR between alternatives; -word to exclude. An empty text result is only definitive when the response's `searchIndex.complete` is true — otherwise `notes` says the index has not confirmed full coverage of the range. The `ciks` filter matches the filing'sprimaryown CIK: an insider Form 4 filed under the reporting owner's CIK is NOT returned for the issuer's CIK. COMPANY FILTERS (any of minMarketCap … recentIpo) are served from the archive only, using Signal8's company data: (1) only issuer-filed forms are searched (10-K, 10-Q, 8-K, S-1, S-3, 424B*, DEF 14A, 20-F, 6-K, …); third-party forms such as Form 4, 144 and SCHEDULE 13D/G are dropped and listed in `companyFilter.droppedForms`, and with no formTypes the default is 10-K, 10-Q, 8-K, S-1, S-3, DEF 14A, 20-F, 40-F, 6-K; (2) companies with no measured value for a filter are EXCLUDED, never assumed, and `companyFilter.unknown` counts them per filter; (3) unknown values (e.g. a misspelt sector) are a 400 that lists the allowed names; (4) when the archive cannot answer (e.g. a date range it does not fully hold yet) the call FAILS with code COMPANY_FILTER_NOT_APPLIED and a reason — it never returns unfiltered rows; (5) results are cursor-paged (use nextCursor, not page) and cannot be combined with acceptedFrom/acceptedTo/bodyStored; company-filtered text matches carry no snippet (use search_filing_text with the accessionNumber for the excerpt). The response then includes `companyFilter` (matchedCompanies, searchedCompanies, unknown, forms, droppedForms), `appliedFilters` and `notes`. To COUNT or list companies (not filings) by market cap etc., use screen_companies instead.
⟨9 unchanged words⟩ CIK numbers to filter by (e.g., \"0000320193320193,0001018724\1018724\"; zero-padded also accepted)","type":"string"},"companyTypes":{"description":"COMPANY FILTER. Comma-separated: operating, fund (registered funds/ETFs; adds N-CSR, N-CEN, N-PX, 485BPOS, 497/497K to the default forms), spac (blank-check companies)","type":"string"},"cursor":{"description":"Opaque keyset cursor from ⟨11 unchanged words⟩ — it is stable while new filings arrive. Required for page 2+ of a company-filtered search.","type":"string"},"dateFrom":{"description":"Startdatefilingfilterdate (YYYY-MM-DD). The archive starts 2021-10.","type":"string"},"dateTo":{"description":"Enddatefilingfilterdate (YYYY-MM-DD)","type":"string"},"exchanges":{"description":"COMPANY FILTER. Comma-separated listing venues: NASDAQ, NYSE, AMEX (= NYSE American), OTC","type":"string"},"excludeForms":{"description":"Comma-separated form types to ⟨6 unchanged words⟩ Exact match.","type":"string"},"foreignIssuer":{"description":"COMPANY FILTER. true = companies with foreign-issuer evidence (a 20-F, 40-F or 6-K seen, or an ADR listing); false = none seen since the evidence log began (companyFilter.foreignEvidenceSince)","type":"boolean"},"
Get Filing Documents — List EVERY document in one SEC filing by accession number — the primary document, each exhibit, XML and XBRL files, graphics — with seq, type (e.g. "8-K", "EX-99.1"), description, size in bytes, `stored` and `secUrl`. Also returns the filing's cik, companyName, formType, filingDate, acceptedAt, bodyStored, primaryDocument, indexUrl, and `filingId`. HOW TO READ A DOCUMENT: if it has an `exhibitId`, call get_exhibit_content with that id; for the whole submission text call get_filing_document with `filingId`. `exhibitId: null` means the document has no readable text row here (XML/XBRL/graphics, …
Get Structured Filing Data — Parsed, machine-readable data from an ownership or holdings filing, by accession number. `kind` says which: "ownership" (Form 3/4/5 and amendments) — issuer, reporting owners with relationship (director, officer title, 10% owner, or the filer's own "Other" text), and `parsed.transactions` (one row per transaction: table nonDerivative/derivative, securityTitle, transactionDate, code, acquiredDisposed A/D, shares, pricePerShare, sharesOwnedAfter, ownership D/I, and for derivatives exercisePrice, exerciseDate, expirationDate, underlyingTitle, underlyingShares); "thirteen_f" (13F-HR) — period, ho…
⟨17 unchanged words⟩ each row enriched with rvol, marketCap, floatShares (the measured POINT float, null on a withheld dilution-snapshot row — such a row then carries "floatEstimate" {shares, bound: "point" ~ | "ceiling" <= | "floor" >=, basis}, the snapshot's own labelled figure: present it as the number with its marker, never as a point, never in arithmetic; neither present = not measured, never 0. The low-float board admits on that figure's VALUE: a <= 8M ceiling is in, a >= 26M floor or a ~27M estimate is out), short interest, dilution, and news/catalyst flags. ⟨231 unchanged words⟩
⟨22 unchanged words⟩ analyzing bearish sentiment or potential short squeeze setups. 🔴 "shortInterestPercent" null ALWAYS carries "shortInterestPercentReason" (since 2026-10-04): "float_not_point" = the float on record is a snapshot BOUND or ESTIMATE (<= / >= / ~), and a percent-of-float is never struck off a bound — do NOT divide "shortInterest" by a ceiling, floor or estimate from get_float yourself; "float_unavailable" = no float of any kind on record; "short_pct_of_float_unreconciled" = a point float existed but the ratio was implausible or the split basis could not be resolved. A null percent is NOT MEASURED, never 0%.
Since 2026-10-03 the float column ALWAYS carries the dilution snapshot's own figure when the snapshot has one: "float" is the measured POINT float (null on a withheld snapshot row), and such a row then carries "floatEstimate" (shares) + "floatEstimateBound" ("point" ~ / "ceiling" <= / "floor" >=) + "floatEstimateBasis" (the working) — present it as the number with its marker, e.g. "<= 7,953,957". minFloat / maxFloat and the computed_float sort compare the figure's VALUE (COALESCE of the two), so a bounded row is kept; a row with neither is NOT MEASURED, never 0. 🔴 Never feed floatEstimate into a market cap, a percent-of-float or a short-interest ratio — a bound is not a point. Screen companies by price range, volume, cash ⟨49 unchanged words⟩ ⟨233 unchanged words⟩ "affiliate_unreconciled" | "share_count_unavailable" | "split_post_dates_basis" | "snapshot_float_unconfirmed" | "refusal_evaluation_failed") means the figure was deliberately WITHHELD,notbyunavailablethe snapshot AND no lower tier could answer — do not substitute a vendor float of your own. Since 2026-09-29 a snapshot that withheld its float FALLS THROUGH: when a lower tier can answer, "source" names that tier (computed / sec-10k / polygon / fmp), "floatShares" is ITS figure under ITS definition, and "snapshotFloatWithheldReason" carries the snapshot's reason as context ("the filing-derived snapshot could not state a float; showing <source>"). Read that field as provenance, never as a second refusal. A withheld result may carry up to four ⟨153 unchanged words⟩ confidence" describes the estimate, not a float.TodaySince 2026-09-29 it ispopulatedtheonlySNAPSHOT FLOAT LADDER figure onaffiliate_basis_staleany withheld snapshot ticker andnullmay also carry "rung" ("non_affiliate_estimate" | "shares_outstanding_ceiling" | "rolled_forward_lower_bound"), "bound" ("point" = about X, render "~X"; "ceiling" = AT MOST X, render "<= X"; "floor" = AT LEAST X, render ">= X") and "asOf"; a floor or ceiling is a BOUND, never a point value. null means no figure could be derived from theordinarysnapshot'soutcome.structured fields. An estimate never becomes floatShares — present shares ⟨145 unchanged words⟩
⟨41 unchanged words⟩ via limit/offset (default 100). Aggregate stats (institutional/insider/beneficial/retailinstitutional/insider/beneficial totals and percentages, plus the `retail` residual) are always included in full. `retail` is the UNATTRIBUTED residual: shares no filing accounts for, which includes recent offering buyers and acquisition holders who have not filed as well as retail investors — an upper bound on retail, never a retail count. When `retail.reason` is `filed_exceeds_outstanding` the residual is withheld (null) because the counted filings exceed the shares outstanding.
⟨56 unchanged words⟩ :null + halted:true when nothing is recoverable. marketCap is the live price × the SEC-derived share count; when that count is unavailable it is null with marketCapWithheldReason set — NOT MEASURED, never "no market cap" and never $0.
Full-textsubstringsearch acrossallSEC filingexhibitcontent,content.websearch syntax ("quoted phrase", OR, -exclude), ranked, one match per filing. Quote multi-word phrases — unquoted words match anywhere in the filing. Returns matching snippets with context around each match. ⟨31 unchanged words⟩
⟨69 unchanged words⟩ number"},"pattern":{"description":"Searchpatternquery (minimum 2 characters).,Substringwebsearchmatchsyntax: \"exact phrase\",case-insensitive.OR, -exclude. A CIK/filing-scoped search whose text is not indexed yet falls back to a literal case-insensitive substring match (response engine: \"substring\").","minLength":2,"type":"string"} ⟨20 unchanged words⟩
⟨6 unchanged words⟩ filtering by company (CIK), form type,anddaterange.range,Returns8-Kpaginateditemresultscodes and excluded forms, optionally with a full-text query over the filingmetadatabodies.includingReturns filing metadata (form type, filing date, company name, accession number, acceptance time, primary document, 8-K items) plus `pagination` with `total`, `totalRelation` ("gte" when the count was cut at 10,000) andaccession`nextCursor`.number.With `q`, rows also carry a ranked `snippet`. Use this to find filings before reading their content with get_filing_document or get_filing_exhibits. The `ciks` filter matches the filing's primary CIK: an insider Form 4 filed under the reporting owner's CIK is NOT returned for the issuer's CIK.
⟨17 unchanged words⟩ ,0001018724\")","type":"string"},"cursor":{"description":"Opaque keyset cursor from a previous response's pagination.nextCursor. Prefer it over page for deep paging — it is stable while new filings arrive.","type":"string"},"dateFrom":{"description":"Start date filter ( ⟨8 unchanged words⟩ (YYYY-MM-DD)","type":"string"},"excludeForms":{"description":"Comma-separated form types to EXCLUDE (e.g., \"4,13F-HR\"). Exact match.","type":"string"},"formTypes":{"description":"Comma-separated form types (e.g., \"10-K,10-Q,8-K,S-1,S-3,424B5\"). Exact match — list amendments (e.g. \"10-K/A\") explicitly.","type":"string"},"items":{"description":"Comma-separated 8-K item codes, ALL required (e.g., \"2.02,9.01\" = results + financial statements; \"5.02\" = officer/director changes; \"1.01\" = material agreements).","type":"string"},"page":{"description":"Page number (1-indexed, default: 1). Ignored when cursor is set.","minimum":1,"type":"number"} ⟨10 unchanged words⟩ ":100,"minimum":1,"type":"number"},"q":{"description":"Full-text query over filing bodies, websearch syntax: \"quoted phrase\", OR, -exclude. Quote multi-word phrases — unquoted words match anywhere in the filing.","maxLength":500,"type":"string"},"sort":{"description":"newest (by acceptance time, default) or relevance (requires q; ranks the newest 1,000 matches)","enum":["newest","relevance"],"type":"string"}},"type":"object"}
Get Politician Disclosures (Feed) — Per-DISCLOSURE feed of politician trades: one item per congressional STOCK Act periodic transaction report (PTR) or executive-branch OGE Form 278-T that contains at least one trade whose bracket LOWER bound is >= minAmount. Each item carries the politician, filing link, filing delay, and ALL trades of the report sorted largest bracket first, with qualifyingTradeCount for how many clear the threshold. Built for polling: pass the returned nextCursor back as `since` and each disclosure is returned exactly once (for the same minAmount and kinds); keep nextCursor even when items is empty, and call…
⟨151 unchanged words⟩ not infer them from shelf or ATM capacity.Requires theIncludedDilutioninSnapshotsSignal8add-onPro (403ADDON_REQUIREDFEATURE_NOT_AVAILABLE, requiredTier "pro", without it). That is a tier upgrade, not an add-on purchase — the add-on is no longer sold.
⟨235 unchanged words⟩ the company as having none of that instrument.Requires theIncludedDilutioninSnapshotsSignal8add-onPro — without it the call returns 403 with codeADDON_REQUIRED,FEATURE_NOT_AVAILABLEwhichand `requiredTier: "pro"`. That is a subscription-tier upgrade, not an add-onpurchase requirementpurchase;andthere isDISTINCTnofromseparateaadd-onsubscription-tiertoupgrade.buy.
⟨296 unchanged words⟩ counted rather than published on a mixed basis.Requires theIncludedDilutioninSnapshotsSignal8add-onPro — without it the call returns 403 with codeADDON_REQUIRED,FEATURE_NOT_AVAILABLEwhichand `requiredTier: "pro"`. That is a subscription-tier upgrade, not an add-onpurchase requirementpurchase;andthere isDISTINCTnofromseparateaadd-onsubscription-tiertoupgrade.buy.
⟨300 unchanged words⟩ counted rather than published on a mixed basis.Requires theIncludedDilutioninSnapshotsSignal8add-onPro — without it the call returns 403 with codeADDON_REQUIRED,FEATURE_NOT_AVAILABLEwhichand `requiredTier: "pro"`. That is a subscription-tier upgrade, not an add-onpurchase requirementpurchase;andthere isDISTINCTnofromseparateaadd-onsubscription-tiertoupgrade.buy.
⟨255 unchanged words⟩ counted rather than published on a mixed basis.Requires theIncludedDilutioninSnapshotsSignal8add-onPro — without it the call returns 403 with codeADDON_REQUIRED,FEATURE_NOT_AVAILABLEwhichand `requiredTier: "pro"`. That is a subscription-tier upgrade, not an add-onpurchase requirementpurchase;andthere isDISTINCTnofromseparateaadd-onsubscription-tiertoupgrade.buy.
⟨340 unchanged words⟩ counted rather than published on a mixed basis.Requires theIncludedDilutioninSnapshotsSignal8add-onPro — without it the call returns 403 with codeADDON_REQUIRED,FEATURE_NOT_AVAILABLEwhichand `requiredTier: "pro"`. That is a subscription-tier upgrade, not an add-onpurchase requirementpurchase;andthere isDISTINCTnofromseparateaadd-onsubscription-tiertoupgrade.buy.
⟨319 unchanged words⟩ counted rather than published on a mixed basis.Requires theIncludedDilutioninSnapshotsSignal8add-onPro — without it the call returns 403 with codeADDON_REQUIRED,FEATURE_NOT_AVAILABLEwhichand `requiredTier: "pro"`. That is a subscription-tier upgrade, not an add-onpurchase requirementpurchase;andthere isDISTINCTnofromseparateaadd-onsubscription-tiertoupgrade.buy.
Get float data for a company: floatShares,sourcefloatDefinition,floatDefinitionas-of date, andas-of—date.when the headline float is WITHHELD — the bounds and labelled stand-ins that replace it. Use when analyzing share supply. CARDINAL RULE: null / absent / withheld means NOT MEASURED — never "no float", never "no restricted shares", never zero. A numeric 0 is a MEASURED zero and passes a null check, so decide from the reason/marker field ("floatWithheldReason", "restrictedBlockCount", "provenance", "direction"), never from the value alone. IMPORTANT: check "floatDefinition" to know which float ⟨48 unchanged words⟩ ), or "free_float" (vendor methodology). TODAY "floatDefinition" and "source" are only present on dilution-snapshot results: a vendor-sourced float arrives with neither (just floatShares, asOfDate, floatEstimated) because vendors are not named — read an ABSENT floatDefinition as "not a filing-derived tradeable float" and do not assume it is tradeable. On snapshot tickers "nonAffiliateFloatShares" carries the SEC ⟨38 unchanged words⟩ "stated_figure_impossible" | "affiliate_basis_stale" | "affiliate_figure_declined" | "affiliate_unreconciled" | "share_count_unavailable" | "split_post_dates_basis") means the figure was deliberately WITHHELD, not unavailable — do not substitute a vendorfloat.floatOnof your own. A withheld result may carry up to four stand-ins, each labelled IN the object; NONE is a float and NONE may be fed to a market cap, a percent-of-float, a short-interest ratio, a screen, a sort or a comparison: (1) "affiliate_basis_staletradeableFloatCeiling" is an UPPER BOUND — the tradeable float is AT MOST this; render it with "<=" and nothing else (null = no bound stateable, never 0). (2) "affiliateBasis.floatLowerBound" / "floatUpperBound" are a RANGE the float lies in(both—ends"betweenorXneither;and Y"; each end is null=independently when not measurable), so state the ends that exist as inequalities. This object also appears on PUBLISHED floats with both ends equal to floatShares — it is arangeboundtoonlystatewhen floatShares is null. (3) "floatEstimate" is a BADGED ESTIMATE {shares, basis, direction, confidence}: "basis" is the itemised working (quote it), "direction" says which way it errs ("overstates" = the true float is at most shares; "understates" = at least; "unknown"), "confidence" describes the estimate, not a float. Today it is populated only on affiliate_basis_stale and null is the ordinary outcome. An estimate never becomes floatShares — present shares WITH basis and direction, never alone. Unrelated to the boolean "floatEstimated", which flags a published floatShares back-derived from a USD public-float disclosure. (4) "vendorFallback" is a third-party free-float figure {floatShares, provenance:"vendor", floatDefinition:"free_float", asOfDate, splitAdjusted} offered beside the withhold — NOT our number,toNOTcomputeonwith.the tradeable definition, already refused when our filings refute it. Present it as the vendor free float as of its own date, never in the "Float" slot. "restrictedShares":null means NOT MEASURED (a block ⟨32 unchanged words⟩ share count — the number itself is unchanged. "tradeableBasis":"convention_conservative" means the filings did not answer and a published convention resolved it — see "tradeableConvention" and do not present the figure as exact.
⟨92 unchanged words⟩ = live cumulative premarket volume ÷ the trailing90-session30-session average cumulative volume AT THE SAME TIME OF ⟨40 unchanged words⟩ = the same live volume ÷ the trailing90-session30-session average FULL premarket session (answers "what fraction ⟨96 unchanged words⟩
⟨36 unchanged words⟩ session's volume to a trailing same-session baseline (9030 trading days by default — configurable via "baselineDays" ⟨141 unchanged words⟩
⟨45 unchanged words⟩ cumulative volume known BY that cutoff ÷ the90-daytrailing baselineDays (default 30) average of the SAME cutoff (not the full ⟨60 unchanged words⟩ in trading rows (same-session days). Default90;30; values outside 20-250 are clamped. This is the ⟨42 unchanged words⟩ smoother and slower to react. The warm-up lookbackand the minimum-warm-days gate scalescales with it automatically, so a wide window is never under-filled into an inflatedratio.ratio; the minimum-warm-days gate (20 prior sessions) does NOT scale down, so at the 30-row default a ticker needs 20 of its last 30 sessions populated before rvol is non-null. Omit for the standard90-day30-daybaseline.baseline; pass 90 for the pre-2026-09 window.","maximum":250,"minimum":20,"type ⟨56 unchanged words⟩
⟨27 unchanged words⟩ bid-price compliance (1:250 cumulative reverse-split cap). IMPORTANT: `cumulativeReverseSplitRatio2yr` is null when it CANNOT BE STATED, which is NOT the same as no reverse splits — read `cumulativeWithheldReason` to tell them apart. `unconfirmed_splits_in_window` means at least one in-window reverse split is evidenced by only one source, so no cumulative is defensible: the confirmed splits alone would understate it, and understating a cumulative can put an issuer that breaches the 1:250 cap under it. Each row also carries `confirmed`; a `confirmed: false` split appears only in the announcement calendar, which retains every announcement and retracts none, so it is usually an amended or superseded announcement and occasionally a real split the effected-splits ledger missed. Both are returned. `ratioDisplay` and `type` are likewise null for a ratio whose exact factor cannot be determined.
⟨144 unchanged words⟩ :"Sort results by field (default: filing_date). Ties are broken by filing id, so a given page is stable and reproducible for a fixed corpus.","enum":["filing_date","form_type"," ⟨4 unchanged words⟩ {"description":"Sort direction (default: desc). Note that paging is offset-based over a corpus that is continuously ingesting new filings, so when walking many pages of a broad date range, newly-arrived filings can shift rows between pages; page on a closed dateFrom/dateTo window if you need an exhaustive, non-overlapping traversal.","enum":["asc","desc"], ⟨4 unchanged words⟩
Get Baby-Shelf (S-3 I.B.6) Raisable Capacity — Get the SEC Form S-3 General Instruction I.B.6 "baby shelf" capacity (10 credits): how much the issuer may raise off an effective shelf right now, given the one-third-of-public-float cap that applies below a $75M non-affiliate float, less the trailing-twelve-month takedowns already used. Returns the public float basis, the cap, takedowns counted and the remaining raisable amount. 🔴 `constraintApplies: false` means the cap does NOT bind (float at or above $75M, so primary offerings are unlimited under I.B.1) — it is NOT "no capacity" and NOT a favourable finding. 🔴 A `suppressed` response me…
Get Dilution Coverage Status — Cheap pre-check (1 credit) for whether Signal8 holds a dilution analysis for a company: coverage status (verified / stale / not_covered), extraction state (never_extracted / running / failed / timeout / complete), last attempt and last success timestamps, the coverage tier, and whether the ticker is out of scope. CALL THIS FIRST before the expensive dilution tools — it answers "is there anything to fetch" for a fraction of the cost. ALWAYS RETURNS 200 — read `available` and `reason`, never the HTTP status. Coverage is partial: `not_covered` means THIS COMPANY HAS NOT BEEN ANALYSED YET, which …
Get Shares-Outstanding and Cash History — Get the historical shares-outstanding and cash series (10 credits) from SEC XBRL filings, with offering and material-cash-event overlays so an issuance or a raise can be lined up against the share count and cash balance around it. Use for share count growth over time and for the cash trajectory between financings. 🔴 THE HISTORICAL SHARE COUNTS ARE AS FILED — each point is on the split basis in force when it was reported and is NOT rebased to today, so a reverse split shows as a step and points either side of one are not directly comparable. Do not compute a growth rate across a split boundar…
Get Dilution Instrument Rows by Family — Get ONE instrument family's rows (10 credits) with per-field SEC citations — each figure carries the accession number, filing date and the verbatim quoted sentence it was read from, so every number can be traced to a filing. Families: warrants, convertibles, preferred, shelfs, atms, elocs, s1_offerings, equity_plans, exchangeables, recent_offerings. One family per call — request the families you actually need rather than sweeping all ten. 🔴 ROW-LEVEL WITHHOLDING: `withheldRows` / `withheldRowCount` mean specific rows could NOT be verified and were blanked, so every family total in the respon…
Get Post-Offering Price Performance — Get post-offering price performance (10 credits): for each recorded offering, how the stock traded after it priced or closed. Use when assessing how the market has absorbed this issuer's past financings. 🔴 THIS IS HISTORY, NOT A FORECAST — it describes what happened after prior offerings and must never be phrased as an expectation, a price target or a prediction about a named company. An empty or unavailable series means no offering performance was measured, NOT that offerings had no effect and NOT that there were no offerings. ALWAYS RETURNS 200 — read `available` and `reason`, never the HT…
Get Dilution Pressure Score and Risk Levels — Get the dilution pressure score (5 credits): a 0-100 score with its seven-component breakdown (shelf capacity, ATM/equity-line capacity, warrants in the money, convertible proximity, cash burn urgency, historical dilution, toxic financing), plus four risk levels — overall, offering ability, overhead supply, cash need. 🔴 THE SCORE IS MEANINGLESS WITHOUT `scoreMaxMeasured` AND `scoreWithheldReason`: components whose inputs could not be measured are DROPPED FROM THE DENOMINATOR, so a score of 58 may be 58 out of 85, not out of 100. Always report it as `score`/`scoreMaxMeasured` and name the exc…
Get Dilution Snapshot Summary — Get the dilution snapshot header (25 credits — the most expensive tool here): summary totals (potential new shares and their percentage of shares outstanding, per-family share totals), the cash position (anchor cash, monthly burn, estimated current cash, runway months), the float block, and `meta` provenance. DOES NOT INCLUDE INSTRUMENT ROWS — call get_dilution_instruments per family for those, and call get_dilution_coverage first to avoid paying 25 credits for an uncovered ticker. 🔴 FLOAT: when `floatWithheldReason` is non-null the tradeable float was NOT MEASURED and must not be stated as …
Get Recent Uplistings — Get OTC-to-exchange uplistings that FINRA recorded on a given US market day, for companies under a market-cap ceiling. Each row carries the old OTC symbol, the resolved new exchange symbol (or null), a confirmed flag, the destination venue (NASDAQ / NYSE / NYSE American / ARCA), company name, effective date, market cap and float in SHARES. 🔴 THIS IS A SAME-DAY READ AND THERE IS NO FORWARD-LOOKING VERSION. FINRA records an uplisting at roughly 01:45 ET ON the day it becomes effective, and the source table has no scheduled/announced column at all. So there is nothing to publish the night befor…
Get Upcoming Reverse Splits — Get reverse stock splits SCHEDULED to take effect within a day-offset window of the current US market day, for companies under a market-cap ceiling. Offsets are days from today on the US market calendar: fromOffset=1, toOffset=1 is tomorrow; fromOffset=1, toOffset=7 is the week ahead. Each row carries the ticker, company name, the exact vendor integers (splitFrom/splitTo), a pre-rendered ratio ("1-for-20"), the effective date, market cap, float in SHARES, and price. WHAT THIS IS: rows are splits scheduled AS OF NOW — not a guarantee that every split effective in the window is already known. T…