Webhooks
DeveloperRegister HTTPS endpoints to receive filing events in real time. Payloads are signed with HMAC-SHA256 so you can verify authenticity. Use webhooks as a reliable push delivery channel for your backend.
How Webhooks Work
Register a webhook endpoint via the API or Settings page. You receive a signing secret.
Receive HTTP POST requests to your endpoint when events occur (e.g. a new filing is processed).
Verify the X-8KIntel-Signature header using your signing secret to confirm authenticity.
Respond with a 2xx status code within 10 seconds. Non-2xx or timeout triggers retries.
Event Types
| Event | Description |
|---|---|
| filing.created | A new 8-K filing has been processed and is available. Includes full filing data with AI summary. |
Additional event types (e.g. filing.updated, earnings.upcoming) are planned for future releases.
Webhook Payload
{
"event": "filing.created",
"timestamp": "2026-03-14T16:30:38Z",
"data": {
"id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"ticker": "AAPL",
"company_name": "Apple Inc.",
"accession_number": "0000320193-26-000042",
"filing_url": "https://www.sec.gov/Archives/edgar/data/...",
"filed_at": "2026-03-14T16:30:00Z",
"items": ["2.02", "9.01"],
"summary": {
"headline": "Q1 2026 revenue beats estimates by 8%",
"sentiment": "bullish",
"bullet_1": "Revenue $124.3B vs $115.2B est.",
"bullet_2": "Services segment hits all-time high at $26.1B",
"bullet_3": "Guidance raised for Q2 2026",
"guidance_change": "raised",
"beat_miss": "beat"
},
"e2e_latency_ms": 38200
}
}Signature Verification
Every webhook delivery includes an X-8KIntel-Signature header containing an HMAC-SHA256 hex digest of the request body, signed with your webhook secret.
import crypto from "crypto";
function verifyWebhook(body: string, signature: string, secret: string): boolean {
const expected = crypto
.createHmac("sha256", secret)
.update(body, "utf8")
.digest("hex");
return crypto.timingSafeEqual(
Buffer.from(signature),
Buffer.from(expected),
);
}
// In your handler:
app.post("/webhook", (req, res) => {
const signature = req.headers["x-8kintel-signature"] as string;
const body = JSON.stringify(req.body);
if (!verifyWebhook(body, signature, WEBHOOK_SECRET)) {
return res.status(401).send("Invalid signature");
}
const event = req.body;
console.log(`[${event.data.ticker}] ${event.data.summary.headline}`);
res.status(200).send("OK");
});import hmac
import hashlib
def verify_webhook(body: bytes, signature: str, secret: str) -> bool:
expected = hmac.new(
secret.encode(), body, hashlib.sha256
).hexdigest()
return hmac.compare_digest(signature, expected)
# In your Flask handler:
@app.route("/webhook", methods=["POST"])
def handle_webhook():
signature = request.headers.get("X-8KIntel-Signature", "")
if not verify_webhook(request.data, signature, WEBHOOK_SECRET):
return "Invalid signature", 401
event = request.json
print(f"[{event['data']['ticker']}] {event['data']['summary']['headline']}")
return "OK", 200Webhook Management
/api/v1/webhooksAuthRegister a new webhook endpoint. Returns a signing secret — store it securely, it's only shown once.
| Parameter | Type | Description |
|---|---|---|
urlrequired | string | HTTPS endpoint URL |
eventsrequired | string[] | Event types to subscribe to (e.g. ["filing.created"]) |
{
"id": "wh_abc123",
"url": "https://your-server.com/webhook",
"events": ["filing.created"],
"active": true,
"secret": "whsec_a1b2c3d4e5f6..."
}/api/v1/webhooksAuthList all registered webhooks with their status and failure counts.
/api/v1/webhooks/{id}/deliveriesAuthGet delivery history for a webhook, including response status codes and timing.
/api/v1/webhooks/{id}/testAuthSend a test event to your webhook endpoint to verify connectivity.
/api/v1/webhooks/{id}AuthDelete a webhook. No further events will be delivered to this endpoint.
Retry Policy
If your endpoint returns a non-2xx status or times out (10 second limit), 8K Intel retries delivery with exponential backoff:
| Attempt | Delay |
|---|---|
| 1st retry | 1 minute |
| 2nd retry | 5 minutes |
| 3rd retry (final) | 30 minutes |
After 3 failed attempts, the delivery is marked as failed. Webhooks with 10+ consecutive failures are automatically deactivated. Check delivery logs to debug issues.
Limits
| Plan | Max Endpoints | Timeout | Retries |
|---|---|---|---|
| Developer | 5 | 10s | 3 |
| Pro | 25 | 10s | 3 |