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:

HeaderDescription
Content-Typeapplication/json
x-webhook-signaturet=<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:

  1. Parse the x-webhook-signature header to extract t and s.
  2. Rebuild the signed string timestamp + "." + raw_body using the unparsed request body (do not re-serialize the JSON).
  3. Compute HMAC-SHA256 with your workspace signing key.
  4. Compare against s using a timing-safe comparison (e.g. crypto.timingSafeEqual in Node).
  5. 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.

postWebhookcall.logged

Payload

event'call.logged' required

Event type. Always call.logged for this payload.

eventIdstring required

Unique per delivery attempt. Use for logging only, not for deduplication. The same call may produce multiple eventIds if delivery is retried. Use callData.callId as your idempotency key.

occurredAtstring date-time required

ISO 8601 timestamp when the event was finalized in Nooks.

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.