Errors & rate limits.
Every error code the SiftingIO REST API can return, the envelope shape, and the rate-limit headers every response carries.
Error envelope
Every error response carries a JSON body with an error code and a human-readable message. HTTP status follows standard conventions; the error code (snake_case) is the stable machine-readable identifier you should switch on.
{ "error": "error_code", "message": "human-readable details" }Error codes
Switch on the snake_case error field. HTTP status maps loosely to category, the code is what stays stable.
- 400
(raw message)Malformed query, invalid cursor, bad limit, missing required parameter.
- 401
unauthorizedAPI key missing or invalid.
- 403
(raw message)Authenticated but not entitled, your subscription doesn't include this product or market.
- 404
unknown_ticker:ticker not in the SEC's US ticker registry.
- 404
unknown_filer:filer (ticker or CIK) not found.
- 404
filing_not_foundSpecific accession isn't in this filer's recent-filings window.
- 404
no_13f_filingsFiler has never filed 13F-HR.
- 404
not_foundConcept / period / unit combination has no data, or symbol absent from live feed.
- 404
section_not_foundRequested filing section couldn't be extracted, body includes `available` (sections that were extracted).
- 404
insufficient_filingsRisk-factors diff needs ≥ 2 10-Ks; this filer has fewer on record.
- 400
invalid_section:section not in the allowed list, body includes `valid_options`.
- 400
invalid_accession_formatAccession number didn't match the dashed/undashed shape.
- 400
invalid_date_rangeEconomic calendar: `to` must be strictly after `from`, range capped at 365 days.
- 406
gzip_requiredHeavy endpoint called without Accept-Encoding: gzip.
- 422
risk_factors_unavailableItem 1A couldn't be extracted from one or both 10-K filings being diffed.
- 429
rate_limit_exceededPer-tier rate budget exhausted, inspect Retry-After.
- 502
upstream_errorFilings source returned a non-success status. Retry shortly.
- 502
malformed_upstreamFilings source returned an invalid payload, or live snapshot couldn't be parsed.
- 503
stale_snapshotLive snapshot older than the configured threshold (default 5s). Body carries last_t and server_now.
- 503
upstream_rate_limitedFilings source throttled our pipeline. Retry shortly.
Rate-limit headers
Every REST response carries these. Read them to self-throttle before you hit a 429.
X-RateLimit-LimitToken bucket burst capacity for your subscription tier.
X-RateLimit-RemainingTokens remaining in the current window.
Retry-AfterSeconds to wait before retrying. Sent on 429 responses.
Plan budgets
Per-tier budgets live on the pricing page. Upgrades raise the per-minute and per-day buckets without changing the headers or codes.