# SEC Form 4 Monitor: Insider Trading Alerts (`incontrovertible_gate/sec-form4`) Actor

Real-time insider trading alerts from SEC EDGAR Form 4 filings. Watch any tickers, filter by transaction value, and push notifications to Slack, Discord, Telegram or any webhook. A modern programmable alternative to OpenInsider, QuiverQuant, and SECForm4.com — pay only $0.10 per alert delivered.

- **URL**: https://apify.com/incontrovertible\_gate/sec-form4.md
- **Developed by:** [Netsrac](https://apify.com/incontrovertible_gate) (community)
- **Categories:** Other, Agents, News
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, NaN bookmarks
- **User rating**: No ratings yet

## Pricing

from $100.00 / 1,000 alert dispatcheds

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/platform/actors/running/actors-in-store#pay-per-event

## What's an Apify Actor?

Actors are a software tools running on the Apify platform, for all kinds of web data extraction and automation use cases.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

In JavaScript/TypeScript projects, use official [JavaScript/TypeScript client](https://docs.apify.com/api/client/js.md):

```bash
npm install apify-client
```

In Python projects, use official [Python client library](https://docs.apify.com/api/client/python.md):

```bash
pip install apify-client
```

In shell scripts, use [Apify CLI](https://docs.apify.com/cli/docs.md):

````bash
# MacOS / Linux
curl -fsSL https://apify.com/install-cli.sh | bash
# Windows
irm https://apify.com/install-cli.ps1 | iex
```bash

In AI frameworks, you might use the [Apify MCP server](https://docs.apify.com/platform/integrations/mcp.md).

If your project is in a different language, use the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).


# README

## SEC Form 4 Monitor — Real-Time Insider Trading Alerts to Slack, Discord & Telegram

**Get push notifications the moment a corporate insider files a Form 4 with the SEC.** Watch any list of US-listed tickers and receive alerts on **Slack, Discord, Telegram, or any webhook** within minutes of the filing hitting EDGAR. A modern, programmable **alternative to OpenInsider, QuiverQuant, InsiderFinance, and SECForm4.com** — but built for engineers, traders, and quant teams who want push alerts and clean JSON, not yet another dashboard to refresh.

> **TL;DR:** SEC Form 4 filings are public, free, and goldmine signal — but no free site pushes them to your channel of choice in real time. This actor does, and you only pay per alert delivered.

### What does SEC Form 4 Monitor do?

This actor watches the public [SEC EDGAR Form 4 feed](https://www.sec.gov/cgi-bin/browse-edgar?action=getcurrent&type=4) — the filings every officer, director, and 10%-owner must submit within 2 business days of trading their company's stock — and pushes a structured alert to your Slack, Discord, or Telegram every time an insider on your watchlist transacts. It parses each filing's XML to extract the **insider's name, title, transaction code (P/S/A/M/F), share count, and price**, calculates the dollar value, applies your filters, and delivers a clean alert with a direct link to the SEC filing.

Insider buying clusters and large CEO sells are some of the highest-signal events in equity markets. Hedge funds pay tens of thousands per month for the same data through Bloomberg terminals (`BIQ <GO>`), FactSet, S&P Capital IQ, or specialized providers like **WhaleWisdom, VerityData/InsiderScore, or 2iQ Research**. This actor delivers the underlying SEC data for **cents per alert**, with the same latency.

#### What this actor solves
- **Push notifications** the moment an insider trades — not next-day email digests
- **Custom watchlists** — track only the tickers you care about
- **Programmatic access** to Form 4 data — clean JSON, dataset export, webhook out
- **Direct EDGAR XML parsing** — actual share counts, prices, transaction codes, not a screenshot
- **Pipe to your own backend** — feed an LLM, a trading bot, a database, or a Discord
- **Minutes-fresh data** — within ~1 polling interval of the SEC accepting the filing

### Why use SEC Form 4 Monitor instead of free dashboards or paid Bloomberg?

| | Free sites (OpenInsider, Finviz, SECForm4.com) | Paid platforms (Bloomberg, WhaleWisdom, VerityData) | **SEC Form 4 Monitor** |
|---|---|---|---|
| **Cost** | Free, ad-supported | $24K–$300K/year | ~$0.10 per alert delivered |
| **Push alerts to your channel** | ❌ (manual refresh) | ✅ (custom integrations $$$) | ✅ Slack, Discord, Telegram, webhook |
| **Watchlist filtering** | Limited | ✅ | ✅ |
| **Min transaction-value filter** | ❌ | ✅ | ✅ |
| **Buy/sell/grant code filtering** | Partial | ✅ | ✅ |
| **JSON dataset for backtesting** | ❌ | ✅ | ✅ |
| **No dashboard required** | ❌ | ❌ | ✅ |
| **Pay only when something happens** | n/a | ❌ (flat fee) | ✅ |
| **Self-hosted / programmable** | ❌ | Limited | ✅ |

If you're tired of refreshing OpenInsider every morning, paying for a Bloomberg you don't fully use, or copy-pasting Form 4s into your trading journal — this is the missing piece.

### Use cases & workflows

#### 1. Day trader / swing trader: catch insider-buying clusters before the news cycle
Watch 20–50 small-/mid-cap tickers. Set `minTransactionValue: 50000`. Insider clusters (3+ officers buying in one day) are one of the highest-conviction signals in equity markets — and you'll see them before the 8-K hits. **Recent example:** on the first day this actor was tested live, six Patrick Industries (PATK) officers bought the open market in a single session, totaling over $2.4M. That's the textbook setup.

#### 2. Quant: build your own factor model
Set `notificationChannel: "none"`. Schedule the actor every 30 minutes. Every match writes to the Apify dataset. Wire the dataset to your data warehouse via the [Apify Webhook Integration](https://docs.apify.com/platform/integrations) → Snowflake/BigQuery/S3. Backtest insider-cluster strategies against price data without scraping anything yourself.

#### 3. Long-only PM: monitor your portfolio
Watch your 30 holdings. Filter to sells over $500K. Get a Slack ping when management is dumping shares — often the first signal something has changed in the business.

#### 4. Newsletter / fintwit creator: never miss a story
Watch the S&P 100. Pipe alerts into a private Discord. Be first on Twitter when a CEO sells $50M.

#### 5. Compliance / IR team: monitor your own company
Watch your own ticker. Confirm that insiders are filing on time and within blackout-period rules.

#### 6. AI agent / LLM workflow: feed insider trades into Claude/GPT
Use `customWebhookUrl` to POST every match to your own LLM-driven analysis pipeline. Auto-summarize cluster events, correlate with earnings, generate trade theses.

### How to use SEC Form 4 Monitor

> ⚠️ **Important: this actor must be scheduled to receive ongoing alerts.** A single run only checks for filings once. Use Apify's **built-in Schedules** feature — no Zapier, n8n, cron server, or other third party needed. It's already part of your Apify account and free to use.

1. **Click "Try for free"** to add the actor to your Apify account.
2. **Configure the input:** tickers (e.g. `NVDA, TSLA, META`), `minTransactionValue`, and pick a `notificationChannel`.
3. **Paste your webhook URL or Telegram credentials.** All secret fields are stored encrypted by Apify.
4. **First run: enable `testMode`** to fire one alert for the most recent matching filing and confirm your webhook works.
5. **Set up the Schedule** (the only thing that turns this from a one-shot into a real-time monitor):
   - Open the actor → **Schedules** tab → **Create new schedule**
   - Cron: `0 */2 * * *` (every 2 hours) is the recommended default
   - Choose this actor + the same input you tested with
   - Save. That's it — alerts will now arrive on your schedule.

#### Schedule cadence cheat sheet

| Cron | Frequency | Best for |
|------|-----------|----------|
| `*/30 * * * *` | every 30 min | Active day traders, news desks |
| `0 */2 * * *` | every 2 hours | Most retail traders, default |
| `0 */6 * * *` | every 6 hours | Long-term investors |
| `0 13 * * 1-5` | weekdays 9am ET | Daily morning digest |

**Why no n8n / Zapier / external scheduler is needed:** Apify Schedules runs the actor on Apify's infrastructure, fully managed. Your watchlist + webhook stay in this one config. Less moving parts, less to break, less surface area for credential leaks.

### Input

| Field | Description |
|-------|-------------|
| `tickers` | Stock tickers to watch (`["NVDA","TSLA",…]`) |
| `minTransactionValue` | Minimum USD value of a transaction to alert on. Default `100000`. |
| `alertOnBuys` | Alert on purchases (P), grants (A), option exercises (M). Default `true`. |
| `alertOnSells` | Alert on sales (S) and tax withholding sales (F). Default `true`. |
| `notificationChannel` | `none` \| `slack` \| `discord` \| `telegram` \| `webhook` |
| `slackWebhookUrl` | Slack incoming webhook (when channel = slack) |
| `discordWebhookUrl` | Discord webhook (when channel = discord) |
| `telegramBotToken` + `telegramChatId` | Telegram bot credentials |
| `customWebhookUrl` | Any HTTPS endpoint receiving JSON alerts |
| `userAgent` | Required by SEC: `Your Name your@email.com` |
| `testMode` | First-run sanity check — fires one alert without dedup |

### Output

Every alert is also pushed to the run's dataset. Example item:

```json
{
  "accessionNumber": "000120992926000006",
  "filedAt": "2026-05-06T08:42:11-04:00",
  "ticker": "PATK",
  "company": "PATRICK INDUSTRIES INC",
  "insiderName": "NEMETH ANDY L",
  "insiderTitle": "Director, Chief Executive Officer",
  "transactionType": "Open-market purchase",
  "transactionCode": "P",
  "shares": 10000,
  "pricePerShare": 88,
  "totalValue": 880000,
  "filingUrl": "https://www.sec.gov/Archives/edgar/data/76605/.../...-index.htm"
}
````

You can download the dataset in **JSON, CSV, Excel, or HTML** from the Apify Console, query it via the [Apify API](https://docs.apify.com/api/v2), or auto-pipe it to Google Sheets, Airtable, Notion, or Slack via [Apify integrations](https://docs.apify.com/platform/integrations).

### Data table

| Field | Type | Description |
|-------|------|-------------|
| `filedAt` | date | When EDGAR received the filing |
| `ticker` | string | Stock ticker symbol |
| `company` | string | Issuer company name |
| `insiderName` | string | Reporting person |
| `insiderTitle` | string | Director / Officer / 10% Owner / officer title |
| `transactionType` | string | Open-market purchase, sale, grant, option exercise, etc. |
| `transactionCode` | string | SEC code: P (buy), S (sell), A (grant), M (exercise), F (tax withholding) |
| `shares` | number | Number of shares transacted |
| `pricePerShare` | number | USD price per share |
| `totalValue` | number | shares × price |
| `filingUrl` | link | Direct link to the SEC filing index |

### Pricing — pay-per-event

This actor uses **Apify pay-per-event pricing: ~$0.10 per alert delivered**. On days with no insider activity matching your filters, you pay nothing. Compare to:

| Service | Approx cost | Notes |
|---|---|---|
| Bloomberg Terminal | $24,000/year | Includes everything, but you're paying for terminals you may not need |
| FactSet | $12,000+/year | Institutional only |
| WhaleWisdom Pro | $1,000+/year | Mostly 13F-focused; Form 4 is secondary |
| VerityData / InsiderScore | $$$ enterprise | Best-in-class but priced for hedge funds |
| OpenInsider | Free | No alerts, no API, dashboard only |
| **SEC Form 4 Monitor** | **~$5–$25/month for typical retail use** | Push alerts + JSON API |

A typical retail user watching 5–10 tickers averages 5–20 alerts per month. A quant team watching the Russell 2000 might see 500+ alerts per month — still under $50.

### Tips & advanced options

- **Tune `minTransactionValue` carefully.** $0 floods you with routine vesting and tax withholding. $100K is a reasonable retail default. $1M filters to executive-cluster signals only.
- **Schedule frequency.** Every 2 hours catches most filings within ~1 hour of EDGAR posting. Every 30 minutes is best for active traders. Every 6 hours is fine for long-term investors.
- **Cluster detection.** Run multiple actor instances per sector and watch for *clusters* — 3+ insiders in the same company buying in one week is a strong leading indicator.
- **Pipe to a database.** Set `notificationChannel: "none"` and use Apify's Webhook Integration to POST every new dataset item to your own backend.
- **Combine with 13F & 13D scrapers.** This actor handles Form 4. Pair it with separate actors for 13F (institutional) and 13D/G (activist) filings for a complete insider/institution picture.

### FAQ

**Is this legal?** Yes. Form 4 filings are public information published by the SEC under the Securities Exchange Act of 1934. There is no restriction on using them.

**How fresh is the data?** EDGAR's RSS feed updates every few minutes. Latency from filing-acceptance to your alert is roughly the gap between scheduled runs (so 2 hours on the default cadence), plus ~30 seconds for parsing.

**Why am I missing some filings?** EDGAR's "current" feed shows the 100 most-recent Form 4s. On extremely high-volume days (proxy seasons, post-earnings windows) older filings may scroll off before your next run. Increase schedule frequency to every 30 minutes or every hour during peak periods.

**Why isn't my ticker matching?** SEC tracks companies by CIK, not ticker. Recently-IPO'd companies, ADRs, and some non-US-listed entities may not yet appear in SEC's [`company_tickers.json`](https://www.sec.gov/files/company_tickers.json) mapping. Open an issue with the ticker and we'll investigate.

**Does this work for 13F/13D/13G filings?** No — this actor monitors **Form 4** only (officer/director/10%-owner trades). Institutional 13Fs and activist 13D/Gs are separate filing types and would need their own actors.

**Does this work for Schedule A grants or 10b5-1 plan trades?** Yes. Form 4 captures these — they appear with transaction codes A (grant) and the 10b5-1 footnote when applicable. The actor surfaces all transaction codes; use `alertOnBuys`/`alertOnSells` and `minTransactionValue` to filter.

**What if I want non-US insider data?** This actor is US-only (SEC EDGAR). Canadian SEDI filings, UK FCA filings, and EU MAR filings would each need a separate actor.

### Support & feedback

Open an issue on the actor's **Issues tab** on Apify Store. Feature requests welcome — especially around clustering analytics, alternative filing types, and integration patterns.

***

*Disclaimer: This actor is an information-retrieval tool for publicly available SEC filings. Nothing in its output constitutes investment advice. Trade responsibly.*

**Keywords:** insider trading alerts, SEC Form 4 alerts, Form 4 tracker, OpenInsider alternative, insider buying alerts, real-time insider trading, insider trading API, EDGAR Form 4, Form 4 monitor, insider transaction Slack alerts, insider trading Discord bot, insider trading Telegram bot, CEO stock sales tracker, track insider buying, stock insider alerts.

# Actor input Schema

## `tickers` (type: `array`):

Stock tickers (e.g. NVDA, TSLA, META). Form 4 filings for these companies trigger alerts.

## `minTransactionValue` (type: `integer`):

Only alert when total share value (price × shares) is at least this amount. Filters out small grants and routine vesting. Set 0 to alert on everything.

## `alertOnBuys` (type: `boolean`):

Send alerts for open-market purchases and grants.

## `alertOnSells` (type: `boolean`):

Send alerts for open-market sales and tax withholding sales.

## `notificationChannel` (type: `string`):

Where to send alerts. Choose 'none' to only write to the dataset (use Apify integrations like Zapier or Make to wire that up).

## `slackWebhookUrl` (type: `string`):

Incoming-webhook URL from your Slack app. Required when channel is 'slack'.

## `discordWebhookUrl` (type: `string`):

Channel webhook URL from Discord. Required when channel is 'discord'.

## `telegramBotToken` (type: `string`):

Bot token from @BotFather. Required when channel is 'telegram'.

## `telegramChatId` (type: `string`):

Chat ID where alerts go (DM, group, or channel). Required when channel is 'telegram'.

## `customWebhookUrl` (type: `string`):

Any HTTPS endpoint. Receives a JSON POST per match. Required when channel is 'webhook'.

## `userAgent` (type: `string`):

SEC requires a User-Agent with your name and email (per their fair-access policy). Format: 'Your Name your@email.com'.

## `testMode` (type: `boolean`):

On first run only: ignore the dedup state and fire one alert for the most recent matching filing. Use this to confirm your webhook works before scheduling.

## Actor input object example

```json
{
  "tickers": [
    "NVDA",
    "TSLA",
    "META"
  ],
  "minTransactionValue": 100000,
  "alertOnBuys": true,
  "alertOnSells": true,
  "notificationChannel": "none",
  "userAgent": "SEC Form 4 Monitor your-email@example.com",
  "testMode": false
}
```

# Actor output Schema

## `alerts` (type: `string`):

All matched insider filings from this run. Download as JSON, CSV, Excel, or HTML.

## `runConsole` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "tickers": [
        "NVDA",
        "TSLA",
        "META"
    ],
    "userAgent": "SEC Form 4 Monitor your-email@example.com"
};

// Run the Actor and wait for it to finish
const run = await client.actor("incontrovertible_gate/sec-form4").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "tickers": [
        "NVDA",
        "TSLA",
        "META",
    ],
    "userAgent": "SEC Form 4 Monitor your-email@example.com",
}

# Run the Actor and wait for it to finish
run = client.actor("incontrovertible_gate/sec-form4").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print("💾 Check your data here: https://console.apify.com/storage/datasets/" + run["defaultDatasetId"])
for item in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "tickers": [
    "NVDA",
    "TSLA",
    "META"
  ],
  "userAgent": "SEC Form 4 Monitor your-email@example.com"
}' |
apify call incontrovertible_gate/sec-form4 --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=incontrovertible_gate/sec-form4",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

```json
{
    "openapi": "3.0.1",
    "info": {
        "title": "SEC Form 4 Monitor: Insider Trading Alerts",
        "description": "Real-time insider trading alerts from SEC EDGAR Form 4 filings. Watch any tickers, filter by transaction value, and push notifications to Slack, Discord, Telegram or any webhook. A modern programmable alternative to OpenInsider, QuiverQuant, and SECForm4.com — pay only $0.10 per alert delivered.",
        "version": "0.0",
        "x-build-id": "rEg7b3Ymr5gIDWqnG"
    },
    "servers": [
        {
            "url": "https://api.apify.com/v2"
        }
    ],
    "paths": {
        "/acts/incontrovertible_gate~sec-form4/run-sync-get-dataset-items": {
            "post": {
                "operationId": "run-sync-get-dataset-items-incontrovertible_gate-sec-form4",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for its completion, and returns Actor's dataset items in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        },
        "/acts/incontrovertible_gate~sec-form4/runs": {
            "post": {
                "operationId": "runs-sync-incontrovertible_gate-sec-form4",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor and returns information about the initiated run in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "content": {
                            "application/json": {
                                "schema": {
                                    "$ref": "#/components/schemas/runsResponseSchema"
                                }
                            }
                        }
                    }
                }
            }
        },
        "/acts/incontrovertible_gate~sec-form4/run-sync": {
            "post": {
                "operationId": "run-sync-incontrovertible_gate-sec-form4",
                "x-openai-isConsequential": false,
                "summary": "Executes an Actor, waits for completion, and returns the OUTPUT from Key-value store in response.",
                "tags": [
                    "Run Actor"
                ],
                "requestBody": {
                    "required": true,
                    "content": {
                        "application/json": {
                            "schema": {
                                "$ref": "#/components/schemas/inputSchema"
                            }
                        }
                    }
                },
                "parameters": [
                    {
                        "name": "token",
                        "in": "query",
                        "required": true,
                        "schema": {
                            "type": "string"
                        },
                        "description": "Enter your Apify token here"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    }
                }
            }
        }
    },
    "components": {
        "schemas": {
            "inputSchema": {
                "type": "object",
                "required": [
                    "tickers",
                    "userAgent"
                ],
                "properties": {
                    "tickers": {
                        "title": "Tickers to watch",
                        "type": "array",
                        "description": "Stock tickers (e.g. NVDA, TSLA, META). Form 4 filings for these companies trigger alerts.",
                        "items": {
                            "type": "string"
                        }
                    },
                    "minTransactionValue": {
                        "title": "Minimum transaction value (USD)",
                        "minimum": 0,
                        "type": "integer",
                        "description": "Only alert when total share value (price × shares) is at least this amount. Filters out small grants and routine vesting. Set 0 to alert on everything.",
                        "default": 100000
                    },
                    "alertOnBuys": {
                        "title": "Alert on buys (P/A)",
                        "type": "boolean",
                        "description": "Send alerts for open-market purchases and grants.",
                        "default": true
                    },
                    "alertOnSells": {
                        "title": "Alert on sells (S/F)",
                        "type": "boolean",
                        "description": "Send alerts for open-market sales and tax withholding sales.",
                        "default": true
                    },
                    "notificationChannel": {
                        "title": "Notification channel",
                        "enum": [
                            "none",
                            "slack",
                            "discord",
                            "telegram",
                            "webhook"
                        ],
                        "type": "string",
                        "description": "Where to send alerts. Choose 'none' to only write to the dataset (use Apify integrations like Zapier or Make to wire that up).",
                        "default": "none"
                    },
                    "slackWebhookUrl": {
                        "title": "Slack webhook URL",
                        "type": "string",
                        "description": "Incoming-webhook URL from your Slack app. Required when channel is 'slack'."
                    },
                    "discordWebhookUrl": {
                        "title": "Discord webhook URL",
                        "type": "string",
                        "description": "Channel webhook URL from Discord. Required when channel is 'discord'."
                    },
                    "telegramBotToken": {
                        "title": "Telegram bot token",
                        "type": "string",
                        "description": "Bot token from @BotFather. Required when channel is 'telegram'."
                    },
                    "telegramChatId": {
                        "title": "Telegram chat ID",
                        "type": "string",
                        "description": "Chat ID where alerts go (DM, group, or channel). Required when channel is 'telegram'."
                    },
                    "customWebhookUrl": {
                        "title": "Custom webhook URL",
                        "type": "string",
                        "description": "Any HTTPS endpoint. Receives a JSON POST per match. Required when channel is 'webhook'."
                    },
                    "userAgent": {
                        "title": "SEC User-Agent",
                        "type": "string",
                        "description": "SEC requires a User-Agent with your name and email (per their fair-access policy). Format: 'Your Name your@email.com'."
                    },
                    "testMode": {
                        "title": "Test mode",
                        "type": "boolean",
                        "description": "On first run only: ignore the dedup state and fire one alert for the most recent matching filing. Use this to confirm your webhook works before scheduling.",
                        "default": false
                    }
                }
            },
            "runsResponseSchema": {
                "type": "object",
                "properties": {
                    "data": {
                        "type": "object",
                        "properties": {
                            "id": {
                                "type": "string"
                            },
                            "actId": {
                                "type": "string"
                            },
                            "userId": {
                                "type": "string"
                            },
                            "startedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "finishedAt": {
                                "type": "string",
                                "format": "date-time",
                                "example": "2025-01-08T00:00:00.000Z"
                            },
                            "status": {
                                "type": "string",
                                "example": "READY"
                            },
                            "meta": {
                                "type": "object",
                                "properties": {
                                    "origin": {
                                        "type": "string",
                                        "example": "API"
                                    },
                                    "userAgent": {
                                        "type": "string"
                                    }
                                }
                            },
                            "stats": {
                                "type": "object",
                                "properties": {
                                    "inputBodyLen": {
                                        "type": "integer",
                                        "example": 2000
                                    },
                                    "rebootCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "restartCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "resurrectCount": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "computeUnits": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "options": {
                                "type": "object",
                                "properties": {
                                    "build": {
                                        "type": "string",
                                        "example": "latest"
                                    },
                                    "timeoutSecs": {
                                        "type": "integer",
                                        "example": 300
                                    },
                                    "memoryMbytes": {
                                        "type": "integer",
                                        "example": 1024
                                    },
                                    "diskMbytes": {
                                        "type": "integer",
                                        "example": 2048
                                    }
                                }
                            },
                            "buildId": {
                                "type": "string"
                            },
                            "defaultKeyValueStoreId": {
                                "type": "string"
                            },
                            "defaultDatasetId": {
                                "type": "string"
                            },
                            "defaultRequestQueueId": {
                                "type": "string"
                            },
                            "buildNumber": {
                                "type": "string",
                                "example": "1.0.0"
                            },
                            "containerUrl": {
                                "type": "string"
                            },
                            "usage": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "integer",
                                        "example": 1
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            },
                            "usageTotalUsd": {
                                "type": "number",
                                "example": 0.00005
                            },
                            "usageUsd": {
                                "type": "object",
                                "properties": {
                                    "ACTOR_COMPUTE_UNITS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATASET_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "KEY_VALUE_STORE_WRITES": {
                                        "type": "number",
                                        "example": 0.00005
                                    },
                                    "KEY_VALUE_STORE_LISTS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_READS": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "REQUEST_QUEUE_WRITES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_INTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "DATA_TRANSFER_EXTERNAL_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_RESIDENTIAL_TRANSFER_GBYTES": {
                                        "type": "integer",
                                        "example": 0
                                    },
                                    "PROXY_SERPS": {
                                        "type": "integer",
                                        "example": 0
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
    }
}
```
