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.
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 version baked into the base URL. Fields are additive within a version, breaking changes ship under a new version.
https://api.sifting.io/v1wss://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"Predictable rules that hold across every product, every endpoint, every payload.
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.
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.