Finance & Market Data
FMP Stock Market API
Use FMP endpoints with schema checks, retries, source timestamps and licensing review; validate responses before production.
Published: April 21, 2026 · By the QVeris Team

TL;DR
Verdict: FMP is a practical shortlist candidate when one API needs to cover quotes, historical prices, company fundamentals, news, calendars, and related market datasets. The buying decision should be based on the exact endpoints, freshness, geography, history, call limits, bandwidth, licensing, and adjustment policy your workload needs—not the number of endpoints on a marketing page.
Research, analytics, portfolio monitoring, prototypes, and products that benefit from broad financial data behind one API surface.
Exact symbol coverage, real-time entitlement, corporate-action treatment, point-in-time behavior, rate limits, and commercial display rights.
An AI agent still needs identity, policy, normalization, evidence, approval, retries, observability, and acceptance tests.
Before choosing FMP, compare it with seven alternatives in the free stock API comparison.
Who this FMP API review is for
You want one maintained API contract for quotes, history, fundamentals, news, calendars, and reference data.
The model must receive normalized records with source time, retrieval time, adjustment mode, validation status, and provenance.
You need to translate calls per day or minute, history, coverage, bandwidth, and licensing into a cost per accepted workload.
Start with the current Stable API contract
FMP's current Quickstart documents https://financialmodelingprep.com/stable/ as the base URL. It lists API-key authentication, more than 100 endpoints, and common 403, 429, and 500 responses. Put the base URL, authentication mode, timeout, and plan limits in configuration instead of scattering them across notebooks and prompts.
FMP stock market API coverage map
The useful unit is not “an endpoint.” It is a dataset with an identity, field contract, update cycle, adjustment policy, geography, history window, and permitted use.
| Need | Stable endpoint example | Validate before production |
|---|---|---|
| Single quote | /quote?symbol=AAPL | Market state, timestamp, currency, exchange, entitlement |
| Batch quotes | /batch-quote?symbols=AAPL,MSFT | Maximum batch size, partial failure, ordering, missing symbols |
| Historical EOD | /historical-price-eod/full?symbol=AAPL | Adjustment mode, VWAP, revisions, date boundaries |
| Intraday bars | /historical-chart/1min?symbol=AAPL | Plan access, session, timezone, latency, retention |
| Fundamentals | /income-statement?symbol=AAPL | Period, filing date, accepted date, currency, restatements |
| Events and news | Calendar and news endpoints | Source, publication time, deduplication, update cycle |
Free tier, paid limits, and licensing reality
FMP's public pricing page currently separates personal and commercial use and lists different call rates, history, coverage, bandwidth, and datasets by plan. Prices and packages can change, so this page does not hard-code a procurement quote. Capture the values on the day you evaluate and attach the applicable agreement.
| Question | Why it changes the architecture | Evidence to retain |
|---|---|---|
| Calls per day or minute? | Determines batching, caching, concurrency, and backoff. | Plan screenshot, dashboard quota, test results |
| How much history? | Changes backtests, warm-up jobs, storage, and migration. | Earliest observed record by dataset and symbol |
| Which geography and asset? | A US prototype does not prove global production coverage. | Symbol census with exchange, currency, and missing rate |
| Can data be displayed or redistributed? | API access alone does not establish product rights. | Signed agreement and product-use mapping |
Code: call the FMP Stable API with cURL
Use an environment variable and avoid exposing the key in shell history or screenshots. FMP documents both header and query-parameter authorization; a header keeps secrets out of the URL.
curl --fail-with-body \
--connect-timeout 5 \
--max-time 30 \
-H "apikey: ${FMP_API_KEY}" \
"https://financialmodelingprep.com/stable/historical-price-eod/full?symbol=AAPL"Python: retry, normalize, and preserve evidence
A production adapter should return a provider-neutral record and an evidence envelope. The example retries only transient failures, respects a deadline, records retrieval time, and keeps the raw response hash without placing the API key in logs.
import hashlib, json, os, random, time
from datetime import datetime, timezone
import requests
BASE_URL = "https://financialmodelingprep.com/stable"
API_KEY = os.environ["FMP_API_KEY"]
def get_eod(symbol: str, attempts: int = 4) -> dict:
url = f"{BASE_URL}/historical-price-eod/full"
headers = {"apikey": API_KEY}
params = {"symbol": symbol}
for attempt in range(attempts):
response = requests.get(
url, headers=headers, params=params, timeout=(5, 25)
)
if response.status_code == 403:
raise RuntimeError("FMP authentication or entitlement rejected")
if response.status_code not in {429, 500, 502, 503, 504}:
response.raise_for_status()
break
if attempt == attempts - 1:
response.raise_for_status()
time.sleep(min(8, 0.5 * (2 ** attempt)) + random.random() / 4)
raw = response.content
rows = response.json()
normalized = [{
"symbol": symbol,
"date": row["date"],
"open": row["open"],
"high": row["high"],
"low": row["low"],
"close": row["close"],
"volume": row["volume"],
"provider": "fmp",
"dataset": "historical_price_eod_full",
} for row in rows]
return {
"records": normalized,
"evidence": {
"retrieved_at": datetime.now(timezone.utc).isoformat(),
"request": {"endpoint": "/historical-price-eod/full", "symbol": symbol},
"status": response.status_code,
"sha256": hashlib.sha256(raw).hexdigest(),
},
}Adjusted prices, timestamps, and point-in-time truth
FMP exposes full, non-split-adjusted, and dividend-adjusted historical price endpoints. These series answer different questions. Record the endpoint and adjustment mode with every dataset; never silently join adjusted closes to unadjusted highs and lows.
| Series | Useful for | Failure if mixed |
|---|---|---|
| Full historical EOD | General OHLCV analysis after validating field semantics | Assuming adjustment behavior without a test |
| Non-split-adjusted | Inspecting observed prices around split events | Artificial return jumps around corporate actions |
| Dividend-adjusted | Total-return-oriented analysis when methodology matches | Double-counting cash dividends or mismatched backtests |
- Store event time, provider source time, retrieval time, and processing time separately.
- Test pre-market, regular, after-hours, weekend, holiday, and daylight-saving boundaries.
- Detect duplicates, reversed ranges, negative volume, missing sessions, and impossible OHLC relationships.
- Pin a dataset version or raw-response hash so an agent answer can be reproduced.
A data-quality acceptance contract
dataset: fmp_historical_eod
symbols: 100
window: 2025-01-01..2026-06-30
contract:
required_fields: [symbol, date, open, high, low, close, volume]
adjustment_mode: documented
currency_and_exchange: resolved
duplicate_keys: 0
impossible_ohlc_rows: 0
missing_expected_sessions_pct: "<= 0.25"
stale_quote_rate_pct: "<= 0.50"
p95_latency_ms: "<= 2500"
unsafe_secret_logs: 0
evidence:
raw_hash: required
retrieved_at: required
provider_endpoint: required
validation_result: requiredSet thresholds from your workload and market calendar; the numbers above are examples, not universal guarantees. Release only after replaying a frozen symbol/date set and reconciling a sample against an authoritative source.
Production architecture for FMP data
Map issuer, security, exchange, currency, ticker, CIK, and effective date. Never join on an ambiguous display symbol alone.
Centralize base URL, auth, timeout, concurrency, quota, retry classes, and request metadata.
Record endpoint, safe parameters, status, retrieval time, content hash, plan context, and response metadata before transformation.
Convert into a canonical schema, attach units and adjustment mode, then reject or quarantine invalid records.
Cache by dataset freshness, expose evidence references, and let the agent reason only over accepted records.
Troubleshooting FMP API failures
| Symptom | Likely class | Safe response |
|---|---|---|
403 | Missing key, invalid key, or entitlement | Do not retry blindly; verify secret and plan access. |
429 | Rate or quota limit | Back off with jitter, reduce concurrency, cache, batch, and stop at deadline. |
500 | Provider-side failure | Bound retries, preserve request evidence, degrade or switch provider. |
| Empty result with 200 | Symbol, exchange, plan, date, or dataset mismatch | Treat empty as a typed result, not zero; inspect identity and coverage. |
| Price discontinuity | Split, dividend, currency, symbol change, or mixed adjustment | Quarantine, inspect corporate actions, and recompute from one policy. |
Compare FMP with one shared workload
Do not compare providers with different symbols, dates, plans, caches, and acceptance rules. Replay the same frozen workload and score accepted datasets.
| Dimension | FMP | Polygon | Alpha Vantage | Twelve Data |
|---|---|---|---|---|
| Test job | 100 symbols: quote + 12 months EOD + latest fundamentals + corporate-action reconciliation | |||
| Record | Accepted completion, missing fields, stale data, adjustment mismatch, P50/P95, retries, total cost, licensing fit | |||
| Decision | Choose by workload result and operating burden, not a generic winner. | |||
Migration checklist for endpoint or provider changes
- Inventory every endpoint, caller, key location, quota, cache key, schema, adjustment assumption, and downstream consumer.
- Freeze representative responses and expected normalized records before changing the adapter.
- Run old and new paths in read-only shadow mode; compare values, dates, missing rates, latency, and cost.
- Canary one low-risk dataset, preserve rollback, and block writes or agent conclusions when evidence is incomplete.
- Update runbooks, dashboards, licensing records, secret rotation, and data-retention controls before cutover.
QVeris pattern: discover, inspect, call, then validate
QVeris fits when an existing agent needs a capability layer rather than a hard-coded provider endpoint. The agent can discover a financial capability by intent, inspect parameters and operational signals, call the selected capability, then feed only validated evidence into reasoning.
Keep the boundary explicit: QVeris does not replace your market-data license, system of record, identity policy, validation rules, portfolio logic, or approval authority. It routes capabilities; your application owns business truth.
FMP stock market API FAQ
FMP lists a free Basic plan for testing with daily call and bandwidth limits. Verify endpoint access, history, real-time coverage, commercial rights, and redistribution rules for your plan.
The current Quickstart documents https://financialmodelingprep.com/stable/. Keep it in configuration so provider changes do not spread through product code.
Use a server-side secret manager. Never put the key in browser code, prompts, logs, screenshots, or committed notebooks.
They answer different questions. Record the endpoint and adjustment mode, and never mix series in one return calculation.
Use bounded exponential backoff with jitter, reduce concurrency, cache stable data, batch when appropriate, and stop at a deadline.
Do not infer rights from API access. Confirm display and redistribution terms for the product, users, territory, and storage period.
It supplies data, but the agent still needs identity, policy, normalization, validation, evidence, retries, and observability.
QVeris can route discoverable financial capabilities while the application retains business policy, authoritative records, and acceptance tests.
Official sources and update policy
Endpoint, pricing, freshness, and licensing claims were checked against official sources on July 31, 2026. Recheck the current plan and agreement before procurement or release.
A verified profile link does not guarantee entitlement, field availability, price or current execution success; inspect the current contract before calling.
