Webhooks

Developer

Register 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

1

Register a webhook endpoint via the API or Settings page. You receive a signing secret.

2

Receive HTTP POST requests to your endpoint when events occur (e.g. a new filing is processed).

3

Verify the X-8KIntel-Signature header using your signing secret to confirm authenticity.

4

Respond with a 2xx status code within 10 seconds. Non-2xx or timeout triggers retries.

Event Types

EventDescription
filing.createdA 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

filing.created 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.

Node.js verification
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");
});
Python verification
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", 200

Webhook Management

POST/api/v1/webhooksAuth

Register a new webhook endpoint. Returns a signing secret — store it securely, it's only shown once.

ParameterTypeDescription
urlrequiredstringHTTPS endpoint URL
eventsrequiredstring[]Event types to subscribe to (e.g. ["filing.created"])
Create webhook response
{
  "id": "wh_abc123",
  "url": "https://your-server.com/webhook",
  "events": ["filing.created"],
  "active": true,
  "secret": "whsec_a1b2c3d4e5f6..."
}
GET/api/v1/webhooksAuth

List all registered webhooks with their status and failure counts.

GET/api/v1/webhooks/{id}/deliveriesAuth

Get delivery history for a webhook, including response status codes and timing.

POST/api/v1/webhooks/{id}/testAuth

Send a test event to your webhook endpoint to verify connectivity.

DELETE/api/v1/webhooks/{id}Auth

Delete 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:

AttemptDelay
1st retry1 minute
2nd retry5 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

PlanMax EndpointsTimeoutRetries
Developer510s3
Pro2510s3