servers / signal8

Signal8 MCP server

communitystreamable_httpremotewrite capablehealthy

SEC filings, dilution, insider & institutional ownership, and political-trade data for AI agents.


01Tools · 113

How to read this: tool names here are observed from a live tools/list handshake. The Risk label is a heuristic inferred from the tool name (write/destructive verbs), not from executing the tool — a conservative guess, not a verified capability. We never escalate risk from a description. Found one that's wrong? Tell us — we fix on report.

ToolRiskSide effectsApproval
define_term
Free: works without an API key or Pro plan (the hosted server only needs a signed-in account). 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 that wording — not that the concept does not exist; try search_learn_guides with the same words.
readfalseunknown
get_accumulation_snapshot
Get intraday accumulation/distribution metrics for the current or most recent trading session. Returns session VWAP, volume above/below VWAP, estimated buy vs sell volume (tick rule), volume by time period (morning/midday/afternoon), and comparison to average volume. Use for assessing real-time buying/selling pressure.
readfalseunknown
get_analyst_consensus
Get analyst ratings consensus for a company including average target price, number of analysts, buy/hold/sell breakdown, and consensus recommendation. Use when evaluating Wall Street sentiment or price targets.
readfalseunknown
get_analyst_coverage
Get aggregated analyst coverage for a ticker — consolidated view of grades, targets, and coverage breadth across covering firms.
readfalseunknown
get_analyst_estimates
Get forward analyst estimates for a company including EPS, revenue, EBITDA, and net income (low/high/avg) with analyst counts. Supports annual and quarterly periods. Use when analyzing forward earnings expectations or revenue forecasts.
readfalseunknown
get_analyst_grades
Get recent analyst grade actions (upgrades, downgrades, initiations) for a ticker, including the grading firm and previous/new grade.
readfalseunknown
get_baby_shelf_capacity
Get the SEC Form S-3 General Instruction I.B.6 "baby shelf" capacity: how much the issuer may raise off an effective shelf now, under the one-third-of-public-float cap that applies below a $75M non-affiliate float, less trailing-twelve-month takedowns. Returns the float basis, the cap, takedowns counted and the remaining raisable amount. 🔴 `constraintApplies: false`: the cap does NOT bind (float >= $75M, primary offerings unlimited under I.B.1); not "no capacity" and not a favourable finding. 🔴 `constraintApplies: null` with `suppressedReason: "float_unmeasured"`: the float value was NOT MEASURED; report not measured, NEVER as "the cap does not bind" and NEVER as unlimited. 🔴 A `suppressed` figure is WITHHELD (e.g. an issuer delisted to OTC cannot run an S-3 primary): report it as not stateable, NEVER as $0 raisable. `suppressedReason: "ib6_pool_unattributed"`: the cap applies but trailing sales could not all be attributed, so $0 is a lower bound; `remainingCapacity` is null and `capacityUpperBoundDollars` means "at most" (`capacityLowerBoundDollars` the other end: say "between $A and $B"). `remainingCapacityBasis: "lower_bound"`: the figure counts unattributed rows whole, so say "at least <remainingCapacity>, at most <capacityUpperBoundDollars>". `staleIssuerStatement`: the issuer's own $0 statement dated `asOf` was NOT used because sales its window counted have since left today's window; report it as "the issuer stated $0 as of <asOf>", never as today's capacity. `poolDerivations`: ATM periods split by differencing the issuer's own stated sub-periods (each with its accession); cite them. `suppressedReason: "issuer_not_ib6_limited"`: the issuer's current prospectus offers more than the cap with no I.B.6 limitation (`issuerUnlimitedOffer`); whether the cap applies is NOT MEASURED, never $0, constrained or unlimited. `floatValueBasis: "issuer_stated"`: the issuer's own printed I.B.6 float (`issuerStatedFloat`, prospectus <= 60 days old) was lower than the live valuation and was used. A null remaining capacity is not measured, not zero. ALWAYS RETURNS 200: read `available` and `reason`, never the HTTP status. `not_covered` means this company has not been analysed yet, not that it has no dilution; an outage is a 5xx. NULL, absent or withheld means NOT MEASURED; it never means "no dilution", "no warrants", "no shelf" or zero. A numeric 0 is a MEASURED zero and defeats a null check: decide from the availability/withheld/reason field, never from the value itself. Figures are as of `meta.asOfDate`, from filings read through `meta.filingsThrough` (a stale date predates anything filed since). Share counts are on one split basis; a row that cannot be rebased is omitted and counted, never published on a mixed basis. Included in Signal8 Pro: without it the call returns 403 FEATURE_NOT_AVAILABLE with `requiredTier: "pro"` (a tier upgrade; there is no add-on to buy).
readfalseunknown
get_cash_history
Get up to 10 years of quarterly cash position history from SEC XBRL filings (data.sec.gov company-facts). Returns an array of {periodEnd, usd, formType, isAnnual} sorted chronologically. Deduped by period with annual filings preferred over quarterly. Not feature-gated — works for any company with SEC filings.
readfalseunknown
get_cash_position
Get the Signal8 cash position model for a company, derived from the dilution snapshot pipeline: anchor cash and anchor date, monthly burn, post-anchor capital raises (with SEC filing citations), known outflows, estimated current cash and runway months. Use when analyzing a company's current cash situation, runway, or capital raise activity. ALWAYS RETURNS 200 — read `available` and `reason`, never the HTTP status: coverage is partial, so `available: false` with reason `snapshot_not_generated` means THIS COMPANY HAS NOT BEEN ANALYSED YET, which is different from it having no cash data and different from an outage (an outage is a 5xx). Never report a company as having no cash or no runway on the strength of an unavailable response. The `scenarios` envelope is preserved for compatibility but only `scenarios.closed` is populated: `pending` and `announced` are null with reason `scenario_not_modelled` because the extraction records only REALIZED cash-raising events and never models speculative raises. Do 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 "pro", without it). That is a tier upgrade, not an add-on purchase — the add-on is no longer sold.
readfalseunknown
get_cash_runway_calendar
Find companies projected to run out of cash within a date window. Similar to lockup expiration calendars but for cash depletion events. Returns companies sorted by urgency (lowest runway first). Runway is an estimate based on current burn rate — actual depletion depends on future capital raises and operational changes. 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.
readfalseunknown
get_clinical_trials
Get the ClinicalTrials.gov trials Signal8 has matched to a company: phase, status, conditions, interventions and key dates. IMPORTANT, sponsor role: the list includes trials the company LEADS and trials where it is only a COLLABORATOR on another organisation's study. Each trial carries metadata.sponsorRole ("lead" | "collaborator" | null = not determined) and metadata.sponsor (the lead sponsor). Only lead trials are the company's own pipeline; describe a collaborator trial as "a <lead sponsor> trial the company collaborates on", never as the company's own. Pass sponsorRole="lead" to get only those. The response's total / leadTotal / collaboratorTotal count the full list, so compare total with the returned count to see whether it was truncated. Dates of type ESTIMATED are sponsor projections, not facts.
readfalseunknown
get_company_profile
Get an enriched company profile by ticker symbol. Returns CIK, exchange, sector, industry, market cap, employee count, description, and other fundamental data. This is a lightweight lookup -- use this when you only need basic company info rather than the full bundle. Always includes halted/haltCode/haltedAt trading-halt status (false/null when trading 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.
readfalseunknown
get_compliance
Get full compliance rules evaluation for a company. Runs Nasdaq/NYSE deficiency detection, bid price tracking, and delinquent filing detection. Returns a comprehensive compliance picture combining SEC filing data, market data, and exchange rules. Rules cover bid price, equity, reverse-split limit, market value of publicly held shares, publicly held shares, holders, timely periodic filings, annual meeting and audit committee, per exchange tier. Standards that could not be judged from any measurement are listed in `notEvaluated` (not passing, not failing); never read them, or the absence of a deficiency notice, as compliance. This is the most thorough compliance check available.
readfalseunknown
get_dilution_coverage
Cheap pre-check 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. An `outOfScope` ticker is a statement about the PRODUCT (dilution analysis covers small-cap issuers only) and says NOTHING about that company's dilution. `stale` means the analysis is real but predates recent filings; `statusDetail` refines it: `newer_filing_unread` (`unreadFilings` names the material filings since: new/amended instrument, 424B5 pricing, split, 10-K) or `delisting_filed` (`delistingFiled` names the Form 25/25-NSE/15). Say the analysis predates that filing, never present it as current. A null `unreadFilings` is NOT MEASURED, never "nothing filed since". ALWAYS RETURNS 200: read `available` and `reason`, never the HTTP status. `not_covered` means this company has not been analysed yet, not that it has no dilution; an outage is a 5xx. NULL, absent or withheld means NOT MEASURED; it never means "no dilution", "no warrants", "no shelf" or zero. A numeric 0 is a MEASURED zero and defeats a null check: decide from the availability/withheld/reason field, never from the value itself. Included in Signal8 Pro: without it the call returns 403 FEATURE_NOT_AVAILABLE with `requiredTier: "pro"` (a tier upgrade; there is no add-on to buy).
readfalseunknown
get_dilution_history
Get the historical shares-outstanding and cash series 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 boundary from these raw points. A gap in the series means no filing supplied that period, not that the share count was unchanged. ALWAYS RETURNS 200: read `available` and `reason`, never the HTTP status. `not_covered` means this company has not been analysed yet, not that it has no dilution; an outage is a 5xx. NULL, absent or withheld means NOT MEASURED; it never means "no dilution", "no warrants", "no shelf" or zero. A numeric 0 is a MEASURED zero and defeats a null check: decide from the availability/withheld/reason field, never from the value itself. Figures are as of `meta.asOfDate`, from filings read through `meta.filingsThrough` (a stale date predates anything filed since). Share counts are on one split basis; a row that cannot be rebased is omitted and counted, never published on a mixed basis. Included in Signal8 Pro: without it the call returns 403 FEATURE_NOT_AVAILABLE with `requiredTier: "pro"` (a tier upgrade; there is no add-on to buy).
readfalseunknown
get_dilution_instruments
Get ONE instrument family's rows with per-field SEC citations (accession number, filing date and the verbatim sentence each figure was read from). Families: warrants, convertibles, preferred, shelfs, atms, elocs, s1_offerings, equity_plans, exchangeables, recent_offerings, rights. One family per call; request only what you need. 🔴 `withheldRows` / `withheldRowCount`: rows that could NOT be verified were blanked, so every family total is a LOWER BOUND; say so. An empty rows array on a covered company is a measured "none found in the filings read"; an unavailable response is not. 🔴 `disputed` status (warrants / convertibles / preferred / exchangeables): the issuer's latest filing disputes the instrument; it is SHOWN and EXCLUDED from totals (`summary.disputedInstrumentCount` / `disputedInstrumentShares`); report it as a disputed claim, never as outstanding or retired. `contingencyTrigger: "event_of_default"`: still outstanding and COUNTED; say "converts only on an event of default", never not dilutive. 🔴 convertibles `principalBasis` `aggregate_only` / `fair_value_only` / `conflict` / `undisclosed_since_issue`: the current balance is NOT MEASURED (principalOutstanding null); report `principalOriginal` as the ORIGINAL principal. `conversionBasis: "formula_unanchored"`: no share count computable; unquantified, not zero. convertibles / preferred `sharesIssuableBasis: "conflict_upper_bound"`: report "up to `sharesIssuableIfConverted`; the issuer states `sharesIssuableIssuerStated`", never the higher figure alone as the issuer's count. 🔴 warrants with null `sharesUnderlying` beside `aggregateExerciseValueDollars` / `exercisePriceFloor` / `sharesCeilingAsFiled` are dollar-denominated or capped: `summary.warrantSharesCeiling` is a ceiling, never a count and never in `potentialNewShares`. `warrantCount` counts WARRANTS, not shares. 🔴 shelfs `babyShelfCurrentCapacityDollars` is a STORED, DATED figure, NOT TODAY'S HEADROOM: always report it with `babyShelfCapacityAsOf` (null = undated, never current; `babyShelfCapacityBasis` names its float). For the raisable-now figure call get_baby_shelf_capacity; never present the stored figure as current. 🔴 rights (SPAC unit rights): `rightsCount` counts RIGHTS, not shares; `sharesPerRight` is the printed fraction of a share per right; `sharesUnderlying` is the share count (null = unsized, never 0), delivered on the initial business combination and lapsing if none closes. A snapshot stored before this family returns `examined: false` for rights: not analysed, never "no rights". ALWAYS RETURNS 200: read `available` and `reason`, never the HTTP status. `not_covered` means this company has not been analysed yet, not that it has no dilution; an outage is a 5xx. NULL, absent or withheld means NOT MEASURED; it never means "no dilution", "no warrants", "no shelf" or zero. A numeric 0 is a MEASURED zero and defeats a null check: decide from the availability/withheld/reason field, never from the value itself. Figures are as of `meta.asOfDate`, from filings read through `meta.filingsThrough` (a stale date predates anything filed since). Share counts are on one split basis; a row that cannot be rebased is omitted and counted, never published on a mixed basis. Included in Signal8 Pro: without it the call returns 403 FEATURE_NOT_AVAILABLE with `requiredTier: "pro"` (a tier upgrade; there is no add-on to buy).
readfalseunknown
get_dilution_performance
Get post-offering price performance: 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 HTTP status. `not_covered` means this company has not been analysed yet, not that it has no dilution; an outage is a 5xx. NULL, absent or withheld means NOT MEASURED; it never means "no dilution", "no warrants", "no shelf" or zero. A numeric 0 is a MEASURED zero and defeats a null check: decide from the availability/withheld/reason field, never from the value itself. Figures are as of `meta.asOfDate`, from filings read through `meta.filingsThrough` (a stale date predates anything filed since). Share counts are on one split basis; a row that cannot be rebased is omitted and counted, never published on a mixed basis. Included in Signal8 Pro: without it the call returns 403 FEATURE_NOT_AVAILABLE with `requiredTier: "pro"` (a tier upgrade; there is no add-on to buy).
readfalseunknown
get_dilution_risk
Get the dilution pressure score: 0-100 with a 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. 🔴 SCORE: components whose inputs could not be measured are DROPPED FROM THE DENOMINATOR, so 58 may be 58 out of 85. Always report `score`/`scoreMaxMeasured` and name the excluded `scoreUnmeasuredComponents`; NEVER rescale it to /100, and never read a low numerator as low risk. `scoreDenominatorThin: true` (under 70 measured points) is a PARTIAL reading ("N of M measured"). A non-null `scoreWithheldReason` (e.g. `no_dilution_snapshot`) means NO score, not zero. With no filed share count, share-count / market-cap components rest on `details.sharesOutstandingEstimate` {shares, kind, asOf, source} (`details.marketCapSource: "derived_price_x_estimated_os"`): say they rest on an estimate. 🔴 LEVELS: when `levelsAreLowerBound` (always present) is true, the levels named in `levelsLowerBoundScope` are floors, not measurements: "medium" means AT LEAST medium. State those (and only those) as a lower bound. `levelsLowerBoundReason`: `unquantified_live_instruments` floors overall + overheadSupply; `offering_capacity_unknown` and `market_cap_unmeasured` floor overall + offeringAbility, NOT `overheadSupply`; `os_growth_span_short`, `os_growth_issuance_floor`, `os_growth_rebased_partial` floor historical + overall; `overhead_capacity_unquantified` floors overheadSupply + overall. Name the stated reason, never another. `details.levelBounds` per level: `floor` (unsized instruments at zero), `ceiling` (at filed maximum; null = some instrument has none), `exact`, `bestEstimate`, `estimated`, `estimateBasis`; report an estimated level as a best estimate with its floor and ceiling, never as a measurement. 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 with a MEASURED $0 drawable (e.g. clamped by the I.B.6 cap) reads medium while the score prices the $0; do not say the company cannot raise. `atmRemainingBasis` / `elocRemainingBasis` `total_minus_reported_sales` / `total_no_sales_reported` are "up to" figures. `overheadSupply` = potential dilution EXCLUDING shelf as a % of shares outstanding: warrants, convertibles, preferred at GROSS counts, plus live ATM remaining (baby-shelf clamped) and equity-line remaining at the current price, plus live S-1 shares, plus `details.registeredResaleOverhangShares`. Low up to 20%, Medium 20-50%, High over 50%. `details.overheadSupplyBasis` itemises the components (null = NOT MEASURED) and `unquantified`; it is NOT the treasury-netted `inTheMoneySupplyPct` / `totalDilutiveShares`. When `details.osGrowthRate` is null, `details.osGrowthFacts` {fromShares, fromDate, toShares, toDate, splitsInWindow, basis} is a FACT, never a rating; with `basis: "as_filed"` the counts must not be compared as growth. ALWAYS RETURNS 200: read `available` and `reason`, never the HTTP status. `not_covered` means this company has not been analysed yet, not that it has no dilution; an outage is a 5xx. NULL, absent or withheld means NOT MEASURED; it never means "no dilution", "no warrants", "no shelf" or zero. A numeric 0 is a MEASURED zero and defeats a null check: decide from the availability/withheld/reason field, never from the value itself. Figures are as of `meta.asOfDate`, from filings read through `meta.filingsThrough` (a stale date predates anything filed since). Share counts are on one split basis; a row that cannot be rebased is omitted and counted, never published on a mixed basis. Included in Signal8 Pro: without it the call returns 403 FEATURE_NOT_AVAILABLE with `requiredTier: "pro"` (a tier upgrade; there is no add-on to buy).
readfalseunknown
get_dilution_snapshot
Get the dilution snapshot header (the heaviest dilution call): summary totals (potential new shares, their % of shares outstanding, per-family totals), the cash position (anchor cash, monthly burn, estimated current cash, runway months), the float block, and `meta` provenance. NO INSTRUMENT ROWS: call get_dilution_instruments per family, and get_dilution_coverage first. Cash is in the filer's REPORTING currency: read `cashPosition.currency` (ISO 4217; null = not determined) and `cashPosition.currencySource` ("presumed_usd" is not a measurement) before calling it dollars (runway months are currency-neutral). 🔴 FLOAT: a non-null `floatWithheldReason` means the tradeable float was NOT MEASURED; never state it as a number. A declined block (`available: false`) may carry `refusal.withheldReason`, the exact value get_float serves. `tradeableFloatCeiling` is an UPPER BOUND, NOT a float: never feed it to a market capitalisation, percent-of-float, short-interest ratio or comparison; say in words the float is at most that figure, with no ~ / ≤ / ≥ glyph. 🔴 BOUNDED TOTALS: a null total (`potentialNewShares`, `totalWarrantShares`, `totalConvertibleShares`, `totalEquityPlanShares`, `totalExchangeableShares`, `totalRightsShares`, `potentialDilutionPercent`) may sit beside `<key>Bound: "ceiling"`, `<key>Ceiling`, `<key>Floor`: report "at most <ceiling>" and the floor as the measured part, never the ceiling as the total. With `potentialDilutionPercentBoundReason: "stated_count_denominator"` there is NO floor: the ceiling divides by the last stated share count (as of `potentialDilutionPercentCeilingShareCountAsOf`); say "at most X%, against the count stated as of <date>". 🔴 `notMeasuredReasons[]` ({field, code, text, detail, expected {form, dueDate, status}}) says WHY a figure is null; quote it, never turn it into a value. `expectedFilings[]` lists the next periodic report(s); `status: "late"` means due by `dueDate` with none on file as of `checkedOn` (say exactly that, never speculate why); `dueDate: null` is not computed. A `kind: "annual_meeting"` row (Nasdaq 5620(a) / NYSE 302.00) "late" means no 8-K Item 5.07 vote results on file, never that a meeting was missed. 🔴 SPAC RIGHTS: `totalRightsShares` (present only when the snapshot examined rights) is shares delivered to holders of SPAC unit rights on the initial business combination; it IS in `potentialNewShares`, and the rights lapse if no combination closes. `rightsOverlapWarrantRows` > 0: a warrant row also names rights, so the rights total and the headline are WITHHELD (null) rather than counted twice; say so. 🔴 RUNWAY beside `goingConcern: true` is a contradiction the auditors flagged: report both, never the runway alone. ALWAYS RETURNS 200: read `available` and `reason`, never the HTTP status. `not_covered` means this company has not been analysed yet, not that it has no dilution; an outage is a 5xx. NULL, absent or withheld means NOT MEASURED; it never means "no dilution", "no warrants", "no shelf" or zero. A numeric 0 is a MEASURED zero and defeats a null check: decide from the availability/withheld/reason field, never from the value itself. Figures are as of `meta.asOfDate`, from filings read through `meta.filingsThrough` (a stale date predates anything filed since). Share counts are on one split basis; a row that cannot be rebased is omitted and counted, never published on a mixed basis. Included in Signal8 Pro: without it the call returns 403 FEATURE_NOT_AVAILABLE with `requiredTier: "pro"` (a tier upgrade; there is no add-on to buy).
readfalseunknown
get_donor_aggregates
Get market-wide campaign-finance rollups across ALL tracked politicians for a cycle: total raised, top 10 individual donors, top 10 PACs, party/chamber/cycle splits, and a most-funded politician leaderboard. Use for "who are the biggest donors in 2024?" or "which party raised more?" type questions. For a single politician, use get_politician_donor_summary.
readfalseunknown
get_earnings
Get historical earnings data for a company including EPS actual vs estimate, revenue actual vs estimate, and surprise percentages. Use when analyzing earnings beats/misses or upcoming earnings expectations.
readfalseunknown
get_earnings_calendar
Get upcoming and recent earnings releases between two dates. Optionally restrict to a list of tickers. Returns ticker, date, time (BMO/AMC), EPS estimate, and revenue estimate when available. Supports market cap filtering to focus on large-cap or small-cap earnings only.
readfalseunknown
get_economic_calendar
Get scheduled macro/economic events (CPI, FOMC, jobs reports, GDP, etc.) between two dates. Optionally filter to a single country (ISO-3166 alpha-2, e.g. "US"). Defaults to US when omitted.
readfalseunknown
get_ended_reverse_splits
List reverse-split episodes ACROSS COMPANIES that ended WITHOUT the split taking effect, from Signal8's SEC-filing tracker: outcome "vote_failed" (shareholders did not approve), "abandoned" (the company said it will not proceed), "authority_expired" (an approval lapsed unused past its stated deadline) or "postponed_indefinitely". Splits that DID happen are not here (get_reverse_splits_list, view "recent"); one company's full history is get_reverse_split_lifecycle. Newest end first. Each row is the Reverse Splits page row (ticker, companyName, hasPage, ratio / ratioMin / ratioMax, trackerState, meetingDate, approvedDate, exchange, securityType, marketCapUsd, cik, approvalPath, domicile, splitAuthority, authorityTerms, verification) plus sourceUrl / sourceAccession and sourceDocuments (EVERY document behind the episode, each with accession or URL; cite them) and an "ended" block: outcome, outcomeLabel, endedOn, endedOnBasis, closedReason (the tracker's own note, verbatim), voteDate, closingAccession / closingUrl (the filing that closed it, when one did). 🔴 endedOnBasis says what endedOn IS: "vote_date" or "meeting_date" = the vote as stated; "authority_expiry" = the stated last day of the authority; "closing_filing" = the ET day of the filing that closed it; "recorded" = none of those, the day the TRACKER recorded the close, which can be later than the event. Say which. 🔴 NULL MEANS NOT MEASURED OR NOT STATED. An EMPTY list is what the tracker has on file for the window, never "no company abandoned a split"; completeness "tracked_episodes" = what the tracker has read from filings since it started, not every company. boundReached: true = the window held more episodes than one read returns; narrow it with from / to. 🔴 LOCKED ROWS ARE WITHHELD, NOT ABSENT. The facts are Signal8 Pro. A key not owned by a Pro account gets rows with locked: true and ONLY ticker, companyName, hasPage and exchange (access "preview", lockedCount); never read a locked row as anything but "facts withheld", and tell the user they need Signal8 Pro. outcome, from and to are Pro-only filters: on a non-Pro key they apply to unlocked rows only and locked rows are left out (filtersLimitedToUnlocked: true). exchange applies to every row. Page with limit and the nextCursor of the previous response (null = last page). available: false (reason "tracker_not_enabled") = the tracker is switched off; an HTTP 503 FEATURE_DISABLED = the Reverse Splits page is switched off. In both cases say it is unavailable and say nothing about any company. Describe what is on file; give no view on the company, its price, or what anyone should do.
readfalseunknown
get_etf_bundle
Get aggregated ETF data in a single call. Combines multiple data sources (profile, holdings, sector weightings, country exposure, performance, news, analyst coverage, and comparables) into one response. Each data type is cached independently. Specify which types to include or omit to get above-the-fold defaults (profile, stock-summary, holdings, sectors).
readfalseunknown
get_executives
Get key executives and officers of a company including name, title, compensation, and tenure. Use when researching company leadership or management quality.
readfalseunknown
get_exhibit_content
Get the full text/HTML content of a single exhibit from an SEC filing. Returns the exhibit text along with exhibit_type, description, company_name, accession_number, and form_type. Use the maxLength parameter to truncate large exhibits. Find exhibit IDs with get_filing_documents (`exhibitId`, by accession number) or get_filing_exhibits (by filing ID), or from search_filing_text matches (`exhibit_id`).
readfalseunknown
get_filing_calendar
Get the forward-looking 10-K / 10-Q SEC filing-deadline calendar within a date window. Optionally restrict to a universe (sp500/ndx/dji/all) and/or a list of form types (default both 10-K and 10-Q).
readfalseunknown
get_filing_document
Get the full raw text/HTML content of an SEC filing by its internal filing ID (the `id` on search_sec_filings rows, `filingId` from lookup_accession_number or get_filing_documents). Returns the complete filing document which can be very large (10-K filings can be 1MB+). Use the maxLength parameter to truncate content for previews. The response includes company_name, form_type, filing_date, cik, and accession_number alongside the content. Record-only filings (bodyStored: false) have no body here — open them on sec.gov. To read one exhibit rather than the whole submission, use get_filing_documents or get_filing_exhibits, then get_exhibit_content. For Form 3/4/5, 13F and SCHEDULE 13D/G, get_filing_structured returns parsed fields instead of XML. Coverage: Signal8's SEC EDGAR archive, updated through the day, in its held range (see `archiveFrom` in each response; currently from late 2021, expanding back to 2016 as the history backfill fills in). Before archiveFrom it holds only a scatter, so ABSENCE BEFORE archiveFrom IS NOT EVIDENCE a filing was never filed; check SEC EDGAR for earlier periods. Record-only rows (bodyStored: false) have no stored body; open them at their sec.gov URL.
readfalseunknown
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, or text not held) — open its `secUrl`. When `readableIdsResolved` is false the id lookup failed and exhibitId is omitted (not "none"); get_filing_exhibits(filingId) lists them. `stored: false` means Signal8 holds the filing record but not that document's body — it exists on EDGAR at `secUrl`. A filing not held in the archive returns a not-found error; its documents are still on EDGAR. Coverage: Signal8's SEC EDGAR archive, updated through the day, in its held range (see `archiveFrom` in each response; currently from late 2021, expanding back to 2016 as the history backfill fills in). Before archiveFrom it holds only a scatter, so ABSENCE BEFORE archiveFrom IS NOT EVIDENCE a filing was never filed; check SEC EDGAR for earlier periods. Record-only rows (bodyStored: false) have no stored body; open them at their sec.gov URL.
readfalseunknown
get_filing_exhibits
List the readable exhibits (individual documents with stored text) within an SEC filing, by internal filing ID. Returns each exhibit's `id`, exhibit type, description, content size and sec_url. Use the `id` with get_exhibit_content. Excludes XML/XBRL. For the COMPLETE document list of a filing by accession number (including files with no stored text), use get_filing_documents.
readfalseunknown
get_filing_structured
Parsed, machine-readable data from an ownership or holdings filing, by accession number. `kind`: "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` (per transaction: table nonDerivative/derivative, securityTitle, transactionDate, code, acquiredDisposed A/D, shares, pricePerShare, sharesOwnedAfter, ownership D/I; derivatives add exercisePrice, exerciseDate, expirationDate, underlyingTitle, underlyingShares); "thirteen_f" (13F-HR): period, holdings with cusip, issuer, shares/principal, put/call, discretion and voting; "schedule13" (XML SCHEDULE 13D/G, 2025 onward): reporting persons, percent of class, items. 13F VALUES: `valueThousands` is the raw filed number, whose unit changed from thousands to whole dollars for filings on/after 2023-01-03; use `valueUsd` / `totalMarketValueUsd` (dollars; null when the unit cannot be determined) and `valueUnit`. Holdings are capped at holdingsLimit (default 200); `holdingsTotal` is the full count, `holdingsTruncated` says whether rows were cut. NULL MEANS NOT STATED IN THE FILING, never zero (a gift with no price has pricePerShare null; `directShares` is null on a derivative-only Form 4). `parsed.transactions` ABSENT (not empty) means the table could not be read; totals still apply. `parsed: null` on a 13F means no information table (e.g. 13F-NT), not zero holdings. Unsupported forms, pre-2025 Schedule 13D/G and filings not in the archive return a not-found error with `details.reason`; read those with get_filing_document. Coverage: Signal8's SEC EDGAR archive, updated through the day, in its held range (see `archiveFrom` in each response; currently from late 2021, expanding back to 2016 as the history backfill fills in). Before archiveFrom it holds only a scatter, so ABSENCE BEFORE archiveFrom IS NOT EVIDENCE a filing was never filed; check SEC EDGAR for earlier periods. Record-only rows (bodyStored: false) have no stored body; open them at their sec.gov URL.
readfalseunknown
get_financials
Get income statement, balance sheet, and cash flow data for a company. Supports annual, quarterly, and trailing-twelve-month views. Use when analyzing revenue, profitability, debt, or cash position.
readfalseunknown
get_float
Get float data for a company: floatShares, floatDefinition, as-of date and, when the headline float is WITHHELD, the bounds and labelled stand-ins that replace it. CARDINAL RULE: null / absent / withheld means NOT MEASURED, never "no float", "no restricted shares" or zero. A numeric 0 is a MEASURED zero and passes a null check, so decide from the reason/marker fields ("floatWithheldReason", "restrictedBlockCount", "provenance", "direction"), never from the value alone. The share count the float was judged against ("basisSharesOutstanding") is DATED by "sharesOutstandingAsOf" + "sharesOutstandingAsOfKind" ("stated" / "checked" / "none" = date not recorded) and "sharesOutstandingSource"; never present the count without its date. "floatDefinition": "tradeable" (shares outstanding minus affiliates minus restricted/unregistered blocks; filing-derived snapshot tickers), "non_affiliate" (the SEC I.B.6 figure, which INCLUDES restricted shares held by non-affiliates; not a trader's float), "non_affiliate_estimate" (from ownership filings), "free_float" (vendor). "floatDefinition" and "source" appear only on snapshot results; read an ABSENT floatDefinition as "not a filing-derived tradeable float". "nonAffiliateFloatShares" (snapshot tickers) is the ONLY correct input to baby-shelf / I.B.6 math; never use the tradeable float there, and never present the non-affiliate figure as tradeable supply. PRECEDENCE: when the snapshot carries ANY figure ("floatEstimate", "tradeableFloatCeiling", an "affiliateBasis" range), "floatShares" stays null and THAT figure is the answer. A lower tier fills "floatShares" (its own "source" and definition, with "snapshotFloatWithheldReason" as provenance context, not a second refusal) only when the snapshot has no figure, or its only figure is a trivial ceiling (>= 99% of the share count), which is stripped. Floors, points, every "shares_outstanding_ceiling" and an "affiliate_sizing_estimate" (quote its "reason" and "unsizedAffiliates") are kept. A lower tier that also answered rides "otherSourceFloat" {floatShares, source, provenance:"other_source", floatDefinition, asOfDate} as a secondary "other source" line, never the float, never arithmetic. A lower-tier figure that predates a split the snapshot names, predates recorded issuances >= 10% of it, or falls outside the snapshot's bounds is REFUSED: "fallbackRefusal" {reason, refusedSource, detail}; do not fetch it from a vendor to fill the gap. "floatShares":null with "floatWithheldReason" set and no lower-tier figure means nothing could answer; do not substitute a vendor float of your own. RENDERING: print no "~", "<=" or ">=" glyph. A point (bound "point", or a "floatEstimate" with "statedAsOf" {asOf, source, events[]}) is the plain number + "as of <asOf>" + the caveat (the unsized later issuances in "statedAsOf.events"). A ceiling, floor or range is NOT a figure: write "float not stated (the filings put it at most / at least N; <reason>)". STAND-INS on a withheld result. NONE is a float and NONE may feed a market cap, percent-of-float, short-interest ratio, screen, sort or comparison. (1) "tradeableFloatCeiling": the tradeable float is AT MOST this (null = no bound, never 0). (2) "affiliateBasis.floatLowerBound" / "floatUpperBound": a range for the NON-AFFILIATE float (still includes non-affiliate restricted shares); each end is null independently. On a published float it is context only. (3) "floatEstimate" {shares, basis, direction, confidence, rung, bound, asOf, reason, qualifier, offBasis, statedAsOf, staleness}: quote "basis"; "direction" "overstates" = true float at most shares, "understates" = at least, "unknown"; "rung" names the ladder step; rung "best_estimate" is the most likely figure when every filing rung withheld ("basisKind" = what it rests on, "assumptions" = how each unsized holder was treated): report it AS an estimate with its assumptions, never a measurement. Quote "qualifier" with the figure. "offBasis": "pre_split_as_filed" (as of asOf, BEFORE "splitsAfter" [{ratio, effectiveDate, status}]), "ordinary_shares_unconverted" (ordinary shares, NOT ADSs), "count_predates_issuances" (dated cover count "countSource", later issuances uncounted); an offBasis figure is true ONLY with its label, so never state it without the label or compare it with a price, market cap, another float or a threshold. "staleness" flags a point older than 12 months or post-dated by a known issuance. An estimate never becomes floatShares; present shares WITH basis and direction. Unrelated to the boolean "floatEstimated" (a published floatShares back-derived from a USD public-float disclosure). (4) "vendorFallback" {floatShares, provenance:"vendor", floatDefinition:"free_float", asOfDate, splitAdjusted}: a third-party free float, not ours; present it as the vendor free float as of its date, never in the "Float" slot. "restrictedShares":null = NOT MEASURED (a block exists whose size the filings do not state), never zero; "restrictedBlockCount":0 is an answer. "affiliateBasisStale" (basisSpanDays, affiliateAnchorDate) labels an affiliate table materially older than the share count. "tradeableBasis":"convention_conservative" = a published convention resolved it (see "tradeableConvention"); do not present the figure as exact.
readfalseunknown
get_float_history
Get the POINT-IN-TIME float history for a company — one sample per trade date (float shares, shares outstanding, and the source the float came from). Use to answer "what was the float on date X" or to see float expand across a dilution event, which the latest-only get_float cannot show. IMPORTANT: this series is FORWARD-ONLY — it began accumulating in mid-2026 and is NOT backfilled, so early/absent history is expected and an empty rows array is a normal result, not an error or a delisted company. Each row carries "source" ("computed" | "sec_10k" or a market-data vendor tier) because float quality varies by provider — weigh rows accordingly rather than treating all sources as equal. Charged per your API tier.
readfalseunknown
get_historical_prices
Get historical OHLCV price candles for a stock. Supports daily, weekly, and monthly resolutions. Use period shorthand (1M, 3M, 6M, 1Y, 5Y, ALL) or explicit from/to UNIX timestamps. Default is 1 year of daily candles. Use this to compute price returns, chart price history, or analyze volume trends over time.
readfalseunknown
get_insider_cluster_buys
Detect cluster buying for a company: periods where 3+ distinct insiders bought shares (Form 4 open-market purchases, code P) within a 14-day window, over a lookback of 7, 30 or 90 days (default 90). Returns clusterBuyingDetected, the strongest clusterWindow, a summary (totalValue is null when no purchase disclosed a price, and is a floor when unpricedPurchaseCount > 0) and the deduped purchases. `asOf` and `lookback` state the date range covered; clusterBuyingDetected false means none in that range only.
readfalseunknown
get_insider_cross_company
Discover insider trading patterns across multiple companies. Unlike get_insiders which shows insider activity for a single ticker, this tool searches the entire universe to find insiders active across multiple companies, cluster buying patterns, and large transactions. Filter by insider name, transaction type, or date range. Cluster buying is computed only for purchases (transactionType P, the default). Useful for detecting coordinated insider activity, cross-company insider networks, and market-wide buying/selling trends.
readfalseunknown
get_insider_positions
Get current open insider positions for a CIK (either an insider or an issuer). If an issuer (company) CIK is supplied, returns all insiders' positions for that company. If an insider (reporting-person) CIK is supplied, returns that insider's open positions across all issuers they have filed Form 4 for. The response includes a `lookupMode` field (`"issuer"` or `"insider"`) indicating which interpretation matched. Derived from Form 4 filings.
readfalseunknown
get_insider_positions_by_ticker
Get per-insider position aggregates for a given ticker — which insiders hold positions in the stock and their aggregate cost/value. Derived from Form 4 filings. NOT LIFETIME: every figure covers only the Form 4 history Signal8 holds, which starts at the response's `coverageStart` date (also repeated on each row) — say "since <coverageStart>", never "lifetime" or "all-time". Each row carries `costBasisStatus`: `complete` (every share the history knows was bought inside coverage), `partial` (the holding predates coverage, so `weightedAvgCost` averages only in-coverage priced buys and is NOT the cost of the position), or `unknown` (the first in-coverage event was a sale, or there was no priced buy — `weightedAvgCost`/`costBasisTotal` are null, which means NOT MEASURED, never zero cost).
readfalseunknown
get_insider_transactions
Get detailed insider transaction history for a company from Form 4 filings. Returns individual buy/sell transactions with insider name, title, shares, price, and transaction codes. Supports pagination for companies with extensive insider activity. Filter by year/month to narrow results, or use transactionCode to find only purchases (P), sales (S), etc. Useful for 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.
readfalseunknown
get_insiders
Get insider trading discovery data for a company. Includes cluster buying detection, entity-centric insider model, and Form 4 cross-referencing. Shows insider transactions with buying/selling patterns that may signal upcoming corporate actions. Each insider includes a transactionBreakdown by SEC code (P=Purchase, S=Sale, F=Tax withholding, M=Exercise, G=Gift, A=Award), netSharesSold12m (code S only, excludes tax withholding), and isPrimarilyTaxWithholding flag to distinguish routine RSU vesting from discretionary selling. Supports pagination with limit/offset.
readfalseunknown
get_institution_activity
Get an institution's position changes over recent 13F periods by CIK. Reads the number of trailing periods to include.
readfalseunknown
get_institution_derivatives
Get an institution's reported PUT/CALL derivative positions by CIK (13F options), with pagination and sorting.
readfalseunknown
get_institution_detail
Get detailed information about a specific institutional investor by their SEC CIK number. Returns the institution name, total AUM, number of holdings, and filing history. Use get_institutions first to find the CIK for an institution.
readfalseunknown
get_institution_filings
Get the list of 13F filings for an institution by CIK, with pagination.
readfalseunknown
get_institution_holdings
Get the full portfolio holdings for a specific institution by CIK. Returns all positions from their latest 13F filing with shares, value, and portfolio weight. Supports pagination for institutions with large portfolios.
readfalseunknown
get_institution_portfolio_analytics
Get sector allocation and top holdings analytics for an institution's portfolio by CIK.
readfalseunknown
get_institution_position_changes
Diff two quarterly 13F snapshots for an institution. Compares the latest filing against the prior quarter and returns per-position changes: new positions, increased, decreased, and exited. Sorted by |changePercent| descending so the biggest moves surface first. Much more efficient than calling get_institution_holdings twice and diffing client-side — the server computes everything in a single SQL query.
readfalseunknown
get_institution_top_aum
Discover top institutional holders across the entire company universe ranked by assets under management (AUM). Unlike get_ownership which shows institutions for a single company, this tool searches across all companies to find the largest institutional players. Optionally set a minimum AUM. Useful for identifying smart money flows and major institutional positioning trends.
readfalseunknown
get_institutions
Get institutional holders (13F filers) for a company. Returns institutions that hold positions in this stock based on SEC 13F filings, including shares held, portfolio weight, and filing dates. Useful for understanding institutional ownership concentration.
readfalseunknown
get_institutions_leaderboards
Two market-wide institution leaderboards in one call: topByAum (largest holders by assets under management, name-deduped) and mostActive (highest 13F position-change volume). No CIK required. For the full paginated AUM list use get_institution_top_aum.
readfalseunknown
get_intraday_bars
Get intraday OHLCV candles at 1, 5, 15, 30, or 60-minute resolution. Use for intraday price action analysis, volume patterns, and short-term technical analysis. Returns open, high, low, close, and volume for each bar. Set extended=true to include premarket (04:00–09:30 ET) and after-hours (16:00–20:00 ET) bars.
readfalseunknown
get_learn_guide
Free: works without an API key or Pro plan (the hosted server only needs a signed-in account). 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.
readfalseunknown
get_legislative_calendar
Forward-looking legislative catalyst calendar: upcoming House/Senate floor votes (bills and Senate cloture motions) filtered to items that can move tickers. Each item includes the predicted vote window (start/end/granularity/confidence/provenance), marketRelevance (low/medium/high), significance (1-5), affected sectors with direction + mechanism, verified affected tickers with evidence quotes, pass outlook, considerationProcedure (suspension-calendar bills pass ~98% of the time), a conflictBadge when the sponsor traded a verified affected ticker, and tweet/plain summaries. An EMPTY calendar is a normal state — it means nothing market-relevant is scheduled in the window, not an error. Defaults: from=today, to=+14 days, minRelevance=low. IMPORTANT: affectedTickers contains VERIFIED rows only — every ticker carries a verbatim evidenceQuote substring-verified against the actual bill text (no hallucinated tickers). sponsorTradeFacts are restatements of public STOCK Act disclosures with verbatim amount brackets and BOTH transactionDate AND disclosureDate — always cite both dates together (disclosures lag trades by up to 45 days), and never present a fact as evidence of wrongdoing. Vote windows are predictions: check window.provenance for trust level ('uc_explicit' is exact; 'rule_xxii_computed' is a medium-confidence estimate) and window.granularity for how precise the window is (exact time vs day vs week).
readfalseunknown
get_market_breadth
Get market breadth aggregates (advance/decline counts and ratio, percent of constituents above their 50DMA and 200DMA, and counts of new 52-week highs/lows) for a chosen universe (sp500, ndx, or all). Use to add market-state context to commentary, tweets, or daily summaries.
readfalseunknown
get_market_metrics
Get computed market metrics for a company including volume averages, volatility, SMAs, and trend direction. Use when analyzing trading patterns or technical indicators beyond the basic quote.
readfalseunknown
get_market_news
Get the latest market-wide news across ALL tickers, most recent first. Every item is significance-classified at ingest (critical | major | standard); the default filter of critical,major is the "top stories" view. Use for "what is happening in the market right now" — for news about one company, use get_news with a ticker instead. Requires the /news/latest public endpoint (added 2026-07-29; 404 until that backend deploy).
readfalseunknown
get_news
Get recent news articles, 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 press releases (no filings).
readfalseunknown
get_ownership
Get the unified ownership breakdown for a company, combining Form 4 insider holdings, 13F institutional holdings and 13D/13G activist positions, resolved across the three form types into one view. allHolders is paginated via limit/offset (default 100); aggregate stats (institutional / insider / beneficial totals and percentages, plus `retail`) are always complete. `sharesOutstanding`, the denominator of every percentage, is DATED by `sharesOutstandingAsOf` + `sharesOutstandingAsOfKind` ("stated" = issuer's statement date; "checked" = last confirmed against a vendor; "none" = date not recorded) and `sharesOutstandingSource`; never present a count without its date. `retail` is the UNATTRIBUTED residual (shares no filing accounts for, including recent offering buyers and non-filing holders): an upper bound on retail, never a retail count; withheld (null) with `retail.reason: "filed_exceeds_outstanding"` when counted filings exceed shares outstanding. 🔴 A bucket whose shares exceed shares outstanding by more than a 2% timing tolerance has `percentOfOutstanding` WITHHELD (null, `percentWithheldReason: "ownership_exceeds_outstanding"`) with `totalShares` still published (e.g. another share basis such as ordinary shares vs ADSs, another class, lent shares reported twice, filings predating a buyback). Report the shares and the reason; NEVER present it as 100%, 0% or any percent. Then `retail.reason` is `ownership_exceeds_outstanding` and `filedSumPercent` is absent. A null percent with NO `percentWithheldReason` means no share count was available. `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 holder family: not a deduction. `reaffirmedBy` names the newer filing; `staleFiling.ageMonths` marks a row with none. `stalePercentOfOutstanding: null` is not measurable, never zero.
readfalseunknown
get_policy_events
List mirrored executive orders (policy events) from the Federal Register feed. Filter by signing-date range, affected sector, or free-text title query. Each event includes its Federal Register document number (externalId), title, signing date (eventDate), normalized affected sectors, full-text URL, and flaggedTradeCount — the number of official trades that occurred in an affected sector near the signing date. IMPORTANT: matches are sector-level co-occurrence — the official traded a stock in a sector the executive order affects, within a window of its signing date. Sector matches are broad and many trades will coincide with policy activity by chance; a match is a starting point for research, not evidence of foreknowledge. The matchBasis field describes match strength only ('sector' = broad sector match), never culpability, and matchCount shows how many EOs matched in the window (a noise indicator).
readfalseunknown
get_policy_trade_leaderboard
Rank politicians (Congress + executive branch) by trades that occurred near executive-order signings in sectors the orders affect. Each row includes the politician, flaggedTradeCount, totalEstimatedUsd, topSector, and an exampleEvent. Use for "who trades most around policy activity" style questions. Defaults to the same "traded 1-14 days before signing" lens as get_policy_trade_overlap; same-day trades are always excluded. IMPORTANT: matches are sector-level co-occurrence — the official traded a stock in a sector the executive order affects, within a window of its signing date. Sector matches are broad and many trades will coincide with policy activity by chance; a match is a starting point for research, not evidence of foreknowledge. The matchBasis field describes match strength only ('sector' = broad sector match), never culpability, and matchCount shows how many EOs matched in the window (a noise indicator).
readfalseunknown
get_policy_trade_overlap
For a single politician, list trades that occurred within a window of days before or after the signing of an executive order affecting the traded sector. Each row contains the trade, the nearestEvent, daysDelta (negative = traded N days before EO signing, positive = traded N days after), matchBasis, and matchCount, plus a summary (totalFlags, totalEstimatedUsd, topSector). Defaults to trades 1-14 days BEFORE signing; same-day trades are always excluded (intraday ordering is unknowable). Executive-branch (exec-) slugs return REAL data here: both congressional and executive trade sources feed the overlap computation. IMPORTANT: matches are sector-level co-occurrence — the official traded a stock in a sector the executive order affects, within a window of its signing date. Sector matches are broad and many trades will coincide with policy activity by chance; a match is a starting point for research, not evidence of foreknowledge. The matchBasis field describes match strength only ('sector' = broad sector match), never culpability, and matchCount shows how many EOs matched in the window (a noise indicator).
readfalseunknown
get_political_sector_rotation
Which market SECTORS politicians have been trading in over a trailing window. Aggregates congressional + executive trades by sector and returns, per sector: trade count, total dollar volume, number of distinct politicians, and the top tickers. Use it to see where political trading activity is concentrating (e.g. "politicians piled into Energy this month"). Sort by count or dollar volume.
readfalseunknown
get_politician_activity
Get activity metrics for a politician broken down by period (30d, 90d, 1y, all-time). Includes buy/sell counts and values per period, most traded tickers (top 10), and transaction type breakdown. Useful for analyzing trading patterns over time.
readfalseunknown
get_politician_committees
Get committee assignments for a politician including committee name, chamber, role (Chair, Ranking Member, etc.), and subcommittee memberships. Use to correlate trading activity with committee oversight areas. Requires a politician slug (e.g. "sen-nancy-pelosi") -- use get_politicians first to find the slug.
readfalseunknown
get_politician_detail
Get the full profile for a politician including party, state, chamber, trade statistics, filing delay metrics, most traded sector, and their 10 most recent transactions. Use get_politicians first to find the slug (e.g. "sen-nancy-pelosi").
readfalseunknown
get_politician_disclosures
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 again at once when hasMore is true. Without `since` only disclosures that became complete in the last 48h are returned. A report is emitted only after no new row of it has arrived for a settle window (~8h), so items lag the filing by 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 null means the bracket was not parsed (never $0), amountMax null means "Over $50,000,000" or unparsed, ticker null means a non-equity asset.
readfalseunknown
get_politician_donor_summary
Get a bundled donor summary for a single politician: cycle totals (raised, spent, cash-on-hand, debts), donor count, top 10 individual donors, and top 10 PAC donors — all in one response. This is the right tool for "who funds <politician>" or "biggest donors to <politician>" style questions. For the full paginated list, use get_politician_donors.
readfalseunknown
get_politician_donors
Get the paginated list of campaign donors (individuals and PACs) for a single politician across one election cycle. Returns donor name, amount, type, employer/occupation (individuals), and committee details (PACs). Use this when a user asks "who donated to <politician>" or wants the full donor list. For a quick top-10 + cycle totals overview, use get_politician_donor_summary instead.
readfalseunknown
get_politician_late_filers
Get STOCK Act late filings -- trades whose disclosure was filed more than 45 days after the transaction, the latest the STOCK Act allows. A fact about the dates on the report: an extension, an amendment or a late notice of the trade can each explain a long gap, so never describe it as illegal or a violation. Sorted by filing delay descending. Excludes trades whose transaction date is suspect (a probable mistyped year upstream: ~one year off the rest of its own on-time filing) -- their delay is not measured. owner null means not stated, never "Self".
readfalseunknown
get_politician_pnl
Get estimated realized + unrealized profit & loss for a politician. Methodology: each disclosed trade amount range is converted to an estimated share count using the stock's historical market price on the transaction date, then FIFO-matched on SHARES (realized = (sellPrice − buyPrice) × matched shares); open positions are marked to the current price for unrealized P&L. Works for Congress (sen-/rep-) AND executive branch (exec-) officials. Response includes a `totals` object (estimatedRealizedPnl, estimatedUnrealizedPnl, winRate, realizedTrades, tickersTraded) and a `byTicker[]` breakdown (estimatedShares, avgCostBasis, currentPrice, realizedPnl, unrealizedPnl, unrealizedPnlPercent) — byTicker open positions double as the estimated holdings. All figures are ESTIMATES (±25-40% from disclosure bracket width). Use get_politicians first to find the slug.
readfalseunknown
get_politician_recent_trades
Get recent STOCK Act trades across all politicians. Each trade includes the senator info, ticker, transaction type, amount, and filing delay. Filter by direction (buy/sell) and lookback period. Useful for monitoring current congressional trading activity.
readfalseunknown
get_politician_roles
Get committee leadership roles (Chair, Ranking Member, etc.) for a politician. Use get_politicians first to find the slug.
readfalseunknown
get_politician_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 them; the card already prints "Estimates from disclosed amount ranges (±25–40%). Not investment advice." WHAT THE METRIC IS (read `metric`): P&L on trades DISCLOSED INSIDE the window only — realized on round trips opened and closed in the window plus unrealized on positions opened in the window. It is NOT lifetime P&L; sales of positions bought before the window are not counted. Eligibility: at least 5 trades in the window (eligibility.minTradesInWindow), so a single lucky trade cannot top the board. Each row: slug, fullTitle ("Senator", "Representative", or an executive official's filed title), fullName, displayName, party and state as full words, estimatedPnl, winRate (0-1; null = no position closed in the window — not measured, never 0%), tradesInWindow, unrealizedMeasured, and portraitUrl (always null for executive officials). Use the full title and full party/state words — never "Sen." or "D-CA". benchmark.available false means SPY was NOT measured (benchmark.reason) — never 0%. available false with reason "pending" means the window has not been computed yet, not that nobody traded.
readfalseunknown
get_politician_transactions
Get paginated trade history for a specific politician. Returns individual STOCK Act disclosures with ticker, transaction type, amount range, filing delay, and late filing flag. Includes a summary with total buys/sells and net value.
readfalseunknown
get_politician_votes
Get voting records for a politician by slug. Returns congressional votes with bill info, position (Yea/Nay/Not Voting), and result. Useful for assessing alignment between a politician's votes and their trading positions. Requires Bioguide ID resolution.
readfalseunknown
get_politicians
List and search congressional politicians who have STOCK Act trading disclosures. Filter by party (D/R/I), state, or search by name. Returns paginated results with trade counts, last trade date, and net buy/sell direction over the trailing 12 months.
readfalseunknown
get_politicians_most_active
Discover the most active congressional traders ranked by trade count within a lookback period. Returns each politician with trade count, tickers traded, buy/sell values, and top tickers. Useful for identifying the most prolific political traders.
readfalseunknown
get_politicians_pnl_leaderboard
Rank politicians (Congress + executive branch) by estimated trading P&L across the universe. Sort by total P&L, win rate, or traded volume. P&L uses price-adjusted share estimation: disclosed amount ranges → estimated shares via historical price → FIFO on shares → open positions marked to current price. Figures are ESTIMATES (±25-40% from disclosure bracket width).
readfalseunknown
get_post_earnings_movers
Get stocks that moved significantly after earnings reports on a given date. Returns pre-computed price changes with earnings surprise data in a single call — no need to chain get_earnings_calendar + get_historical_prices + get_quote per ticker. Includes preEarningsClose, currentPrice, changePct, EPS/revenue actuals vs estimates, and surprise percentages. Filter by minimum absolute % change threshold.
writetrueunknown
get_premarket_scan_history
Historical MARKET-WIDE premarket scan for one PAST ET trade date: every ticker with that day's premarket (default) session volume and its RVOL vs the trailing 30-day same-session baseline (the same math as get_rvol_history, across the market for one date). Filter by RVOL, market cap, price and float to backtest screens like "sub-$500M tickers with premarket RVOL > 5 on 2026-07-20"; rows ranked by RVOL descending. A future or non-trading date returns an empty list with a reason (not an error). Each row reports "baselineState" (why its RVOL is or is not null), "advRatio" (volume ÷ trailing 30-session average FULL-DAY volume), "advDays", and the RVOL denominator "baselineVolume" with "baselineThin" (true under 200 shares): a 90x RVOL off a 1-share baseline is arithmetically correct and analytically worthless, mostly an early-asOfTime effect on liquid large caps; screen it out with minBaselineVolume / minSessionVolume. includeNoHistory=true surfaces high-volume tickers with no computable RVOL (e.g. first-session listings). meta reports asOfApplied / asOfIgnored / asOfIgnoredReason, so an unhonoured time-of-day request is visible. Tickers with no screener value for a price / market-cap / float filter (just renamed or listed) are NEVER silently dropped: "meta.unscreened" reports their count, filter families and tickers, and includeUnscreened=true returns them tagged "unscreenedFilters"; treat that tag as NOT MEASURED, not out of range. Charged per your API tier.
readfalseunknown
get_premarket_scanner
Get the live premarket scanner board: top premarket gainers and losers by absolute gap %, each row enriched with rvol, marketCap, floatShares, short interest, dilution and news/catalyst flags. Off-hours it falls back to the last session. Use for premarket small-cap runner discovery; includePennyStocks=true includes sub-$1 names. FLOAT: floatShares is the measured POINT float (null on a withheld dilution-snapshot row, which then carries "floatEstimate" {shares, bound: "point" | "ceiling" | "floor", basis}). Print a point as the plain number with its as-of and caveat; a ceiling / floor is a BOUND: say "float not stated (at most / at least N)", never the bare number, a "~" / "<=" / ">=" glyph or arithmetic; neither present = not measured, never 0. The low-float board admits on that figure's VALUE (an 8M ceiling is in, a 26M floor is out). COMPLIANCE: row "compliance", the compliance/split badges, "reverseSplitSignal" and "deficiencySignal" are Signal8 Pro; for other callers "compliance" is null with "complianceWithheld": "pro_required": WITHHELD, which is not "not measured" and never "no deficiency". LIVE VOLUME (04:00–09:30 ET only; null outside the window or until the baseline is warm, never fabricated): two DIFFERENT metrics, never substitute them for each other or for "rvol". "liveRvol" = live cumulative premarket volume ÷ the trailing 30-session average cumulative volume AT THE SAME TIME OF MORNING, with "liveRvolAsOf" the 15-minute grid cutoff (compare with meta.asOf for time skew); "premarketPaceRatio" = the same volume ÷ the trailing 30-session average FULL premarket session (>1.0 = already beat a normal premarket). universe="lowfloat" returns the separate LOW-FLOAT board (float under 10M, no top-100 slice) from the aggregator snapshot; an empty rows array with meta.reason when none is published is a normal off-hours state. Charged per your API tier.
readfalseunknown
get_price_target
Get analyst price target data for a ticker. By default returns the consensus / split-adjusted average price target. Set list=true to return the full per-analyst list of individual price targets instead.
readfalseunknown
get_quote
Get the current stock quote for a company including price, volume, change, market cap, and other real-time market data. Use this when a user asks about a stock's current price or trading activity. Always includes halted/haltCode/haltReason/haltedAt/resumptionAt trading-halt fields (false/null when trading normally); a halted ticker returns the last-known quote instead of an error, or currentPrice:null + halted:true when nothing is recoverable. priceAsOfDate is the ET date the price PRINTED (priceAsOf the trade time when known), not when it was read; priceIsStale true means it is an older held close, so say "last traded at $X on <date>", never "trading at" or "today"; null = print date not measured. 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. 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. 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` ("stated_as_of" = the ISSUER's last stated count, a dated point; the filings record later issuances LISTED in `statedAsOf.events`, not added — "at_least" is the retired name of the same state) and `marketCapEstimated: true` with `marketCapAsOf` (the count's date). Render a stated_as_of count WITH its date and its events ("2,357,498 as of 2026-10-08 · plus an offering closed 2026-10-09 whose share count is not stated"); never as a bound, never as today's count.
readfalseunknown
get_recent_congressional_votes
Get recent congressional roll-call votes across all members, sourced from GovTrack (both chambers as available — currently Senate-heavy). Each vote includes member, bill info, position, and result.
readfalseunknown
get_recent_material_filings
Recent material 8-K filings (last 7 days) for the constituents of an index universe. By default returns the high-signal 8-K item codes (material agreements, M&A, executive changes, restructurings, etc.); pass `items` to filter to specific 8-K item codes. Choose the universe with `universe`.
readfalseunknown
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 before, and dayOffset exists for catch-up reads of past days, NOT for forecasting — a positive offset returns nothing. Never frame these as upcoming, tomorrow, or expected; they have already happened. 🔴 newSymbol: null IS A FIRST-CLASS PUBLISHED STATE, NOT A MISSING FIELD. FINRA's row names only the OLD OTC symbol; the new ticker is resolved by company-name match against Nasdaq SymDir and sometimes cannot be resolved. A guessed or wrong ticker would name a company that did not uplist, so an unresolved row is published naming the OLD symbol and saying the new one was not resolved. DO NOT infer, guess, look up, or fill in a null newSymbol, and do not drop the row. confirmed: false means the symbol resolution is PROVISIONAL — render it as provisional, keep it out of any headline, and do not assert the new ticker as fact. Only confirmed: true is a confirmed resolution. 🔴 capUnknownCount IS A WITHHOLDING COUNT, NOT A ZERO — rows that cleared every other filter but have NO measured market cap, so they cannot be asserted to sit under the stated ceiling. It does not mean those companies have no cap. Disclose the count if you publish a cap-bracketed framing. AN EMPTY uplistings ARRAY IS THE NORMAL, EXPECTED RESULT ON MOST DAYS — uplistings run roughly 6.6 per month across ALL market caps, so the large majority of days genuinely have none. It is NOT an error, NOT an outage, and NOT evidence that uplisting activity has stopped. Publish nothing rather than publishing an empty-list framing.
readfalseunknown
get_recently_sponsored_bills
Get the most recently introduced bills across all congressional sponsors. Each bill includes the sponsor block (bioguideId, fullName, party, state, politicianSlug) so persona agents can link directly to the sponsor detail page. politicianSlug is null when the sponsor is no longer in the active roster (typically ex-members). Requires CONGRESS_API_KEY on the backend.
readfalseunknown
get_reverse_split_authority
Screen companies whose BOARD still holds reverse-split authority it may use WITHOUT ANOTHER shareholder vote: an approval on file (shareholder vote or written consent; tracker states consent_pending, voted_approved, ratio_fixed) not past a stated expiry, one row per company (its newest approval; other live ones in otherLiveAuthorityEpisodeIds). Soonest stated expiry first. Each row is the Reverse Splits page row (ticker, companyName, ratio, exchange, approvalPath, domicile, splitAuthority, authorityTerms, sourceUrl / sourceAccession, sourceDocuments: every document behind the approval with accession or URL; cite them) plus an "authority" block: episodeId, state, approvedDate, approvedRatio {fixed, min, max} (the per-split ratio or range approved), cumulativeCap (cap on the PRODUCT of every split drawn on it), multiStep, expiresOn, expiryTerm, daysUntilExpiry, and room: capRatio + capBasis ("cumulative_cap", or "single_split_maximum" = no cumulative cap stated and nothing drawn, so one split up to the approved maximum), perSplitMax, usedSplits + usedRatio (product of the splits already executed on it; 1 = none drawn), remainingRatio (capRatio / usedRatio), exhausted, nextSplitMax, pendingRatio (a ratio the board set that has not taken effect) and a one-line label. The approval route is approvalPath.path (shareholder_vote, written_consent, fpi_written_resolution, pre_approved_range, board_only, depositary_ratio_change or unknown = "Not determined", never "no vote"). Ratios are 1-for-N factors and combine by product. 🔴 NOT MEASURED IS NEVER "NONE REMAINING". room.remainingRatio null comes with room.notMeasuredReason: "cumulative_cap_not_stated", "ratio_not_stated" or "drawn_split_ratio_not_stated"; say the remaining room is not measured and why. Such rows are LISTED, never dropped, and never read as full. expiresOn null = the documents read state no expiry, NOT "never expires". An empty list is what the tracker has on file, never "no board holds authority". This screen covers approvals on file; a board that may split under its statute or charter with no approval at all shows as splitAuthority.boardMayActWithoutVote on a row and in get_reverse_split_lifecycle, and is not listed here on that basis alone. 🔴 LOCKED ROWS ARE WITHHELD, NOT ABSENT. The facts are Signal8 Pro: a key not owned by a Pro account gets rows with locked: true and only ticker, companyName, hasPage and exchange (access "preview", lockedCount); tell the user the facts need Signal8 Pro. minRemaining and expiringBefore are Pro-only filters (on a non-Pro key they apply to unlocked rows only; filtersLimitedToUnlocked: true). A row whose remaining room or expiry is not measured never matches those filters; excludedNotMeasured counts how many were left out for that reason, so report it. Page with limit and nextCursor. available: false or an HTTP 503 FEATURE_DISABLED = unavailable: say so and say nothing about any company. Describe what is on file; give no view on whether a split will happen, what it means for the price, or what anyone should do.
readfalseunknown
get_reverse_split_lifecycle
Get the reverse-split LIFECYCLE Signal8 has tracked from a company's own SEC filings (proxies, 8-K Items 3.03/5.03/5.07, 6-Ks): one episode per split authority, newest first, each with its state (proposed, vote scheduled, approved, ratio set, effective date announced, charter filed, … or closed), the ratio or authorised range, meeting / vote / effective dates, the state history, and the events behind it oldest first. Every event carries its source (accession and an EDGAR sourceUrl) and its facts; every STATED fact carries the VERBATIM QUOTE it was read from — cite the quote and link the source rather than paraphrasing. 🔴 NOT STATED IS NOT MEASURED, NEVER "NO". A fact with notStated:true (or a null field) means the documents read did not say it — never that it is false, zero or absent. coverage "unresolved" means the ticker could not be matched to an SEC registrant: NOT MEASURED. coverage "tracked" with an EMPTY episodes list means no episode has been tracked from the filings read since the tracker started — it is NOT evidence that no reverse split is planned; never say "no reverse split". effectiveDate is the date the ISSUER STATED, strictly parsed: a SCHEDULED date, not a confirmation that the split happened (it can be postponed or abandoned). A conditional date ("the 25th trading day after the Trigger Event") is returned VERBATIM in effectiveCondition and is never a date — do not compute one from it. verification is copied from the tracker: "provisional" = one source, not cross-checked (the default, not "doubtful"); "verified" = cross-checked. APPROVAL (present only when approvalAvailable is true): each episode carries approvalPath {path, label, quote, sourceUrl} — shareholder_vote, written_consent, fpi_written_resolution, pre_approved_range (the board set the ratio inside a range shareholders approved earlier), board_only (the company's OWN filing states no shareholder approval was required, quoted), depositary_ratio_change (an ADS ratio change by the depositary, no shareholder vote, the ordinary shares not consolidated) or unknown. The response also carries domicile {code, label, group, source} (EDGAR, else the latest 10-K / 20-F cover; null = NOT MEASURED, never "Delaware") and splitAuthority {authority, basis, label, boardMayActWithoutVote, conditions, statute, quote, sourceUrl}. Only basis own_prior_board_only_announcement or charter_clause means the board can split without a vote. 🔴 authority "unknown" or basis "domicile_default_only" is NOT A FINDING: it only says what the domicile's law allows by default (e.g. "Domicile may permit board action; charter not checked") — never say this company can split without a vote on it. vote_required appears only as a labelled domicile default, never as a statement that a vote is needed. path "unknown" is not "no vote"; quote the evidence, never infer a path from a missing proxy. An HTTP 503 FEATURE_DISABLED means the lifecycle tracker is switched off: report that it is unavailable and say nothing about the company's splits.
readfalseunknown
get_reverse_splits_list
Get the cross-company reverse-split lists the Signal8 Reverse Splits page serves: ONE view per call. view "upcoming" = splits with an effective date from tomorrow through 30 US market days ahead, the vendor market calendar UNION Signal8's SEC-filing tracker (filings, exchange and depositary notices); "recent" = the same union for effective dates in the past 30 days; "approved_no_date" = tracked episodes where shareholders (or the board, where no vote is required) have APPROVED a reverse split but no effective date is stated yet; "vote_pending" = tracked episodes where a reverse split is PROPOSED and the shareholder vote has NOT happened yet. A security sits on exactly one view (upcoming, then recent, then approved_no_date, then vote_pending). Each row carries ticker, companyName, hasPage, source ("market_calendar" or "tracker"), stage + stageLabel, trackerState, ratio (or ratioMin / ratioMax for an authorised range), meetingDate, approvedDate, effectiveDate, effectiveDateSource, marketCalendarAgrees / marketCalendarDate / marketCalendarRatio, effectiveCondition, verification, marketConfirmation (recent only), marketCapUsd + capBucket, securityType, exchange, cik, sourceUrl / sourceAccession / sourceFormType / sourceFiledDate / sourceLabel, sourceDocuments (every document behind the episode), quote, adsRatioChange, approvalPath, domicile, splitAuthority and authorityTerms. 🔴 NULL MEANS NOT MEASURED OR NOT STATED, NEVER "NO SPLIT", never zero, never "no vote needed", never "no date". A null ratio = the documents state none yet; a null marketCapUsd = cap not measured (capBucket is then null, never "nano"); a null verification = no tracked episode; a null domicile = not measured (never "Delaware"); a null marketConfirmation = the price step was not measured. An EMPTY rows array on a view is normal and is not evidence that no company is splitting. completeness says what the view is: "scheduled_as_of_now" (upcoming) and "recorded_as_of_now" (recent) are what is KNOWN as of now, never "all reverse splits"; "tracked_episodes" is what the tracker has read from filings since it started, never every company. A scheduled split can still be postponed or cancelled: say "scheduled", never "confirmed" or "will". 🔴 DATES. effectiveDate is the SCHEDULED effective date (vendor calendar, or the issuer-stated date strictly parsed from the filing); a filing or listing-rule DEADLINE is never an effective date and never appears in this field. A conditional date ("the 25th trading day after...") is returned VERBATIM in effectiveCondition and is never a date: do not compute one. effectiveDateSource says where effectiveDate came from: "filing" = the issuer stated it; "market_calendar" = the filing states no date and the vendor calendar supplies it. marketCalendarAgrees is a CROSS-CHECK on a tracker row the calendar also lists: true = same date and ratio; false = at least one differs and marketCalendarDate / marketCalendarRatio hold the calendar's value (the filing wins; report the disagreement, do not pick one); null or absent = not compared (no calendar row). meetingDate is the shareholder meeting date, not the split date. APPROVAL AND AUTHORITY. approvalPath.path is shareholder_vote, written_consent, fpi_written_resolution, pre_approved_range (the board sets the ratio inside a range shareholders approved earlier), board_only (the issuer's OWN filing says no shareholder approval is required, quoted), depositary_ratio_change (an ADS ratio change by the depositary, no vote) or unknown ("Not determined", not "no vote"). splitAuthority.boardMayActWithoutVote is true ONLY from the issuer's own filing or charter; a domicile default alone is not a finding. authorityTerms is the authority behind the episode: a cumulativeCap (the board may split in STEPS, each within the cap, without a new vote until the authority expires), multiStep, the expiry, and what executed splits already used. null = the documents state nothing beyond the ratio. 🔴 LOCKED ROWS ARE WITHHELD, NOT ABSENT. The split facts on every view are Signal8 Pro. A caller whose API key is not owned by a Pro account gets EVERY row with locked: true and ONLY ticker, companyName, hasPage and exchange on it; the response then says access: "preview", lockedCount = how many rows are locked, and rowLimit. A locked row means the facts exist and were not shown to this caller: never read it as "no split", never guess the missing fields from another source, and tell the user the facts need Signal8 Pro. access: "full" = every row carries its facts. filtersLimitedToUnlocked: true = a board / domicile filter was applied to unlocked rows only (locked rows are left out entirely, because matching them would reveal the fact through membership). FILTERS apply server-side: cap (scanner buckets), type (security type), exchange, board ("without_vote": the board can split without a vote, from the issuer's own filing) and domicile. Each accepts "not_measured" to select rows where that fact was not measured; an unmeasured row never matches a measured bucket. totalCount is the filtered list (locked rows included), unfilteredCount the view before filters, capUnknownCount the rows whose cap was not measured (on the calendar views). Page with limit / offset; truncated: true = more rows exist. available: false with reason "tracker_not_enabled" (the two tracker views) means the tracker is switched off: say it is unavailable, not that nothing is pending. An HTTP 503 FEATURE_DISABLED means the page is switched off: report that it is unavailable and say nothing about any company's split. Describe what is on file; give no view on whether a split will happen, what it means for the price, or what anyone should do.
readfalseunknown
get_rvol_history
Get the per-day relative-volume (RVOL) time series for a ticker, bucketed by trading session (premarket 04:00–09:30 ET, regular 09:30–16:00, afterhours 16:00–20:00, or all four). Each day's RVOL compares that session's volume to a trailing same-session baseline (30 trading days by default — configurable via "baselineDays"), so premarket volume is judged against premarket history (not a stale full-day figure). Use for spotting unusual premarket / session volume surges over the last N days. Each point also carries "baselineState" — "ready" (rvol is populated), "warming" (baseline not yet warm), "no-cutoff-history" (established ticker that never traded at this session/cutoff before) or "no-history" (new listing, no prior trading history at all) — so a null rvol is explained rather than silent. Points additionally carry "advRatio" (that day's volume ÷ the trailing 30-session average FULL-DAY volume, null when no full-day denominator exists) and "advDays" (its sample size), which give a magnitude to points RVOL cannot rate. advRatio is NOT an RVOL — it compares a partial session to a whole day, so it is typically well under 1 and must not be compared to rvol. Charged per your API tier.
readfalseunknown
get_senate_trades_by_ticker
Reverse lookup — find which politicians recently traded a given TICKER. Returns recent STOCK Act disclosures for that symbol with politician info, transaction type, and amount.
readfalseunknown
get_short_interest
Get short interest data for a company including short volume, short ratio, days to cover, and short percent of float. Use when 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; "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%.
readfalseunknown
get_split_history
Get stock split history for a company including forward and reverse splits with dates, ratios, type classification, and cumulative 2-year reverse split ratio. Relevant for NASDAQ/NYSE minimum 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. NOT EVERY VENDOR "SPLIT" IS A SPLIT: stock dividends and other distributions under 25%, spin-off price factors and consolidations under 1.5x are returned in `nonSplitAdjustments` (each with a `kind` and `meaning`), never in `splits`, and are excluded from `totalSplits`, `reverseSplitCount` and the cumulative. Do not describe them as splits.
readfalseunknown
get_split_performance
Get how ONE ticker's price moved in the N calendar days after EACH stock split it already executed (forward or reverse), newest first, up to 30 splits, in one call. Use this instead of fetching price history once per split. Past executed splits only: it does not list upcoming, approved or pending splits (see get_reverse_splits_list and get_upcoming_reverse_splits). Each split row carries executionDate, ratio ("1-for-12" = 12 old shares became 1), kind (reverse | forward | other), lastPreSplitDate, firstPostSplitDate, firstPostSplitCloseAsTraded, windowEndDate, windowEndCloseAsTraded, sessionsInWindow, changeFromFirstPostSplitClosePct (first post-split close to the last close in the window), changeFromLastPreSplitClosePct (the last pre-split close moved onto the post-split basis by the split ratio, so the split itself is not counted as a move), lowestLowVsFirstClosePct and highestHighVsFirstClosePct. BASIS: the response field basis states it. Each row is on that split's own post-split basis (daily bars as traded); prices are not adjusted onto today's basis, so compare % moves across rows, never prices. NULL MEANS NOT MEASURED, never 0 and never "no move": a missing bar, a bar print Signal8 refused as implausible, or a window that reaches a later split (anotherSplitInWindow: true, its % withheld). notMeasured on a row names the reason per null field; dataGap = no daily bar within 7 days after the split. Stock dividends, spin-off price factors and consolidations under 1.5x that the vendor files as splits are NOT splits: they are listed in nonSplitAdjustments (kind, meaning), never measured or counted, and a split window containing one has its % withheld (nonSplitAdjustmentInWindow: true). An empty splits array means no executed split is on record in Signal8 split history, which is not evidence that none occurred. splitsMeasured and fellInWindow count only measured rows. asOf is the latest window-end bar date. Describe these as past price moves; they are not a forecast and not investment advice. This is Signal8 Pro: an HTTP 403 FEATURE_NOT_AVAILABLE means the API key's account is not on Pro; report that, and say nothing about the company's price moves.
readfalseunknown
get_stock_price_change
Get percentage price changes for a stock across multiple timeframes: 1D, 5D, 1M, 3M, 6M, YTD, 1Y, 3Y, 5Y, 10Y, and MAX. Use this for quick "how much is it up/down" answers without fetching full candle data.
readfalseunknown
get_top_movers
Top stock movers — gainers (largest % up), losers (largest % down), or active (highest volume). Optional session window (premarket / regular / afterhours; regular default; not supported for active). Optional date (YYYY-MM-DD) returns a PAST trade date's gainers/losers on a historical daily close-to-close basis (computed from split-adjusted daily bars, NOT intraday) — session is rejected when date is set, date is not supported for direction=active, and a non-trade date (weekend/holiday) returns an empty list (not an error). Penny-stock artifacts are filtered by default — set includePennyStocks to include sub-$1 movers.
readfalseunknown
get_trading_halts
List securities currently halted across NASDAQ/NYSE/AMEX (from the consolidated Nasdaq Trader halt feed). Each halt includes ticker, market, haltCode (T1/T2/T12/LUDP/H10/...), human-readable reason, haltedAt, haltAgeDays, and the scheduled resumptionAt when one is set. `halts` holds halts that began within the last 30 days; `longRunningHalts` holds older halts the feed still lists (often regulatory halts that have lasted months or years) and must not be described as new. `asOf` is when the list was read. An EMPTY list is a normal state (no active halts right now), not an error. Use get_quote for the last price of a halted name.
readfalseunknown
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. 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 — 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 OF NOW — not a guarantee that every split effective in the window is already known. The underlying stock_splits table has NO created_at column, so there is no way to measure when a row first appeared, and a split announced later will simply be missing. Describe results as "scheduled as of now", NEVER as "all of" or "every" reverse split. A scheduled split can also be postponed or cancelled after it is announced. 🔴 capUnknownCount IS A WITHHOLDING COUNT, NOT A ZERO. It counts rows that passed every other filter and were DELIBERATELY EXCLUDED because Signal8 has no measured market cap for them — typically real OTC microcaps. It does NOT mean those companies have no dilution, no split, or no cap; it means the cap was not measured, so they cannot be asserted to sit under the stated ceiling. If you publish a "under $Xm" framing and capUnknownCount is above zero, say that N further companies were withheld for unmeasured market cap — do not present the list as complete and do not describe the withheld rows at all. Funds, ETFs and sub-1.5x fractional ratio adjustments are already removed server-side; do not re-filter or re-derive the ratio. AN EMPTY splits ARRAY IS A NORMAL, COMMON RESULT — most single weekdays have no sub-cap reverse split scheduled at all. It is NOT an error, NOT a failure, and NOT evidence that reverse-split activity has stopped. Publish nothing rather than publishing an empty-list framing. includeLifecycle=true adds Signal8's SEC-filing lifecycle tracker: top-level lifecycleAvailable, and per row `lifecycle` = the tracked episode (state, ratio, ratioRange, meetingDate, the ISSUER-STATED effectiveDate, effectiveCondition, verification, asOf, sourceUrl). lifecycle: null means NO EPISODE TRACKED — NOT "no split" and not a contradiction of the calendar row; a row with NO lifecycle key could not be matched to an SEC registrant (not measured). lifecycleAvailable: false means the tracker is switched off or unreadable — say nothing about lifecycle at all. verification "provisional" = one source, not cross-checked. SCOPE: this is the VENDOR MARKET CALENDAR only (unchanged). For the merged list the Signal8 Reverse Splits page shows (the calendar UNION the SEC-filing tracker, one row per security, with the stage, approval route, authority terms, source filings and the Approved-no-date / Vote-pending tabs) use get_reverse_splits_list.
readfalseunknown
get_volume_profile
Get volume distribution across price levels for a single trading day. Returns price buckets with volume, Point of Control (highest volume level), and Value Area (price range containing 70% of volume). Use for identifying support/resistance and high-volume price nodes.
readfalseunknown
lookup_accession_number
Look up a filing or exhibit by its SEC accession number. Supports both dashed format (e.g., "0001193125-22-010026") and compact 18-digit format. Returns filing metadata including company name, form type, filing date, exhibit count and `filingId` (for get_filing_document / get_filing_exhibits). If the filing is held in Signal8's archive (isInDatabase: true) its content can be read here; if it is only found on SEC EDGAR the response has isInDatabase: false and basic metadata only. For the full document list use get_filing_documents.
readfalseunknown
screen_companies
Screen companies by price range, volume, cash runway, float, shares outstanding, market cap, industry, listing exchange (NASDAQ/NYSE/AMEX), listing market (market="otc" / "exchange"; the reliable OTC test, as the exchange label is inconsistent on OTC rows), float data source, TTM dividend yield and snapshot cash (minCash / maxCash). Sort by any sortable column. Returns matching companies with key metrics and pagination. FLOAT: "float" is the measured POINT float (null on a withheld dilution-snapshot row, which then carries "floatEstimate" + "floatEstimateBound" ("point" / "ceiling" / "floor") + "floatEstimateBasis"). Print a point as the plain number with its basis as the caveat; a ceiling / floor is a BOUND, not a figure: write "float not stated (at most / at least N)", never the bare number or a "~" / "<=" / ">=" glyph. minFloat / maxFloat and the computed_float sort use the figure's VALUE, so a bounded row is kept; a row with neither is NOT MEASURED, never 0. Never feed floatEstimate into a market cap, percent-of-float or short-interest ratio. `shares_outstanding` is DATED by `sharesOutstandingAsOf` + `sharesOutstandingAsOfKind` (stated / checked / none = date not recorded) and `sharesOutstandingSource`; never present the count without its date. CASH RUNWAY: a null cash_runway_months carries cashRunwayReason. "estimate_would_be_negative" = the last cash figure (dated cashRunwayAsOf) rolled forward by burn is below zero: ESTIMATED exhausted, not a reported zero balance; maxCashRunway drops such rows unless includeRunwayExhausted=true. Any other or null reason is NOT a runway claim. estimatedCurrentCash (estimatedCashAsOf) is the snapshot's USD cash PROJECTION, only for snapshot-covered companies: null = NOT MEASURED, never "no cash"; a non-USD filer has it null and is never matched by minCash / maxCash. dividendYield (TTM cash dividends with an ex-date in the last 365 days / current price, %), nextExDate, lastExDate: null = NOT MEASURED or not a payer, never 0%. listingMarket: "exchange" / "otc", null = unknown. Each row carries live trading-halt status (halted/haltCode/haltedAt; false/null when trading normally); pass excludeHalted=true to drop currently-halted tickers.
readfalseunknown
screen_must_raise
Find companies with imminent capital raise needs based on estimated cash runway. Defaults to companies with less than 6 months of cash remaining, sorted by urgency (lowest runway first). Useful for identifying distressed companies, imminent dilution situations, or potential financing 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.
readfalseunknown
screen_sec_filings
Screen SEC filings across all companies with company-level filters (sector, industry, market cap, exchange) combined with filing-level filters (form type, date range). Returns filings enriched with company metadata: ticker, sector, industry, exchange, market cap, and price. Use this to answer questions like "find all S-1 filings from biotech companies under $500M market cap" or "show me recent 8-K filings from Technology sector companies". This is the most powerful filing DISCOVERY tool for filings — use search_sec_filings only when you already know the specific CIK. This tool returns FILINGS, not a company universe: to enumerate or COUNT companies by market cap / price / float (e.g. "find all companies under $300M market cap"), use screen_companies instead — it supports minMarketCapComputed / 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 SEC EDGAR archive, updated through the day, in its held range (see `archiveFrom` in each response; currently from late 2021, expanding back to 2016 as the history backfill fills in). Before archiveFrom it holds only a scatter, so ABSENCE BEFORE archiveFrom IS NOT EVIDENCE a filing was never filed; check SEC EDGAR for earlier periods. Record-only rows (bodyStored: false) have no stored body; open them at their sec.gov URL.
readfalseunknown
screen_sec_filings_performance
Analyze stock price performance after SEC filings. Returns individual filing records with pre-computed price returns at +1 day, +3 days, +7 days, and +30 days after the filing date (numbers in percent points: 4.35 = +4.35%; null = not measured), plus aggregate statistics (average, median, % negative, best, worst) across all matching filings. Combine company-level filters (sector, industry, market cap, exchange) with filing filters (form type, date range). Use this to answer questions like "how do biotech stocks perform after S-1 filings?" or "what is the average 7-day return after 8-K filings from companies under $500M market cap?".
readfalseunknown
search_clinical_trials
Search clinical trials market-wide (cross-company). Distinct from get_clinical_trials, which is scoped to a single ticker. Filter by phase, indication, sponsor, status, and date window; sort and paginate the results. An unrecognised phase, status, dateField or sort value is rejected with the allowed list (it is never silently ignored). IMPORTANT: a result's ticker is the company whose trial list the row was collected under, which may be the lead sponsor OR only a collaborator; metadata.sponsor is the lead sponsor. Do not present a result as that ticker's own trial unless metadata.sponsor is that company; use get_clinical_trials for a company's role.
readfalseunknown
search_companies
Search for companies by name or ticker symbol in the Signal8 database. Returns matching companies with their ticker, name, CIK, and exchange. Use this as the first step to find a company before calling other tools.
readfalseunknown
search_filing_text
Full-text search across SEC filing content that returns the MATCHING PASSAGE: one match per filing, with the exhibit it was found in (`exhibit_id`, `exhibit_type`) and a snippet with context. Query 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), 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. Quote multi-word phrases; the archive's reading of the query is in meta.understanding. Best for locating specific clauses ("change of control", "anti-dilution", "right of first refusal") and for the excerpt of a known filing (pass accessionNumber or filingId). Use search_sec_filings with `q` for filing-level paging, totals, date ranges, 8-K items, excluded forms or company filters. Filters: CIK, filing, accession number, form type, section (risk_factors, mdna, ex99 …; applied only when meta.sections confirms it, otherwise meta.unsupported says the whole filing was searched) and exhibitTypes (EX-10 …). Coverage: Signal8's SEC EDGAR archive, updated through the day, in its held range (see `archiveFrom` in each response; currently from late 2021, expanding back to 2016 as the history backfill fills in). Before archiveFrom it holds only a scatter, so ABSENCE BEFORE archiveFrom IS NOT EVIDENCE a filing was never filed; check SEC EDGAR for earlier periods. Record-only rows (bodyStored: false) have no stored body; open them at their sec.gov URL.
readfalseunknown
search_institutions
Search institutional investors (13F filers) by name. Returns matching institutions with CIK, name, AUM, holdings count, and latest filing period. Use this to find a specific fund or investment manager when you know part of their name (e.g., "Vanguard", "BlackRock", "Citadel"). Results are ranked by AUM descending.
readfalseunknown
search_learn_guides
Free: works without an API key or Pro plan (the hosted server only needs a signed-in account). Search the 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 the guide; title hits rank highest. An empty query lists every guide (optionally one track) in reading order. Use this to ground an explanation of a concept the user asked about, or to cite a guide alongside data from the dilution / filing tools. An empty result means no guide matched the words given — try fewer or broader words (e.g. "warrant" rather than "warrant inducement repricing") — not that the topic is unimportant.
readfalseunknown
search_sec_filings
Search and list SEC filings by company (CIK), form type, date range, 8-K item codes and excluded forms, optionally with a full-text query over filing bodies and by COMPANY FACTS (market cap, float, price, sector, industry, exchange, company type, foreign issuer, recent IPO). Rows carry `id` (the filingId for get_filing_document / get_filing_exhibits), cik, company_name, accession_number, form_type, filing_date, acceptedAt, primaryDocument, bodyStored and itemNumbers (plus `rank` and `snippet` with `q`); `pagination` has `total`, `totalRelation` ("eq" exact; "gte" a lower bound cut at 10,000, when `totalEstimate` is "about N"), `hasMore` and `nextCursor`. The `ciks` filter matches the filing's own CIK: a Form 4 filed under the reporting owner's CIK is NOT returned for the issuer's CIK. Coverage: Signal8's SEC EDGAR archive, updated through the day, in its held range (see `archiveFrom` in each response; currently from late 2021, expanding back to 2016 as the history backfill fills in). Before archiveFrom it holds only a scatter, so ABSENCE BEFORE archiveFrom IS NOT EVIDENCE a filing was never filed; check SEC EDGAR for earlier periods. Record-only rows (bodyStored: false) have no stored body; open them at their sec.gov URL. 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`); report "the archive only holds filings from <archiveFrom>", never "no such filing exists". An empty text result is definitive only when `searchIndex.complete` is true. Full-text `q`: Query 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), 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 is in `meta.understanding` (understand=false searches the words literally). facets=true adds `facets` per form / year / 8-K item over the whole result set (absent = not measured, never zero). sort=relevance caps page 1 per company; meta.diversity {maxPerCompany, hidden} names who has more (page with nextCursor or filter by CIK). section / exhibitTypes filters apply only when meta.sections / appliedFilters confirm them; otherwise meta.unsupported says why and the whole filing was searched. COMPANY FILTERS (minMarketCap … recentIpo): only issuer-filed forms are searched (third-party Form 4 / 144 / 13D/G go to `companyFilter.droppedForms` unless `companyFilter.subjectMatch` is true; with no formTypes the default is 10-K, 10-Q, 8-K, S-1, S-3, DEF 14A, 20-F, 40-F, 6-K); companies with no measured value are EXCLUDED, never assumed (`companyFilter.unknown` counts them); an unknown value is a 400 listing allowed names; when the archive cannot answer the call FAILS with COMPANY_FILTER_NOT_APPLIED and never returns unfiltered rows; results are cursor-paged, cannot combine with acceptedFrom/acceptedTo/bodyStored, and carry no snippet (use search_filing_text). To count or list companies rather than filings, use screen_companies.
readfalseunknown

02Install & source
Hosted · connect by URL
https://mcp.signal8.ai/mcp

03Access granted
Financial data · writeRead calendar · writePublish a post · write

The access this server can exercise, inferred from its verified tools — not a declared OAuth scope.


05Provenance & freshness
sourcesOfficial MCP Registry [p1]
last_checked2026-11-05 03:21Z
next_check2026-11-05 06:21Z
cadenceevery 3h
verifiedmetadata:passed tools_list:passed handshake:passed metadata:passed tools_list:passed handshake:passed metadata:passed tools_list:passed handshake:passed metadata:passed
index_statusindex — 9 unique facts >= 5

06Badge

Add the “as seen on MCPExplorer” badge to your README. Signal8 MCP — as seen on mcpexplorer.com

[![Signal8 MCP — as seen on mcpexplorer.com](https://mcpexplorer.com/badge/signal8.svg)](https://mcpexplorer.com/servers/signal8)

Next step

This is one server. A loadout combines the right servers, governance, and proven plays for a whole job — assembled deliberately, not tool-dumped.

Explore loadouts →