> ## Documentation Index
> Fetch the complete documentation index at: https://docs.trikon.tech/llms.txt
> Use this file to discover all available pages before exploring further.

# Webhooks

> Receive real-time HTTP POST notifications when calls finish, produce transcripts, or generate AI post-call intelligence.

Webhooks allow your application server to receive instant HTTP notifications whenever a call completes or generates AI summaries and transcripts.

<Note>
  Configure your webhook URL in **Settings → Developer API**. Each workspace can store one URL.
</Note>

## Webhook Delivery

When an event occurs, Trikon sends an HTTP `POST` request to your configured Webhook URL with a `Content-Type: application/json` payload.

Your server should respond with a `200 OK` status code within **3 seconds** to acknowledge receipt.

***

## Event Types

| Event Name           | Trigger Description                                                      |
| :------------------- | :----------------------------------------------------------------------- |
| `call.completed`     | Fired when a phone call finishes a successful human conversation.        |
| `call.no_answer`     | Fired when a call goes to voicemail, is unanswered, or busy.             |
| `call.failed`        | Fired when call origination or line connectivity fails.                  |
| `recording.ready`    | Fired when the carrier MP3 audio recording has finished processing.      |
| `analysis.completed` | Fired when Gemini AI generates post-call summary, sentiment, and intent. |

***

## Payload Schema

Every webhook event payload includes standardized call metadata, call status, duration, recording URL, and full conversation transcripts.

### Example Payload (`call.completed`)

```json theme={null}
{
  "event": "call.completed",
  "callUuid": "9d1f6b2a-0c44-11f0-9c3e-0242ac120002",
  "callLogId": "bf9c7bea-16ae-481e-b943-e962c4199933",
  "enterprise": "acmeclinic",
  "campaignId": "731874e9-c349-4c18-ad52-40a80ffcd0f2",
  "leadId": null,
  "agentId": "8f2c1d34-5b6a-4c7e-9f10-2a3b4c5d6e7f",
  "direction": "outbound",
  "from": "+918031339921",
  "to": "+919845012345",
  "name": "Asha",
  "callStatus": "completed",
  "disconnectReason": "normal_hangup",
  "duration": 45,
  "recordingUrl": "https://voice.trikon.tech/api/media-proxy?url=https%3A%2F%2Fexample.com%2Frecordings%2F0579a482.mp3",
  "timestamp": "2026-08-03T10:15:30.000Z",
  "origin": "campaign",
  "hangupSource": "callee",
  "hangupCause": "normal_clearing",
  "summary": "User confirmed the appointment for Thursday.",
  "intent": "appointment_scheduled",
  "sentiment": "positive",
  "sentimentReason": "User enthusiastically agreed to the time.",
  "calledAt": "2026-08-03T10:14:45.000Z",
  "transcript": [
    {
      "speaker": "Agent",
      "text": "Hello Asha, I'm calling from Acme Clinic regarding your upcoming health checkup."
    },
    {
      "speaker": "User",
      "text": "Hi, yes! I'd like to confirm my appointment for Thursday at 3 PM."
    },
    {
      "speaker": "Agent",
      "text": "Perfect! Your appointment for Thursday at 3 PM is confirmed. See you then!"
    }
  ]
}
```

***

## Field Reference

<ResponseField name="event" type="string">
  The event type: `call.completed`, `call.no_answer`, `call.failed`, `recording.ready`, or `analysis.completed`.
</ResponseField>

<ResponseField name="callUuid" type="string">
  Unique carrier call identifier string.
</ResponseField>

<ResponseField name="callLogId" type="string">
  Unique database log ID for matching records in Trikon **Call Logs**.
</ResponseField>

<ResponseField name="enterprise" type="string">
  Your workspace slug (e.g., `acmeclinic`).
</ResponseField>

<ResponseField name="campaignId" type="string">
  *(Optional)* Unique campaign ID if the call was originated from an outbound campaign.
</ResponseField>

<ResponseField name="leadId" type="string">
  *(Optional)* The identifier for the lead associated with this call.
</ResponseField>

<ResponseField name="agentId" type="string">
  UUID of the AI Voice Agent that handled the call.
</ResponseField>

<ResponseField name="direction" type="string">
  The call direction (`outbound` or `inbound`).
</ResponseField>

<ResponseField name="from" type="string">
  The outbound phone number initiating the call in international E.164 format.
</ResponseField>

<ResponseField name="to" type="string">
  The recipient phone number in international E.164 format.
</ResponseField>

<ResponseField name="name" type="string">
  The recipient's name passed during call initiation.
</ResponseField>

<ResponseField name="callStatus" type="string">
  Final call status: `completed`, `no_answer`, `busy`, or `failed`.
</ResponseField>

<ResponseField name="disconnectReason" type="string">
  Reason for disconnection: `normal_hangup`, `voicemail_detected`, or `user_rejected`.
</ResponseField>

<ResponseField name="duration" type="number">
  Total call duration in seconds.
</ResponseField>

<ResponseField name="recordingUrl" type="string">
  Direct audio URL to stream or download the call MP3 recording.
</ResponseField>

<ResponseField name="timestamp" type="string">
  ISO 8601 timestamp of when the event occurred.
</ResponseField>

<ResponseField name="origin" type="string">
  The source of the call (e.g., `web embed`, `campaign`).
</ResponseField>

<ResponseField name="hangupSource" type="string">
  *(Optional)* The source that initiated the call hangup (e.g., `callee`, `caller`).
</ResponseField>

<ResponseField name="hangupCause" type="string">
  *(Optional)* The technical SIP cause for the call termination.
</ResponseField>

<ResponseField name="summary" type="string">
  *(Optional)* AI executive summary of the conversation. Populated when AI analysis is generated.
</ResponseField>

<ResponseField name="intent" type="string">
  *(Optional)* AI-detected caller intent (e.g. `appointment_scheduled`, `voicemail`, `not_interested`). Populated when AI analysis is performed.
</ResponseField>

<ResponseField name="sentiment" type="string">
  *(Optional)* AI-detected caller sentiment (e.g., `positive`, `neutral`, `negative`). Populated when AI analysis is performed.
</ResponseField>

<ResponseField name="sentimentReason" type="string">
  *(Optional)* Brief AI explanation for the detected sentiment.
</ResponseField>

<ResponseField name="calledAt" type="string">
  *(Optional)* ISO 8601 timestamp of when the call was initiated.
</ResponseField>

<ResponseField name="transcript" type="array">
  Turn-by-turn spoken conversation transcript objects containing `speaker` and `text`. Captured automatically for every call.
</ResponseField>

***

## Delivery & Retries

Your application server should respond with a **`200 OK`** status code within **3 seconds** of receiving a webhook request.

If your endpoint returns a server error (`5xx` or `408`) or times out, Trikon automatically retries webhook delivery up to 3 times with exponential backoff.

<Tip>
  Perform heavy backend processing (such as CRM syncs or database updates) asynchronously after returning an immediate `200 OK` response.
</Tip>
