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

# The webhook event object

> One event MeetingKit sent, and every attempt to deliver it.

A webhook event is one `meeting.*`, `bot.*` or `calendar_connection.*` event, with each delivery to your endpoints and what your server answered. Use it to recover missed events. See [Retries and ordering](/api-reference/webhooks#retries-and-ordering).

## Attributes

<ResponseField name="id" type="string">
  The event's ID, the same `id` your receiver got in the payload.
</ResponseField>

<ResponseField name="object" type="string">
  Always `webhook_event`.
</ResponseField>

<ResponseField name="type" type="string">
  The event type, as this request's API version names it.
</ResponseField>

<ResponseField name="workspace_id" type="string">
  Workspace ID, beginning with `wks_`.
</ResponseField>

<ResponseField name="test" type="boolean">
  A sample sent with `POST /webhook_endpoints/{id}/test`.
</ResponseField>

<ResponseField name="created_at" type="string">
  When the event happened, in ISO 8601.
</ResponseField>

<ResponseField name="data" type="object | null">
  Not in lists: the payload's `data`, as this request's API version shapes it. `null` if it can't be
  shaped at that version.

  <Expandable title="properties">
    <ResponseField name="object" type="object">
      The resource the event is about, as its webhook reference page describes it.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="deliveries" type="object[]">
  One per endpoint it was sent to.

  <Expandable title="properties">
    <ResponseField name="endpoint_id" type="string">
      The endpoint it was sent to.
    </ResponseField>

    <ResponseField name="status" type="string">
      `pending` until its first answer, `succeeded` once your receiver returned `2xx`, `failed` when its last attempt failed (it is retried with backoff until it succeeds or 21 attempts are used), `cancelled` when the endpoint was disabled, stopped receiving the event, or could not be sent to (an unsafe address).

      Available options: `pending`, `succeeded`, `failed`, `cancelled`.
    </ResponseField>

    <ResponseField name="attempt_count" type="integer">
      How many times it was sent.
    </ResponseField>

    <ResponseField name="last_attempt" type="object">
      The most recent attempt.

      <Expandable title="properties">
        <ResponseField name="number" type="integer">
          Which attempt this was, from 1.
        </ResponseField>

        <ResponseField name="status" type="string">
          * `pending`: sending.

          * `succeeded`: your receiver answered `2xx`.

          * `failed`: it answered something else, timed out, or could not be reached.

          Available options: `pending`, `succeeded`, `failed`.
        </ResponseField>

        <ResponseField name="response_code" type="integer | null">
          What your receiver answered; `null` when it could not be reached.
        </ResponseField>

        <ResponseField name="response_body" type="string | null">
          Not in lists. The first 2,000 bytes of what your receiver answered.
        </ResponseField>

        <ResponseField name="error" type="string | null">
          Not in lists. Why the request failed before an answer (a timeout, a refused connection).
        </ResponseField>

        <ResponseField name="started_at" type="string">
          When the attempt started, in ISO 8601.
        </ResponseField>

        <ResponseField name="completed_at" type="string | null">
          When your receiver answered, or `null` while sending.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="attempts" type="object[]">
      Not in lists.

      <Expandable title="properties">
        <ResponseField name="number" type="integer">
          Which attempt this was, from 1.
        </ResponseField>

        <ResponseField name="status" type="string">
          * `pending`: sending.

          * `succeeded`: your receiver answered `2xx`.

          * `failed`: it answered something else, timed out, or could not be reached.

          Available options: `pending`, `succeeded`, `failed`.
        </ResponseField>

        <ResponseField name="response_code" type="integer | null">
          What your receiver answered; `null` when it could not be reached.
        </ResponseField>

        <ResponseField name="response_body" type="string | null">
          Not in lists. The first 2,000 bytes of what your receiver answered.
        </ResponseField>

        <ResponseField name="error" type="string | null">
          Not in lists. Why the request failed before an answer (a timeout, a refused connection).
        </ResponseField>

        <ResponseField name="started_at" type="string">
          When the attempt started, in ISO 8601.
        </ResponseField>

        <ResponseField name="completed_at" type="string | null">
          When your receiver answered, or `null` while sending.
        </ResponseField>
      </Expandable>
    </ResponseField>

    <ResponseField name="created_at" type="string">
      When it was created, in ISO 8601.
    </ResponseField>

    <ResponseField name="updated_at" type="string">
      When it last changed, in ISO 8601.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseExample>
  ```json The webhook event object theme={null}
  {
    "id": "evt_01k6d1r9s8x7c2dvq3m5n6p4ab",
    "object": "webhook_event",
    "type": "meeting.finished",
    "workspace_id": "wks_01k6a2r9s8x7c2dvq3m5n6p4ab",
    "test": false,
    "created_at": "2026-09-29T09:41:10Z",
    "data": {
      "object": {
        "id": "mtg_01k6a2r9s8x7c2dvq3m5n6p4ab",
        "object": "meeting",
        "…": "…"
      }
    },
    "deliveries": [
      {
        "endpoint_id": "whe_01k6d0r9s8x7c2dvq3m5n6p4ab",
        "status": "succeeded",
        "attempt_count": 1,
        "last_attempt": {
          "number": 1,
          "status": "succeeded",
          "response_code": 204,
          "response_body": null,
          "error": null,
          "started_at": "2026-09-29T09:41:11Z",
          "completed_at": "2026-09-29T09:41:11Z"
        },
        "attempts": [
          {
            "number": 1,
            "status": "succeeded",
            "response_code": 204,
            "response_body": null,
            "error": null,
            "started_at": "2026-09-29T09:41:11Z",
            "completed_at": "2026-09-29T09:41:11Z"
          }
        ],
        "created_at": "2026-09-29T09:41:10Z",
        "updated_at": "2026-09-29T09:41:11Z"
      }
    ]
  }
  ```
</ResponseExample>
