SKILLMERC tools

SEC Filing Alerts - 8-K, Form 4, 13D & 10-K Monitor

Get alerted when your tickers file with the SEC: 8-K items, Form 4 insider trades, 13D/13G, 10-K, 10-Q, S-1. Runs on a schedule, sends to Slack or a webhook, $0.01 per new filing.

USD 10 per 1,000 alerts on Apify (pay per event)

Open in Apify StoreExample: Insider trading alerts (SEC Form 4)


Watch a list of tickers or CIKs on SEC EDGAR and get told only when a new filing appears. Each run reads the official submissions feed for every company, compares it against the snapshot from the previous run, and writes one row per new filing that matches your filters: form types such as 8-K, 10-K, 10-Q, Form 4, SC 13D, SC 13G, S-1 or DEF 14A, and optionally specific 8-K items such as 5.02 (officer and director changes) or keywords.

Nothing new was filed? The run writes nothing and you pay almost nothing. Data comes from data.sec.gov, the SEC's official JSON API. No API key, no login.

Common uses

How to schedule it

  1. Run the actor once with your companies, form types and a watchlistName. The first run saves a baseline and reports nothing, unless you set initialLookbackDays (see below).
  2. In Apify Console open the actor, click Schedule, and pick an interval. EDGAR accepts filings on business days from 6:00 to 22:00 US Eastern time. Every 30 or 60 minutes during that window catches 8-Ks the same day; once a day is fine for periodic reports.
  3. Optional: put a Slack incoming webhook URL or your own HTTPS endpoint in the input to receive each run's alerts as a push message.

Every scheduled run reuses the same watchlistName, so it always compares against the previous run. The snapshot lives in a key-value store named sec-filing-alerts-<watchlistName> in your account. Delete that store to start over.

If you leave watchlistName empty, the name is derived from the list of companies, so editing the list starts a fresh baseline. Naming the watchlist is better.

Initial lookback

Set initialLookbackDays to a number such as 30 and the first run also reports filings dated within that window that match your filters. This gives you a useful first result immediately and lets you check the output before scheduling. Later runs ignore the setting and report only filings that are new since the previous run.

Filters

The snapshot always stores the full filing list, so changing filters later never resurfaces old filings as new.

Input

| Field | Type | Default | Description | | - -| - -| - -| - -| | companies | array | | Tickers (AAPL) or CIK numbers (320193). | | formTypes | array | [] (all) | Form types to alert on. | | includeAmendments | boolean | true | Also report /A amendments of selected forms. | | items8K | array | [] | 8-K item numbers to require. | | keywords | array | [] | Keywords to require. | | initialLookbackDays | integer | 0 | On the first run, also report filings dated within this many days. | | watchlistName | string | | Name of the watchlist. Keeps the snapshot between runs. | | webhookUrl | string | | HTTPS endpoint that receives a JSON POST per run with the summary and alerts. | | slackWebhookUrl | string | | Slack incoming webhook. One message per run. | | maxAlertsPerRun | integer | 500 | Upper bound on alerts delivered and charged in a single run. |

Output

One dataset row per new filing. Example (a real row from a test run):

{
  "watchlist": "my-watchlist",
  "change_type": "new_filing",
  "cik": "1318605",
  "ticker": "TSLA",
  "company_name": "Tesla, Inc.",
  "form_type": "8-K",
  "filing_date": "2026-10-02",
  "accepted_at": "2026-10-02T13:04:26.000Z",
  "report_date": "2026-10-02",
  "items": ["2.02", "9.01"],
  "description": "8-K",
  "summary": "TSLA: new 8-K (items 2.02, 9.01) filed 2026-10-02 - 8-K",
  "accession_number": "0001628280-26-064366",
  "filing_url": "https://www.sec.gov/Archives/edgar/data/1318605/000162828026064366/",
  "document_url": "https://www.sec.gov/Archives/edgar/data/1318605/000162828026064366/tsla-20261002.htm",
  "size": 156965,
  "detected_at": "2026-10-06T07:05:04.956Z",
  "run_id": "abc123"
}

If a registrant changes its name between runs you also get a name_change row with before and after.

The run stores a summary in the OUTPUT record of the run's key-value store: companies_checked, changes_detected, alerts_delivered, alerts_skipped, not_found and whether the run was a baseline.

Webhook payloads

webhookUrl receives one POST per run: the summary plus run_id and an alerts array of the rows. Nothing is sent when a run has no alerts (except the first baseline run, which sends the summary).

slackWebhookUrl receives a short message listing up to 20 filings with document links.

Pricing

You pay per alert, not per company. Each new filing row written to the dataset costs USD 0.01. Each run also costs USD 0.001 to start, which covers checking your whole list when nothing new was filed. Platform usage is included.

Example: a watchlist of 20 companies on 8-K, 10-K and 10-Q, checked hourly on business days (about 350 runs a month), with 40 new filings a month, costs about USD 0.40 for the alerts plus USD 0.35 for the runs. Form 4 adds volume: large companies file several insider forms a week, so budget for that if you include it.

Limits and notes


Run it on Apify Apify's free plan includes monthly platform credit, so small runs cost little or nothing to try.