📈 SEC Insider Trading Scraper avatar

📈 SEC Insider Trading Scraper

Pricing

from $3.00 / 1,000 transaction records

Go to Apify Store
📈 SEC Insider Trading Scraper

📈 SEC Insider Trading Scraper

Turn raw SEC Form 4 filings into alert-ready insider trades. Search by ticker, company, insider, CIK, or date. Get one row per trade with shares, price, value, role, decoded action, and precomputed cluster signals. Export, run via API, schedule, or integrate with other tools.

Pricing

from $3.00 / 1,000 transaction records

Rating

0.0

(0)

Developer

Skootle

Skootle

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

a day ago

Last modified

Share

Stop decoding Form 4 XML by hand

Stop opening EDGAR filings, decoding one-letter transaction codes, and flattening nested XML by hand. This Actor turns Form 4 filings into alert-ready trade rows and can emit dedicated multi-insider cluster signals when the configured criteria are met.

  • Search by ticker, company, insider, CIK, or date range.
  • Get one clean row per saved transaction with shares, price, dollar value, role, decoded action, and direct filing URL.
  • Schedule saved searches or send results to alerts, spreadsheets, databases, Slack, and APIs.

SEC Form 4 Insider Trades hero

TL;DR

Turn SEC Form 4 filings into transaction-level data without writing or maintaining an EDGAR XML parser. Track insider purchases, sales, grants, exercises, and ownership changes. When enough distinct insiders at one issuer meet your configured window and direction criteria, the Actor emits dedicated cluster_signal records alongside transaction rows.

Verified cloud proof: the current-build market-wide trial processed 5 filings, saved 19 transaction rows, and reported 0 parser errors. Inspect the public sample dataset. Review every signal against the linked Form 4. Cluster signals are analytical flags, not investment advice.

Try it on a small dataset, then let us know what you think in a review.


What does SEC Form 4 Insider Trades do?

When a corporate insider (director, officer, or 10%+ shareholder) buys or sells equity in their own company, federal securities law requires them to file a Form 4 with the SEC within two business days. The filings publish on EDGAR as machine-readable XML. Each Form 4 can contain multiple transactions - a CEO selling shares, exercising options, and surrendering shares for tax withholding can all be in one filing.

This actor:

  1. Calls EDGAR's full-text search API (efts.sec.gov) to find Form 4 filings matching your filter (ticker, issuer name, insider name, CIK, date range).
  2. Fetches the XML for each matching filing directly from sec.gov/Archives.
  3. Parses every non-derivative and derivative transaction into a flat row with typed numerics.
  4. Decodes the transaction code (P, S, A, D, M, etc.) into a plain-English description.
  5. Extracts the reporting owner's role flags (Director / Officer / 10% Owner / Other) and officer title text into typed booleans + enum.
  6. Optionally runs cluster detection across all parsed transactions and emits a separate cluster_signal record when 3+ unique insiders at the same issuer trade in the same direction within a rolling N-day window.

The output is two record types in one dataset, discriminated by recordType (transaction or cluster_signal).

Why scrape SEC Form 4?

Form 4 is a federally mandated disclosure of transactions by directors, officers, and 10% owners. Researchers and monitoring teams use it to study insider activity, but any signal requires context and should be checked against the underlying filing. The source data is public and free.

What's painful is the consumption shape. EDGAR publishes Form 4 as schema-X0609 XML with nonDerivativeTransaction and derivativeTransaction arrays nested under ownershipDocument root, with each transaction wrapped in a tree of transactionAmounts, postTransactionAmounts, ownershipNature, securityTitle.value blocks. Every field is a string. Every comparison code is a single uppercase letter. Every footnote is a separate element. To get a usable row out, you write 200+ lines of XML extraction per filing.

This actor does that extraction once. Buyers consume the rows.

Who needs this?

  • Retail-investor SaaS products building insider-trade alerts and research workflows.
  • Quant research desks testing signals on normalized insider-transaction data.
  • Equity research analysts building one-off industry insider-flow studies.
  • Financial journalists running stories on specific insider moves.
  • Compliance teams auditing their own executives' Section 16 reporting.
  • AI agents and automation pipelines that need clean, parsed Form 4 data piped into a daily LLM context or a structured DB.

How to use SEC Form 4 Insider Trades

  1. Open the actor in the Apify Console.
  2. Set contactEmail to your real work email. SEC.gov Fair Access policy requires this on every request. The email is stored encrypted; it is never displayed publicly.
  3. Choose at least one filter: tickers, issuerNames, ciks, or insiderNames. If you leave all four empty, the actor pulls recent Form 4s market-wide.
  4. (Optional) Restrict to a date range with startDate and endDate. Defaults to the last 30 days.
  5. (Optional) Leave emitClusterSignals on (the default) to also get pre-computed cluster-buy/cluster-sell rows.
  6. Set maxFilings (default 10 trial; production typically 100-1000).
  7. Click Start.

How much will scraping Form 4 cost?

Pricing is per-result (per transaction row written to the dataset). Cluster-signal records do not incur a separate event charge - they're free byproducts of the run.

Plan tierPer-result price
FREE$0.006
BRONZE$0.005
SILVER$0.004
GOLD$0.003
PLATINUM$0.003
DIAMOND$0.003

You pay only for saved transaction rows. A 10-row trial costs $0.06 on the FREE tier or $0.03 on GOLD. The final cost of a date range depends on how many matching transactions EDGAR returns; use maxTransactions to set a predictable ceiling.

Yes. SEC EDGAR is the official U.S. Securities and Exchange Commission public-disclosure system. The data is explicitly released for public reuse. The only operational requirement is the SEC Fair Access policy requiring requests to include a real contact email in the User-Agent header - this actor enforces that. The free EDGAR full-text-search API (efts.sec.gov) is the official endpoint for programmatic search.

Examples

Track Apple insiders across a fixed research window.

{
"contactEmail": "you@yourcompany.com",
"tickers": ["AAPL"],
"startDate": "2026-07-01",
"maxFilings": 100
}

One-day market-wide insider sweep.

{
"contactEmail": "you@yourcompany.com",
"startDate": "2026-07-16",
"endDate": "2026-07-16",
"maxFilings": 500,
"emitClusterSignals": true,
"clusterWindowDays": 5,
"clusterMinInsiders": 3
}

Watch a basket of tech tickers.

{
"contactEmail": "you@yourcompany.com",
"tickers": ["AAPL", "MSFT", "GOOGL", "AMZN", "META", "NVDA"],
"startDate": "2026-07-01",
"maxFilings": 1000
}

Track one specific insider across all companies they file at.

{
"contactEmail": "you@yourcompany.com",
"ciks": ["0001214128"],
"maxFilings": 50
}

Cluster signals only - tune the window tighter.

{
"contactEmail": "you@yourcompany.com",
"startDate": "2026-07-01",
"maxFilings": 2000,
"emitClusterSignals": true,
"clusterWindowDays": 3,
"clusterMinInsiders": 4
}

Audit one biotech's IPO-era insider activity.

{
"contactEmail": "you@yourcompany.com",
"issuerNames": ["MoonRoc Therapeutics"],
"startDate": "2026-07-01",
"maxFilings": 200
}

Input parameters

FieldTypeDescription
contactEmailstringRequired. SEC Fair Access policy.
tickersstring[]Issuer tickers.
issuerNamesstring[]Full or partial issuer names.
ciksstring[]10-digit CIKs (issuer or insider).
insiderNamesstring[]Reporting-owner names.
startDatestringISO date inclusive. Default: 30 days ago.
endDatestringISO date inclusive. Default: today.
emitClusterSignalsbooleanCompute and emit cluster rows. Default true.
clusterWindowDaysintegerRolling window for cluster detection. Default 5.
clusterMinInsidersintegerMinimum distinct insiders for a cluster. Default 3.
maxFilingsintegerUpper bound on filings fetched. Default 10.
maxTransactionsintegerSafety cap on transaction rows. Default 5000.

Output format

transaction record

FieldTypeNotes
recordTypestringAlways "transaction".
accessionNumberstringE.g. "0001225208-26-005023".
filingDatestringISO date.
periodOfReportstringISO date of transaction period.
filingUrlstringDirect URL to the Form 4 XML.
issuerCik, issuerName, issuerTickerstringSubject company.
insiderCik, insiderNamestringReporting owner.
insiderRolesstring[]Array of Director, Officer, TenPercentOwner, Other.
insiderOfficerTitlestringFree-text officer title from filing.
insiderIsDirector, insiderIsOfficer, insiderIsTenPercentOwnerbooleanTyped booleans.
securityTitlestringE.g. "Common Stock", "Restricted Stock Units".
isDerivativebooleanTrue for options, RSUs, warrants, etc.
transactionCodeenumSEC code: P, S, A, D, F, M, G, C, etc.
transactionCodeDescriptionstringPlain-English description of the code.
acquiredOrDisposedenumA / D / OTHER.
transactionDatestringISO date.
sharesTradednumberTyped numeric.
pricePerSharenumberTyped numeric in USD.
transactionValueUsdnumbershares × price; null when price is 0.
postTransactionSharesnumberShares the insider owns after this transaction.
directOrIndirectOwnershipenumD (direct) / I (indirect) / OTHER.
fieldCompletenessScoreinteger0-100.
agentMarkdownstringLLM-ready card.

The record below came from the verified current-build market-wide trial:

{
"recordType": "transaction",
"outputSchemaVersion": "2026-05-12",
"filingDate": "2026-07-17",
"issuerName": "Nerdy Inc.",
"issuerTicker": "NRDY",
"insiderName": "Callaway Kyle",
"insiderOfficerTitle": "Chief Accounting Officer",
"transactionCode": "A",
"transactionCodeDescription": "Grant, award, or other acquisition under benefit plan",
"transactionDate": "2026-07-15",
"sharesTraded": 100000,
"pricePerShare": 0,
"transactionValueUsd": null,
"filingUrl": "https://www.sec.gov/Archives/edgar/data/2145476/000214547626000004/wk-form4_1784319778.xml"
}

cluster_signal record

Emitted when emitClusterSignals: true and 3+ unique insiders at the same issuer transact in the same direction within the rolling window.

FieldTypeNotes
recordTypestringAlways "cluster_signal".
clusterTypeenumcluster_buy or cluster_sell.
rollingWindowDaysintegerThe window setting.
insiderCountintegerDistinct insiders.
transactionCountintegerUnderlying transactions.
totalSharesTradednumberSum of shares.
totalValueUsdnumberSum of dollar value.
insiderNamesstring[]Names of the participating insiders.
firstTransactionDate, lastTransactionDatestringISO dates spanning the cluster.

During the Actor run

The actor first hits EDGAR full-text search to enumerate Form 4 filings matching your filter. For each match, it fetches the filing XML at sec.gov/Archives/edgar/data/..., parses both transaction tables, and pushes one row per transaction. If cluster signals are enabled, the actor runs a rolling-window detection over the parsed transactions at the end of the run and pushes one record per detected cluster.

Run artifacts:

  • OUTPUT: counts, total buys/sells in USD, unique issuers + insiders, API call counts.
  • AGENT_BRIEFING: markdown digest with cluster signals + top 10 transactions by dollar value.

FAQ

How does Form 4 reporting work?

Section 16 of the Securities Exchange Act of 1934 requires officers, directors, and 10%-plus shareholders to disclose covered transactions. The Actor uses EDGAR's full-text search index, whose indexing time is controlled by the SEC. Use overlapping date windows and deduplicate on accession and transaction identity for robust monitoring.

What's a "cluster buy" and why does it matter?

A cluster buy is when multiple distinct insiders at the same issuer make qualifying purchases within a short rolling window. The Actor's defaults use a 5-day window and 3 or more insiders. This is a screening flag, not a prediction or investment recommendation; inspect the underlying transaction codes, ownership changes, footnotes, and filing links.

Can I get only purchases (code P)?

Yes - filter client-side after the run. Apify's dataset query API supports filtering on any field. Or in your downstream pipeline, drop rows where transactionCode !== "P". We considered an input filter but kept the output unfiltered so cluster detection can run across the whole set.

Why are some transactions missing dollar values?

Form 4 transactions filed with pricePerShare: 0 are typically grants (code A), exercises of zero-cost RSUs, or tax-withholding share surrenders (code F) where there's no market price. The actor preserves the underlying numbers but sets transactionValueUsd to null. Filter on transactionCode in ["P", "S"] to get only open-market transactions with real prices.

Can I use this with Python / Make / Zapier / n8n / Slack?

Yes. The Apify Python client is the easiest path. The agentMarkdown field on every transaction and cluster signal is designed for direct posting into a Slack channel.

How does this differ from existing free EDGAR scrapers?

Free actors pull the raw filing XML or return one row per filing. This actor returns one row per transaction (a single filing typically has 1-5), with the SEC code decoded into a description, the insider's role flags as typed booleans, and the cluster-signal layer pre-computed. The data shape is what every consumer of Form 4 needs but few existing actors deliver.

Does this overlap with sec-edgar-filings?

The sister actor skootle/sec-edgar-filings is a generalist EDGAR full-text scraper. This actor is the Form 4 specialist - every line of code is dedicated to the Form 4 schema. Use the generalist for 10-K/10-Q/8-K/13F/etc. Use this one for Form 4 specifically.

Why do I need to supply my own contact email?

SEC.gov Fair Access policy requires a real contact email in the User-Agent of every request. If multiple actors share one email at high volume, the SEC may rate-limit or block that email. Per-actor / per-buyer emails keep volume distributed and your access reliable.

How fresh is the data?

EDGAR ingests Form 4 filings continuously during business hours, but full-text-search indexing can lag and is controlled by the SEC. Schedule recurring runs with an overlapping date window and deduplicate on accession number plus transaction identity for robust monitoring.

Your feedback

Hit a bug or want a feature? Open an issue on the Issues tab rather than the reviews page, and we'll fix it fast (typically within 48 hours).

Why choose SEC Form 4 Insider Trades

  • One row per transaction, not per filing. Multi-transaction filings get fanned out so downstream analytics is one filter expression, not a flatmap.
  • Cluster-buy / cluster-sell signals pre-computed. The configurable rolling-window detector runs after parsing and emits dedicated signal records alongside transaction rows when the threshold is met.
  • Decoded transaction codes. Plain-English description on every row. No more "what does code 'F' mean again?".
  • Role enum + officer title parsed. insiderRoles is a typed array (Director, Officer, TenPercentOwner); insiderOfficerTitle carries the free-text title verbatim ("Chief Financial Officer").
  • Typed numerics throughout. Shares, price, dollar value, post-transaction shares - all numbers, not strings.
  • Versioned schema (outputSchemaVersion: "2026-05-12").
  • fieldCompletenessScore per record.
  • agentMarkdown per record + AGENT_BRIEFING.md per run for LLM / Slack consumption.

Other Skootle actors you might want to check

Support and contact

Open an issue at the Issues tab for bugs or feature requests. Typical response time 48 hours.