Stock Flow Bars API
Multi-resolution OHLCV plus flow bars derived from the live trade tape, returned oldest-first for chart consumers across 1s to 4h resolutions.
Endpoint
X-Api-Key)
Rate Limited: Yes
Alpha plan+
Parameters
| Name | In | Required | Default | Description |
|---|---|---|---|---|
symbol |
path | yes | - | Stock symbol (uppercased server-side) |
resolution |
query | yes | - | One of 1s, 1m, 5m, 15m, 30m, 1h, 4h. Anything else returns 400 {"error":"invalid_resolution"}. |
minutes |
query | no | 60 | Look-back window. Clamped to [1, 1440] (24h matches the in-memory ring cap). |
curl -H "X-Api-Key: YOUR_API_KEY" \
"https://lab.flashalpha.com/v1/flow/stocks/SPY/bars?resolution=5m&minutes=60"
import requests
resp = requests.get(
"https://lab.flashalpha.com/v1/flow/stocks/SPY/bars",
headers={"X-Api-Key": "YOUR_API_KEY"},
params={"resolution": "5m", "minutes": 60}
)
data = resp.json()
print(f"Bars returned: {data['count']}")
const resp = await fetch(
"https://lab.flashalpha.com/v1/flow/stocks/SPY/bars?resolution=5m&minutes=60",
{ headers: { "X-Api-Key": "YOUR_API_KEY" } }
);
const data = await resp.json();
console.log("Bars returned: " + data.count);
Response
{
"symbol": "SPY",
"resolution": "5m",
"minutes": 60,
"count": 12,
"dataStartUtc": "2026-05-30T13:30:00Z",
"bars": [
{
"ts": "2026-05-30T15:00:00Z",
"closed": true,
"open": 531.12,
"high": 531.88,
"low": 530.94,
"close": 531.55,
"vwap": 531.41,
"buyVolume": 184200,
"sellVolume": 152800,
"midVolume": 21400,
"netVolume": 31400,
"tradeCount": 5820,
"biggestTrade": 12000
}
]
}
Key Response Fields
| Field | Type | Description |
|---|---|---|
symbol | string | Uppercase symbol |
resolution | string | Echo of requested resolution |
minutes | integer | Effective window |
count | integer | Number of bars returned |
dataStartUtc | string | null | Timestamp of the oldest 1-second bucket in the in-memory ring (UTC), or null when no history exists. Use this to detect partial coverage when requesting minutes=1440 against a process that started recently - if dataStartUtc > now - minutes*60, the response covers a shorter window than requested. |
bars[] | array | Oldest-first bars. Each entry: ts (bar start, UTC), closed (bool), open, high, low, close, vwap, buyVolume, sellVolume, midVolume, netVolume, tradeCount, biggestTrade. |
bars[].closed | boolean | true once wall-clock time has advanced past [ts, ts + resolution) - i.e. the bar is final. The right-edge bar is typically false (still accumulating). Chart libraries should use this flag directly rather than re-deriving it client-side. |
Errors
| Status | Description |
|---|---|
400 invalid_resolution | Unrecognized resolution (must be one of 1s, 1m, 5m, 15m, 30m, 1h, 4h). |
403 | Requires Alpha plan or higher. |
About
Stock Flow Bars return multi-resolution OHLCV plus flow bars derived from the live trade tape, backed by an in-memory 1-second ring per symbol. Higher resolutions are computed on read by streaming roll-up. Bars are returned oldest-first for chart consumers, in contrast to /history, which is newest-first. The leftmost bar's start time is always boundary-aligned to the resolution, and the right-most bar may be partial while the current bar is still accumulating.
1-second history is in-memory only and dropped across container restarts; dataStartUtc surfaces the effective coverage so clients can distinguish "process is too young to answer" from "symbol is quiet." Use /history for long-term replay and /bars for live chart feeds.
Common Use Cases
- Feed live candlestick charts - request any
resolutionfrom1sto4hand plot each oldest-first bar'sopen/high/low/closefor an intraday price feed - Overlay flow on price - shade each bar by
buyVolume/sellVolumeand the signednetVolumeto read aggressor pressure under the candle - Drive TradingView or Lightweight Charts correctly - use the per-bar
closedflag to update the in-progress right-edge bar in place rather than re-deriving finality client-side - Detect partial coverage - compare
dataStartUtctonow - minutes*60to tell "process too young" from "symbol is quiet" before trusting a long window - Spot participation spikes - flag bars where
tradeCountorbiggestTradejumps above a rolling baseline - Track intrabar VWAP - compare
closeto the bar'svwapfor a fast mean-reversion read at the chart resolution
Related
Related reading
- Real-time options data: polling vs streaming - polling cadence for a live bar feed and handling the in-progress bar
Complementary endpoints
- Stocks History - newest-first minute buckets for long-term replay (vs these live, oldest-first bars)
- Stocks Cumulative - the running net-flow line to overlay on the price bars
- Stocks Recent - the per-trade tape these bars roll up
- Options History - the matching minute-flow series for the options tape
Ready to build?
Get your free API key and start pulling live options data in 30 seconds.