Short answer: Before you commit to a financial data API, get five answers in writing: what the license allows, how delayed the data is, how history is adjusted, the request limits, and the SLA and exit terms. Free official APIs such as the European Central Bank's need no key but still set conditions, and exchange data that software acts on, customers see or you pass on is licensed separately.
Most comparisons of financial data APIs count endpoints and calls per minute. The costly surprises come later: a license that covers a screen but not an algorithm, a history that changes when the provider revises it, or a free tier whose terms forbid your product.
Official pages cited here were read on 6 November 2026; naming a provider is not a recommendation. Disclosure: Fincode sells data integration and pipeline work, so this guide is not neutral on the build-or-buy question.
What to check in a financial data API before you commit
Check the license first and the endpoints last, because a gap in the license cannot be fixed with code.
| Area | Ask the provider | Why it matters later |
|---|---|---|
| Source | Who produces the data, and under which agreement it reaches you | The licensor decides what you may do |
| Coverage | Venues, instruments, fields and start dates | A missing field surfaces in production |
| Timeliness | The stated delay and the timestamps on each record | Real-time without a number cannot be tested |
| History | Depth, raw and adjusted series, delisted instruments, revisions | Results must be reproducible |
| License | Display, machine use, redistribution, derived data, storage | Each is a separate permission, often a separate fee |
| Limits | Request rates, symbols per connection, bulk files | Backfills and reconnects hit limits first |
| SLA | Uptime, data latency, incident notices, credits | Without numbers, an outage breaches nothing |
| Change and exit | Notice periods, deletion duties, export | Some terms change without notice |
Financial data API free: what free covers and what it does not
Free describes the price of access, not the right to build a product on the data, and official APIs set conditions too.
| Provider | Key | Limits | Conditions |
|---|---|---|---|
| European Central Bank Data Portal: rates and statistics | None; the check below ran without one | None stated on its nine API help pages | Free use if the ECB is cited and changes are stated; when built into anything sold, buyers must be told, before paying and at each access, that it is free from the ECB; reference rates are for information only, and transaction use is strongly discouraged |
| FRED, Federal Reserve Bank of St. Louis: economic series | Required, through a FRED account | Up to 120 requests a minute, then HTTP 429; the bank may also limit bandwidth | Third-party series need their owner's permission beyond personal use, which the bank says it cannot give; a non-endorsement notice is required; terms can change without notice |
| SEC EDGAR, data.sec.gov: filings and XBRL financial data | None | Current maximum of 10 requests per second | A declared User-Agent naming a company and a contact address; no CORS, so a browser app needs a server in between |
Turkish official sources have their own guides: the Turkish central bank's exchange rate API and TEFAS, KAP and EVDS data; commercial free tiers are listed with dates in the stock market data API guide and crypto price APIs.
Market data API licensing: display, machine use, redistribution, derived data
Exchanges license market data by how it is used, so one price feed can need several permissions at once.
- Display: a person sees the data. Whether that person is staff or a customer, professional or private, can change the fee.
- Non-display: software uses the data with nobody watching. Nasdaq's US Equities and Options Data Policies (version 2.6) define this as any access other than display, meaning automated use by a machine. Borsa Istanbul's data FAQ names surveillance, risk management, algorithmic trading and order routing systems and investment analysis services, and requires its Data Distribution Agreement, signed directly with the exchange, for them.
- Redistribution: the data leaves your company, which is a separate permission with its own reporting.
- Derived data: both exchanges define it as information from which the original data cannot be rebuilt. Borsa Istanbul requires a separate index agreement when the derived value is an index and its Data Distribution Agreement otherwise, and Nasdaq says derived data containing price data from its all-US exchange information is generally fee-liable at the underlying product rates.
- Storage: how long you may keep history, and what you must delete when the contract ends.
Hypothetical example. A wealth app shows each client a portfolio volatility figure computed nightly from exchange closes. The figure may count as derived data, because the closes cannot be rebuilt from it; a table of the closes beside it is display; the nightly job is machine use. One screen, three license questions: ask which ones the contract covers, in writing.
The provider you pay is often not the licensor, so ask which exchange agreements it holds. The Turkish case is covered in Borsa Istanbul API and market data.
Real-time financial data API: what real-time and delayed mean in a contract
Real-time has no fixed meaning across providers, so the contract should state the delay, record timestamps and how latency is measured.
- The licensor defines the delay. Nasdaq's policy says delayed data may carry no charge depending on the product, but a delay message such as Data Delayed 15 minutes must appear prominently on displays, for example near the top, and a ticker should repeat it at least every 90 seconds.
- Official sources state their timing. The SEC says its EDGAR APIs are updated in real time as filings are disseminated, with a typical delay of under a second for submissions and under a minute for XBRL data.
- A date is not a timestamp. The ECB's page puts the daily concertation around 14:10 CET and publication around 16:00 CET, while the series title the API returned on 6 November 2026 says 2.15 pm (C.E.T.), and each record carries only a date. Decide which time you attach before joining these rates with intraday data.
- Keep three times: the source's event time, the provider's publish time and your receive time.
Test a free financial data API before you sign: a worked check
A short script aimed at awkward cases tells you more than a feature list. This one, run on 6 November 2026 without a key, asks the ECB for the US dollar per euro reference rate across the 2025 year end, for a window holding only holidays and for a series that does not exist.
import csv, http.client, io, re, urllib.error, urllib.request
from datetime import date, timedelta
from decimal import Decimal
BASE = "https://data-api.ecb.europa.eu/service/data/EXR/"
PLAIN = re.compile(r"[0-9]+(\.[0-9]+)?") # rejects 1e400, NaN, Infinity, signs
def fetch(key, start, end):
url = f"{BASE}{key}?startPeriod={start}&endPeriod={end}&format=csvdata"
req = urllib.request.Request(url, headers={"User-Agent": "Mozilla/5.0"})
try:
try:
with urllib.request.urlopen(req, timeout=20) as r:
return r.status, r.read().decode("utf-8", "replace")
except urllib.error.HTTPError as e: # 4xx and 5xx: keep the status
return e.code, e.read().decode("utf-8", "replace")
except (OSError, http.client.HTTPException) as e: # refused, reset, cut off
return None, str(e)
def parse(body):
rows = csv.DictReader(io.StringIO(body))
if "OBS_VALUE" not in (rows.fieldnames or []):
return {}, ["unexpected format"]
rates, seen, problems = {}, set(), []
for row in rows:
day = (row.get("TIME_PERIOD") or "").strip()
raw = (row.get("OBS_VALUE") or "").strip()
if not day:
problems.append("row without a date")
elif day in seen: # ambiguous: use neither copy
problems.append(f"{day} appears twice")
rates.pop(day, None)
else:
seen.add(day)
if PLAIN.fullmatch(raw) and Decimal(raw) > 0:
rates[day] = Decimal(raw)
else:
problems.append(f"{day} bad value {repr(raw)}")
return rates, problems
def check(key, start, end):
status, body = fetch(key, start, end)
print(f"{key} {start}..{end}:", end=" ")
if status is None:
return print("network error,", body)
if status == 404:
return print("HTTP 404, no series matches the query")
if not 200 <= status < 300:
return print(f"HTTP {status},", body[:80])
if not body.strip():
return print(f"HTTP {status} with an empty body")
try:
rates, problems = parse(body)
except csv.Error as e: # stray quote, bare CR
return print("unreadable CSV,", e)
day, gaps = date.fromisoformat(start), []
while day <= date.fromisoformat(end):
if day.weekday() < 5 and day.isoformat() not in rates:
gaps.append(day.isoformat())
day += timedelta(days=1)
print(f"{len(rates)} rates, problems: {problems or 'none'}")
print(" weekdays without a rate:", ", ".join(gaps) or "none")
check("D.USD.EUR.SP00.A", "2025-12-22", "2026-01-09")
check("D.USD.EUR.SP00.A", "2025-12-25", "2025-12-26")
check("D.XXX.EUR.SP00.A", "2025-12-22", "2026-01-09")Output on 6 November 2026:
D.USD.EUR.SP00.A 2025-12-22..2026-01-09: 12 rates, problems: none
weekdays without a rate: 2025-12-25, 2025-12-26, 2026-01-01
D.USD.EUR.SP00.A 2025-12-25..2025-12-26: HTTP 200 with an empty body
D.XXX.EUR.SP00.A 2025-12-22..2026-01-09: HTTP 404, no series matches the query- Empty is not always an error. The ECB's status-code page says a 404 means no results match the query. The unknown series returned 404, but the valid series over two holidays returned 200 with an empty body, so code waiting for a 404 breaks.
- Holidays look like outages. The three gaps are T2 closing days, when the ECB publishes no reference rates. A gap report needs the source's calendar, including Good Friday and Easter Monday, which move each year.
- Parsing decides correctness. In Python, float('1e400') returns inf and float('1e-400') returns 0.0, so a careless parser stores impossible values silently. Synthetic tests confirmed that this one reports them, along with NaN, Infinity, negative, zero, undated and repeated rows, and that server, network and CSV failures print a clear message. The CSV also wrote the 31 December 2025 rate as 1.175 although the metadata says four decimals, so compare numbers, not strings.
History, adjustments and revisions: what to ask
Ask whether history arrives as first published or as later revised, and keep both when the difference matters.
- Corporate actions: ask for raw prices, adjustment factors and the method, so you can rebuild adjusted series yourself.
- Revisions: macro statistics and company financials are corrected after release. The ECB API documents updatedAfter, which returns changes including revisions, and includeHistory, which returns previous versions. Without an equivalent, a backtest uses figures nobody knew at the time.
- Delisted and renamed instruments must stay in the history, or results suffer survivorship bias, as backtesting pitfalls explains.
- Bulk history: per-request backfills run into limits, so ask for bulk files, such as the SEC's nightly ZIP of its XBRL frames and company facts data.
How to compare financial data API providers and quotes
Send every provider the same written use case and compare the answers row by row, exchange fees included.
- Specify instruments, fields, history, freshness, who sees the data, which software uses it, whether it leaves your company and the request volume.
- Ask which agreements cover your use, whether exchange fees and user reporting are included, what the SLA measures and pays, how much notice precedes changes, and what you must delete when you leave.
- Compare the total cost of the same use case over the term, not the entry price, after a proof of concept on your hardest case.
| Red flag | Why it matters |
|---|---|
| Cannot name the source or the agreement behind it | The provider may have no right to pass the data on |
| Commercial use confirmed by email but not in the terms | The written terms may override the email |
| Real-time with no stated delay or measurement | Nothing to test or enforce |
| Data scraped against a site's terms | The license problem can become yours |
| No change notice or deletion terms | Your product rests on terms that can move |
Buying is often enough when a provider's license and coverage fit your use. A pipeline of your own makes sense when nobody sells the data in the form you need, or when you must show what your software saw at a given moment. For integration work in general, see Fincode's market data pipelines page; naming a provider here does not mean Fincode integrates it or has built on it.
Frequently asked questions
Is there a free financial data API that needs no key?
Yes, among official providers: as of 6 November 2026 the European Central Bank's data API and the SEC's data.sec.gov APIs need no key, while FRED requires one. Each still sets conditions on use.
Can I use free financial data in a commercial product?
Only where the written terms allow it. The ECB allows free use if it is cited, but buyers of anything sold with its data must be told it is free from the ECB. FRED says third-party series need their owner's permission beyond personal use.
What is non-display use of market data?
Use by software with nobody viewing the data, such as algorithmic trading, risk management or order routing. Nasdaq and Borsa Istanbul license it separately from display.
What does real-time mean in a financial data API?
Whatever the contract states, so ask for the delay, record timestamps and how latency is measured.
Sources
- ECB Data Portal: API data queries (entry point, parameters, updatedAfter, includeHistory, formats) (opens in a new tab)
- ECB Data Portal: API status codes (opens in a new tab)
- ECB: Euro foreign exchange reference rates (opens in a new tab)
- ECB: Disclaimer and copyright (reuse of ECB information) (opens in a new tab)
- ECB: T2, opening and closing days (opens in a new tab)
- Federal Reserve Bank of St. Louis: FRED API Terms of Use (opens in a new tab)
- Federal Reserve Bank of St. Louis: FRED API errors (120 requests per minute, HTTP 429) (opens in a new tab)
- SEC: EDGAR Application Programming Interfaces (data.sec.gov) (opens in a new tab)
- SEC: Accessing EDGAR Data (fair access, request rate, User-Agent) (opens in a new tab)
- Nasdaq: US Equities and Options Data Policies, version 2.6 (opens in a new tab)
- Borsa Istanbul: FAQ on data distribution and index licensing, non-display use and derived data (Turkish) (opens in a new tab)
This guide is general information about software and markets, not investment, legal or tax advice. Automated trading can lose money, past or backtested performance does not guarantee future results, and the rules that apply depend on your jurisdiction and your exchange's terms. Sources, checks and corrections: see the editorial policy.