Skip to main content

What this API gives you

The Algoseek Datasets API is a REST service that delivers historical US-market data in three asset classes — equities, equity options, and futures — alongside the reference data (corporate actions, splits and dividends, IPO records, market holidays, security master, shares outstanding) you need to make sense of those prices. Every dataset is exposed as a small family of HTTP endpoints under a common URL prefix, returns either JSON or (compressed) CSV, and is gated by an API key tied to your account.

Positioning.

The API is designed to replace one-off S3 bulk-file deliveries with on-demand, parameterised access. Where the bulk channel forces you to download a full day's TAQ file before you can look at one ticker, the API lets you express the slice you need (Ticker, TradeDate, columns to project, sort order, limit/offset) and returns only that slice. Full-tick days paginate.

What this guide assumes.

You are comfortable reading and writing HTTP clients in your language of choice; you know what a 2xx, 4xx, and 5xx status mean and how they differ; you have integrated at least one paginated REST API before; and you have written ingestion code that has to be safely re-runnable.

What this guide gives you.

For each topic: the mental model, the real captured wire-level shape, the production-grade client pattern, and the gotchas observed in actual use.

The base URL and the version prefix.

Every endpoint sits under https://dev-datasets-api.algoseek.com/api/v1/ on the development environment. The /api/v1/ prefix is part of every documented endpoint — the few tutorials that show a bare /data/... path are using a deprecated shorthand that the server no longer accepts. When in doubt, paste the full /api/v1/... path.

Three families of endpoints.

Section by section, the API decomposes into:

  • System and identityGET /api/v1/status (liveness, no auth required); GET /api/v1/account/my (who am I: identity id, name, and IP allow-list); GET /api/v1/account/my/quotas (current usage and limits per quota dimension); GET /api/v1/account/my/data-access-rules (which datasets you are entitled to, with their date ranges and ticker universes). Each is a separate endpoint because each is independently expensive to compute — the entitlement join, the quota counters, and the IP allow-list lookup are distinct backend calls — so the API exposes them at distinct paths rather than packing them into one catch-all response.
  • CatalogGET /api/v1/meta/datasets (what datasets exist, what columns each one has, what time range each covers).
  • DataGET /api/v1/data/{family}/{dataset} (the actual ticks, bars, and reference rows). Some take trade_date and ticker as path parameters; others take them as query-string column-name filters. The TAQ chapter walks through both shapes.

One real request, end to end.

To make this concrete, here is the very first thing you can do with your key, end to end — a real captured exchange. Every line is explained over the next few chapters; for now, just convince yourself that the API is alive and that it knows who you are.

Probe the API for the first time. Set your key in the environment first.
export ALGOSEEK_API_KEY="paste-your-key-here"
curl -s "https://dev-datasets-api.algoseek.com/api/v1/status" \
-H "X-API-KEY: $ALGOSEEK_API_KEY"

The server answers with a tiny JSON envelope:

Captured response body — sys_status
{
"status": "OK",
"version": "0.2.0"
}

Live capture: HTTP 200 • 319.4 ms • 33 bytes • X-Request-ID: fe45aeca-5ca4-4429-aa0d-f4a27f2a1d17

That is the entire interaction surface in microcosm: a versioned URL under the canonical base, an X-API-KEY header, and a JSON response. The remaining chapters add filters, columns, sort, paging, formats, and the error shapes that wrap them.

note

The captured timing for this status call (see meta_sys_status) is a useful baseline: the round-trip with no database lookup, no entitlement check, and a trivial response body. A slower response on a production data endpoint is paying for the entitlement check, the data scan, and bytes on the wire.