PLUTUS · ENGINE ROOM // PAPER ONLY · NO LIVE CAPITAL
ENGINEERED BY LEOPARD DATA

What the FMP Plan Actually Serves

One API key, probed endpoint by endpoint with a status code for each — because the vendor's own pricing pages return 403 to a script, and a tier description describes the top of the product line, not the entry of it.

The 402 ritual

Before any design leans on an endpoint, we call it once with the real key and record what comes back. The first pass ran on 2026-08-28: roughly 45 billable requests, including two binary searches, and it permanently retired five open questions that three documents had been carrying as assumptions. Two more passes followed on 2026-08-29 (forex), 2026-08-30 (ETFs) and 2026-08-31 (bars, delisted names, constituents).

The reason the ritual exists is that a design document built on a wrong belief is more expensive than 45 requests. One of those beliefs — that the news archive reached 2019 — turned out to be off by six years. The archiver is what that correction cost.

Measured status codes

EndpointStatusWhat it means for us
quote (control)200The key is valid and the plan is paid
historical-price-eod/full200Daily bars to SPY's first day, 1993-01-29, with an explicit from
historical-price-eod/dividend-adjusted200Caps at 5,000 rows per response — page it or lose 1993–2006
dividends, splits200~33 years of SPY dividends; total return is covered
news/stock, news/stock-latest, news/general-latest200The three feeds the archiver pulls; 365 rolling days, exactly
grades-news, grades-latest-news200Latest allows page=0 only and limit ≤ 100 — a snapshot, not a history
Six forex pairs (EURUSD, USDJPY, GBPUSD, USDCAD, USDSEK, USDCHF)200EURUSD reaches 1999-01-01, the euro's first day
etf/info, sector and country weightings, the ETF list200~6,360 ETFs profiled
Delisted tickers (LEH, ENE, YHOO, WAMUQ, GM pre-2009)200Zero rows. Not an error — silently empty
news/press-releases, press-releases-latest402"Restricted Endpoint: not available under your current subscription"
earning-call-transcript, earnings-transcript-list402Two specs book these at $0. They are not $0
historical-chart/1min402No intraday; day-trading stays deferred
DX-Y.NYB (the dollar index)402Superseded anyway by FRED's DTWEXBGS via GMI
etf/holdings, reverse asset exposure402No spec consumes either
sp500-constituent, historical constituents402Point-in-time membership stays an open gap
News from older than 364 days402"Premium Query Parameter" — a hard stop, not an empty page

What the bars actually reach

The price endpoint is the deep one, and its depth depends on how you ask. With no from or to the default window is exactly 1,254 rows — five years — and the first probe read that as the plan's limit. Pass an explicit from and the same endpoint returns SPY from 1993-01-29, AAPL from 1990, EURUSD from 1999-01-01. Prices are split-adjusted: AAPL in January 1990 comes back at $0.33.

The dividend-adjusted endpoint has a different ceiling: 5,000 rows per response. That is the exact defect Gate 2 caught on its first attempt — the benchmark equity curve was truncated and the comparison failed. The fix was to page, not to widen the tolerance.

Delisted names are the other trap. Lehman, Enron, Yahoo, WaMu and pre-bankruptcy GM all return 200 with an empty array. A consumer that cannot tell "no data" from "broken" will backtest straight through a hole in its history, which is why "empty and error must be distinguishable" became a written rule in the GMI contract, and why survivorship remains our problem, not the vendor's.

The rule the pattern predicts

Line the two columns up and a rule falls out. Everything that returns 200 is a public fact that is cheap to store: a closing price, a dividend, a split, a headline and its snippet, an ETF's stated sector weights. Everything that returns 402 is copyrighted, licensed from a third party, or expensive to maintain: press releases and transcripts are someone else's text, index membership is a licensed product, one-minute bars are a storage bill, and full ETF holdings are issuer data that changes daily.

This is our reading of the pattern, not a vendor statement — but it has predicted every probe since it was written, and it is now the first question asked before an endpoint is designed against: is this a fact, or is it someone's product?

"$0 marginal" — half right

The cost model books FMP at "$0 marginal if shared with GMI's existing plan." The probe split that in two. For news it holds: stock, general and grade news all return 200 on the existing key. For transcripts it fails: the demand/supply spec books them at $0 and they are 402, so backlog and RPO extraction have no source on this plan. Decision 4e in the implementation plan is still open; FMP support was emailed 2026-09-02.

And the third thing the assumption never addressed, because nobody had looked: the news archive is one rolling year. from=2025-08-29 — 364 days back — returned 200; from=2025-08-28 returned 402. Paging without a date range bottoms out at 92 days. That is not a pricing problem, it is a design problem, and it is why the archiver was built first.

The envelope

News yes, press releases no, transcripts no, 1-minute bars no, news history capped at a rolling year. That pattern is consistent with the vendor's Starter tier. Whatever the invoice says, this is the capability envelope the design is built inside.

feeds 3 of 5 work news 365 d rolling, exact bars 1993-01-29 probe ~45 calls
What we did about it
  • Archived the feed the same week — 364 days, 627,754 items, before the window ate another month
  • Always pass from/to, with a hard floor at today − 364, because the boundary errors rather than terminating
  • Did not buy Ultimate reflexively — price the gaps against Tiingo, Polygon and EDGAR first
  • Re-run the ritual before any phase that depends on an endpoint; tiers change under you