sifting/io
Quickstart · 5 min

Make your first call.

An API key, a base URL, and a single request. The same authentication and rate-limiting rules apply across fundamentals and live market data.

01

Base URLs

Every endpoint lives under one production host with the version baked into the base URL. Fields are additive within a version, breaking changes ship under a new version.

REST · https
https://api.sifting.io/v1
WebSocket · wss
wss://stream.sifting.io/ws/v1
02

API key & headers

Generate 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.

credentials
# 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_•••
03

Your first request

Resolve a ticker through the search endpoint to verify your key is live before pulling deeper data.

request · shell
curl -H "X-API-Key: $KEY" \
  "https://api.sifting.io/v1/fnd/stocks/search?q=apple&limit=5"
04

Conventions

Predictable rules that hold across every product, every endpoint, every payload.

Versioning

Every endpoint is pinned to v1, baked right into the base URL. Within a version, fields are additive, never removed. Breaking changes ship under a new version with a deprecation window.

Identifiers

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.

Dates & timestamps

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.

Money & units

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).

Pagination

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.

Compression

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.

05

SDKs & libraries

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

Go 1.23+

Typed client for Go services and data pipelines.

Go quickstart
install · go get
go get github.com/siftingio/sdk-go@latest
client
client := siftingio.New(	siftingio.WithAPIKey(os.Getenv("SIFTING_API_KEY")),)

Python

Python 3.9+

Sync and async clients for scripts, notebooks, and backends.

Python quickstart
install · pip
pip install siftingio
client
client = SiftingClient(api_key="sft_...")

JavaScript

Node 18+ or modern browsers

One client for Node and the browser, with full TypeScript types.

JavaScript quickstart
install · npm
npm install @siftingio/sdk
client
const sifting = new SiftingClient({  apiKey: process.env.SIFTING_API_KEY,});
06

API specs

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.

Where next

Browse the reference

Every endpoint has its own page with parameters, request samples, response shapes, and a Try-it runner.