Short Interest & Fails-to-Deliver API — SEC FTD + FINRA
Pricing
from $3.30 / 1,000 results
Short Interest & Fails-to-Deliver API — SEC FTD + FINRA
Short interest & fails-to-deliver (FTD) API. Merges SEC FTD and FINRA short-interest disclosures into one per-ticker time series with change and spike flags. Keyless official sources. Market-structure DATA, not investment advice.
Pricing
from $3.30 / 1,000 results
Rating
0.0
(0)
Developer
Kyle Maloney
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
0
Monthly active users
2 days ago
Last modified
Categories
Share
Merges two official, keyless US market-structure disclosures — the SEC Fails-to-Deliver (FTD) semi-monthly files and the FINRA Consolidated Equity Short Interest bi-monthly file — into one per-ticker time series with change and spike flags.
This is a DATA tool, not investment advice. It reproduces public regulatory disclosures and arithmetic over them. It is not a signal, a recommendation, or a solicitation to buy, sell, or hold any security. Fails to deliver have many benign operational causes and are not evidence of misconduct. Verify every figure against the primary source before acting.
Who it's for
- Quant / market-structure researchers building settlement-failure and short-interest factors without maintaining two file scrapers.
- Compliance and surveillance teams watching Reg SHO threshold-adjacent activity in named tickers.
- Financial data engineers who want one normalised, per-(ticker, settlement date) row instead of two different file formats.
- AI agents — clean field names and explicit per-source status make this a safe MCP tool: it will tell you when it did not read a source instead of guessing.
What it does
- Pulls N SEC FTD half-month ZIPs, newest first, probing every path prefix the SEC serves them from (they move months between prefixes without notice), and reconciles each file against the SEC's own trailer record count and share total.
- Optionally pulls FINRA consolidated short interest, resolving FINRA's bi-monthly settlement calendar itself.
- Collapses the SEC's per-CUSIP rows to one total per (symbol, settlement date), as-of-joins the nearest FINRA observation, and computes deltas, trailing averages and spike flags.
- Stamps a per-source outcome on every row, so a missing source is visible
rather than silently rendered as a zero or a
false.
Example input
{"tickers": ["GME", "AMC"],"lookbackPeriods": 6,"spikeMultiplier": 3,"includeShortInterest": true,"maxResults": 5000}
Leave tickers empty for every symbol in the fetched files (capped by
maxResults — see results_truncated). Leave shortInterestDates empty to
have the actor resolve FINRA's calendar for you.
The contract: null never means "no"
null= not checked (the source was not requested, did not answer, or there was no history to compute against).false= checked, and the answer is negative.
fails_spike, short_interest_spike and every short-interest value obey this.
short_interest_status tells you which case you are in on every single row.
If no SEC period can be retrieved the run fails loudly and emits
nothing — you are never billed for an empty answer dressed up as a real one.
Output fields
One row per (ticker, settlement date). Every declared field is listed.
Identity & fails (SEC)
| Field | Description |
|---|---|
symbol | Uppercased ticker |
cusip | Representative CUSIP (the one with the largest fails that day) |
cusips | Every CUSIP the SEC filed for this symbol that day |
cusip_count | How many CUSIPs were summed into fails_quantity |
description | Issuer / company name |
settlement_date | SEC settlement date (YYYY-MM-DD) |
fails_quantity | Total fails-to-deliver shares, summed across all CUSIPs |
price | Prior-day close from the FTD file (null when the SEC value is .) |
fails_delta | Change in fails_quantity vs the ticker's prior observation |
fails_pct_change | Percent change vs the prior observation |
fails_trailing_avg | Average fails over the prior observations in the window |
fails_trailing_window | How many prior observations backed that average (null = none) |
fails_spike | true when fails > spikeMultiplier x trailing average; null when not computable |
Short interest (FINRA, opt-in)
| Field | Description |
|---|---|
short_interest | FINRA current short-interest shares, as of short_interest_as_of |
short_interest_prev | FINRA's published prior-cycle short-interest shares |
short_interest_delta | Real cycle-over-cycle change (current − previous) |
short_interest_pct_change | FINRA's published changePercent |
days_to_cover | FINRA days-to-cover. Null at FINRA 999.99 ceiling — see below |
days_to_cover_capped | true when FINRA published its 999.99 ceiling instead of a real ratio |
avg_daily_volume | FINRA average daily share volume |
short_interest_spike | Spike vs the trailing average of distinct prior FINRA observations; null when not computable or not read |
short_interest_as_of | The FINRA settlement date this row's short interest was observed on |
short_interest_stale_days | Days between short_interest_as_of and settlement_date |
short_interest_status | ok / no_row / unavailable / not_requested |
market_class | FINRA marketClassCode: NYSE, ARCA, NNM, SC, BZX, AMEX, OTC |
exchange_code | FINRA issuerServicesGroupExchangeCode |
stock_split_flag | FINRA stockSplitFlag (null when blank) |
revision_flag | FINRA revisionFlag (null when blank) |
short_pct_float | Structurally always null — float is not published by FINRA. Retained so downstream schemas do not break. |
Run provenance
| Field | Description |
|---|---|
ftd_status | ok (every requested period loaded) or partial |
ftd_periods_loaded | Which SEC half-month keys backed this series, e.g. ["202607a"] |
ftd_periods_missing | Which did not, and why (not_published / error) |
ftd_latest_period | The newest period loaded — guards against a stale vintage |
ftd_trailer_reconciled | Parsed counts matched the SEC's own file trailer |
results_truncated | true when maxResults cut the series (alphabetical subset) |
sources | Which disclosures contributed to this row |
Populating the optional columns. Set includeShortInterest: true (the
shipped prefill) for the whole short-interest block. stock_split_flag and
revision_flag are blank for most securities because most have neither; a
verified live input that populates both is
{"tickers": ["BOXL", "DD", "SLBT", "SPCX"], "lookbackPeriods": 4, "includeShortInterest": true}
(2026-08-01: 13 rows carried stock_split_flag: "S", 20 carried
revision_flag: "R"). short_pct_float is the only permanently-null column and
is structurally so — FINRA does not publish float.
Use as an MCP tool
Available over mcp.apify.com. An agent can call it with a ticker list and
read short_interest_status / ftd_status to know whether an absent value
means "no short interest" or "not checked" — the distinction most market-data
tools lose. Chain it with a filings or ownership actor for a fuller picture.
Sources, caveats & verified behaviour
- SEC Fails-to-Deliver — semi-monthly ZIPs. The SEC serves them from more
than one path prefix and moves months between prefixes without notice:
verified 2026-08-01, the May-2026 files 404 on
/files/data/fails-deliver-data/and resolve only under/files/data/other/fails-deliver-data/. This actor probes every known prefix (plus the SEC's_0re-upload suffix) and reports which periods loaded. Each file ends with a trailer declaring the SEC's own record count and share total; every run reconciles against it and fails rather than publish a time series over a truncated file. - FINRA Consolidated Equity Short Interest — bi-monthly, keyless, at
https://cdn.finra.org/equity/otcmarket/biweekly/shrt{YYYYMMDD}.csv. Correction to earlier versions of this page: despite theotcmarketpath and the.csvextension, this file is pipe-delimited and consolidated, not OTC-only — on 2026-06-30 it carried 22,209 records of which 12,745 (57.4%) were exchange-listed (NYSE 2,905, ARCA 2,641, Nasdaq NNM 3,804, BZX 1,431, Nasdaq SC 1,657, AMEX 307; OTC 9,464). A date FINRA has not published returns HTTP 403, which is reported asnot_published. days_to_coverhas a ceiling sentinel. FINRA capsdaysToCoverQuantityat 999.99: on 2026-06-30 that was 3,807 of 22,209 records (17.1%), while the next-highest genuine value in the entire file was 997.40 (one row). 2,985 of those had zero average daily volume, so the ratio is undefined. This actor emitsdays_to_cover: nullthere and setsdays_to_cover_capped: true, rather than telling you 3,807 tickers take a thousand days to cover.- Short interest lags fails. FINRA publishes twice a month, the SEC files
daily rows.
short_interest_as_ofandshort_interest_stale_daystell you exactly how stale the short-interest side of any row is. - Multiple CUSIPs per symbol. Around reverse splits and share-class changes
the SEC files a symbol under more than one CUSIP on the same day (verified:
PSQHon 2026-07-13 filed 693691107 = 1,510 and 693691206 = 14,166).fails_quantityis the sum;cusipslists them. maxResultstruncates alphabetically, because the series is sorted by symbol then date. Narrowtickersfor a complete answer; checkresults_truncated.- Not advice. Every field is a reproduction of a public disclosure or arithmetic over one. Fails to deliver arise from many ordinary operational causes.
FAQ
Why is short_interest null for my ticker? Read short_interest_status.
not_requested = you left includeShortInterest off. no_row = FINRA
answered and does not publish that symbol. unavailable = FINRA was asked and
did not answer, so nothing on this row asserts anything about short interest.
Why is fails_spike null instead of false? Because there was no prior
history in the window to compare against. false here would be a claim we
cannot support.
Why are some periods missing? The SEC publishes the first-half file near
the end of that month and the second-half file around the middle of the next
one, so the newest one or two periods in a lookback window normally do not
exist yet. ftd_periods_missing names them.
Does delta mode really remember across runs? Yes — state lives in a
named key-value store (short-interest-ftd-monitor-state) keyed by your
query scope. The first run for a scope establishes the baseline and says so.
Pricing
Pay per result: one billable result = one merged (ticker, settlement date) record. Tiered discounts apply on paid Apify plans. Runs that fail a source or drift gate emit nothing and bill nothing for results.
Related actors
- FDIC Deposit Market Share & HHI Rollup — bank deposit concentration.
- FEC Campaign-Finance Delta — political-money flows.
- RIA Registration Delta Monitor / PCAOB Auditor Engagement Monitor — adjacent regulatory-disclosure feeds from the same bulk-file layer.