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

# Dialer Webhook Events: Dispositions and Survey Responses

> Reference for CloudTalk's Dialer webhook events (dialer.disposition_created and dialer.survey_filled) with example payloads and field definitions.

Dialer events tell you what happened on a call placed by a Dialer campaign: the disposition the user recorded and, when the campaign uses one, the survey they filled in. Both events carry the campaign, the contact, and the user, so you can update your CRM without a follow-up API call. These are account-level webhooks, delivered to the endpoints you register under **Account → Webhooks**. See the [overview](/guides/webhooks/overview).

Dialer events require the Dialer add-on. Neither event carries call details such as duration or recording: join on `call_uuid` with [`call.ended`](/guides/webhooks/events/calls#call-ended) or fetch the call from the API.

All examples show the full request body, including the [envelope](/guides/webhooks/overview#the-event-envelope). Fields with empty values are omitted from payloads: they are never sent as `null`. Fields shown in **bold** are always present. A bold field nested inside an optional object is always present whenever that object is. Everything else is optional.

## The dialer object

Both events carry the same `dialer` object identifying the campaign:

| Field                 | Type   | Description                                                                                                                                          |
| --------------------- | ------ | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`campaign`**        | object | The campaign the call belongs to.                                                                                                                    |
| **`campaign.id`**     | string | The campaign's id.                                                                                                                                   |
| **`campaign.name`**   | string | The campaign's name at the time of the event.                                                                                                        |
| `campaign.mode`       | string | How the campaign dials: `sequential` or `parallel`.                                                                                                  |
| `campaign_contact_id` | string | The contact's membership in this campaign: the id the [Dialer API](/api-reference/dialer/get-one-campaign-contact) takes for per-contact operations. |

## dialer.disposition\_created

Fires when a user records a disposition on a Dialer call: the outcome they chose, their note, the number that was dialed, and what the campaign will do with the contact next. Use it to log call outcomes in your CRM, create follow-up tasks for rescheduled calls, or suppress contacts who asked not to be called again.

```json Example theme={"system"}
{
  "event_id": "018f5d3b-8c4e-8f6a-9b2c-3d4e5f607182",
  "type": "dialer.disposition_created",
  "version": "v1",
  "occurred_at": "2026-08-17T14:22:08.412Z",
  "company_id": "123456",
  "data": {
    "call_uuid": "018f9a3e-5b7c-4d21-9e8f-aa12bb34cc56",
    "dialer": {
      "campaign": {
        "id": "8841",
        "name": "Q3 renewals",
        "mode": "sequential"
      },
      "campaign_contact_id": "530212"
    },
    "disposition": {
      "tag": { "id": "17", "name": "Callback requested" },
      "outcome_kind": "rescheduled",
      "notes": "Wants to talk after the board meeting on Thursday.",
      "attempt_no": 2,
      "dialed_number": "+12025550143",
      "attempts": [
        { "number": "+12025550143", "outcome": "answered", "call_uuid": "018f9a3e-5b7c-4d21-9e8f-aa12bb34cc56" }
      ],
      "rescheduled_at": "2026-08-21T15:00:00Z",
      "rescheduled_user_id": "7"
    },
    "contact_state": {
      "state": "scheduled",
      "category": "rescheduled",
      "attempt_count": 2,
      "next_eligible_at": "2026-08-21T15:00:00Z"
    },
    "contact": {
      "id": "44210",
      "type": "contact",
      "name": "Jane Doe",
      "company": "Acme Corp",
      "phones": ["+12025550143"],
      "emails": ["jane.doe@example.com"]
    },
    "user": {
      "id": "7",
      "name": "Ada Bennett",
      "first_name": "Ada",
      "last_name": "Bennett",
      "email": "ada.bennett@example.com",
      "role": "agent",
      "language": "en",
      "extension": "1007"
    }
  }
}
```

| Field                             | Type      | Description                                                                                                                                                                                                                                                           |
| --------------------------------- | --------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`call_uuid`**                   | string    | The dispositioned call. Join on it with the call and Conversation Intelligence events for the same call.                                                                                                                                                              |
| **`dialer`**                      | object    | The campaign. See [the dialer object](#the-dialer-object).                                                                                                                                                                                                            |
| **`disposition`**                 | object    | What the user recorded.                                                                                                                                                                                                                                               |
| `disposition.tag`                 | object    | The disposition tag the user chose: `id` (always present) and `name` (when the tag has a label). Tags are the [disposition buttons](/api-reference/dialer/get-a-campaigns-disposition-buttons) configured on the campaign.                                            |
| **`disposition.outcome_kind`**    | string    | The outcome classification: `successful_positive`, `successful_negative`, `rescheduled`, `unsuccessful_call_again`, or `unsuccessful_do_not_call`. New values may be added over time; handle unknown values gracefully rather than failing.                           |
| `disposition.notes`               | string    | The user's free-text note on the call.                                                                                                                                                                                                                                |
| `disposition.attempt_no`          | integer   | Which dial attempt this was. One attempt is one dial cycle, however many of the contact's numbers it rang.                                                                                                                                                            |
| `disposition.dialed_number`       | string    | The number the outcome applies to, in E.164 format.                                                                                                                                                                                                                   |
| `disposition.attempts`            | object\[] | The per-number dial trail for this cycle. Each entry carries `number` (E.164), `outcome` (`answered`, `no_answer`, `busy`, `failed`, `voicemail`, or `abandoned`), the `call_uuid` that dial produced when there was one, and `machine_kind` when a machine answered. |
| `disposition.rescheduled_at`      | string    | When the rescheduled callback is due, UTC ISO 8601. Present only on a `rescheduled` outcome.                                                                                                                                                                          |
| `disposition.rescheduled_user_id` | string    | The user the rescheduled callback is pinned to. Present only when the reschedule pinned one.                                                                                                                                                                          |
| `disposition.survey_response_id`  | string    | The survey response attached to this disposition, when the user filled one. Matches `survey.response_id` on the [`dialer.survey_filled`](#dialer-survey-filled) event for the same call.                                                                              |
| **`contact_state`**               | object    | The contact's position in the campaign after this disposition.                                                                                                                                                                                                        |
| **`contact_state.state`**         | string    | `pending`, `scheduled`, `completed`, `dnc`, `exhausted`, or `excluded`. `dnc` means the contact asked not to be called again; suppress them in your own systems too.                                                                                                  |
| `contact_state.category`          | string    | The queue tier the contact now sits in: `favorite`, `rescheduled`, `retry`, or `fresh`.                                                                                                                                                                               |
| `contact_state.attempt_count`     | integer   | How many dial attempts this contact has received in this campaign so far.                                                                                                                                                                                             |
| `contact_state.next_eligible_at`  | string    | The earliest the Dialer may call this contact again, UTC ISO 8601. The Dialer already plans that retry, so don't create a duplicate follow-up for it.                                                                                                                 |
| `contact`                         | Contact   | The contact who was called. Same shape as [the contact object](/guides/webhooks/events/calls#the-contact-object) on call events. Omitted when the contact no longer exists.                                                                                           |
| `user`                            | User      | The user who recorded the disposition. Same shape as [the user object](/guides/webhooks/events/calls#the-user-object) on call events. Omitted when the user no longer exists.                                                                                         |
| `truncated`                       | string\[] | Present as `["notes"]` only when a very long note had to be shortened to keep the event deliverable; a shortened text ends with the marker `…[truncated]`. Absent means nothing was shortened.                                                                        |

## dialer.survey\_filled

Fires when a user submits a survey response on a Dialer call. The payload carries every answer in full, together with the disposition the response belongs to. Use it to push qualification answers into your CRM or trigger workflows on specific responses.

```json Example theme={"system"}
{
  "event_id": "018f5d3b-8c4e-8f7b-9b2c-3d4e5f607183",
  "type": "dialer.survey_filled",
  "version": "v1",
  "occurred_at": "2026-08-17T14:22:31.905Z",
  "company_id": "123456",
  "data": {
    "call_uuid": "018f9a3e-5b7c-4d21-9e8f-aa12bb34cc56",
    "dialer": {
      "campaign": {
        "id": "8841",
        "name": "Q3 renewals",
        "mode": "sequential"
      },
      "campaign_contact_id": "530212"
    },
    "survey": {
      "response_id": "90417",
      "survey_id": "312",
      "name": "Renewal qualification",
      "answers": [
        {
          "question_id": 1201,
          "label": "Is the customer planning to renew?",
          "type": "radio",
          "option_id": 4402,
          "value": "Yes"
        },
        {
          "question_id": 1202,
          "label": "Which add-ons are they interested in?",
          "type": "checkbox",
          "value": ["Conversation Intelligence", "Dialer"]
        },
        {
          "question_id": 1203,
          "label": "Notes",
          "type": "textarea",
          "value": "Decision expected after the Thursday board meeting."
        }
      ]
    },
    "disposition": {
      "tag": { "id": "17", "name": "Callback requested" },
      "outcome_kind": "rescheduled",
      "attempt_no": 2,
      "rescheduled_at": "2026-08-21T15:00:00Z"
    },
    "contact": {
      "id": "44210",
      "type": "contact",
      "name": "Jane Doe",
      "company": "Acme Corp",
      "phones": ["+12025550143"],
      "emails": ["jane.doe@example.com"]
    },
    "user": {
      "id": "7",
      "name": "Ada Bennett",
      "first_name": "Ada",
      "last_name": "Bennett",
      "email": "ada.bennett@example.com",
      "role": "agent",
      "language": "en",
      "extension": "1007"
    }
  }
}
```

| Field                    | Type      | Description                                                                                                                                                                                                                                                                                                                                                                                                                                    |
| ------------------------ | --------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| **`call_uuid`**          | string    | The call the response was captured on.                                                                                                                                                                                                                                                                                                                                                                                                         |
| **`dialer`**             | object    | The campaign. See [the dialer object](#the-dialer-object).                                                                                                                                                                                                                                                                                                                                                                                     |
| **`survey`**             | object    | The submitted response.                                                                                                                                                                                                                                                                                                                                                                                                                        |
| **`survey.response_id`** | string    | The response's id. Matches `disposition.survey_response_id` on the [`dialer.disposition_created`](#dialer-disposition-created) event for the same call.                                                                                                                                                                                                                                                                                        |
| `survey.survey_id`       | string    | The survey definition that was answered.                                                                                                                                                                                                                                                                                                                                                                                                       |
| `survey.name`            | string    | The survey's name at the time of the response.                                                                                                                                                                                                                                                                                                                                                                                                 |
| **`survey.answers`**     | object\[] | Every answer, in full. Each item carries `question_id`, the question's `label` and `type` (`text`, `textarea`, `radio`, `checkbox`, or `select`) as they were when answered, `option_id` where the question offers options, and `value`: a string for `text`, `textarea`, `radio` and `select`, an array of strings for `checkbox`. Labels and types are snapshotted at submit time, so they stay accurate even if the survey is edited later. |
| `disposition`            | object    | The disposition this response belongs to: `tag`, `outcome_kind`, `attempt_no`, and `rescheduled_at`, with the same meanings as on `dialer.disposition_created`. Omitted when the survey was submitted before the call was dispositioned, which is a normal order of events.                                                                                                                                                                    |
| `contact`                | Contact   | The contact the response is about. Same shape as [the contact object](/guides/webhooks/events/calls#the-contact-object). Omitted when the contact no longer exists.                                                                                                                                                                                                                                                                            |
| `user`                   | User      | The user who submitted the response. Same shape as [the user object](/guides/webhooks/events/calls#the-user-object). Omitted when the user no longer exists.                                                                                                                                                                                                                                                                                   |
| `truncated`              | string\[] | Present as `["answers"]` only when a very large answer set had to be shortened to keep the event deliverable: trailing answers are dropped and a shortened text ends with the marker `…[truncated]`. Absent means nothing was shortened.                                                                                                                                                                                                       |

<Note>
  A survey can be submitted before or after the disposition on the same call, and the two events can arrive in either order. Correlate them on `call_uuid`, or on `survey.response_id` and `disposition.survey_response_id` when both are present.
</Note>


## Related topics

- [CloudTalk Webhooks](/guides/webhooks/overview.md)
- [List disposition tags](/api-reference/dialer/list-disposition-tags.md)
- [Get a survey](/api-reference/dialer/get-a-survey.md)
