Snapshot date: 2026-07-09. FMP product names, history depth, and endpoint
access change over time — re-check FMP’s own docs and pricing
before relying on tier-specific claims below.
This document answers one question:
If I only have an FMP Starter-class key (short US history, limited
fundamentals depth, no bulk), which citrusquant features can I honestly
backtest, and which ones are blocked because the input panels are missing
or too coarse?
It is not a Starter | Premium | Ultimate marketing comparison. Richer FMP
plans (or any other vendor) matter only as “full panels are possible.” The engine
never calls FMP; ops fail only when required series are absent from
EvalContext / your data root. On-disk shape: data-layout.md.
1. Mental model
lemon op / backtest knob → needs series (close, high, pe, …)
→ your pipeline fills panels
→ if Starter cannot fill them well, that feature is unusable *in practice*
Labels for Starter-class access (US retail API, short history). Treat as a
checklist for your sync job; re-verify endpoints when implementing a builder.
Input
Typical Starter situation
Label
Daily adjusted OHLCV (open/high/low/close/volume)
Available for US names; history often capped around ~5 years
Available (short)
History beyond that window
Not available on Starter-class depth
Missing (depth)
Annual fundamentals / ratios usable as pe/roe/…
Often available for US, coarser than quarterly PIT research
Degraded
Dense quarterly / long fundamental history
Starter blurb emphasizes annual / short depth
Degraded / Missing
report_event (filing / report dates)
Partial; depends on calendar/filing endpoints you wire
Degraded
Company sector for industry map
US profile fields usually enough
Available
Snapshot scores / analyst series
Often limited, extra endpoints, or must derive
Degraded / Derive
Full-universe bulk EOD/statements
Not on Starter
Missing (ops scale) — ops still run on small lists
Historical index constituents (PIT)
Often weak or incomplete
Degraded / Missing
Delisted names with complete price files
Easy to omit if you only sync “active” lists
Degraded unless you ingest delisteds
“Richer” FMP tiers mainly restore depth, fuller fundamentals, and
bulk so large universes are practical. They do not unlock secret lemon ops.
4. Gap table: Starter → what you cannot honestly backtest
If your Starter-fed tree is weak on…
Then these citrusquant capabilities are blocked or misleading
History longer than ~5y
Any strategy needing longer samples: long walk-forwards (#21), multi-regime TA, long factor studies — all op families
Rotation on price signals (exit_when, hold_until, rebalance)
OK (stops need a price panel, usually close)
OHLCV TA in ops/ta.rs
OK if OHLC(V) present
Volume TA + impact knobs
OK if volume present
BB / MACD / Donchian-style compositions
OK (price only)
Fundamental / industry / event / long-history / full-market honesty
Not OK without better data
5. Practical guidance
Learning / demo / short US price strategies — Starter-class data is enough
if OHLCV is complete for your window.
Factor, industry-neutral, or multi-decade research — Starter depth and
annual-leaning fundamentals are the bottleneck, not missing lemon syntax.
Product-scale universes — lack of bulk is a pipeline problem; the engine
will still evaluate any panels you can build.
Always document your window and universe construction next to results
(survivorship and PIT are data choices — data-layout.md).
6. The fmp-sync builder (bring-your-own key)
yuzu-cli fmp-sync fetches from FMP with your own API key and writes the
data-layout.md tree. Direct HTTPS, no third-party FMP SDK;
the key stays on your machine and no FMP data is redistributed. FMP lives only in
yuzu-cli (behind the default-on fmp-sync cargo feature) — never in
yuzu-core / yuzu-data / WASM.
fmp-symbols writes one ticker per line (# comments allowed); fmp-sync --symbols-file reads that back (also accepts a symbol,… CSV). This decouples
which symbols exist from fetching their data, so the universe can be curated,
diffed, and re-synced.
Universe & screening (from #52 review):
Symbols — --symbols AAPL,MSFT,… (explicit list), --symbols-file <path>
(a prebuilt list, e.g. from fmp-symbols), or --all-symbols to sync the
screened universe (FMP company-screener). Exactly one source per run. The
universe is large — pair it with --min-market-cap / --rate-limit / --resume.
Exchanges — the universe defaults to the three US majors
(NASDAQ,NYSE,AMEX — AMEX is now NYSE American). Override with --exchange
(comma-separated FMP codes) on fmp-symbols / fmp-sync --all-symbols; pass
--exchange all for every exchange.
Stocks only — ETFs and mutual/closed-end funds are skipped by default
(classified from the profile endpoint’s isEtf / isFund); pass
--include-etf to keep them.
Market-cap floor — --min-market-cap <usd> drops symbols below that
company market cap (0 = off), read from the profile endpoint. Accepts unit
suffixes: 1b, 500m, 10k, 2.5t (or a plain number / 1e9).
Screening happens before the price fetch, so a filtered symbol costs no
price request. A single profile GET per symbol serves the ETF/fund screen, the
cap screen, and --include-industry. A profile-endpoint error fails open
(the symbol is kept) so a secondary hiccup never drops the price sync.
Operational knobs (from #52 discussion):
Rate limit — --rate-limit requests/minute (0 = no throttle). Set it to
your plan’s ceiling; Starter-class keys are commonly ~300/min. The tool does
not auto-detect your tier — check your plan and pass the value.
Retry — --max-retries with exponential backoff on 429 / 5xx /
transport errors; a 4xx (bad key/symbol) fails fast. The API key is redacted
from every log line and error message.
Resume — --resume skips symbols that already have a price file, to
continue an interrupted multi-symbol run.
Append — --append merges freshly fetched rows into existing files
(extend an existing tree’s history); fetched rows win on a date collision.
MVP scope. Enough for price-based strategies over a short US window:
close/OHLC TA and cross-section ops on a modest symbol list (the acceptance path —
fmp-sync then yuzu-cli run). Fundamentals are best-effort from the annual
ratios/metrics/growth endpoints and are dense forward-filled onto the price
calendar; fields the plan does not return are left NaN. Richer fundamentals,
full-universe, point-in-time membership, and delist honesty are out of scope —
see §2–§4 above for what a Starter key can and cannot honestly support, and #53
for the follow-up.
7. ToS / product boundary
Bring-your-own API key; keep vendor data on the user’s machine.
Displaying or redistributing vendor data to end users may require a separate
agreement with the vendor — out of scope for this engine repo.
No FMP (or other vendor) dependency in yuzu-core / WASM.