QVeris

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

An analyst reviewing financial charts and source data
An analyst reviewing financial charts and source data
An analyst reviewing financial charts and source data

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.

Good fit

Research, analytics, portfolio monitoring, prototypes, and products that benefit from broad financial data behind one API surface.

Prove before buying

Exact symbol coverage, real-time entitlement, corporate-action treatment, point-in-time behavior, rate limits, and commercial display rights.

Not enough by itself

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

Developers replacing a patchwork of market-data scripts

You want one maintained API contract for quotes, history, fundamentals, news, calendars, and reference data.

AI teams that need traceable financial evidence

The model must receive normalized records with source time, retrieval time, adjustment mode, validation status, and provenance.

Buyers comparing free and paid plans

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.

Stable base URLVersion the provider adapter, not every caller.
API keyKeep it server-side and out of model context.
403 / 429 / 500Classify auth, quota, and provider failures separately.
Plan contractEndpoint access is not the same as display rights.

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.

NeedStable endpoint exampleValidate before production
Single quote/quote?symbol=AAPLMarket state, timestamp, currency, exchange, entitlement
Batch quotes/batch-quote?symbols=AAPL,MSFTMaximum batch size, partial failure, ordering, missing symbols
Historical EOD/historical-price-eod/full?symbol=AAPLAdjustment mode, VWAP, revisions, date boundaries
Intraday bars/historical-chart/1min?symbol=AAPLPlan access, session, timezone, latency, retention
Fundamentals/income-statement?symbol=AAPLPeriod, filing date, accepted date, currency, restatements
Events and newsCalendar and news endpointsSource, 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.

QuestionWhy it changes the architectureEvidence 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 · historical EOD
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.

Python · bounded provider adapter
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.

SeriesUseful forFailure if mixed
Full historical EODGeneral OHLCV analysis after validating field semanticsAssuming adjustment behavior without a test
Non-split-adjustedInspecting observed prices around split eventsArtificial return jumps around corporate actions
Dividend-adjustedTotal-return-oriented analysis when methodology matchesDouble-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

YAML · release gate
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: required

Set 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

1. Resolve identity

Map issuer, security, exchange, currency, ticker, CIK, and effective date. Never join on an ambiguous display symbol alone.

2. Fetch through a provider adapter

Centralize base URL, auth, timeout, concurrency, quota, retry classes, and request metadata.

3. Preserve raw evidence

Record endpoint, safe parameters, status, retrieval time, content hash, plan context, and response metadata before transformation.

4. Normalize and validate

Convert into a canonical schema, attach units and adjustment mode, then reject or quarantine invalid records.

5. Serve accepted data

Cache by dataset freshness, expose evidence references, and let the agent reason only over accepted records.

Troubleshooting FMP API failures

SymptomLikely classSafe response
403Missing key, invalid key, or entitlementDo not retry blindly; verify secret and plan access.
429Rate or quota limitBack off with jitter, reduce concurrency, cache, batch, and stop at deadline.
500Provider-side failureBound retries, preserve request evidence, degrade or switch provider.
Empty result with 200Symbol, exchange, plan, date, or dataset mismatchTreat empty as a typed result, not zero; inspect identity and coverage.
Price discontinuitySplit, dividend, currency, symbol change, or mixed adjustmentQuarantine, 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.

DimensionFMPPolygonAlpha VantageTwelve Data
Test job100 symbols: quote + 12 months EOD + latest fundamentals + corporate-action reconciliation
RecordAccepted completion, missing fields, stale data, adjustment mismatch, P50/P95, retries, total cost, licensing fit
DecisionChoose 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

Is the FMP stock market API free?

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.

What is the current FMP base URL?

The current Quickstart documents https://financialmodelingprep.com/stable/. Keep it in configuration so provider changes do not spread through product code.

How should the API key be stored?

Use a server-side secret manager. Never put the key in browser code, prompts, logs, screenshots, or committed notebooks.

Adjusted vs unadjusted prices?

They answer different questions. Record the endpoint and adjustment mode, and never mix series in one return calculation.

How should 429 be handled?

Use bounded exponential backoff with jitter, reduce concurrency, cache stable data, batch when appropriate, and stop at a deadline.

Can FMP data be redistributed?

Do not infer rights from API access. Confirm display and redistribution terms for the product, users, territory, and storage period.

Is FMP enough for an AI agent?

It supplies data, but the agent still needs identity, policy, normalization, validation, evidence, retries, and observability.

Where does QVeris fit?

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.

FMP Stock Market API | QVeris Guides