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

# Webhooks

> Reference for the webhook events telli sends when calls and contact states change.

Webhooks send real-time event data from telli to your systems. Go to **Settings > Developer**, click **Configure** under **Webhook configuration**, then add an endpoint and select the events it should receive.

For endpoint setup, signature verification, and retry behavior, see [Receive call data](/receive-call-data).

## Events

### Call ended

The `call_ended` event is sent when a call ends. It includes the call status, transcript, analysis, outcome, collected data, and the associated contact.

```json theme={null}
{
  "event": "call_ended",
  "call": {
    "ended_reason": "contact-ended-call",
    "call_id": "b4a05730-2abc-4eb0-8066-2e4d23b53ba9",
    "loop_id": "ba99c99d-19b9-4a0d-8df6-3e213088989a",
    "attempt": 1,
    "from_number": "+17755719467",
    "direction": "outbound",
    "to_number": "+14155552671",
    "external_contact_id": "123456789",
    "contact_id": "6bd1e7e0-6d00-4c0b-ad5b-daa72457a27d",
    "contact_details": {
      "company": "Art Studio Inc"
    },
    "contact_properties": [],
    "agent_id": "d8931604-92ad-45cf-9071-d9cd2afbad0c",
    "triggered_at": 1731956924302,
    "triggered_at_iso": "2024-11-18T15:08:44.302Z",
    "started_at": 1731956932264,
    "started_at_iso": "2024-11-18T15:08:52.264Z",
    "ended_at": 1731957002078,
    "ended_at_iso": "2024-11-18T15:10:02.078Z",
    "call_length_min": 2,
    "call_length_sec": 69,
    "call_status": "COMPLETED",
    "transcript": "Agent: Hello...",
    "transcriptObject": [
      {
        "content": "Hello...",
        "role": "agent"
      }
    ],
    "call_analysis": {
      "summary": {
        "value": true,
        "details": "The customer is interested in buying an ice cream machine."
      }
    },
    "call_outcome": null,
    "collected_data": {
      "email": {
        "status": "confirmed",
        "value": "charlie@example.com"
      }
    },
    "booked_slot_for": null,
    "recording_url": "https://example.com/recording.wav",
    "sip_status_code": 200,
    "sip_status": "OK"
  },
  "contact": {
    "contact_id": "6bd1e7e0-6d00-4c0b-ad5b-daa72457a27d",
    "external_contact_id": "123456789",
    "external_url": null,
    "created_at": "2024-11-18T15:00:00.000Z",
    "gender": null,
    "first_name": "Charlie",
    "last_name": "Doe",
    "phone_number": "+14155552671",
    "in_call_since": null,
    "reached_at": "2024-11-18T15:08:52.264Z",
    "contact_details": {
      "company": "Art Studio Inc"
    },
    "call_attempts": 1,
    "next_call_at": null,
    "email": "charlie@example.com",
    "timezone": "America/Los_Angeles",
    "salutation": "Ms.",
    "status": "reached",
    "properties": []
  }
}
```

See [Receive call data](/receive-call-data#call-ended-event) for more information about call statuses, analysis, outcomes, and collected data.

### Auto dialer status changed

The `auto_dialer_status_changed` event is sent when a contact enters or exits the auto dialer.

The `auto_dialer_status` field is one of:

* `in_dialer`: The contact entered the auto dialer
* `not_in_dialer`: The contact exited the auto dialer

When a contact exits the auto dialer, `auto_dialer_exit_reason` describes why. It is `null` when no exit reason applies.

```json theme={null}
{
  "event": "auto_dialer_status_changed",
  "contact": {
    "contact_id": "6bd1e7e0-6d00-4c0b-ad5b-daa72457a27d",
    "external_contact_id": "123456789",
    "auto_dialer_status": "not_in_dialer",
    "auto_dialer_status_updated_at": "2026-07-14T10:30:00.000Z",
    "auto_dialer_exit_reason": "manually-removed-from-dialer",
    "first_name": "Charlie",
    "last_name": "Doe",
    "phone_number": "+14155552671",
    "email": "charlie@example.com",
    "contact_details": {
      "company": "Art Studio Inc"
    },
    "properties": []
  }
}
```

### Contact status changed

<Warning>This webhook is deprecated and will be removed on July 1st, 2027.</Warning>

The `contact_status_changed` event is sent when a contact's status changes. It includes the new status, when it changed, and the associated contact data.

Contact status can be `new`, `pending`, `closed`, or `reached`.

```json theme={null}
{
  "event": "contact_status_changed",
  "contact": {
    "contact_id": "6bd1e7e0-6d00-4c0b-ad5b-daa72457a27d",
    "external_contact_id": "123456789",
    "status": "reached",
    "status_updated_at": "2024-11-18T15:10:02.078Z",
    "reached_at": "2024-11-18T15:08:52.264Z",
    "first_name": "Charlie",
    "last_name": "Doe",
    "phone_number": "+14155552671",
    "email": "charlie@example.com",
    "contact_details": {
      "company": "Art Studio Inc"
    },
    "properties": []
  }
}
```

See [Receive call data](/receive-call-data#contact-status-changed-event) for more information about contact statuses.
