Getting started
Quick start
The StockDrifts Data API is HTTPS-only with JSON in and out. It covers data StockDrifts owns or derives from public record — Korean insider filings, Japanese 5%-rule shareholding reports, US 13F holdings, and normalized company KPIs. Every request is authenticated with a bearer token.
Base URL
https://api2.stockdrifts.io
Authenticate
Pass your key as a bearer token on every request. Keys are issued from the dashboard and look like sd_live_….
| 1 | curl "https://api2.stockdrifts.io/v1/kr/insiders/top-buys?days=30" \ |
| 2 | -H "Authorization: Bearer sd_live_..." |
Pagination
Endpoints marked paginated take ?page=&limit= (page is 0-indexed). A page shorter than limit means there are no more rows. Every list returns a plain array — no envelope, no total count.
Rate limits
Enforced per key in fixed one-minute windows. Responses carry X-RateLimit-Limit, -Remaining, and -Reset; a 429 adds Retry-After.
Fields & currency
Responses are snake_case JSON. Value fields are suffixed with their currency (value_usd, value_krw, value_jpy), so nothing is silently FX-converted.
Periods
13F period values are ISO quarter-end dates (2026-03-31), not 2026-Q1. Omit it to get the latest quarter on file.
Errors
Every error uses one shape, with an optional hint. The code maps to the HTTP status: bad_request (400), unauthorized (401), forbidden (403), not_found (404), validation_error (422), rate_limited (429), upstream_error (502), and internal_error (500, which carries a request_id to quote when reporting it).
| 1 | { |
| 2 | "error": { |
| 3 | "code": "forbidden", |
| 4 | "message": "Your plan does not include the 'holdings' endpoints", |
| 5 | "hint": "See stockdrifts.io/pricing for plans that include it." |
| 6 | } |
| 7 | } |
Out-of-range parameters fail the same way, naming the offending field:
| 1 | { |
| 2 | "error": { |
| 3 | "code": "validation_error", |
| 4 | "message": "limit: Input should be less than or equal to 500" |
| 5 | } |
| 6 | } |