Skip to main content
A Signal is something worth knowing the moment it happens. You subscribe by creating a monitor:
monitor = signal + watch + url
  • signal — what kind of event (post_engagement). Browse them at GET /signals.
  • watch — who to watch: the author’s profile URL (one value or a list).
  • url — your HTTPS endpoint (and optional secret).
{ "signal": "post_engagement", "watch": "https://www.linkedin.com/in/jane/", "url": "https://your-server.com/webhook" }
One API key can have many monitors. Create them with POST /monitors.

One envelope for every signal

Every signal is delivered with the same envelope — write one handler, one signature check, then branch on signal:
{
  "signal": "post_engagement",
  "event_type": "post_engagement",
  "target": { "type": "profile", "value": "ACoAA…" },
  "data": { /* signal-specific — see the catalog */ },
  "chunk": { "index": 1, "total": 1 },
  "delivered_at": "2026-06-12T10:47:18.000000+00:00"
}
FieldMeaning
signalwhich signal fired
event_typethe sub-event (for post_engagement, also post_engagement)
targetwhat the event is about (null for market-wide signals)
datathe signal-specific body — see each signal in the catalog
chunka large event is split across several webhooks; index/total let you reassemble
delivered_atISO 8601

Verifying authenticity

When a monitor has a secret, each delivery is signed: header X-Webhook-Signature: sha256=<hmac> where <hmac> is HMAC-SHA256(secret, raw_body). Recompute and compare.

Delivery & retries

Deliveries retry on failure (up to 5 attempts, exponential backoff). A very active event is chunked so no single webhook is oversized.
Need full details on a person or company referenced in a signal? Pass the profile_id / id to Enrich Profile or Enrich Company.