# Bulk delete conversations

> DELETE /v1/conversations/bulk · Core resources API

Source: https://developer.kustomer.com/api/core-resources/bulk-delete-conversations

```http
DELETE https://{orgname}.api.kustomerapp.com/v1/conversations/bulk
Authorization: Bearer <API key>
```

## Authorization

Requires any one of these roles: `org.permission.conversation.delete`; or legacy `org.admin.conversation.delete`. The API key or user must hold at least one of them. Legacy roles predate permission sets and still work.

Deletes multiple conversations in bulk.

Use the `ids` query param to delete multiple conversations in bulk.

## About Conversations

A conversation is one support thread with one customer, such as an email exchange, a chat session or a phone call. It holds the work state agents manage, including status, assignment, priority and tags, and contains the thread's messages and notes.

Every conversation belongs to exactly one [customer](https://developer.kustomer.com/api/core-resources#customers) and appears on that customer's timeline in the agent desktop. Inside it are [messages](https://developer.kustomer.com/api/core-resources#messages) exchanged with the customer and internal [notes](https://developer.kustomer.com/api/core-resources#notes) from your team. Kustomer creates a conversation when a new inbound email, chat or call arrives, and workflows, agents and integrations can create them too. The conversation is the unit of work: it's what gets routed to a queue, assigned to an agent, measured against an SLA and eventually marked done. A customer can have many conversations over time, open or closed.

#### Status

| `status` | Meaning |
| --- | --- |
| `open` | Needs attention. Counts toward queues and SLAs. |
| `snoozed` | Parked until a time or event, set with a `snooze` object. The conversation reopens when the snooze ends or the customer replies. |
| `done` | Resolved. A new inbound message normally reopens it. |

You can create a conversation as `open` or `done`; snoozing is an update. `subStatus` adds org-defined detail inside a status, such as "Waiting on warehouse", using an ID from [sub-statuses](https://developer.kustomer.com/api/core-resources#sub-statuses).

#### Assignment and other work fields

`assignedUsers` and `assignedTeams` each hold up to 10 IDs. `queue` is the routing queue, for orgs that use queues and routing. `priority` runs from 1 (lowest) to 5 (highest). `direction` is `in` when the customer started the thread and `out` when your team did, for example with a proactive email. `name` is the subject agents see, and `custom` holds [custom attributes](https://developer.kustomer.com/docs/concepts/custom-attributes).

Kustomer keeps a set of read-only fields up to date as the thread changes: `channels` (every channel used in it), `messageCount`, `noteCount`, `outboundMessageCount`, `firstResponse`, `lastMessageIn`, `sla` and `satisfaction`. To see what changed and when, read the conversation's events, which record each update with before and after values.

#### Tags

`tags` is a list of tag IDs. Sending `tags` in an update replaces the whole list. The tag endpoints instead add or remove specific tags, up to 20 per request, and accept tag names or IDs; a name that doesn't exist yet is created as a new tag. Adding a tag the conversation already has is a no-op.

#### Which endpoint to use

| To | Call |
| --- | --- |
| Start a conversation for a customer | [`POST /v1/customers/{id}/conversations`](https://developer.kustomer.com/api/core-resources/create-conversation-for-customer), or [`POST /v1/conversations`](https://developer.kustomer.com/api/core-resources/create-conversation) with `customer` in the body |
| Read, update or delete a conversation | [`GET`](https://developer.kustomer.com/api/core-resources/get-conversation-by-id), [`PUT`](https://developer.kustomer.com/api/core-resources/update-conversation), [`PATCH`](https://developer.kustomer.com/api/core-resources/update-conversation-attributes) or [`DELETE /v1/conversations/{id}`](https://developer.kustomer.com/api/core-resources/delete-conversation) |
| Find the conversation for one of your threads | [`GET /v1/conversations/externalId={externalId}`](https://developer.kustomer.com/api/core-resources/get-conversation-by-external-id) |
| List a customer's conversations | [`GET /v1/customers/{id}/conversations`](https://developer.kustomer.com/api/core-resources/get-conversations-by-customer) |
| Page through all conversations | [`GET /v1/conversations`](https://developer.kustomer.com/api/core-resources/get-conversations) |
| Add or remove tags | [`POST`](https://developer.kustomer.com/api/core-resources/append-tags-to-conversation) or [`DELETE /v1/conversations/{id}/tags`](https://developer.kustomer.com/api/core-resources/remove-tags-from-conversation) |
| See every file shared in the thread | [`GET /v1/conversations/{id}/attachments`](https://developer.kustomer.com/api/core-resources/get-conversation-attachments) |
| Read the change history | [`GET /v1/conversations/{id}/events`](https://developer.kustomer.com/api/core-resources/get-conversation-events) |
| Import, update or delete up to 100 conversations per request | [`POST`](https://developer.kustomer.com/api/core-resources/bulk-create-conversations), [`PUT`](https://developer.kustomer.com/api/core-resources/bulk-batch-update-conversations) or [`DELETE /v1/conversations/bulk`](https://developer.kustomer.com/api/core-resources/bulk-delete-conversations) |

Creating a conversation doesn't send anything to the customer; add messages to it, or send a reply with a [draft](https://developer.kustomer.com/api/core-resources#drafts). Set `externalId` to your own thread ID so later messages land in the same conversation. A client can create 120 conversations per customer per minute, unless the records carry `importedAt`, and one conversation can be updated 100 times in 10 minutes (see [Rate limits](https://developer.kustomer.com/docs/concepts/rate-limits#object-limits)). `PUT` merges your changes unless you add `replace=true`. `PATCH` with `Content-Type: application/json-patch+json` takes JSON Patch operations, and `rev` makes the write depend on the revision you last read. For filtered queries, such as open conversations in a queue, use [search](https://developer.kustomer.com/api/core-resources#search).

Related: [Conversations and messages](https://developer.kustomer.com/docs/concepts/conversations-and-messages), [Messages](https://developer.kustomer.com/api/core-resources#messages), [Notes](https://developer.kustomer.com/api/core-resources#notes), [Snoozes](https://developer.kustomer.com/api/core-resources#snoozes)

### Recipes

#### 1. Find or open the conversation for one of your threads

Map a ticket, chat thread or case in your system to exactly one Kustomer conversation, so every update you send lands in the same place.

**Step 1.** [`GET /v1/conversations/externalId={externalId}`](https://developer.kustomer.com/api/core-resources/get-conversation-by-external-id.md). Use your thread ID as the conversation's `externalId`. Look it up first: a `200` returns the conversation, so keep `data.id`; a `404` means you haven't created it yet. URL-encode the ID in the path.

```bash title="cURL"
curl "https://api.kustomerapp.com/v1/conversations/externalId=$THREAD_ID" \
  --header "Authorization: Bearer $KUSTOMER_API_KEY"
```

```bash title="kusty"
# exits with code 4 when there's no conversation with that externalId
kusty api GET "/v1/conversations/externalId=$THREAD_ID" --fields id | jq -r .data.id
```

**Step 2.** [`POST /v1/customers/{id}/conversations`](https://developer.kustomer.com/api/core-resources/create-conversation-for-customer.md). On a `404`, create the conversation under the customer (see [find or create a customer](https://developer.kustomer.com/api/core-resources#customers)) with `externalId` set. `name` is the subject agents see, `priority` runs from 1 to 5, and `assignedTeams` takes up to 10 team IDs. `direction: "in"` marks it as started by the customer. Nothing is sent to the customer.

```bash title="cURL"
curl --request POST "https://api.kustomerapp.com/v1/customers/$CUSTOMER_ID/conversations" \
  --header "Authorization: Bearer $KUSTOMER_API_KEY" \
  --header "Content-Type: application/json" \
  --data "{\"externalId\": \"$THREAD_ID\", \"name\": \"$SUBJECT\", \"direction\": \"in\", \"priority\": 4, \"assignedTeams\": [\"$TEAM_ID\"]}"
```

```bash title="kusty"
kusty api POST /v1/customers/$CUSTOMER_ID/conversations \
  --field externalId=$THREAD_ID --field name="$SUBJECT" --field direction=in \
  --field priority:=4 --field "assignedTeams:=[\"$TEAM_ID\"]" \
  | jq -r .data.id
```

**Step 3.** [`POST /v1/conversations/{id}/messages`](https://developer.kustomer.com/api/core-resources/create-message-from-conversation.md). Add the thread's content as messages. A message created this way belongs to the conversation's customer automatically. See [Messages](https://developer.kustomer.com/api/core-resources#messages) for importing each message exactly once.

```bash title="cURL"
curl --request POST "https://api.kustomerapp.com/v1/conversations/$CONVERSATION_ID/messages" \
  --header "Authorization: Bearer $KUSTOMER_API_KEY" \
  --header "Content-Type: application/json" \
  --data "{\"channel\": \"chat\", \"app\": \"acme-inbox\", \"direction\": \"in\", \"preview\": \"$TEXT\", \"externalId\": \"$MESSAGE_ID\"}"
```

```bash title="kusty"
kusty api POST /v1/conversations/$CONVERSATION_ID/messages \
  --field channel=chat --field app=acme-inbox --field direction=in \
  --field preview="$TEXT" --field externalId=$MESSAGE_ID
```

> One client can create 120 conversations per customer per minute unless the records carry `importedAt`. [Bring messages from a custom channel](https://developer.kustomer.com/docs/guides/custom-channel-messages) walks through the whole flow, including delivering agent replies back to your channel.

#### 2. Add and remove tags without overwriting an agent's changes

Tag a conversation from an integration, such as marking it `vip` or `refund-requested`, while agents tag the same conversation by hand.

**Step 1.** [`POST /v1/conversations/{id}/tags`](https://developer.kustomer.com/api/core-resources/append-tags-to-conversation.md). Send a bare JSON array of tag names or IDs, up to 20, not an object. A name that doesn't exist yet becomes a new tag, and a tag the conversation already has is left alone. Only the tags you send are added, so tags an agent set a moment ago survive. Avoid sending `tags` in a `PUT` for this: that replaces the whole list with whatever you send.

```bash title="cURL"
curl --request POST "https://api.kustomerapp.com/v1/conversations/$CONVERSATION_ID/tags" \
  --header "Authorization: Bearer $KUSTOMER_API_KEY" \
  --header "Content-Type: application/json" \
  --data '["vip", "refund-requested"]'
```

```bash title="kusty"
kusty api POST /v1/conversations/$CONVERSATION_ID/tags --data '["vip", "refund-requested"]'
```

**Step 2.** [`DELETE /v1/conversations/{id}/tags`](https://developer.kustomer.com/api/core-resources/remove-tags-from-conversation.md). Remove tags the same way, with the same bare array in the body of a `DELETE`. Other tags on the conversation are untouched.

```bash title="cURL"
curl --request DELETE "https://api.kustomerapp.com/v1/conversations/$CONVERSATION_ID/tags" \
  --header "Authorization: Bearer $KUSTOMER_API_KEY" \
  --header "Content-Type: application/json" \
  --data '["refund-requested"]'
```

```bash title="kusty"
kusty api DELETE /v1/conversations/$CONVERSATION_ID/tags --data '["refund-requested"]' --confirm --yes
```

**Step 3.** [`GET /v1/conversations/{id}`](https://developer.kustomer.com/api/core-resources/get-conversation-by-id.md). The conversation's `tags` holds tag IDs, not names. Read it back if you need to confirm the result.

```bash title="cURL"
curl "https://api.kustomerapp.com/v1/conversations/$CONVERSATION_ID" \
  --header "Authorization: Bearer $KUSTOMER_API_KEY"
```

```bash title="kusty"
kusty api GET /v1/conversations/$CONVERSATION_ID --fields attributes.tags
```

> Both tag endpoints count as updates to the conversation, which can be updated 100 times in 10 minutes. Skip the call when the tag is already where you want it.

#### 3. Snooze a conversation while you wait on another system

Park a conversation until a refund clears or a shipment arrives, then reopen it from your integration when the answer comes in.

**Step 1.** [`PUT /v1/conversations/{id}`](https://developer.kustomer.com/api/core-resources/update-conversation.md). Set `status` to `snoozed` with a `snooze` object whose `status` is `scheduled` and whose `time` is when it should wake up, in UTC. `status: "snoozed"` on its own is rejected. The conversation reopens by itself at that time, or earlier if the customer replies.

```bash title="cURL"
curl --request PUT "https://api.kustomerapp.com/v1/conversations/$CONVERSATION_ID" \
  --header "Authorization: Bearer $KUSTOMER_API_KEY" \
  --header "Content-Type: application/json" \
  --data "{\"status\": \"snoozed\", \"snooze\": {\"status\": \"scheduled\", \"time\": \"$WAKE_AT\"}}"
```

```bash title="kusty"
kusty api PUT /v1/conversations/$CONVERSATION_ID \
  --field status=snoozed --field snooze.status=scheduled --field snooze.time=$WAKE_AT
```

**Step 2.** [`GET /v1/conversations/{id}`](https://developer.kustomer.com/api/core-resources/get-conversation-by-id.md). When your system has the answer, read the conversation. If `status` is already `open`, the snooze ended or the customer wrote in, and an agent may be on it. Keep `rev` for the next step.

```bash title="cURL"
curl "https://api.kustomerapp.com/v1/conversations/$CONVERSATION_ID" \
  --header "Authorization: Bearer $KUSTOMER_API_KEY"
```

```bash title="kusty"
kusty api GET /v1/conversations/$CONVERSATION_ID --fields attributes.status,attributes.rev
```

**Step 3.** [`PUT /v1/conversations/{id}`](https://developer.kustomer.com/api/core-resources/update-conversation.md). Reopen it by setting `status` to `open` and cancelling the snooze. Send the `rev` you read so the update is rejected if the conversation changed in the meantime.

```bash title="cURL"
curl --request PUT "https://api.kustomerapp.com/v1/conversations/$CONVERSATION_ID" \
  --header "Authorization: Bearer $KUSTOMER_API_KEY" \
  --header "Content-Type: application/json" \
  --data "{\"status\": \"open\", \"snooze\": {\"status\": \"canceled\"}, \"rev\": $REV}"
```

```bash title="kusty"
kusty api PUT /v1/conversations/$CONVERSATION_ID \
  --field status=open --field snooze.status=canceled --field rev:=$REV
```

> Add an internal [note](https://developer.kustomer.com/api/core-resources#notes) with the answer as you reopen, so the agent who picks it up has the context. To close it instead, send `{"status": "done"}`.

#### 4. See who changed a conversation's status and when

Audit a conversation's history, for example to find out who closed it or how long it sat in each status.

**Step 1.** [`GET /v1/conversations/{id}/events`](https://developer.kustomer.com/api/core-resources/get-conversation-events.md). Page through the conversation's events oldest first. Each `kustomer.conversation.update` event has `changes.attributes`, keyed by attribute, with the `before` and `after` values; `publishedAt` is when it happened and `relationships.createdBy` is who made the change.

```bash title="cURL"
curl "https://api.kustomerapp.com/v1/conversations/$CONVERSATION_ID/events?sort=asc&pageSize=100" \
  --header "Authorization: Bearer $KUSTOMER_API_KEY"
```

```bash title="kusty"
kusty api GET /v1/conversations/$CONVERSATION_ID/events --query sort=asc --all > events.jsonl
```

**Step 2.** Keep only the events that changed `status`, and print when, who, and the old and new values.

```bash title="kusty"
jq -r 'select(.data.attributes.changes.attributes.status)
  | [.data.attributes.publishedAt, .data.relationships.createdBy.data.id,
     .data.attributes.changes.attributes.status.before, .data.attributes.changes.attributes.status.after]
  | @tsv' events.jsonl
```

> The same events cover assignment, tags and any other attribute: swap `status` for `assignedUsers` or `tags`. To react to changes as they happen instead, subscribe an [outbound webhook](https://developer.kustomer.com/docs/events/outbound-webhooks) to `kustomer.conversation.update`.

### Example object

A real record from [`GET /v1/conversations/{id}`](https://developer.kustomer.com/api/core-resources/get-conversation-by-id.md):

```json
{
  "type": "conversation",
  "id": "58228e05d4e96711004eccb7",
  "attributes": {
    "name": "",
    "channels": [],
    "status": "done",
    "messageCount": 0,
    "noteCount": 0,
    "satisfaction": 0,
    "createdAt": "2016-11-09T02:46:29.789Z",
    "updatedAt": "2016-11-09T03:23:34.064Z",
    "modifiedAt": "2016-11-09T03:23:34.064Z",
    "tags": [],
    "suggestedTags": [],
    "sentiment": {},
    "lastMessageIn": {},
    "assignedUsers": [],
    "assignedTeams": [],
    "firstResponse": {},
    "sla": {
      "name": "Gold",
      "version": 1,
      "matchedAt": "2026-01-01T00:00:00.000Z",
      "status": "pending",
      "breached": false,
      "metrics": {
        "nextReply": {
          "breachAt": "2026-01-01T01:00:00.000Z",
          "onTimeCount": 6,
          "lateCount": 2
        }
      }
    },
    "direction": "in",
    "outboundMessageCount": 0,
    "rev": 1
  },
  "relationships": {
    "org": {
      "links": {
        "self": "/v1/orgs/57f29863a1dbf61100e6aa92"
      },
      "data": {
        "type": "org",
        "id": "57f29863a1dbf61100e6aa92"
      }
    },
    "customer": {
      "links": {
        "self": "/v1/customers/58210c3db0f09110006b7953"
      },
      "data": {
        "type": "customer",
        "id": "58210c3db0f09110006b7953"
      }
    },
    "messages": {
      "links": {
        "self": "/v1/conversations/58228e05d4e96711004eccb7/messages"
      }
    },
    "createdBy": {
      "links": {
        "self": "/v1/users/58190b991f2932100010d683"
      },
      "data": {
        "type": "user",
        "id": "58190b991f2932100010d683"
      }
    },
    "modifiedBy": {
      "links": {
        "self": "/v1/users/58190b991f2932100010d683"
      },
      "data": {
        "type": "user",
        "id": "58190b991f2932100010d683"
      }
    }
  },
  "links": {
    "self": "/v1/conversations/58228e05d4e96711004eccb7"
  }
}
```

Fields:

- `attributes.name` (string): The subject agents see in the agent desktop, up to 256 characters. Writable.
- `attributes.channels` (array): Every channel used in the conversation so far, such as `email` and `chat`. Read-only; it fills in as messages are added.
- `attributes.status` (string): `open`, `snoozed` or `done`. Create conversations as `open` or `done`; snoozing is an update that also needs a `snooze` object.
- `attributes.messageCount` (integer): How many messages the conversation has, in both directions. Read-only.
- `attributes.noteCount` (integer): How many internal notes the conversation has. Read-only.
- `attributes.satisfaction` (integer): The satisfaction (CSAT) result, from `-1` to `1`. Survey details, such as its status and rating, are in `satisfactionLevel`.
- `attributes.tags` (array): Tag IDs, up to 20. Sending `tags` in an update replaces the whole list; use the tag endpoints to add or remove specific tags.
- `attributes.suggestedTags` (array): Tags suggested for the conversation but not applied, each `{ tag, confidence }`.
- `attributes.sentiment` (object): Overall sentiment of the conversation. `polarity` is `-1`, `0` or `1`; `confidence` runs from `-1` to `1`.
- `attributes.lastMessageIn` (object): Read-only summary of the customer's latest inbound message in this conversation.
- `attributes.assignedUsers` (array): IDs of the users the conversation is assigned to, up to 10. Sending it replaces the list.
- `attributes.assignedTeams` (array): IDs of the teams the conversation is assigned to, up to 10. Sending it replaces the list.
- `attributes.firstResponse` (object): Read-only details of your team's first reply, empty until one is sent.
- `attributes.sla` (object): The SLA policy this conversation matched and its live deadlines, set by Kustomer. Read it to see what's about to breach; the policy itself is an [SLA](https://developer.kustomer.com/api/core-resources#sl-as).
- `attributes.sla.name` (string): The name of the matched SLA. `version` is the SLA version the conversation is measured against, so later edits to the policy don't change it.
- `attributes.sla.status` (string): `pending` while a deadline is running, `paused` while the clock is stopped, or `done`.
- `attributes.sla.breached` (boolean): Whether any metric has missed its deadline.
- `attributes.sla.metrics.nextReply` (object): Runtime SLA metric snapshot for a conversation. Current-cycle fields (`breachAt`, `satisfiedAt`, `remainingTime`) apply to all metrics.
- `attributes.sla.metrics.nextReply.breachAt` (string (date-time)): When the current reply is due. Other metrics, such as `firstResponse`, have the same shape.
- `attributes.sla.metrics.nextReply.onTimeCount` (integer): Lifetime count of completed Next Reply cycles satisfied on or before the deadline. Incremented when a pending cycle completes via outbound satisfy or Done close. Preserved across cycle restarts. Distinct from current-cycle `breachAt` / `satisfiedAt` / `remainingTime`.
- `attributes.sla.metrics.nextReply.lateCount` (integer): Lifetime count of completed Next Reply cycles satisfied after the deadline (late reply or Done-closed late). Incremented when a pending cycle completes after breach. Preserved across cycle restarts.
- `attributes.direction` (string): `in` when the customer started the conversation, `out` when your team did, such as with a proactive email.
- `attributes.outboundMessageCount` (integer): How many messages your team has sent in the conversation. Read-only.
- `attributes.rev` (integer): The revision, which goes up with every change. Send it as `rev` (in the body on `PUT`, or as a query parameter on a JSON Patch `PATCH`) so the write is rejected if the conversation changed since you read it.
- `relationships.customer` (object): The customer the conversation is with. Set on create and required.
- `relationships.messages` (object): Link to the conversation's messages. Read them with `GET /v1/conversations/{id}/messages`.

### Relationships

- Points to **Customers** via `relationships.customer`: The customer a conversation is with. Every conversation has exactly one customer, and a customer can have many conversations over time.
- Points to **Messages** via `relationships.messages` (list): The messages in a conversation, in both directions. Each message belongs to exactly one conversation.
- Referenced by **Comments** via `relationships.conversation`: On a comment, the conversation the commented KObject is linked to, when there is one.
- Referenced by **Conversation time** via `relationships.conversation`: The conversation an agent's handle time was recorded on. A conversation collects many conversation time records over its life, across agents and sessions.
- Referenced by **Drafts** via `relationships.conversation`: The conversation a draft replies in. When it's sent, the delivered message is added to this conversation. A conversation can have at most one note draft.
- Referenced by **Conversation forwards** via `relationships.conversation`: The conversation a forward copies. A conversation can be forwarded many times, and each forward is listed on it.
- Referenced by **Messages** via `relationships.conversation`: The conversation a message belongs to. Every message is in exactly one conversation, which can hold many messages.
- Referenced by **Notes** via `relationships.conversation`: The conversation a note is left on. Every note belongs to one conversation, which counts its notes in `noteCount`.
- Referenced by **Satisfaction surveys** via `relationships.conversation`: The conversation a satisfaction response is about. The conversation's `satisfactionLevel` holds the response ID in `formResponse`, along with its `status`, `rating` and `score`.
- Referenced by **Work items** via `relationships.resource`: The conversation this work item routes. A conversation has at most one work item that isn't `completed`, and gets a new one each time it needs an agent again.

### Permissions

Fewest roles for a read-only integration: `org.permission.conversation.read`, `org.permission.attachment.read`, `org.permission.event.read`. For every endpoint: `org.permission.conversation.read`, `org.permission.conversation.update`, `org.permission.conversation.create`, `org.permission.conversation.delete`, `org.permission.attachment.read`, `org.permission.event.read`.

### Events

Webhook events:

- `kustomer.conversation.create`: A conversation is created
- `kustomer.conversation.update`: Status, assignment, tags, custom attributes, or message counts and timestamps change

Workflow triggers:

- `kustomer.conversation.create` (Conversation Created): A conversation is created on any channel
- `kustomer.conversation.update` (Conversation Updated): Any conversation attribute changes, including on every new message

Workflow actions:

- `kustomer.conversation.create` (Conversation: Create): required inputs `customer`
- `kustomer.conversation.update` (Conversation: Update): required inputs `id`
- `kustomer.conversation.find-by-id` (Conversation: Lookup (By ID)): required inputs `id`
- `kustomer.conversation.find-by-external-id` (Conversation: Lookup (By External ID)): required inputs `externalId`
- `kustomer.conversation.append-tags` (Conversation: Add Tags): required inputs `id`, `tags`
- `kustomer.conversation.remove-tags` (Conversation: Remove Tags): required inputs `id`, `tags`
- `kustomer.conversation.append-skills` (Conversation: Add Skills): required inputs `id`, `skills`
- `kustomer.conversation.remove-skills` (Conversation: Remove Skills): required inputs `id`, `skills`
- `kustomer.conversation.assign-user` (Conversation: Assign User): required inputs `id`, `user`
- `kustomer.conversation.assign-team` (Conversation: Assign Team): required inputs `id`, `team`
- `kustomer.conversation.ai-agent-handoff` (AI Agent Handoff): required inputs `id`, `user`

## Query parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `ids` | string | no | Comma-separated list of unique conversation IDs. |

## Responses

### 201

Created

- `data` (object, required)
  - `type` (string, required)
  - `id` (string, required)
  - `attributes` (object, required)
    - `ids` (array<any>, required)
    - `context` (string, required)
    - `status` (string, required)
    - `v2` (boolean, required)
    - `payload` (object, required)
    - `createdAt` (string, required)
    - `updatedAt` (string, required)
    - `completed` (boolean, required)
  - `relationships` (object, required)
    - `org` (object, required)
    - `createdBy` (object, required)
  - `links` (object, required)
    - `self` (string, required)

```json
{
  "data": {
    "type": "bulk",
    "id": "5b3bddb67f8469003df370a4",
    "attributes": {
      "ids": [],
      "context": "api.sobjects.conversations.bulk-delete",
      "status": "complete",
      "v2": true,
      "payload": {
        "api": {
          "data": [
            {
              "id": "5a96dac46dd73800112fab28",
              "status": "done"
            },
            {
              "id": "5a96dac46dd73800112fab29",
              "name": "Foobar"
            }
          ],
          "path": "/v1/conversations",
          "user": {
            "id": "5a96dac46dd73800112fab30",
            "userType": "user",
            "roles": [
              "org"
            ],
            "orgName": "mycompany",
            "subject": "5a96dac46dd73800112fab30",
            "org": "5a96dac36dd73800112fab2e"
          },
          "requestId": "5b3bddb6b6e494001779fa38",
          "service": "api",
          "method": "DELETE"
        }
      },
      "createdAt": "2018-07-03T20:33:58.486Z",
      "updatedAt": "2018-07-03T20:34:03.873Z",
      "completed": true
    },
    "relationships": {
      "org": {
        "links": {
          "self": "/v1/orgs/5a96dac36dd73800112fab2e"
        },
        "data": {
          "type": "org",
          "id": "5a96dac36dd73800112fab2e"
        }
      },
      "createdBy": {
        "links": {
          "self": "/v1/users/5a96dac46dd73800112fab30"
        },
        "data": {
          "type": "user",
          "id": "5a96dac46dd73800112fab30"
        }
      }
    },
    "links": {
      "self": "/v1/bulk/5b3bddb67f8469003df370a4"
    }
  }
}
```

### 400

Bad Request

### 401

Unauthorized

### 403

Forbidden

## Example request

```bash
curl --request DELETE \
  --url 'https://api.kustomerapp.com/v1/conversations/bulk' \
  --header "Authorization: Bearer $KUSTOMER_API_KEY"
```
