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

POpen market purchase
SOpen market sale
MExercise/conversion of derivative
AGrant or award
FTax withholding
GGift

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.01Material Definitive Agreement
1.05Material Cybersecurity Incidents
2.01Acquisition or Disposition of Assets
2.02Results of Operations (Earnings)
4.01Changes in Certifying Accountant
5.01Changes in Control
5.02Director/Officer Departure or Appointment
7.01Regulation FD Disclosure
8.01Other 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": [...]
  }
}

Error Handling

All errors return JSON with an error field.

Status Meaning
400Bad request (invalid parameters)
401Missing or invalid API key
404Company not found
429Rate 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.