Call logged
Fires once a call is fully finalized in Nooks (status, disposition, recording, transcript, and notes resolved). Delivered as an HTTP POST to every webhook URL configured for the workspace.
It fires for every call logged in the workspace: inbound and outbound, dialer calls, manually logged calls, and calls placed from a Nooks sequence.
Configure endpoints on the Webhooks page under Integrations in your Nooks workspace. On save Nooks performs a verification ping and returns a signing key once. Store it securely. For full setup and reference verification code in Node/Python/Ruby, see the Nooks Webhooks Integration Guide.
Headers
Each delivery includes:
| Header | Description |
|---|---|
| Content-Type | application/json |
| x-webhook-signature | t=<unix-ms>,s=<base64-hmac-sha256>. See the verification steps below. |
Signature verification
The signature is computed as:
s = base64(HMAC-SHA256(signingKey, timestamp + "." + raw_body))
Steps to verify on your endpoint:
- Parse the x-webhook-signature header to extract t and s.
- Rebuild the signed string timestamp + "." + raw_body using the unparsed request body (do not re-serialize the JSON).
- Compute HMAC-SHA256 with your workspace signing key.
- Compare against s using a timing-safe comparison (e.g. crypto.timingSafeEqual in Node).
- Reject requests where t is older than 5 minutes to prevent replay.
Response and retries
Respond with any 2xx within 15 seconds. Non-2xx responses or timeouts are retried with exponential backoff and jitter, up to 8 attempts over ~30 minutes. Process events asynchronously and acknowledge immediately.
Idempotency
eventId is unique per delivery attempt and is intended for logging only. Use callData.callId as your idempotency key. The same call may be delivered more than once due to retries.
Payload
Example payload
{
"event": "call.logged",
"eventId": "evt_01HW9X4S5K2M8R0Q1Y3Z6T7V8B",
"occurredAt": "2026-05-22T18:14:07.103Z",
"callData": {
"callId": "c-7f3d2a1b-9c4e-4f8a-b1d2-5e6f7a8b9c0d",
"workspaceId": "ws-3b2c1a09-8d7e-6f5a-4b3c-2a1b0c9d8e7f",
"userData": {
"userId": "u-1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
"email": "rep@example.com",
"name": "Alex Rep"
},
"prospectData": {
"prospectId": "p-9b8a7c6d-5e4f-3a2b-1c0d-9e8f7a6b5c4d",
"name": "Jamie Buyer",
"phoneNumber": "+14155550199",
"email": "jamie@prospectco.com",
"linkedInUrl": "https://www.linkedin.com/in/jamie-buyer"
},
"accountData": {
"accountId": "a-2c3d4e5f-6a7b-8c9d-0e1f-2a3b4c5d6e7f",
"name": "Prospect Co"
},
"callDirection": "outbound",
"status": "completed",
"disposition": {
"id": "d-connected-decision-maker",
"name": "Connected - Decision Maker"
},
"startedAt": "2026-05-22T18:11:42.000Z",
"durationSeconds": 142,
"recordingUrl": "https://recordings.nooks.in/c-7f3d2a1b/audio.mp3",
"notes": "Decision-maker interested in Q3 pilot. Follow up Tuesday.",
"transcriptUrl": "https://app.nooks.in/transcripts/c-7f3d2a1b",
"sequenceData": {
"sequenceName": "Q1 Outbound Campaign",
"sequenceStep": "Day 3 - Call"
}
}
}Response
Any 2xx response acknowledges receipt. Respond within 15 seconds.
Changes
Webhooks have no change history: a webhook is keyed by its event name rather than a path and method, so no recorded change can name it.