---
title: "Conversation resolved"
method: POST
path: "conversation.resolved"
---

# Conversation resolved

`POST conversation.resolved` (webhook)

Incoming webhook deliveries are authenticated with HMAC signature headers (`X-Chatway-Signature` and `X-Chatway-Timestamp`), not your Chatway API key.

A conversation was resolved by an agent, automation, or system.

> resolved_by uses the same object shape as assigned_by on tag.assigned and agent.assigned: agent, automation, or system.

Use conversation.resolved to record closure in a ticketing system or stop an open-conversation timer. Identify the conversation with `data.conversation.id` and the actor with data.resolved_by. For example, your activity history can distinguish an agent resolving a conversation from an automation doing so. To resolve or reopen a conversation through the API, see [Resolve Conversation](https://developers.chatway.app/operations/api-docs.conversations.resolve). This webhook describes the resolved event; the API operation supports both status changes.

For signature verification and retries, see [Webhooks overview](https://developers.chatway.app/webhooks/guides.webhooks_overview).

## Headers

- `X-Chatway-Event` string, required
- `X-Chatway-Webhook-Id` string, uuid, required
- `X-Chatway-Delivery-Id` string, required
- `X-Chatway-Delivery-Attempt` string, required
- `X-Chatway-Timestamp` string, required
- `X-Chatway-Signature` string, required

## Payload

- object
  - `id` string, required: Stable event ID (`evt_…`). Same across HTTP retries for this notification.
  - `event` string, required: Event name. For this webhook, always `conversation.resolved`.
  - `data` object, required: Payload for conversation.resolved.
    - `conversation` object, required
      - `id` string, uuid, required: Conversation ID.
      - `channel` string, required: Normalized channel.
      - `status` string, required: Conversation status.
      - `widget_name` string: Present when the conversation is tied to a website widget.
      - `identifier` string: Widget identifier when widget_name is present.
      - `resolved_at` string, date-time
    - `visitor` object, required
      - `id` string, uuid, required: Visitor/contact ID.
      - `name` string: Visitor name. Omitted when empty.
      - `email` string, nullable, required: Visitor email. Always present; null when unknown.
      - `phone` string, nullable, required: Visitor phone. Always present; null when unknown.
    - `agent` object: Agent recorded as the conversation's resolver. Omitted when no agent is recorded, for example when resolved_by is system. When an automation resolves the conversation, resolved_by is automation and this is the workspace owner's agent, which the automation acts as. Use resolved_by to identify who or what resolved it.
      - `id` string, uuid, required: Agent ID.
      - `name` string, required: Agent display name.
      - `email` string: Agent email when available.
    - `resolved_by` union, required: Who performed the action. Contains exactly one of: agent, automation, or system.
      - object
        - `agent` object, required
          - `id` string, uuid, required: Agent ID.
          - `name` string, required: Agent display name.
          - `email` string: Agent email when available.
        - `automation` object
          - `id` string, uuid, required
          - `name` string, required
        - `system` object
      - object
        - `agent` object
          - `id` string, uuid, required: Agent ID.
          - `name` string, required: Agent display name.
          - `email` string: Agent email when available.
        - `automation` object, required
          - `id` string, uuid, required
          - `name` string, required
        - `system` object
      - object
        - `agent` object
          - `id` string, uuid, required: Agent ID.
          - `name` string, required: Agent display name.
          - `email` string: Agent email when available.
        - `automation` object
          - `id` string, uuid, required
          - `name` string, required
        - `system` object, required
  - `occurred_at` string, date-time, required: When the business event occurred.
  - `version` string, required: Payload schema version.

## Acknowledgement `200`

Return any 2xx status to acknowledge receipt.

## Other responses

- `410`: Optional HTTP 410 Gone to signal the endpoint is permanently unavailable. Like every non-2xx response below 500 (including `408` and `429`), it is not retried. It does not disable the subscription; turn the webhook off in Chatway Settings if you want deliveries to stop.

---

[API](https://skmtc.dev/chatway/apis/chatway-developer-docs.md) · [All operations](https://skmtc.dev/chatway/apis/chatway-developer-docs/llms.txt) · [OpenAPI document](https://skmtc.dev/chatway/apis/chatway-developer-docs/revisions/ca1a1da291cc?raw)
