Versioning
Every endpoint is pinned to v1, baked right into the path (e.g. `/v1/fnd/stocks/search`). Within a version, fields are additive, never removed. Breaking changes ship under a new version with a deprecation window.
An API key, a base URL, and a single request. The same authentication and rate-limiting rules apply across fundamentals and live market data.
Every endpoint lives under one production host, with the API version (currently v1) baked into every path. Fields are additive within a version, breaking changes ship under a new version.
https://api.sifting.iowss://stream.sifting.io/ws/v1Generate an API key from your dashboard. REST endpoints accept it via the X-API-Key header (preferred) or as a query parameter. WebSocket connections take it via the ?key= query parameter, since browsers can't set custom headers on the WS handshake.
# REST, preferred (query strings can leak in logs)X-API-Key: sft_••• # REST, accepted fallback?api_key=sft_••• # WebSocket, query string onlywss://stream.sifting.io/ws/v1?key=sft_•••Resolve a ticker through the search endpoint to verify your key is live before pulling deeper data.
curl -H "X-API-Key: $KEY" \
"https://api.sifting.io/v1/fnd/stocks/search?q=apple&limit=5"Prefer to explore a dataset offline first? Download a free sample: 90 days of one-minute forex OHLC bars for all seven major USD pairs, on Kaggle under an open license.
Predictable rules that hold across every product, every endpoint, every payload.
Every endpoint is pinned to v1, baked right into the path (e.g. `/v1/fnd/stocks/search`). Within a version, fields are additive, never removed. Breaking changes ship under a new version with a deprecation window.
Tickers are case-insensitive (AAPL = aapl). CIKs are always exposed as 10-digit zero-padded strings ("0000320193"). Accession numbers come back in dashed form ("0000320193-25-000089") and are accepted in either dashed or undashed form on input.
ISO 8601 everywhere. filed_at, period_end, transaction_date are date-only (YYYY-MM-DD). accepted_at, as_of are full timestamps (YYYY-MM-DDTHH:MM:SSZ). Live-tick timestamps (t) are int64 Unix epoch milliseconds.
XBRL data carries the unit explicitly. Monetary observations come back as { value, unit } where unit is one of USD, USD/shares (EPS), shares, or pure (dimensionless ratios).
List endpoints accept ?limit (default 50, max 200; default 10, max 25 for /insiders) and ?cursor (opaque, from meta.next_cursor on the previous response). meta.next_cursor is null/omitted on the final page; meta.total carries the count and meta.as_of the snapshot timestamp.
Send Accept-Encoding: gzip and every /fnd/* and /hist/* response comes back gzipped, most HTTP clients add this header for you. A handful of heavy endpoints (full XBRL bundles, single-concept and screener queries, plus historical bars for stocks, forex, and crypto) require the header and return 406 gzip_required without it.
Prefer a client library to raw HTTP? Install the official SDK for your language. Full quickstarts and streaming examples live on the SDKs page.
go get github.com/siftingio/sdk-go@latestclient := siftingio.New( siftingio.WithAPIKey(os.Getenv("SIFTING_API_KEY")),)pip install siftingioclient = SiftingClient(api_key="sft_...")One client for Node and the browser, with full TypeScript types.
JavaScript quickstartnpm install @siftingio/sdkconst sifting = new SiftingClient({ apiKey: process.env.SIFTING_API_KEY,});The full REST and WebSocket contracts as machine-readable specs. Run them in Postman, generate a client, or load them in any OpenAPI / AsyncAPI tool.
Every endpoint has its own page with parameters, request samples, response shapes, and a Try-it runner.