SEC Form 4 Insider Trades Scraper avatar

SEC Form 4 Insider Trades Scraper

Pricing

Pay per event

Go to Apify Store
SEC Form 4 Insider Trades Scraper

SEC Form 4 Insider Trades Scraper

Parses SEC Form 4 insider-transaction filings into transaction-level rows -- who traded, how many shares, at what price, and under which transaction code (buy, sell, award, exercise) -- from the ownership XML. One row per trade, not per filing; joint filings handled correctly.

Pricing

Pay per event

Rating

0.0

(0)

Developer

DevilScrapes

DevilScrapes

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

13 hours ago

Last modified

Categories

Share


🎯 What this scrapes

Every SEC Form 4 filing carries an

🔥 What we handle for you

  • 🔁 Retries with exponential backoff on 429 / 5xx and honours Retry-After -- we never hammer SEC's servers into a block.
  • 🧱 Rate-limit-aware pacing -- a shared request-interval floor keeps every run inside SEC's ~10 req/s polite-use ceiling, even across concurrent runs.
  • 🧾 Transaction-level parsing, not just a filing index -- every buy, sell, award, and exercise line item, with footnote-only fields honestly reported as null instead of guessed.
  • 🧊 Joint filings handled correctly -- every reporting owner on a multi-owner Form 4 gets attributed rows, never silently dropped.
  • 🧊 Clean, typed dataset rows -- Pydantic-validated, ISO-8601 timestamps, stable accession-number IDs.
  • 💰 Pay-Per-Event pricing -- you only pay for transaction rows that land in your dataset. No data, no charge (beyond the small warm-up fee).

💡 Use cases

  • Insider-trading signal feeds -- quant and fintech shops ingesting transaction-level buy/sell data as a raw factor input.
  • Activist and executive-conviction tracking -- flag large open-market buys (code P) by officers and directors across a watchlist.
  • Equity research workflows -- pull every recent insider transaction for a covered issuer without hand-parsing XML.
  • Financial media and newsletters -- surface notable Form 4 activity (large sells, cluster buying) for a daily brief.
  • Compliance and governance monitoring -- audit officer/director trading windows against blackout-period policy.

⚙️ How to use it

  1. Click Try for free at the top of the page.
  2. Fill in the input form — most fields have sensible defaults.
  3. Click Start. Output streams into the run's dataset.
  4. Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.

📥 Input

FieldTypeRequiredDefaultNotes
tickersarrayyes['AAPL', 'TSLA']Ticker symbols (e.g. AAPL) or 10-digit CIKs to sweep for Form 4 insider-transaction filings. We resolve…
lookbackDaysintegerno90Only include Form 4 filings with a filing date within this many days of run start.
maxFilingsPerIssuerintegerno50Cap on the number of Form 4 filings fetched and parsed per issuer -- bounds egress on issuers with heavy…
includeDerivativebooleannoTrueInclude derivative-table transactions -- stock options, RSUs, and similar -- as output rows.
includeNonDerivativebooleannoTrueInclude non-derivative-table transactions -- common-stock buys and sells -- as output rows.
userAgentstringno'DevilScrapes-Form4/1.0 (contact: apify.com/DevilScrapes)'SEC requires a descriptive User-Agent with contact info on every request. Default identifies as Devil Scrapes; replace…
proxyConfigurationobjectno{'useApifyProxy': True}Apify Proxy configuration. SEC EDGAR has no anti-bot wall -- this is a fleet-standard courtesy that helps smooth the…

Example input

{
"tickers": [
"AAPL"
],
"lookbackDays": 30,
"maxFilingsPerIssuer": 3,
"includeDerivative": true,
"includeNonDerivative": true,
"userAgent": "DevilScrapes-Form4/1.0 (contact: apify.com/DevilScrapes)",
"proxyConfiguration": {
"useApifyProxy": true
}
}

📤 Output

Every row is one dataset item.

FieldTypeNotes
issuer_cikstringIssuer's 10-digit CIK (zero-padded).
issuer_namestringIssuer (company) name.
issuer_tickerstringIssuer's trading symbol, when present on the filing.
owner_cikstringReporting owner's 10-digit CIK (zero-padded).
owner_namestringReporting owner (insider) name.
is_directorbooleanWhether the reporting owner is a director.
is_officerbooleanWhether the reporting owner is an officer.
is_ten_percent_ownerbooleanWhether the reporting owner holds 10%+ of the issuer's stock.
officer_titlestringOfficer title (e.g. "CEO"), when is_officer is true.
transaction_datestringTransaction date (YYYY-MM-DD). Null when the date is footnote-only.
transaction_codestringSEC single-letter transaction code (P, S, A, M, F, G, C, X, etc.).
transaction_code_labelstringPlain-English label for transaction_code (e.g. "Grant/award/other acquisition").
is_derivativebooleanTrue when this row came from the derivativeTransaction table, false for nonDerivativeTransaction.
security_titlestringSecurity title (e.g. "Common Stock", "Restricted Stock Unit").
shares_transactednumberNumber of shares transacted. Null when footnote-only.
price_per_sharenumberPrice per share (USD). Null when footnote-only (e.g. $0 RSU grants).
transaction_value_usdnumberDerived: shares_transacted * price_per_share, when both are present.
acquired_disposedstring"A" (acquired) or "D" (disposed).
shares_owned_afternumberShares owned by the reporting owner following the transaction.
ownership_naturestring"D" (direct) or "I" (indirect) ownership.
indirect_ownership_notestringFree-text nature-of-ownership note for indirect holdings (e.g. "By Trust").
underlying_security_titlestringUnderlying security title, derivative transactions only.
underlying_sharesnumberUnderlying share count, derivative transactions only.
exercise_pricenumberConversion or exercise price (USD), derivative transactions only. Null when footnote-only.
exercise_datestringExercise date, derivative transactions only. Null when footnote-only.
expiration_datestringExpiration date, derivative transactions only. Null when footnote-only.
accession_numberstringSEC accession number the row came from (e.g. 0001140361-26-035362).
filed_atstringFiling acceptance timestamp (ISO-8601), from the submissions index.
period_of_reportstringPeriod-of-report date for the filing.
source_xml_urlstringThe ownership-XML URL actually fetched to produce this row.
scraped_atstringISO-8601 timestamp when this row was scraped.

Example output

{
"issuer_cik": "0000320193",
"issuer_name": "Apple Inc.",
"issuer_ticker": "AAPL",
"owner_cik": "0002148403",
"owner_name": "Ternus John",
"is_director": true,
"is_officer": true,
"is_ten_percent_owner": false,
"officer_title": "CEO",
"transaction_date": "2026-09-01",
"transaction_code": "A",
"transaction_code_label": "Grant/award/other acquisition",
"is_derivative": true,
"security_title": "Restricted Stock Unit",
"shares_transacted": 7690.0,
"price_per_share": null,
"transaction_value_usd": null,
"acquired_disposed": "A",
"shares_owned_after": 7690.0,
"ownership_nature": "D",
"indirect_ownership_note": null,
"underlying_security_title": "Common Stock",
"underlying_shares": 7690.0,
"exercise_price": null,
"exercise_date": null,
"expiration_date": null,
"accession_number": "0001140361-26-035362",
"filed_at": "2026-09-01T18:32:04-04:00",
"period_of_report": "2026-09-01",
"source_xml_url": "https://www.sec.gov/Archives/edgar/data/320193/000114036126035362/form4.xml",
"scraped_at": "2026-09-03T12:00:00+00:00"
}

💰 Pricing

Pay-Per-Event — you pay only when these events fire:

EventUSDWhat it is
actor-start$0.20One-off warm-up charge per run
transaction-row$0.0025PPE event

Example: 1 000 results at the rates above ≈ $2.70. No subscription, no minimum, no card to start — Apify gives every new account $5 of free credit.

🚧 Limitations

  • Form 4 only -- Form 3 (initial ownership) and Form 5 (annual) filings are out of scope.
  • No unbounded historical backfill -- lookback is bounded by lookbackDays and maxFilingsPerIssuer, with older filings pulled from an issuer's overflow submissions pages only as needed to cover the window.
  • No "sweep everything filed today" firehose entry point -- you supply the tickers/CIKs to sweep; there's no reverse market-wide Form 4 stream in v1.
  • Amended filings (form "4/A") are excluded by default.

❓ FAQ

Is this the same as your SEC EDGAR Filings Scraper?

No. That Actor returns one row per FILING (form type, date, accession number) across all SEC form types. This Actor returns one row per TRANSACTION -- parsed out of the Form 4 ownership XML body -- with shares, price, transaction code, and reporting-owner detail that the filing-index Actor doesn't have.

Do I need a SEC EDGAR API key?

No -- SEC EDGAR is free and keyless. It only requires a descriptive User-Agent with contact info, which we supply a sensible default for.

What happens on a joint filing with multiple insiders?

We emit one row per (reporting owner, transaction) pair -- every owner named on the filing is attributed to the transactions in that filing, never silently dropped.

Why is price_per_share sometimes null?

Some Form 4 fields (like a $0 RSU grant price) are only disclosed in a footnote, not the structured

Do you cover Form 3 or Form 5?

Not in this version -- v1 is scoped to Form 4 only. Form 3 (initial ownership) and Form 5 (annual) filings are a candidate future enhancement.

💬 Your feedback

Spotted a bug, hit a weird edge case, or need a new field? Open an issue on the Actor's Issues tab on Apify Console — we ship fixes weekly and we read every report.