API Documentation

REST API for US ETF data — universe, batch prices, market status, and backtesting endpoints.

Official SDKs

Use the official client libraries instead of hand-rolling HTTP calls. Same API key, typed methods for screener, rankings, heatmap, backtest, and portfolio endpoints.

JavaScript / TypeScript

npm · datacaptain@0.1.0

npm install datacaptain
import { DataCaptain } from "datacaptain";

const dc = new DataCaptain({ apiKey: process.env.DATACAPTAIN_API_KEY });
const rankings = await dc.etf.rankings({ category: "return", period: "1y" });

Python

PyPI · datacaptain@0.1.0

pip install datacaptain
from datacaptain import DataCaptain

dc = DataCaptain(api_key="YOUR_API_KEY")
rankings = dc.etf_screener(return_min=10, period="1y")

Full SDK docs with install + examples →

Packages: npm · PyPI. Source in packages/datacaptain and packages/datacaptain-python.

Authentication

Include your API key in the x-api-key header for all requests.

x-api-key: YOUR_API_KEY

ETF Endpoints

GET/api/etf/listlimit=100&offset=0&search=SPYcache: 60s

Paginated US ETF universe from database. Returns { data, total, limit, offset }.

Params: limit (number), offset (number), search (string)
https://datacaptain.up.railway.app/api/etf/listlimit=100&offset=0&search=SPY
GET/api/etf/:symbolcache: 60s

Single ETF details — symbol, name, latest price, exchange.

Params: symbol (string)*
https://datacaptain.up.railway.app/api/etf/SPY
GET/api/etf/heatmap?basket=broad&period=1ycache: 60s

ETF performance heatmap — colored cells by return % for preset baskets or custom symbol lists.

Params: basket (string), symbols (string), period (string)
https://datacaptain.up.railway.app/api/etf/heatmap?basket=broad&period=1y
GET/api/etf/screener?returnMin=10&dividendYieldMin=2&period=1ycache: 60s

Filter ETFs by return and dividend yield. Free plan returns top 10 matches.

Params: returnMin (number), dividendYieldMin (number), period (string), sort (string), limit (number)
https://datacaptain.up.railway.app/api/etf/screener?returnMin=10&dividendYieldMin=2&period=1y
GET/api/etf/rankings?category=return&period=1y&limit=20cache: 60s

ETF leaderboards — top return, top dividend yield, or lowest volatility. Free plan returns top 10.

Params: category (string), period (string), assetClass (string), limit (number)
https://datacaptain.up.railway.app/api/etf/rankings?category=return&period=1y&limit=20
GET/api/stocks/prices?symbols=SPY,QQQ,VOOcache: 60s

Batch ETF prices — latest close for up to 50 ETF tickers in one request. Cached 60s.

Params: symbols (string)*
https://datacaptain.up.railway.app/api/stocks/prices?symbols=SPY,QQQ,VOO

Market

GET/api/market/statuscache: 30s

US market session status from NYSE calendar (holidays + early closes). Regular 09:30–16:00 ET.

https://datacaptain.up.railway.app/api/market/status

Backtesting & Portfolio

POST/api/backtest/buy-and-hold

ETF buy-and-hold backtest — total return, CAGR, drawdown, dividend yield, risk score, equity curve.

Params: symbol (string)*, investment (number), startDate (string)*, endDate (string)*, strategy (string)
https://datacaptain.up.railway.app/api/backtest/buy-and-hold
POST/api/portfolio/rebalance

ETF portfolio rebalancer — compare current holdings to target weights and get buy/sell suggestions.

Params: holdings (object[])*, target (object[])*, driftThreshold (number), mode (string)
https://datacaptain.up.railway.app/api/portfolio/rebalance
POST/api/backtest/compare

Compare multiple ETFs — e.g. VOO vs SPY vs QQQ. Returns ranked results.

Params: symbols (string[])*, investment (number), startDate (string)*, endDate (string)*
https://datacaptain.up.railway.app/api/backtest/compare

Developer

GET/api/developer/usage

Usage stats — plan, requests today, remaining, daily limit.

https://datacaptain.up.railway.app/api/developer/usage

WebSocket (Real-Time)

Real-time ETF price streaming (when enabled). Subscribe to ETF symbols for periodic updates.

wss://datacaptain.up.railway.app/ws

Subscribe:

{"action":"subscribe","symbols":["SPY","QQQ"]}