Call AI Summary Webhook

Receive the AI-generated summary of a completed PSTN or WhatsApp call as soon as it is ready, including a short recap, the key points discussed and the follow-ups mentioned.

A single event covers both calling channels. The channel field tells you whether the call went through your PSTN number or your WhatsApp Business number.

Events Covered

EventDescription
CALL_AI_SUMMARYFires once the AI summary of a completed PSTN or WhatsApp call has been generated

Call AI Summary

Event type: CALL_AI_SUMMARY

Fires when the AI summary of a completed call is ready. The summary is generated after the call ends, so this event arrives after CALL_ENDED for the same call.

Trigger Conditions

The event is emitted when:

  • A PSTN or WhatsApp call has ended and its AI summary has been generated.
  • The summary was generated automatically after the call (call summarisation is enabled for your organization), or a team member generated it from the chat.
  • A webhook is subscribed to CALL_AI_SUMMARY on the channel the call went through, your PSTN number for a PSTN call, or your WhatsApp Business number for a WhatsApp call.

It is not emitted when:

  • No summary can be generated for the call — for example the call was missed or rejected, it ended without a recording, or nothing was said.
  • The summary for the call was already generated earlier. The event fires only once per call.
  • The call is a bot test call and webhooks were not turned on for that test.
  • No webhook is subscribed to CALL_AI_SUMMARY on the call's channel.

Subscriptions are per channel. A webhook subscribed on your PSTN number receives summaries of that number's PSTN calls only, and a webhook subscribed on your WhatsApp Business number receives summaries of that number's WhatsApp calls only. Subscribe on both if you want both.

Payload Structure

FieldTypeRequiredDescription
eventstringYesAlways "CALL_AI_SUMMARY"
channelstringYesThe channel the call went through. See values below.
callIdstringYesUnique identifier for the call. Same callId as the call's lifecycle webhooks.
callDirectionstringYesDirection of the call. See values below.
callStatusstringYesStatus of the call when the summary was generated. Normally "END".
durationInSecondsnumberYesCall duration in seconds
callStartedAtstringYesISO 8601 timestamp when the call started
callEndedAtstringYesISO 8601 timestamp when the call ended
fromstringYesYour PSTN number or WhatsApp Business number. The same for incoming and outgoing calls.
tostringYesCustomer's phone number. The same for incoming and outgoing calls.
channelNumberstringYesSame value as from, under the name used by the other call webhooks
customerNumberstringYesSame value as to, under the name used by the other call webhooks
agentNumberstringNoPhone number of the team member who handled or started the call. Absent when there is none.
callTypestringYesWho handled the call. See values below.
triggeredViastringYesHow the call was started. See values below.
summaryobjectYesThe AI summary of the call. See Summary Object.

channel Values

ValueDescription
PSTNThe call went through your PSTN number
WHATSAPPThe call went through your WhatsApp Business number

callDirection Values

ValueDescription
INCOMINGThe call was placed by the customer to the business
OUTGOINGThe call was placed by the business to the customer

callType Values

ValueDescription
AI_BOTThe call was handled by an AI bot
AGENTThe call was handled by a team member

triggeredVia Values

ValueDescription
INBOUNDThe customer called the business
CAMPAIGNThe call was placed as part of a voice campaign
APIThe call was started through the public API
UIThe call was started from the DoubleTick app

Summary Object

FieldTypeRequiredDescription
recapstringYesShort summary of the call
keyPointsarray of stringsYesKey points discussed in the call
nextStepsarray of stringsYesFollow-ups mentioned in the call

When a call ends, callStatus is "END" — not "ENDED". Checking for "ENDED" in your code will silently fail.


Sample Payloads

WhatsApp Call Handled by an Agent

{
  "event": "CALL_AI_SUMMARY",
  "channel": "WHATSAPP",
  "callId": "call_01HX9abc123",
  "callDirection": "INCOMING",
  "callStatus": "END",
  "durationInSeconds": 145,
  "callStartedAt": "2026-01-15T10:30:00.000Z",
  "callEndedAt": "2026-01-15T10:32:25.000Z",
  "from": "+919000000000",
  "to": "+919876543210",
  "channelNumber": "+919000000000",
  "customerNumber": "+919876543210",
  "agentNumber": "+919111111111",
  "callType": "AGENT",
  "triggeredVia": "INBOUND",
  "summary": {
    "recap": "The customer asked about the delivery date of their order and the agent confirmed it ships tomorrow.",
    "keyPoints": [
      "The order is packed and ready for dispatch",
      "Delivery is expected within two days"
    ],
    "nextSteps": [
      "Share the tracking link once the order ships"
    ]
  }
}

PSTN Call Handled by an AI Bot

{
  "event": "CALL_AI_SUMMARY",
  "channel": "PSTN",
  "callId": "call_01HX9def456",
  "callDirection": "OUTGOING",
  "callStatus": "END",
  "durationInSeconds": 87,
  "callStartedAt": "2026-01-15T11:00:00.000Z",
  "callEndedAt": "2026-01-15T11:01:27.000Z",
  "from": "+918000000000",
  "to": "+919876543210",
  "channelNumber": "+918000000000",
  "customerNumber": "+919876543210",
  "callType": "AI_BOT",
  "triggeredVia": "CAMPAIGN",
  "summary": {
    "recap": "The AI bot reminded the customer about their appointment on Friday and the customer confirmed they will attend.",
    "keyPoints": [
      "The appointment is on Friday at 11 AM",
      "The customer confirmed attendance"
    ],
    "nextSteps": [
      "Send a reminder message on Thursday"
    ]
  }
}

PSTN Call Started by an Agent from the App

{
  "event": "CALL_AI_SUMMARY",
  "channel": "PSTN",
  "callId": "call_01HX9ghi789",
  "callDirection": "OUTGOING",
  "callStatus": "END",
  "durationInSeconds": 212,
  "callStartedAt": "2026-01-15T12:10:00.000Z",
  "callEndedAt": "2026-01-15T12:13:32.000Z",
  "from": "+918000000000",
  "to": "+919876543210",
  "channelNumber": "+918000000000",
  "customerNumber": "+919876543210",
  "agentNumber": "+919111111111",
  "callType": "AGENT",
  "triggeredVia": "UI",
  "summary": {
    "recap": "The agent followed up on the customer's home loan application and requested the pending income documents.",
    "keyPoints": [
      "The application is pending income proof",
      "The customer will upload the documents this week"
    ],
    "nextSteps": [
      "Check the uploaded documents and update the application status"
    ]
  }
}

Fetching a Summary on Demand

The same summary can also be fetched at any time with the public API, using the callId from this event:

GET https://public.doubletick.io/v1/call/ai-summary?callId=<callId>

Notes

  • The event fires only once per call, after the summary has been saved. Generating the summary again for the same call does not send a second event.
  • agentNumber is absent, not an empty string and when no team member handled or started the call, for example an AI bot call started through the public API or a campaign.
  • from and channelNumber always hold your number, and to and customerNumber always hold the customer's number, whatever the call direction.
  • Delivery is fire-and-forget: a failure to deliver this webhook never affects the summary being saved. Failed deliveries are retried in the same way as the other call webhooks.

Best Practices

  • Use callId to correlate this event with the call's lifecycle webhooks (CALL_INCOMING_INITIATED / CALL_OUTGOING_INITIATED → CALL_ACCEPTED → CALL_ENDED → CALL_AI_SUMMARY), which all share the same callId.
  • Check channel before processing if your webhook is subscribed on both PSTN and WhatsApp numbers.
  • Treat agentNumber as optional and always check that it is present before using it.
  • agentNumber contains the team member's phone number, not a stable identifier. Phone numbers can change when a team member updates their profile. Do not use it for programmatic matching or routing logic and it is intended for display and audit purposes only.