Get live market quotes and fundamentals from one endpoint
The Finance API returns real-time quotes, charts, fundamentals and analyst data as clean JSON.
78 active endpoints, on 1 and 2 credit tiers.
- POST/finance/v1/quote
- POST/finance/v1/chart
- POST/finance/v1/search
- POST/finance/v1/fundamentals
- POST/finance/v1/analyst
- POST/finance/v1/holders
- POST/finance/v1/news
- +71 more
What Stocks & Finance endpoints does ReefAPI ship?
78 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.
Stocks & Finance API
3 of 78 endpoints, ready to run
Live price, change, percent change, currency, market state, market cap, volume and an exchange timestamp — for as many symbols as you list, across asset classes, in one call.
{ "ok": true, "meta": { "api": "finance", "endpoint": "quote", "mode": "live", "latency_ms": 5902.4, "record_count": 6, "cache_hit": false, "completeness_pct": 100 }, "data": { "quotes": [ { "symbol": "AAPL", "shortName": "Apple Inc.", "longName": "Apple Inc.", "price": 320.14, "change": 5.560028, "changePercent": 1.767445, "currency": "USD", "marketState": "REGULAR", "exchange": "NasdaqGS", "quoteType": "EQUITY", "marketCap": 4672180977664, "volume": 20142087, "timestamp": 1787937530 }, { "symbol": "MSFT", "shortName": "Microsoft Corporation", "longName": "Microsoft Corporation", "price": 516.72, "change": 11.659973, "changePercent": 2.3086312, "currency": "USD", "marketState": "REGULAR", "exchange": "NasdaqGS", "quoteType": "EQUITY", "marketCap": 3836927803392, "volume": 14816155, "timestamp": 1787937529 }, { "symbol": "BTC-USD", "shortName": "Bitcoin USD", "longName": "Bitcoin USD", "price": 77982.47, "change": -2462.664, "changePercent": -3.0612967, "currency": "USD", "marketState": "REGULAR", "exchange": "CCC", "quoteType": "CRYPTOCURRENCY", "marketCap": 1565052370944, "volume": 38963494912, "timestamp": 1787937527 } ] } }
How the Stocks & Finance API works
Stocks & Finance is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.
No OAuth app, no request signing, no per-site account. One key covers all 185 engines.
Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.
Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.
One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.
One quote call for a whole watchlist, then drill in
The mistake is calling quote once per ticker. It takes a list, and the list can mix asset classes that would otherwise be four different products.
{"symbols": "AAPL,MSFT,BTC-USD,EURUSD=X,^GSPC,GC=F"}Six rows, six asset classes, one call. Every row carries its own currency and its own exchange timestamp — check that timestamp, it is not the same for all of them.
{"symbol": "AAPL", "range": "1mo", "interval": "1d"}Candles for the ones that moved. Points carry a timestamp, OHLC and volume; the currency is stated once at the top.
{"symbol": "AAPL"}The rating distribution and the recent target changes, with the firm named on each move.
A watchlist refresh is one credit, not one per symbol. Fundamentals, options chains, holders, insider transactions and the earnings, dividend, IPO and economic calendars are all on the same key.
curl -X POST https://api.reefapi.com/finance/v1/quote \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"symbol":"AAPL"}'{
"ok": true,
"data": { … },
"meta": {
"api": "finance",
"endpoint": "quote",
"mode": "live",
"latency_ms": …,
"record_count": …
},
"error": null
}Symbol formats, and what each instrument type actually fills in
Symbols follow Yahoo Finance conventions, and the shape of the answer changes with the instrument. An equity carries a market cap and a real volume; an FX pair carries neither. The single field people get wrong is currency, because it is not always the currency you would guess from the exchange. Every row below came back from one live multi-symbol quote call.
| Symbol form | Measured example | quoteType / exchange | What comes back |
|---|---|---|---|
| Plain US ticker | AAPL | EQUITY / NasdaqGS | currency USD, a real marketCap, volume and price |
| Ticker + exchange suffix | BP.L | EQUITY / LSE | currency GBp, meaning pence: 522.7 is 522.70 pence, not 522.70 pounds |
| Crypto pair | BTC-USD | CRYPTOCURRENCY / CCC | currency USD, marketCap present, marketState REGULAR around the clock |
| FX pair | EURUSD=X | CURRENCY / CCY | currency USD, marketCap null, volume 0 |
| Index, caret prefix | ^GSPC | INDEX / SNP | currency USD, marketCap null, the index level in price |
| Unrecognized string | NOTAREALTICKER123 | not returned at all | ok:true with quotes: [] and record_count 0, not an error |
Batch several symbols in one call with `symbols` (comma-separated) rather than `symbol`. Every timestamp in quote, chart and events is unix seconds in UTC, and on a chart it marks the bar's open: a 1d/5m AAPL chart started at 1787751000, which is 13:30:00Z, the 09:30 New York open.
How fresh is this number, and what currency is it in
Measured on 2026-08-28 during US market hours, against six asset classes and six non-US exchanges, by comparing each row's own exchange timestamp with the wall clock at the moment of the call.
In one call the exchange timestamps were 14, 15, 15, 18, 27 and 15 seconds behind the wall clock for two US equities, crypto, a currency pair and a major index. Two identical calls seconds apart returned a moved volume figure and a timestamp one second later, so this is a real tick and not a cached snapshot.
The gold future in the same call carried a timestamp 614 seconds old while everything beside it was under half a minute. That is the exchange's own delay, not a fault, and the response hands you the timestamp to see it with. Never assume one call means one freshness.
Six non-US tickers returned six currencies — EUR, JPY, BRL, INR, TRY and, for the London line, GBp. That last one is PENCE, not pounds, and it is the single most common way a portfolio total comes out a hundred times too big. Read the currency field on every row.
The same call returned REGULAR for the US and European names and POSTPOST for Tokyo and India, which were closed. Crypto and FX also report REGULAR around the clock, so treat that field as a market-hours flag for exchange-traded instruments only.
For the week after measurement, the calendar counter reported 100 earnings events and the market-wide earnings feed returned zero rows for exactly the same window. Asked for a window seven weeks out it returned 50 rows, correctly filtered to the two days requested, and its offset paging worked. The date filter is fine; the count endpoint is not a reliable pre-check for it.
A news query on a large-cap ticker returned an unrelated index-fund article as its first row, published minutes earlier. The timestamps are genuinely current — the relevance is keyword-level. Filter on the symbol field rather than trusting the query.
What people build with Stocks & Finance
The jobs this data is most often used for.
endpoints
credits per call
Portfolio dashboards call quote and chart to show live prices and history for a holding.
Research tools use fundamentals and analyst to evaluate a company's financials and ratings.
Trading apps use options, calendar and events to track expiries, earnings and catalysts.
What Stocks & Finance data costs
The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.
Full pricing →- 1,000 free credits on signup, no card
- One key, all 185 APIs, one credit pool
- Failed and blocked calls are never charged
- Credits roll over and never expire
Call it in two lines
Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.
curl -X POST https://api.reefapi.com/finance/v1/quote \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"symbol":"AAPL"}'import requests
r = requests.post(
"https://api.reefapi.com/finance/v1/quote",
headers={"x-api-key": REEF_KEY},
json={
"symbol": "AAPL"
},
)
print(r.json()["data"])Have a question? We got answers.
The questions people actually ask before wiring up Stocks & Finance.
Get a free key →Why is BP.L quoted at 522.7 when the share trades around five pounds?▾
Because London-listed shares are quoted in pence, and the response says so. A live quote on BP.L returned currency "GBp" with a lowercase p, and the fundamentals price module for the same symbol returned currencySymbol "£". GBp is pence, so 522.7 means 5.227 pounds. Divide by 100 before comparing it to anything denominated in GBP, and read the currency field rather than inferring it from the exchange suffix.
Are the quotes real-time or delayed, and by how much?▾
It depends on the exchange, and the answer is in the data rather than in a blanket policy. Call fundamentals with modules=price and read exchangeDataDelayedBy alongside quoteSourceName. Measured in one pass: AAPL returned 0 and "Nasdaq Real Time Price", BP.L returned 15 and "Delayed Quote", and the Nikkei 225 in a market_summary response returned 20. There is no single delay figure that covers the whole API.
After the close, is quote.price the last regular-session price or the after-hours print?▾
The regular-session price. On a measured AAPL call with marketState "POST", quote returned price 313.45, while the fundamentals price module for the same symbol at the same moment showed regularMarketPrice 313.45, postMarketPrice 311.48 and preMarketPrice 310.24. If you need the extended-hours print, take it from fundamentals modules=price. marketState values seen live include REGULAR, POST, POSTPOST and PREPRE.
Why does fundamentals return {raw, fmt} objects when quote returns plain numbers?▾
quote, chart, events and technicals are normalized to plain JSON numbers. fundamentals, analyst, calendar and market_summary pass through Yahoo's quoteSummary shape, where each value is an object such as {"raw": 309.9, "fmt": "309.90"}, sometimes with a longFmt as well. Read .raw for arithmetic and .fmt only for display. Handle both shapes if your code touches actions from each group.
I passed a range value that is not on the list and got one candle back. Why no error?▾
range and interval are ignore-on-invalid, so a token the API does not recognize is passed through to Yahoo instead of being rejected. A live chart call with range="banana" returned ok:true, echoed "range": "banana" back in the payload, and delivered a single daily candle. Compare data.range against what you sent, and treat a record_count of 1 on a multi-day request as a bad range token rather than a quiet market.
Why does a 5-year range with a 5-minute interval fail?▾
Yahoo does not serve intraday candles over long windows, and the refusal surfaces as ok:false with error code UPSTREAM_HTTP. Measured back to back: range=1d with interval=5m returned 79 points, while range=5y with interval=5m failed outright. Keep minute intervals to short ranges and use 1d or coarser for multi-year history.
Does technicals give me the full indicator series or just the latest value?▾
Just the latest value. A measured 6mo/1d call on AAPL returned twelve indicators as scalars or small objects, never arrays: sma20, sma50, ema20, ema50, rsi14, atr14, adx14, obv and vwap as single numbers, plus macd {line, signal, histogram}, bollinger20 {upper, middle, lower} and stochastic14 {k, d}. The periods parameter chooses which SMA and EMA lookbacks are computed; RSI, MACD, Bollinger, ATR and ADX are always included. For a series, pull chart and compute over the OHLCV points.
What does the analyst action actually contain?▾
Three quoteSummary modules: recommendationTrend, upgradeDowngradeHistory and financialData. In a measured AAPL call, recommendationTrend.trend[0] was {"period": "0m", "strongBuy": 6, "buy": 19, "hold": 14, "sell": 3, "strongSell": 2}, which is the analyst head count for the current month with earlier months in later entries. financialData carried recommendationKey "buy" and targetMeanPrice as {"raw": 324.45282, "fmt": "324.45"}.
What is the Stocks & Finance API?▾
Stocks & Finance API is a ReefAPI endpoint group for quotes, charts, fundamentals and market data. It returns live JSON through POST requests under /finance/v1.
Is the Stocks & Finance API free to try?▾
Yes. ReefAPI starts with 1,000 free credits, no card required. Stocks & Finance calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Stocks & Finance login or account?▾
No login to Stocks & Finance is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Stocks & Finance data?▾
The page example is captured from a live quote call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Stocks & Finance API use?▾
Stocks & Finance actions currently cost 1-2 credits per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Stocks & Finance from an AI assistant or MCP client?▾
Yes. Connect ReefAPI once through MCP and your assistant can call finance actions with the same key, credit pool and JSON envelope used by normal REST requests.
5 Finance & Data APIs on the same key
One key, one credit pool, one response envelope. If you are pulling Stocks & Finance, you are one call away from the rest of the category — no second contract, no second integration.
Need something this API does not do?
Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.
Try it on your own data before you pay anything
The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 184 APIs, and the same envelope everywhere.
Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-28.