SEC Form 4 Insider Trades Scraper
Pricing
Pay per event
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
Maintained by CommunityActor 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/5xxand honoursRetry-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
nullinstead 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
- Click Try for free at the top of the page.
- Fill in the input form — most fields have sensible defaults.
- Click Start. Output streams into the run's dataset.
- Export from Storage → Dataset as JSON, CSV, or Excel — or fetch via the API.
📥 Input
| Field | Type | Required | Default | Notes |
|---|---|---|---|---|
tickers | array | yes | ['AAPL', 'TSLA'] | Ticker symbols (e.g. AAPL) or 10-digit CIKs to sweep for Form 4 insider-transaction filings. We resolve… |
lookbackDays | integer | no | 90 | Only include Form 4 filings with a filing date within this many days of run start. |
maxFilingsPerIssuer | integer | no | 50 | Cap on the number of Form 4 filings fetched and parsed per issuer -- bounds egress on issuers with heavy… |
includeDerivative | boolean | no | True | Include derivative-table transactions -- stock options, RSUs, and similar -- as output rows. |
includeNonDerivative | boolean | no | True | Include non-derivative-table transactions -- common-stock buys and sells -- as output rows. |
userAgent | string | no | '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… |
proxyConfiguration | object | no | {'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.
| Field | Type | Notes |
|---|---|---|
issuer_cik | string | Issuer's 10-digit CIK (zero-padded). |
issuer_name | string | Issuer (company) name. |
issuer_ticker | string | Issuer's trading symbol, when present on the filing. |
owner_cik | string | Reporting owner's 10-digit CIK (zero-padded). |
owner_name | string | Reporting owner (insider) name. |
is_director | boolean | Whether the reporting owner is a director. |
is_officer | boolean | Whether the reporting owner is an officer. |
is_ten_percent_owner | boolean | Whether the reporting owner holds 10%+ of the issuer's stock. |
officer_title | string | Officer title (e.g. "CEO"), when is_officer is true. |
transaction_date | string | Transaction date (YYYY-MM-DD). Null when the date is footnote-only. |
transaction_code | string | SEC single-letter transaction code (P, S, A, M, F, G, C, X, etc.). |
transaction_code_label | string | Plain-English label for transaction_code (e.g. "Grant/award/other acquisition"). |
is_derivative | boolean | True when this row came from the derivativeTransaction table, false for nonDerivativeTransaction. |
security_title | string | Security title (e.g. "Common Stock", "Restricted Stock Unit"). |
shares_transacted | number | Number of shares transacted. Null when footnote-only. |
price_per_share | number | Price per share (USD). Null when footnote-only (e.g. $0 RSU grants). |
transaction_value_usd | number | Derived: shares_transacted * price_per_share, when both are present. |
acquired_disposed | string | "A" (acquired) or "D" (disposed). |
shares_owned_after | number | Shares owned by the reporting owner following the transaction. |
ownership_nature | string | "D" (direct) or "I" (indirect) ownership. |
indirect_ownership_note | string | Free-text nature-of-ownership note for indirect holdings (e.g. "By Trust"). |
underlying_security_title | string | Underlying security title, derivative transactions only. |
underlying_shares | number | Underlying share count, derivative transactions only. |
exercise_price | number | Conversion or exercise price (USD), derivative transactions only. Null when footnote-only. |
exercise_date | string | Exercise date, derivative transactions only. Null when footnote-only. |
expiration_date | string | Expiration date, derivative transactions only. Null when footnote-only. |
accession_number | string | SEC accession number the row came from (e.g. 0001140361-26-035362). |
filed_at | string | Filing acceptance timestamp (ISO-8601), from the submissions index. |
period_of_report | string | Period-of-report date for the filing. |
source_xml_url | string | The ownership-XML URL actually fetched to produce this row. |
scraped_at | string | ISO-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:
| Event | USD | What it is |
|---|---|---|
actor-start | $0.20 | One-off warm-up charge per run |
transaction-row | $0.0025 | PPE 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
lookbackDaysandmaxFilingsPerIssuer, 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.