Documentation

Twelve paid endpoints, a handful of free ones, and one payment flow shared by everything — from intraday bars to SEC filings to a full joined research brief. If you're integrating an AI agent over MCP or A2A, the agent integration guide is the faster path.

Every paid endpoint quotes its exact price in a 402 response before any payment happens. You never pay blind, and there's nothing to configure — the price is in the reply.

Query a full trading day

POST /v1/query$0.025 per query

Returns a full trading day of intraday bars for one ticker at your chosen timeframe — interval accepts 3, 6, 9, 12, 15, 30, 60, or 240 minutes and defaults to 3 (about 130 bars per regular session).

Request

{"ticker": "AAPL", "date": "2024-01-02"}

Response

{ "ticker": "AAPL", "date": "2024-01-02", "interval": 3, "reference": "daily_open", "bars": 130, "data": [ {"window_start": "2024-01-02T14:30:00", "timestamp": 1704204600000000000, "open": 191.52, "high": 191.76, "low": 191.43, "close": 191.68, "pct_open": 0.0, "pct_high": 0.001253, "pct_low": -0.000470, "pct_close": 0.000835, "volume": 47000, "transactions": 312} ] }

How intraday values are expressed

Intraday endpoints — /v1/query, /v1/range, /v1/batch and /v1/bars — return both on every bar: absolute open, high, low and close price levels, and each one’s fractional change from that day’s open, alongside raw volume and transaction counts.

pct_x = (bar_x − day_open) / day_open // 0.0012 = +0.12% day_open × (1 + pct_x) = bar_x // both are in the same response

Read the prices directly when you want levels; use the percentages when you are comparing across tickers or dates, where levels are not comparable. No second call is needed for either.

/v1/daily rolls the same prices up to the session — open, high, low, close, volume, transactions and VWAP — and is the cheapest way to cover long histories.

One caveat worth knowing: day_open is the first bar of the session and includes pre-market, so the percentages are measured from that rather than the 09:30 regular-session open a third party would quote. The absolute prices are unaffected.

List every ticker for a date

GET /v1/tickers?date=YYYY-MM-DD$0.005 per query

Every symbol that printed at least one trade on the given date. Useful for building universes or discovering what existed at any point in the last two decades.

{ "date": "2024-01-02", "count": 10181, "tickers": ["A", "AA", "AAA", "AAAU", "AACG", ...] }

Query a date range

POST /v1/range$0.01 per trading day

One ticker across consecutive trading days. Price scales with days returned.

Request

{"ticker": "NVDA", "start": "2024-01-02", "end": "2024-01-05"}

Response

{ "ticker": "NVDA", "days_returned": 4, "total_bars": 2943, "results": [ {"date": "2024-01-02", "bars": 780, "data": [...]}, {"date": "2024-01-03", "bars": 721, "data": [...]} ] }

Query multiple tickers at once

POST /v1/batch$0.02 per ticker

Several tickers, one date, one request. Price scales with tickers returned.

Request

{"tickers": ["AAPL", "NVDA", "MSFT", "TSLA", "SPY"], "date": "2024-01-02"}

Daily bars — decades in one call

POST /v1/daily$0.001 per year

Daily OHLCV bars plus VWAP and volatility for one ticker over any date range — two decades of history for about two cents. Session-level aggregates of the same prices the intraday endpoints return, and by far the cheapest way to cover long histories. Each day also returns range_pct = (high − low) / open, and true_range_pct = (max(high, prev_close) − min(low, prev_close)) / prev_close, which unlike range_pct captures the overnight gap. Pass "adjusted": true for split-adjusted prices (also supported on /v1/query and /v1/range).

Request

{"ticker": "AAPL", "start": "2004-01-01", "end": "2024-12-31", "adjusted": true}

Scan the whole market

POST /v1/scan$0.10

Screen every US stock on a date for custom criteria — gap percentage, price change, volume thresholds. One query replaces thousands.

Request

{"date": "2024-01-16", "min_gap_pct": 5, "min_volume": 1000000}

Resampled bars — custom timeframes

POST /v1/bars$0.015 per trading day

The same eight intervals as /v1/query, with multi-day ranges in one call. Supports split-adjusted prices.

Request

{"ticker": "AAPL", "date": "2024-01-16", "interval": 15, "adjusted": true}

Response

{ "ticker": "AAPL", "interval": 15, "date": "2024-01-16", "adjusted": true, "bars": 64, "data": [ {"window_start": "2024-01-16T14:30:00", "timestamp": 1705395600000000000, "open": 182.16, "high": 183.00, "low": 181.83, "close": 181.85, "pct_open": 0.0, "pct_high": 0.004611, "pct_low": -0.001812, "pct_close": -0.001702, "volume": 3200000, "transactions": 4200} ] }

Available intervals

MinutesBars per regular session
3~130
6~65
9~44
12~33
15~26
30~13
60~7
240~2

Company profile

GET /v1/company?ticker=AAPL$0.005

Name, CIK, SIC industry, exchange, and fiscal year end from SEC EDGAR.

Fundamentals

POST /v1/fundamentals$0.02

Quarterly financials normalized from SEC EDGAR XBRL filings: revenue, net income, EPS, margins, cash, debt — every reported quarter.

Request

{"ticker": "AAPL"}

Insider activity

POST /v1/insiders$0.02

SEC Form 4 transactions: who bought or sold, role, shares, price, and value.

Request

{"ticker": "AAPL"}

SEC filings

POST /v1/filings$0.01 index · $0.05 with sections

Filing index for a ticker — 10-Ks, 10-Qs, 8-Ks (with item codes, so earnings 8-Ks are identifiable), proxies, and ownership filings, each with a direct document link. Pass "sections": ["risk_factors", "mdna"] to get the full extracted text of those sections from the latest 10-K/10-Q — an agent reads Risk Factors without parsing a 300-page filing.

Request

{"ticker": "AAPL", "types": ["10-K"], "sections": ["risk_factors"]}

The research brief

POST /v1/brief$0.25

Everything material about one company, joined in a single structured response: price action over the lookback window, latest fundamentals, insider activity, and split history. Replaces roughly twenty individual queries — and the token bill of assembling them.

Request

{"ticker": "NVDA", "lookback_days": 30}

The payment flow

All paid endpoints use x402, the open standard for HTTP-native payments. The pattern is always the same:

1. Send your request to any paid endpoint 2. Receive 402 + PAYMENT-REQUIRED header (base64-encoded terms) 3. Decode → exact amount, receiver address, network 4. Sign a USDC transfer on Base for that amount 5. Retry the identical request + X-PAYMENT header 6. Receive 200 + data + PAYMENT-RESPONSE receipt

Payments settle in USDC on Base mainnet. Most x402 client libraries handle steps 2–5 automatically.

Free endpoints

EndpointDescription
GET /v1/sampleReal bars, no payment, no parameters — check data quality before you spend
GET /v1/pricingMachine-readable pricing and coverage
GET /v1/statsPlatform statistics
GET /healthService health
POST /mcpMCP JSON-RPC endpoint — see the agent guide
GET /.well-known/mcp.jsonMCP capability card
GET /.well-known/agent-card.jsonA2A agent card
GET /llms.txtPlain-text service description for LLMs
GET /openapi.jsonOpenAPI 3 specification (also at /swagger.json)
GET /.well-known/x402x402 service manifest — every endpoint, method and exact price
GET /agents.txtPlain-text integration guide for agents

Data schema

Intraday bars (query, range, batch, bars)

FieldDescription
window_startBar start time, ISO 8601 UTC
timestampBar start time, nanoseconds since Unix epoch (UTC)
open / high / low / closeAbsolute prices in USD for that bar
pct_open / pct_high / pct_low / pct_closeThe same four values as fractional change from the daily open (0.0012 = +0.12%)
volumeShares traded during the bar interval
transactionsNumber of individual trades
range_pctDay-level, returned alongside data: (high − low) / open — the day’s swing, precomputed

Daily bars (/v1/daily)

FieldDescription
dateTrading date (YYYY-MM-DD)
open / high / low / closeAbsolute prices in USD, aggregated over the session
volumeShares traded for the day
transactionsNumber of individual trades
vwapVolume-weighted average price
range_pct(high − low) / open — intraday swing, ignores overnight gaps
true_range_pct(max(high, prev_close) − min(low, prev_close)) / prev_close — standard true range, includes the overnight gap. Null when no prior close is available.
CoverageValue
Date rangeSeptember 2003 → present
Tickers per day7,000 – 16,000+
Bars per ticker per day~130 at 3m; scales with interval

Errors and limits

CodeMeaning
400Invalid parameters (bad date format, empty ticker, etc.)
402Payment required — terms are in the PAYMENT-REQUIRED header
404No data for that ticker/date (weekend, holiday, or pre-listing)
429Rate limited — 30/min per IP unpaid, 120/min on /mcp. Paid (x402-settled) requests have no rate limit.