DEV Community

Cover image for Best Finance Data APIS
TheBitForge for Roic AI

Posted on

Best Finance Data APIS

If you are building anything around company fundamentals, start with ROIC.ai. It is a financial data API with prices, statements, ratios and earnings call transcripts for more than 68,000 tickers on over 70 exchanges, a free plan that needs no credit card, and a hosted MCP server so your AI tools can query the same data. It tops this list, and the first big section below explains why.

The rest of the post compares ROIC.ai with eight other providers, so you can see where it wins and where it does not. I looked at what actually decides a project: what data you get, how far back it goes, how fast you can pull it, what the free tier really allows, and whether you may ship the data inside a product.

A few honest notes first. I compared published documentation and pricing pages, last checked in late October 2026, and I did not run my own latency benchmarks. Prices move, so confirm every number on the vendor page. Near the end there is a small script you can use to measure the providers yourself.

Table of contents

  1. The quick answer
  2. Why ROIC.ai is my top pick
  3. How to judge a finance data API
  4. The comparison at a glance
  5. The other best finance data APIs
  6. Measure them yourself
  7. Mistakes that cost real money
  8. Frequently asked questions
  9. Final thoughts

The quick answer

There is no single best finance data API for every job, and anyone who names one without asking what you are building is selling something. For fundamentals, ratios and transcripts across many markets, though, ROIC.ai is the one I would try first. For other jobs, here is where I would start.

If you need Start with
Company fundamentals, ratios and transcripts across many countries ROIC.ai
Statements and screening, US focused Financial Modeling Prep
Live and streaming US market data Massive, formerly Polygon.io
A free key to prototype with Finnhub or Twelve Data
Decades of end of day history worldwide EODHD
Clean adjusted prices for backtests Tiingo
Official filings and raw XBRL facts at no cost SEC EDGAR
A first project with plenty of tutorials Alpha Vantage

Why ROIC.ai is my top pick

ROIC.ai is a financial data API covering stock prices, financial statements, earnings call transcripts, ratios and company data. Its published scale is more than 68,000 tickers across more than 70 global exchanges, with financial statement history going back over 40 years. Fundamentals come from SEC filings and prices from Nasdaq, refreshed daily, according to a third party review of the service.

Here is what makes it stand out.

Depth where it matters. Beyond income statements, balance sheets and cash flow, it exposes profitability ratios (including return on invested capital, the name on the door), credit and debt ratios, liquidity ratios with an Altman Z-Score, working capital ratios, yield analysis, enterprise value and valuation multiples. Most providers make you calculate those yourself.

A free plan you can really develop on. Worldwide coverage, a 5 requests per minute limit and the MCP server are all included at no cost. ROIC.ai's own comparison with Alpha Vantage points out that Alpha Vantage's free key stops at 25 requests per day, which is a very different experience for a developer testing an idea.

Real throughput on a small plan. The Individual plan is 29 dollars a month for 300 requests per minute, and Professional at 89 dollars a month has no request cap.

Earnings coverage. Earnings calendars with estimates and surprises, plus call transcripts in raw and edited versions, with audio and slide decks where available.

Built for AI tools. The hosted MCP server exposes 36 read only tools and works on every plan, including free. There is also an open source version you can run locally.

More than prices. Forex for more than 4,000 pairs, stock splits, company profiles, logos, and sector and industry reference data, plus bulk downloads on paid plans. Official clients exist for Python, JavaScript, Ruby and Go.

Pricing and limits

Free Individual Professional Enterprise
Price per month 0 29 dollars 89 dollars Custom
Requests per minute 5 300 Unlimited Unlimited
Price and financial history 2 years 5 years 40 plus years 40 plus years
Quarterly financials None 20 quarters 160 plus quarters 160 plus quarters
Earnings transcripts 2 quarters 2 quarters All available All available
Earnings calendar and bulk downloads No No Yes Yes
MCP server access Yes Yes Yes Yes
Commercial license No No No Yes

Annual billing includes two free months. Free and Individual both cap transcripts at two quarters, so the 17 plus year transcript archive needs Professional.

The honest limits

It does not fit every job. Prices are daily only, so there is no intraday or tick data. There is no options or crypto data. And if you plan to redistribute the data inside a product, you need Enterprise, because the lower plans carry no commercial license. If any of those are your main need, look at the providers further down.

A first request

Authentication takes one header. Every v3 path starts with the version, and tickers use an exchange prefix such as NASDAQ:AAPL.

import os
import time
import requests

BASE = "https://api.roic.ai/v3.0.0"
HEADERS = {"Authorization": f"Bearer {os.environ['ROIC_API_KEY']}"}

def get(path, **params):
    r = requests.get(f"{BASE}{path}", headers=HEADERS, params=params, timeout=30)
    if r.status_code == 429:
        time.sleep(int(r.headers.get("Retry-After", 30)))
        return get(path, **params)
    r.raise_for_status()
    return r.json()

latest = get("/stock-prices/latest/NASDAQ:AAPL")
income = get(
    "/fundamental/income-statement/NASDAQ:AAPL",
    period_type="annual",
    **{"fiscal_year.gte": 2025},
)
print(latest)
print(income)
Enter fullscreen mode Exit fullscreen mode

Two details from the docs are worth knowing. Send either the query parameter key or the bearer header, never both, because supplying both returns a 401. And a request counts against your limit before validation runs, so even a malformed call costs you one.

Connecting an AI assistant

The hosted MCP server lives at https://mcp.roic.ai/mcp. In Claude Code, one command adds it:

claude mcp add --transport http roicai https://mcp.roic.ai/mcp
Enter fullscreen mode Exit fullscreen mode

For CI jobs or clients without hosted login support, there is also an open source server you can run locally with an API key. Review its license and recent commits on GitHub before adopting it, as you would with any third party package.

Once connected, you can ask for things like profitability ratios for two companies over three years, and the assistant routes the request to the right tool. Plan limits apply exactly as they do over REST.

For every endpoint, error code and the full MCP tool list, ROIC.ai has its own detailed guide:


You can start free at roic.ai/signup with no credit card, and the interactive docs live at roic.ai/api/docs.

How to judge a finance data API

Most comparison posts rank by feature count. That is the wrong lens. A longer endpoint list does not help if the one endpoint you need is locked behind a plan you cannot afford. These are the questions I would ask, in this order.

What kind of data do I need? Prices, fundamentals, filings, news and transcripts are different products. Many providers are strong at one and thin at the rest.

Where are my companies listed? Several providers cover US stocks well and treat everything else as an upgrade.

How much history do I need? Free and entry plans often cap history at two to five years. That is fine for a dashboard and useless for a long backtest.

What will my call budget look like? Do this math before you pick a plan, not after.

calls per day=Nsymbols×Rrefreshes×Eendpoints \text{calls per day} = N_{\text{symbols}} \times R_{\text{refreshes}} \times E_{\text{endpoints}}

Say you track 500 tickers, refresh twice a day, and hit three endpoints for each. That is 3,000 calls a day. On a free tier capped at 25 requests per day, that job would take 120 days to finish once. And some vendors weight calls differently. EODHD, for example, charges 1 call for an end of day request but 10 for fundamentals, so the same job costs far more than the raw count suggests.

Am I allowed to ship this data? Personal use and commercial redistribution are different licenses. This is the one people skip, and it is the one that can end a product.

Can an AI agent use it? More providers now run MCP servers so assistants can query data directly. If you build with agents, that is worth checking.

The comparison at a glance

Provider Best for Free tier Paid entry point Standout limit
ROIC.ai Fundamentals, ratios, transcripts 5 requests per minute, 2 years, MCP included 29 dollars a month for 300 per minute Daily prices only
Alpha Vantage Learning, scheduled jobs 25 requests per day, 5 per minute 49.99 dollars a month for 75 per minute Free tier is tiny
Financial Modeling Prep Statements and screening 250 calls per day, end of day Starter, US only Global data sits in the top plan
Massive (Polygon.io) Live US trading data 5 calls per minute, 2 years end of day 29 dollars a month, 15 minute delay US focus
Twelve Data Multi asset time series 800 credits per day 29 dollars a month Credit weights vary by endpoint
Finnhub Fast prototypes 60 calls per minute, personal use Priced per market Free tier is non commercial
EODHD Global history 20 calls per day 19.99 dollars a month Fundamentals cost 10 calls each
Tiingo Adjusted history Free Starter plan 30 dollars a month Fundamentals sold separately
SEC EDGAR Filings and XBRL Free, no key Not applicable 10 requests per second, you normalize the data

The other best finance data APIs

Alpha Vantage

Alpha Vantage is where a lot of developers start, and there is a good reason. It has a huge tutorial base, a broad endpoint list that includes technical indicators, and a key you can get in seconds.

The free tier is the catch. You get 25 requests per day and 5 per minute, and the vendor's own community has noted that the daily number used to be 500, then 100, and is now 25. Paid plans run from 49.99 dollars a month for 75 requests per minute up to 249.99 for 1,200 per minute, and paid plans have no daily cap.

Use it for learning and for small scheduled jobs. Do not build anything that refreshes often on the free key.

import os
import requests

url = "https://www.alphavantage.co/query"
params = {
    "function": "GLOBAL_QUOTE",
    "symbol": "IBM",
    "apikey": os.environ["ALPHAVANTAGE_KEY"],
}
print(requests.get(url, params=params, timeout=30).json())
Enter fullscreen mode Exit fullscreen mode

Financial Modeling Prep

Financial Modeling Prep, usually called FMP, leans toward statements, ratios and screening. The free Basic plan gives 250 calls per day with end of day data and a sample of tickers.

The paid ladder matters more than the free tier. Starter allows 300 calls per minute but covers US companies only. Premium raises that to 750 per minute and adds UK and Canadian coverage plus up to 30 years of history. Global coverage, earnings transcripts and 13F filings sit in Ultimate at 3,000 calls per minute.

One detail most reviews miss: FMP also enforces a trailing 30 day bandwidth cap, 500 MB on free, 20 GB on Starter, 50 GB on Premium and 150 GB on Ultimate. If you pull bulk statements, you can hit that before you hit the call limit.

Starter pricing shows up in the twenties on annual billing and a little higher month to month, so check the live page.

Massive, formerly Polygon.io

Polygon.io became Massive on October 30, 2025. The two API hostnames ran in parallel during the transition, and the plan prices I found match what Polygon charged under its old name.

Massive is the pick when you care about live US market data. It covers stocks, options, indices, forex and crypto, with WebSocket streaming and flat file downloads. Individual stock plans run from a free Basic tier (5 calls per minute, two years of end of day data) to Starter at 29 dollars a month, Developer at 79 and Advanced at 199. Starter data is delayed 15 minutes, so true real time costs more.

The tradeoff is scope. It is excellent at market data and less central for fundamentals, and it is US focused.

Twelve Data

Twelve Data offers one consistent interface across equities, ETFs, forex, crypto and indices, with server side technical indicators and WebSockets. The free plan gives 800 API credits per day, and paid plans start at 29 dollars a month.

The word to watch is credits. Different endpoints consume different amounts, so a naive call count will mislead you. Read their data weight explanation before you size a plan.

Finnhub

Finnhub has one of the most generous free tiers in the category: about 60 calls per minute, real time US quotes, company news, basic fundamentals, forex and crypto, and a WebSocket stream, all without a credit card.

The catch is the license. The free key is meant for personal, non commercial projects. Paid plans are priced per market and not as simple to read as a flat table, so expect to spend some time on the pricing page.

It is a great prototyping key. Confirm the terms before it goes near a product.

import os
import requests

r = requests.get(
    "https://finnhub.io/api/v1/quote",
    params={"symbol": "AAPL", "token": os.environ["FINNHUB_KEY"]},
    timeout=30,
)
print(r.json())
Enter fullscreen mode Exit fullscreen mode

EODHD

EODHD, short for EOD Historical Data, is the long history specialist. The free plan gives only 20 calls per day, but the paid End of Day plan is 19.99 dollars a month and the End of Day plus Intraday plan is 29.99. Paid plans allow 100,000 calls per day and 1,000 per minute.

Remember the call weights. One call for end of day or live data, five for intraday and news, ten for fundamentals, and 100 or more for bulk. Commercial use goes through a separate startup and enterprise plan, so do not assume a 29.99 dollar plan covers a product.

Tiingo

Tiingo is the one I would reach for when the quality of adjusted price history and corporate actions matters most, such as backtesting. Its free Starter plan is limited to about 50 requests per hour and 500 unique symbols per month. The Power plan for individuals is 30 dollars a month, or 300 on annual billing, and a Business plan for internal company use is priced higher.

Fundamentals and news have historically sat behind paid access or add ons, so check what your plan includes before you plan around them.

SEC EDGAR

EDGAR is not a vendor. It is the primary source, and it is free. The SEC exposes company submissions and extracted XBRL facts through JSON endpoints on data.sec.gov, with no API key.

The rules are strict. The fair access guidance caps you at 10 requests per second across all your machines, and you must send a User-Agent that identifies you with contact details. Skip that header and you get a 403 quickly, and repeat offenders can be blocked.

You also do the normalizing yourself. Facts can appear under several taxonomies, and companies tag things differently. That is the price of free, as filed data, and it is the work a service like ROIC.ai does for you.

import time
import requests

HEADERS = {"User-Agent": "Your Name your.email@example.com"}

facts = requests.get(
    "https://data.sec.gov/api/xbrl/companyfacts/CIK0000320193.json",
    headers=HEADERS,
    timeout=30,
).json()

revenues = facts["facts"]["us-gaap"].get("Revenues", {})
print(list(revenues.get("units", {}).keys()))
time.sleep(0.2)  # stay far below 10 requests per second
Enter fullscreen mode Exit fullscreen mode

A note on yfinance. It is a popular open source Python wrapper around Yahoo Finance data. It is great in a notebook, but it is not an official API with an agreement behind it, so I would not build a paid product on it.

Measure them yourself

Documentation tells you what a vendor promises. A ten minute test tells you what you will actually get from your own server. Here is a small harness that times a list of endpoints and prints the median and the slowest runs.

import os
import statistics
import time
import requests

def bench(name, url, headers=None, params=None, runs=10):
    times = []
    for _ in range(runs):
        start = time.perf_counter()
        r = requests.get(url, headers=headers, params=params, timeout=30)
        r.raise_for_status()
        times.append((time.perf_counter() - start) * 1000)
        time.sleep(1.5)  # respect free tier limits
    times.sort()
    print(f"{name}: median {statistics.median(times):.0f} ms, slowest {times[-1]:.0f} ms")

bench(
    "roic.ai",
    "https://api.roic.ai/v3.0.0/stock-prices/latest/NASDAQ:AAPL",
    headers={"Authorization": f"Bearer {os.environ['ROIC_API_KEY']}"},
)
# Add one line per provider, with your own keys
Enter fullscreen mode Exit fullscreen mode

Run it from the region where your app will live. A fast result from your laptop in one country can look very different from a cloud server in another.

Mistakes that cost real money

Using unadjusted prices for returns. After a split or dividend, raw closes lie. Check whether an endpoint returns adjusted or unadjusted data before you compute anything.

Treating the free tier as a license. A key that works is not permission to redistribute. Read the terms for commercial use every time.

Counting calls without weights. The 3,000 calls you planned can turn into 30,000 on a provider that weights fundamentals.

Putting keys in query strings. URLs get logged by servers, proxies and browsers. Prefer an authorization header where the provider supports one.

Skipping the cache. Fundamentals change a few times a year. Fetch them once, store them, and stop paying for the same answer twice.

Ignoring symbol formats. Some providers want a bare ticker, others want an exchange prefix. A mismatch looks like missing data when it is really a wrong identifier.

Frequently asked questions

What is the best finance data API?
For company fundamentals, ratios and earnings transcripts across many markets, ROIC.ai is the one I would start with. For live US trading data it is Massive, and for a free prototype key it is Finnhub. The right answer depends on the data you need, so use the quick answer table near the top.

What is the best free finance data API?
For raw call volume, Finnhub's 60 calls per minute is the most generous, though it is for personal use. For fundamentals on a free key, ROIC.ai offers worldwide coverage, 5 requests per minute and MCP access, with two years of history. Alpha Vantage's 25 requests per day is the tightest of the group.

Which finance data API works best with AI agents?
Look for a native MCP server. ROIC.ai runs a hosted one with 36 read only tools on every plan, including free, and an open source version for local use. Several other providers have community built servers. Plan limits still apply to every tool call.

Which finance data API has real time stock data?
Massive, Finnhub and Twelve Data all offer real time or streaming options, with limits that depend on the plan. Several entry plans deliver data delayed by 15 minutes, so check the delay before you build anything that trades. ROIC.ai serves daily prices only.

Is there an official free source for company financials?
Yes. SEC EDGAR provides filings and XBRL facts for free with no key, within a limit of 10 requests per second and a required User-Agent header. You normalize the data yourself.

Can I use these APIs in a commercial product?
Often only on higher tiers. ROIC.ai reserves commercial redistribution for Enterprise, Finnhub's free key is non commercial, and EODHD routes commercial use to a separate plan. Always read the license, not just the pricing table.

Final thoughts

Choose by the job, not by the brand. For live US trading data, Massive is the natural fit. For a free prototype key, Finnhub and Twelve Data are hard to beat. For decades of global end of day history, look at EODHD. For clean adjusted prices, Tiingo. For official filings at no cost, go to EDGAR directly.

And for fundamentals, ratios and transcripts across many markets, with an MCP server for your AI tools and a free plan to test on, ROIC.ai is the one I would open first. Create a free key at roic.ai/signup, run the first request from this post, and see whether the data matches what you need.

Whatever you pick, run the call budget math first, read the license second, and test with your own script third. That order saves you from the expensive kind of surprise.

What are you building, and which API ended up in your stack? Tell me in the comments.

Top comments (0)