Skip to main content
A webhook sends an event to your URL when something happens on an account. A call ends, a prospect replies, a deal closes or moves stage. Each record event carries the identity-resolved account, its people, the deal and the evidence behind it, so your receiver can act without calling back. Point it at n8n, Make, Clay, your own backend or your agent’s endpoint. Manage webhooks with the endpoints in this group or the webhooks MCP tool.
Webhooks run on OpenNous Cloud. A self-hosted instance returns 403 cloud_only_feature.

Set one up

The response holds the signing secret. It is shown once. Store it next to your receiver. If you lose it, rotate it with PATCH /v2/webhooks/{id} and rotate_secret: true. Then send a test event. It is built on one of your real accounts, so you see the exact shape your handler will receive. Any key can list, create and test webhooks. Changing or deleting one needs an admin key. A read-only key cannot create or test.

Events

GET /v2/webhooks/events returns this catalog. deal.won and deal.lost arrive once the deal ledger learns of the close from your CRM. Expect them hours after the close, sometimes later.

Legacy interaction events

Six older events carry a person snapshot only, in a different shape. They are interaction.email_received, interaction.email_bounced, interaction.linkedin_connection_accepted, interaction.linkedin_message_received, interaction.meeting_scheduled and interaction.meeting_held.

Payload

Every record event has the same envelope. api_version changes when the envelope changes shape, so you can branch on it.
  • people lists the person the event is about first, then the most recently active, up to 10.
  • deal is the deal the event names. Otherwise it is the account’s open deal closing soonest, else its latest. It is null when the account has no deal.
  • account.icp.tier is tier_1, tier_2, tier_3 or not_icp.
  • evidence.claims holds up to 15 key account claims with their confidence and freshness (fresh, aging, suspect or expired). evidence.facts holds up to 8 facts with their source.
  • A webhook goes to a shared destination, so the payload carries only what every member can read. It never includes anything derived from one person’s private mail.

Delivery

We POST the JSON body to your URL with these headers.
  • Respond with any 2xx within 10 seconds to mark the event delivered.
  • A 4xx other than 408 or 429 is permanent. We stop and mark it failed.
  • A 5xx, 408, 429, timeout or network error is retried after 1 minute, 5 minutes, 30 minutes, 2 hours and 6 hours. After 6 attempts, about 9 hours, it is marked failed.
  • Each event goes to each webhook at most once. Still treat X-Nous-Event-Id as an idempotency key in your receiver.
  • History is not replayed. Events older than 48 hours are not sent, or 45 days for deal closes. A new webhook receives nothing from before the week it was created.
See every attempt, its status code and its last error in GET /v2/webhooks/{id}/deliveries.

Verify the signature

Compute the HMAC over the raw request bytes before you parse the JSON, then compare in constant time. Parsing and re-serialising the body changes the bytes and breaks the check.