API Documentation
SEC EDGAR filing data, parsed and served as a clean REST API.
Base URL: https://api.stockdata.dev/v1
Authentication
All API requests require an API key passed via the X-API-Key header.
curl "https://api.stockdata.dev/v1/company/AAPL" \
-H "X-API-Key: your_api_key"
Create a free account to get your API key. Free tier: 1,000 calls/month.
Rate Limits
| Tier | Monthly Calls | Burst Rate | Price |
|---|---|---|---|
| Free | 1,000 | 1 req/sec | $0 |
Paid tiers with higher limits coming soon.
Company Profile
GET /v1/company/{ticker}
Get company profile with SIC code, exchange, fiscal year end, and more.
Example Response
{
"ticker": "AAPL",
"name": "Apple Inc.",
"cik": "0000320193",
"exchange": "Nasdaq",
"sic": "3571",
"sic_description": "Electronic Computers",
"category": "Large accelerated filer",
"fiscal_year_end": "0926",
"state_of_incorporation": "CA",
"phone": "(408) 996-1010"
}
Financial Statements
GET /v1/company/{ticker}/financials
Parsed income statement, balance sheet, and cash flow from SEC XBRL filings.
Parameters
| period | annual or quarterly. Default: annual |
| limit | Number of periods to return (max 20). Default: 4 |
Example Response
{
"ticker": "AAPL",
"financials": [{
"fiscal_year": 2025,
"fiscal_period": "FY",
"filed": "2025-10-31",
"income_statement": {
"revenue": 383285000000,
"net_income": 96995000000,
"eps_diluted": 6.13
},
"balance_sheet": {
"total_assets": 364980000000,
"cash_and_equivalents": 29943000000
},
"cash_flow": {
"operating_cash_flow": 110543000000
}
}]
}
All monetary values are in actual USD (not thousands). Per-share values (EPS, dividends) are decimals.
Filing History
GET /v1/company/{ticker}/filings
SEC filing history with direct links to EDGAR documents.
Parameters
| form | Filter by form type: 10-K, 10-Q, 8-K, 4, etc. |
| from | Filter filings after this date (YYYY-MM-DD) |
| limit | Max results (max 100). Default: 20 |
Insider Trades
GET /v1/insider-trades/{ticker}
Parsed Forms 3, 4, and 5 insider transactions for a specific company.
GET /v1/insider-trades
Recent insider trades across all companies. Supports ticker filter.
Parameters
| from | Window start, YYYY-MM-DD. No limit on how far back this may reach |
| to | Window end, YYYY-MM-DD. Default: today |
| days | Trailing look-back (max 365). Default: 90 (per-ticker), 7 (all). Ignored when from/to are used |
| action | Filter by buy or sell (open market only) |
| form | Filter by form type: 3, 4, or 5 |
| limit | Rows per page. Max 200 (free), 500 (starter), 1000 (pro). Default: 50 |
| offset | Row offset for paging. Responses carry total and has_more |
Date Ranges
A single request may span at most 365 days. This is a limit on the width of one window, not on how far back history reaches — page the window backwards to walk through the full dataset:
GET /v1/insider-trades?from=2025-01-01&to=2025-06-30&limit=200
GET /v1/insider-trades?from=2024-07-01&to=2024-12-31&limit=200
A window wider than 365 days returns 400 with the requested and
maximum span. Omit from/to to use the trailing days window instead.
Coverage
Filings are fetched on demand, so a company nobody has queried yet holds no rows.
Every response carries a coverage object so an empty trades list can be told apart
from a company that was never fetched. On the per-ticker route:
"coverage": {
"status": "covered", // or "never_fetched" / "fetched_no_records"
"coverage_start": "2019-03-14", // earliest filing we hold for this company
"coverage_end": "2026-09-14",
"last_fetched": "2026-09-15T04:12:08"
}
never_fetched means we hold no data for the company yet — an
empty result is not evidence of no insider activity. fetched_no_records means we synced
the company and it genuinely filed nothing in the window. The bulk route reports dataset-wide
coverage_start plus companies_with_data and companies_total.
Coverage Listing
GET /v1/insider-trades/coverage
Enumerate per-company coverage in one call, so a backfill pass can target gaps instead of probing tickers one at a time. Pure metadata — this endpoint never triggers a fetch.
| status | all (default), never_fetched, fetched_no_records, covered |
| max_span_days | Only companies holding at most this many days of history. Companies with no rows count as span 0 |
| stale_days | Only companies last fetched more than N days ago, or never fetched |
| sort | last_fetched (default, oldest first), span, trades, ticker |
| limit / offset | Paging. Max 200 (free), 500 (starter), 1000 (pro). Default: 200 |
{
"count": 200, "total": 2240, "offset": 0, "has_more": true,
"companies": [
{
"ticker": "EXMPL",
"name": "Example Corp",
"status": "covered",
"coverage_start": "2026-02-20",
"coverage_end": "2026-07-27",
"span_days": 157,
"trade_count": 10,
"last_fetched": "2026-09-15T07:14:38"
}
]
}
Shallow-history sweep: ?max_span_days=250&sort=span.
Never-fetched sweep: ?status=never_fetched. status and the date bounds always agree
with what /v1/insider-trades/{ticker} reports for the same company.
Paging while backfilling: fetching a company updates its
last_fetched and coverage, which reorders the very result set you are walking. Use
sort=ticker when paging through the listing to drive a backfill — it is the one ordering
the fetch does not mutate, so no company is skipped or repeated. Responses are cached for 60 seconds.
Filings
GET /v1/company/{ticker}/filings
GET /v1/filings
Per-company and cross-company filing history. Both accept
from/to (YYYY-MM-DD), form, item,
and limit/offset, and both return total and
has_more so truncation is visible. Per-company windows may span 5 years;
/v1/filings spans every company so it keeps a 365-day window.
Form families: form=8-K includes
8-K/A and the 12B/12G3 variants; form=10-K includes 10-K/A.
Pass exact=true for a single form. Matching is by family rather than prefix, so
form=4 never sweeps in 40-F or 424B3.
Resolved by CIK: an issuer with several listed
securities (common, warrants, units, preferreds, notes) has one row per ticker, but a filing is
stored once. Both routes resolve across every ticker sharing the CIK, so querying a warrant
ticker returns the issuer's filings rather than an empty list. Responses include
resolved_across_tickers when more than one row was used.
Transaction Codes
| P | Open market purchase |
| S | Open market sale |
| M | Exercise/conversion of derivative |
| A | Grant or award |
| F | Tax withholding |
| G | Gift |
Example Response
{
"ticker": "AAPL",
"name": "Apple Inc.",
"count": 1,
"trades": [
{
"accession_number": "0000320193-26-000012",
"filing_date": "2026-02-15",
"transaction_date": "2026-02-13",
"owner_name": "WILLIAMS JEFFREY E",
"owner_cik": "0001214156",
"is_director": true,
"is_officer": true,
"officer_title": "Chief Operating Officer",
"transaction_code": "S",
"shares": 50000,
"price_per_share": 232.5,
"shares_owned_after": 489201,
"form_type": "4",
"form_label": "Statement of Changes in Beneficial Ownership",
"ticker": "AAPL"
}
]
}
Institutional Holdings
GET /v1/institutions/{ticker}
13F institutional holder data for a company. Sourced from quarterly SEC 13F-HR filings by top ~50 institutional investors.
Parameters
| period | Quarter filter: 2025-Q4 |
| limit | Max results (max 200). Default: 50 |
Example Response
{
"ticker": "AAPL",
"name": "Apple Inc.",
"count": 12,
"holdings": [
{
"institution": "Berkshire Hathaway Inc",
"institution_cik": "0001067983",
"report_date": "2025-12-31",
"shares": 227917808,
"value": 61961735283,
"filing_date": "2026-02-17",
"ticker": "AAPL"
}
]
}
GET /v1/institutions
List all institutions ranked by total portfolio value.
Parameters
| period | Quarter filter: 2025-Q4 |
| limit | Max results (max 200). Default: 50 |
Example Response
{
"count": 36,
"institutions": [
{
"institution": "Vanguard Group Inc",
"institution_cik": "0000102909",
"holdings_count": 3314,
"total_value": 4271283947521,
"total_shares": 18293847561,
"latest_report": "2025-12-31"
}
]
}
GET /v1/institutions/portfolio/{cik}
Full portfolio for a specific institution. Use the CIK from the institution list endpoint.
Parameters
| period | Quarter filter: 2025-Q4. Default: most recent quarter |
| limit | Max results (max 500). Default: 100 |
Example Response
{
"institution": "Berkshire Hathaway Inc",
"institution_cik": "0001067983",
"report_date": "2025-12-31",
"count": 33,
"total_value": 267128394752,
"holdings": [
{
"institution": "Berkshire Hathaway Inc",
"institution_cik": "0001067983",
"report_date": "2025-12-31",
"shares": 227917808,
"value": 61961735283,
"filing_date": "2026-02-17",
"ticker": "AAPL"
}
]
}
Corporate Events (8-K)
GET /v1/events
Recent 8-K corporate events across all companies, filterable by event type.
Parameters
| item | 8-K item number filter (e.g., 2.02 for earnings) |
| ticker | Filter by ticker symbol |
| days | Look back period (max 90). Default: 7 |
| limit | Max results (max 200). Default: 50 |
Common Item Numbers
| 1.01 | Material Definitive Agreement |
| 1.05 | Material Cybersecurity Incidents |
| 2.01 | Acquisition or Disposition of Assets |
| 2.02 | Results of Operations (Earnings) |
| 4.01 | Changes in Certifying Accountant |
| 5.01 | Changes in Control |
| 5.02 | Director/Officer Departure or Appointment |
| 7.01 | Regulation FD Disclosure |
| 8.01 | Other Events |
Example Response
{
"count": 5,
"days": 7,
"item_filter": "2.02",
"events": [
{
"ticker": "AAPL",
"company": "Apple Inc.",
"form_type": "8-K",
"filing_date": "2026-01-29",
"items": "2.02,9.01",
"item_labels": [
{"item": "2.02", "label": "Results of Operations and Financial Condition"},
{"item": "9.01", "label": "Financial Statements and Exhibits"}
],
"url": "https://www.sec.gov/Archives/..."
}
]
}
Also available as a filter on GET /v1/company/{ticker}/filings?item=2.02
Beneficial Ownership (13D/13G)
GET /v1/ownership/{ticker}
5%+ beneficial ownership filings for a company. Schedule 13D (activist) and 13G (passive).
GET /v1/ownership
Cross-company beneficial ownership filings.
Parameters
| form | Filter by 13D (activist) or 13G (passive) |
| ticker | Filter by ticker (cross-company endpoint only) |
| days | Look back period. Default: 365 (per-ticker) or 30 (cross-company) |
| limit | Max results (max 200). Default: 50 |
Example Response
{
"ticker": "AAPL",
"name": "Apple Inc.",
"count": 1,
"filings": [
{
"schedule_type": "13G",
"form_type": "SCHEDULE 13G/A",
"filing_date": "2025-07-29",
"reporting_person": "The Vanguard Group",
"aggregate_shares": 1415826462,
"percent_of_class": 9.47,
"sole_voting_power": 0,
"shared_voting_power": 19800347,
"sole_dispositive_power": 1343278627,
"shared_dispositive_power": 72547835,
"cusip": "037833100",
"is_amendment": true,
"url": "https://www.sec.gov/Archives/..."
}
]
}
Data available for filings from January 2025 onward (SEC XML mandate). 13D = activist/control-seeking. 13G = passive/institutional.
Proposed Sales (Form 144)
GET /v1/proposed-sales/{ticker}
Form 144 proposed sales of restricted securities for a specific company.
GET /v1/proposed-sales
Cross-company Form 144 proposed sales filings.
Form 144 filings are required when an insider plans to sell restricted securities. These filings provide early notice of planned insider sales before they appear as Form 4 transactions.
Parameters
| ticker | Filter by ticker (cross-company endpoint only) |
| days | Look back period. Default: 365 (per-ticker) or 30 (cross-company) |
| limit | Max results (max 200). Default: 50 |
Example Response
{
"ticker": "AAPL",
"name": "Apple Inc.",
"count": 1,
"filings": [
{
"accession_number": "0000320193-26-000045",
"filing_date": "2026-02-10",
"reporting_person": "WILLIAMS JEFFREY E",
"reporting_person_cik": "0001214156",
"title": "Chief Operating Officer",
"is_director": true,
"is_officer": true,
"is_ten_percent_owner": false,
"is_affiliate": true,
"security": "Common Stock",
"shares_to_sell": 50000,
"aggregate_market_value": 11625000,
"estimated_avg_price": 232.5,
"approximate_sale_date": "2026-03-01",
"exchange": "NASDAQ",
"broker": "Morgan Stanley",
"is_amendment": false,
"ticker": "AAPL"
}
]
}
Congressional Trades
GET /v1/congress-trades
Recent congressional stock trades from STOCK Act disclosures.
GET /v1/congress-trades/{ticker}
Congressional trades for a specific ticker.
Parameters
| days | Look back period (max 365). Default: 30 |
| chamber | Filter by House or Senate |
| party | Filter by party: R, D, I |
| ticker | Filter by ticker symbol |
| committee | Filter by committee (thomas_id, e.g. HSAS for Armed Services) |
| format | quiver for Quiver Quantitative-compatible field names |
| limit | Max results (max 500). Default: 50 |
Example Response
{
"count": 2,
"days": 30,
"trades": [{
"ticker": "NVDA",
"transaction_type": "purchase",
"transaction_date": "2025-01-15",
"amount_min": 15001,
"amount_max": 50000,
"owner": "Self",
"politician": {
"name": "Tommy Tuberville",
"party": "R",
"state": "AL",
"chamber": "Senate"
}
}]
}
Congressional Members
GET /v1/congress/members
List congressional members with trade counts.
GET /v1/congress/members/{name}
Get trades for a specific congressional member.
Parameters
| chamber | Filter by House or Senate |
| party | Filter by party: R, D, I |
Congressional Committees
GET /v1/congress/committees
List all congressional committees with member counts.
GET /v1/congress/committees/{thomas_id}
Committee detail with members and their recent trades. Use this to identify group trading activity by committee.
Parameters
| chamber | Filter by house, senate, or joint |
| days | Look back period for recent trades (detail view). Default: 90 |
Example: Armed Services Committee
GET /v1/congress/committees/HSAS
{
"committee": {
"thomas_id": "HSAS",
"name": "House Committee on Armed Services",
"chamber": "house"
},
"member_count": 60,
"members": [{
"name": "...",
"party": "R",
"state": "TX",
"rank": 1,
"title": "Chairman"
}],
"recent_trades": {
"count": 15,
"days": 90,
"trades": [...]
}
}
Search
GET /v1/search?q={query}
Search companies by name, ticker, or CIK number.
Parameters
| q | Search query (min 2 characters). Required. |
| limit | Max results (max 50). Default: 20 |
Error Handling
All errors return JSON with an error field.
| Status | Meaning |
|---|---|
| 400 | Bad request (invalid parameters) |
| 401 | Missing or invalid API key |
| 404 | Company not found |
| 429 | Rate limit exceeded |
Data Source
All data is sourced from SEC EDGAR, the official public filing system of the U.S. Securities and Exchange Commission. SEC filing data is public domain under 17 U.S.C. § 105.
Data is updated continuously. New filings are typically available within 30 minutes of being posted to EDGAR. Financial statements are parsed from XBRL data attached to 10-K and 10-Q filings.
Congressional trading data is sourced from Senate financial disclosure reports and House Clerk Periodic Transaction Reports (PTRs), both public under the STOCK Act.