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

# Appointments

> Qminder's backend sends HTTP requests to registered URLs every time an Appointment is created, changed, cancelled or no-showed.

Appointments are treated as scheduled tickets, so the appointment ID and ticket ID are the same.

Once an appointment is checked in, it is handled like a regular ticket.
Checking in an appointment triggers a regular [`ticket_created`](/reference/webhooks-tickets#ticket-created) webhook event.

Appointment events include the same Ticket structure in `data` as Ticket events,
with an additional nested `data.appointment` property containing the following fields:

| Field name                     | Data type | Description                                                   |
| ------------------------------ | --------- | ------------------------------------------------------------- |
| **data.appointment.createdAt** | timestamp | The date and time when the appointment was created.           |
| **data.appointment.startTime** | timestamp | The date and time when the appointment is scheduled to start. |
| **data.appointment.endTime**   | timestamp | The date and time when the appointment is scheduled to end.   |
| **data.appointment.assignee**  | number    | The user ID of the team member assigned to the appointment.   |

Timestamps use RFC 3339 format in UTC, with millisecond precision, for example: `2026-07-14T16:19:01.085Z`.

### Appointment created

This HTTP request is sent to the registered URL every time an Appointment was created in Qminder.

This includes appointments created via Visitor Website and in Qminder Dashboard.

You can use `data.source` field to detect the origin of the appointment:

* `MICROSITE` for Visitor Website
* `MANUAL` for Qminder Dashboard

<CodeGroup>
  ```http Example incoming request theme={null}
  POST /webhooks HTTP/1.1
  X-Qminder-Signature: SIGNATURE
  Content-Type: application/json

  {
    "type": "appointment_created",
    "data": {
      "id": "123456789",
      "status": "SCHEDULED",
      "source": "MICROSITE",
      "line": 180183,
      "firstName": "Jane",
      "phoneNumber": 12125551234,
      "created": {
        "date": "2026-07-14T07:19:01.085Z"
      },
      "appointment": {
        "createdAt": "2026-07-14T07:19:01.085Z",
        "startTime": "2026-07-14T10:00:00.000Z",
        "endTime": "2026-07-14T10:30:00.000Z",
        "assignee": 41719
      }
    }
  }
  ```
</CodeGroup>

This HTTP request includes the following data fields in its request body:

| Field name           | Data type   | Description                         |
| -------------------- | ----------- | ----------------------------------- |
| **type**             | string      | Always `appointment_created`        |
| **data.id**          | string      | The ID of the appointment/ticket    |
| **data.appointment** | Appointment | Appointment-specific data           |
| **data**             | Ticket      | [Ticket](/reference/tickets#fields) |

### Appointment changed

This HTTP request is sent to the registered URL every time an Appointment was changed in Qminder.

<CodeGroup>
  ```http Example incoming request theme={null}
  POST /webhooks HTTP/1.1
  X-Qminder-Signature: SIGNATURE
  Content-Type: application/json

  {
    "type": "appointment_changed",
    "data": {
      "id": "123456789",
      "status": "SCHEDULED",
      "source": "MICROSITE",
      "line": 37338,
      "firstName": "Jane",
      "phoneNumber": 12125551234,
      "created": {
        "date": "2026-07-14T07:19:01.085Z"
      },
      "appointment": {
        "createdAt": "2026-07-14T07:19:01.085Z",
        "startTime": "2026-07-14T10:00:00.000Z",
        "endTime": "2026-07-14T10:30:00.000Z",
        "assignee": 41719
      }
    }
  }
  ```
</CodeGroup>

This HTTP request includes the following data fields in its request body:

| Field name           | Data type   | Description                         |
| -------------------- | ----------- | ----------------------------------- |
| **type**             | string      | Always `appointment_changed`        |
| **data.id**          | string      | The ID of the appointment/ticket    |
| **data.appointment** | Appointment | Appointment-specific data           |
| **data**             | Ticket      | [Ticket](/reference/tickets#fields) |

### Appointment cancelled

This HTTP request is sent to the registered URL every time an Appointment was cancelled in Qminder.

If appointment was cancelled by visitor via Visitor Website, then

* `data.status` is `SCHEDULING_CANCELLED_BY_VISITOR`
* `data.canceller` is `null`

If appointment was cancelled by user, then

* `data.status` is `SCHEDULING_CANCELLED`
* `data.canceller` is set to the user id who cancelled the appointment

<CodeGroup>
  ```http Example incoming request theme={null}
  POST /webhooks HTTP/1.1
  X-Qminder-Signature: SIGNATURE
  Content-Type: application/json

  {
    "type": "appointment_cancelled",
    "data": {
      "id": "123456789",
      "status": "SCHEDULING_CANCELLED",
      "source": "MANUAL",
      "line": 37338,
      "firstName": "Jane",
      "created": {
        "date": "2026-07-13T11:40:22.323Z",
        "creator": 140849
      },
      "cancelled": {
        "date": "2026-07-13T11:55:04.481Z",
        "canceller": 140849
      },
      "extra": [
        {
          "title": "Custom Select Field",
          "value": "Selected Value",
          "color": "#fdba74"
        }
      ],
      "appointment": {
        "createdAt": "2026-07-13T11:40:22.323Z",
        "startTime": "2026-07-13T12:15:00.000Z",
        "endTime": "2026-07-13T13:00:00.000Z",
        "assignee": 140849
      }
    }
  }
  ```
</CodeGroup>

This HTTP request includes the following data fields in its request body:

| Field name           | Data type   | Description                         |
| -------------------- | ----------- | ----------------------------------- |
| **type**             | string      | Always `appointment_cancelled`      |
| **data.id**          | string      | The ID of the appointment/ticket    |
| **data.appointment** | Appointment | Appointment-specific data           |
| **data**             | Ticket      | [Ticket](/reference/tickets#fields) |

### Appointment marked as no-show

This HTTP request is sent to the registered URL every time an Appointment was marked as no-show in Qminder Dashboard.

<CodeGroup>
  ```http Example incoming request theme={null}
  POST /webhooks HTTP/1.1
  X-Qminder-Signature: SIGNATURE
  Content-Type: application/json

  {
    "type": "appointment_noshowed",
    "data": {
      "id": "123456789",
      "status": "SCHEDULING_NOSHOW",
      "source": "MANUAL",
      "line": 37338,
      "firstName": "Jane",
      "created": {
        "date": "2026-07-13T11:54:46.621Z",
        "creator": 140849
      },
      "cancelled": {
        "date": "2026-07-13T11:54:57.482Z",
        "canceller": 140849
      },
      "extra": [
        {
          "title": "Custom Select Field",
          "value": "Selected Value",
          "color": "#fdba74"
        }
      ],
      "appointment": {
        "createdAt": "2026-07-13T11:54:46.621Z",
        "startTime": "2026-07-13T13:30:00.000Z",
        "endTime": "2026-07-13T14:00:00.000Z",
        "assignee": 140849
      }
    }
  }
  ```
</CodeGroup>

This HTTP request includes the following data fields in its request body:

| Field name           | Data type   | Description                         |
| -------------------- | ----------- | ----------------------------------- |
| **type**             | string      | Always `appointment_noshowed`       |
| **data.id**          | string      | The ID of the appointment/ticket    |
| **data.appointment** | Appointment | Appointment-specific data           |
| **data**             | Ticket      | [Ticket](/reference/tickets#fields) |
