# Update work item

> PUT /v1/routing/work-items/{id} · Queues and routing API

Source: https://developer.kustomer.com/api/queues-and-routing/update-work-item

```http
PUT https://{orgname}.api.kustomerapp.com/v1/routing/work-items/{id}
Authorization: Bearer <API key>
```

## Authorization

Requires any one of these roles: `org.permission.work_item.update`, `org.permission.routing.update`; or legacy `org.user.routing.write`. The API key or user must hold at least one of them. Legacy roles predate permission sets and still work.

Updates a work item based on its unique ID.

## About Work items

A work item is routing's record of one conversation that needs an agent. It tracks which queue the conversation waits in, which agent it was offered to and accepted by, and how long each stage took.

Routing doesn't move conversations around directly; it moves work items. When a conversation needs an agent, Kustomer creates a work item for it (`resource` points at the conversation), places it in a [queue](https://developer.kustomer.com/api/queues-and-routing#queues), offers it to an available agent, and tracks it until the work is done. The routed conversations agents see arrive in the agent desktop are work items under the hood.

A conversation has at most one work item that isn't `completed`. Creating a work item for a conversation that already has one returns the existing item. Once an item is completed, a conversation that needs an agent again, for example after the customer replies, gets a new work item, so a conversation's history can hold several.

#### Lifecycle

| `status` | Meaning |
| --- | --- |
| `ivr` | Created, not yet in a queue. For a phone call, this covers time in the phone menu. |
| `queued` | Waiting in a queue. `queuedCount` counts how many times the item has entered a queue. |
| `routed` | Offered to one agent and waiting for them to accept. If they reject it or the offer times out, it goes back to `queued` and the agent is moved to an unavailable status. |
| `assigned` | Accepted. The agent is working on it, and it uses capacity on their [work session](https://developer.kustomer.com/api/queues-and-routing#work-sessions). |
| `wrap-up` | The agent has finished the conversation and is doing after-contact work, such as notes. |
| `completed` | Done. The item no longer changes. |

The `status` enum also lists `!wrap-up`, which items never rest in. `paused` is separate from status: it's `true` while the conversation is snoozed, and a paused item uses no capacity and isn't routed.

#### Priority, size and timing

`priority` and `itemSize` are copied from the queue each time the item enters one. Routing offers the item with the lowest `priority` number first, then the one that has waited longest (`firstEnterQueueAt`). The `ivr`, `handle` and `wrapUp` objects record `time` and `businessTime` (time within business hours) for each stage, and `lastRevision` holds the latest queue entry, offer and acceptance, such as `enteredQueueAt` and `acceptedAt`.

#### Which endpoint to use

| To | Call |
| --- | --- |
| List work items across the org | [`GET /v1/routing/work-items`](https://developer.kustomer.com/api/queues-and-routing/get-work-items) |
| Read one work item | [`GET /v1/routing/work-items/{id}`](https://developer.kustomer.com/api/queues-and-routing/get-work-item) |
| Find the work items for a conversation | [`GET /v1/routing/conversations/{id}/work-items`](https://developer.kustomer.com/api/queues-and-routing/get-work-items-by-conversation), filtered by `status` |
| See what's in a queue | [`GET /v1/routing/queues/{id}/work-items`](https://developer.kustomer.com/api/queues-and-routing/get-work-items-in-a-queue), with `status=queued` for waiting items |
| Peek at the item routing would hand out next | [`GET /v1/routing/queues/{id}/work-items/next`](https://developer.kustomer.com/api/queues-and-routing/get-next-work-item-in-a-queue) |
| Create a work item, with a queue or an agent | [`POST /v1/routing/work-items`](https://developer.kustomer.com/api/queues-and-routing/create-work-item) |
| Move, assign, pause or finish an item | [`PUT /v1/routing/work-items/{id}`](https://developer.kustomer.com/api/queues-and-routing/update-work-item) |

Each `PUT` performs one change, chosen from the body: a `queue` moves the item to that queue (`queue.id: null` takes it out), `assignedTo` or `accepted` assigns it to an agent (`assignedTo: null` puts it back in its queue), `status` moves it to `wrap-up` or `completed`, and `paused` pauses or resumes it. Send the `rev` you last read; if the item changed since then, the request fails with `409 Conflict`, so read it again and retry. The next-item endpoint only reads: it skips paused items, returns `404` when the queue is empty, and doesn't reserve the item for you.

Related: [Queues](https://developer.kustomer.com/api/queues-and-routing#queues), [Work sessions](https://developer.kustomer.com/api/queues-and-routing#work-sessions), [Queue rules](https://developer.kustomer.com/api/queues-and-routing#queue-rules), [Conversations](https://developer.kustomer.com/api/core-resources#conversations)

### Recipes

#### 1. Move a conversation to another queue

Transfer a conversation to a different queue from your own tool, for example when an external system reclassifies it, without overwriting a change routing just made.

**Step 1.** [`GET /v1/routing/conversations/{id}/work-items`](https://developer.kustomer.com/api/queues-and-routing/get-work-items-by-conversation.md). Get the conversation's work item. Without a `status` filter this endpoint leaves out completed items, so you get the one that's still live, or an empty list if routing isn't handling the conversation. Keep its `id`, `rev` and `status`.

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

```bash title="kusty"
kusty api GET /v1/routing/conversations/$CONVERSATION_ID/work-items \
  | jq '.data[0] | {id, rev: .attributes.rev, status: .attributes.status}'
```

**Step 2.** [`PUT /v1/routing/work-items/{id}`](https://developer.kustomer.com/api/queues-and-routing/update-work-item.md). Send the target queue as `queue.key` (the queue's own `key`) or `queue.id`, with the `rev` you read. If the item is `assigned`, a queue change on its own only relabels it and the agent keeps the conversation; add `"assignedTo": null` to take it off the agent so routing offers it from the new queue. A `409 Conflict` means the item changed since you read it, so read it again and decide whether to retry.

```bash title="cURL"
curl --request PUT "https://api.kustomerapp.com/v1/routing/work-items/$WORK_ITEM_ID" \
  --header "Authorization: Bearer $KUSTOMER_API_KEY" \
  --header "Content-Type: application/json" \
  --data "{\"queue\": {\"key\": \"$QUEUE_KEY\"}, \"assignedTo\": null, \"rev\": $REV}"
```

```bash title="kusty"
kusty api PUT /v1/routing/work-items/$WORK_ITEM_ID \
  --field queue.key=$QUEUE_KEY --field assignedTo:=null --field rev:=$REV
```

> The item takes the new queue's `priority` and `itemSize` as it enters. To take a conversation out of routing altogether, send `"queue": {"id": null}` instead.

#### 2. Send a conversation into a queue from your integration

Hand a conversation your system created to routing in a specific queue, and cope with routing having picked it up already.

**Step 1.** [`GET /v1/routing/queues`](https://developer.kustomer.com/api/queues-and-routing/get-queues.md). Find the queue by its `key`, so your code doesn't depend on IDs that differ between orgs. An empty `data` array means no active queue has that key.

```bash title="cURL"
curl "https://api.kustomerapp.com/v1/routing/queues?key=$QUEUE_KEY" \
  --header "Authorization: Bearer $KUSTOMER_API_KEY"
```

```bash title="kusty"
kusty api GET /v1/routing/queues --query key=$QUEUE_KEY | jq -r '.data[0].id'
```

**Step 2.** [`POST /v1/routing/work-items`](https://developer.kustomer.com/api/queues-and-routing/create-work-item.md). Create the work item with the conversation as `resource` and the queue's `id`. If the conversation already has a work item that isn't completed, the API returns that item instead, still with `201 Created`, and ignores your `queue`. Compare `relationships.queue.data.id` with the queue you asked for.

```bash title="cURL"
curl --request POST "https://api.kustomerapp.com/v1/routing/work-items" \
  --header "Authorization: Bearer $KUSTOMER_API_KEY" \
  --header "Content-Type: application/json" \
  --data "{\"resource\": {\"id\": \"$CONVERSATION_ID\", \"type\": \"conversation\"}, \"queue\": {\"id\": \"$QUEUE_ID\"}}"
```

```bash title="kusty"
kusty api POST /v1/routing/work-items \
  --field resource.id=$CONVERSATION_ID --field resource.type=conversation --field queue.id=$QUEUE_ID \
  | jq '{id: .data.id, rev: .data.attributes.rev, queue: .data.relationships.queue.data.id}'
```

**Step 3.** [`PUT /v1/routing/work-items/{id}`](https://developer.kustomer.com/api/queues-and-routing/update-work-item.md). If the item you got back is in a different queue, move it with `queue.id` and its `rev`. Skip this step when the queues already match.

```bash title="cURL"
curl --request PUT "https://api.kustomerapp.com/v1/routing/work-items/$WORK_ITEM_ID" \
  --header "Authorization: Bearer $KUSTOMER_API_KEY" \
  --header "Content-Type: application/json" \
  --data "{\"queue\": {\"id\": \"$QUEUE_ID\"}, \"rev\": $REV}"
```

```bash title="kusty"
kusty api PUT /v1/routing/work-items/$WORK_ITEM_ID --field queue.id=$QUEUE_ID --field rev:=$REV
```

> To give the conversation straight to one agent instead of a queue, send `assignedTo` with their user ID on create.

#### 3. Measure a queue's backlog

Count what's waiting in a queue and how long the oldest item has waited, for alerts or a staffing view.

**Step 1.** [`GET /v1/routing/queues/{id}/work-items`](https://developer.kustomer.com/api/queues-and-routing/get-work-items-in-a-queue.md). Page through the queue's items with `status=queued`. Results are sorted by `updatedAt`, not by how long items have waited, so work out the oldest yourself.

```bash title="cURL"
curl "https://api.kustomerapp.com/v1/routing/queues/$QUEUE_ID/work-items?status=queued&pageSize=100" \
  --header "Authorization: Bearer $KUSTOMER_API_KEY"
```

```bash title="kusty"
kusty api GET /v1/routing/queues/$QUEUE_ID/work-items --query status=queued --all --output jsonl > queued.jsonl
```

**Step 2.** Count the items and find the earliest `firstEnterQueueAt`. Paused (snoozed) items stay in the queue but aren't routed, so count them separately.

```bash title="kusty"
jq -s '{waiting: length, paused: map(select(.data.attributes.paused)) | length, oldestSince: (map(.data.attributes.firstEnterQueueAt) | min)}' queued.jsonl
```

**Step 3.** [`GET /v1/chat/queues/metrics/{ids}`](https://developer.kustomer.com/api/queues-and-routing/queue-metrics.md). For context, get the queue's latest measured wait. `latestWaitTimeSeconds` is how long the latest customer waited in the queue, or `null` if the queue had no activity in the window.

```bash title="cURL"
curl "https://api.kustomerapp.com/v1/chat/queues/metrics/$QUEUE_ID?rangeFrom=3600" \
  --header "Authorization: Bearer $KUSTOMER_API_KEY"
```

```bash title="kusty"
kusty api GET /v1/chat/queues/metrics/$QUEUE_ID --query rangeFrom=3600 \
  | jq '.data[0].attributes.latestWaitTimeSeconds'
```

#### 4. Close out an agent's leftover wrap-up items

Complete the work items an agent left in wrap-up, for example from an end-of-shift script, so they stop showing as in progress.

**Step 1.** [`GET /v1/routing/users/{id}/work-sessions/current`](https://developer.kustomer.com/api/queues-and-routing/get-current-work-session-by-user-id.md). Read the agent's current session for its `id`. A `404` means they aren't signed in to routing.

```bash title="cURL"
curl "https://api.kustomerapp.com/v1/routing/users/$USER_ID/work-sessions/current" \
  --header "Authorization: Bearer $KUSTOMER_API_KEY"
```

```bash title="kusty"
kusty api GET /v1/routing/users/$USER_ID/work-sessions/current --fields id
```

**Step 2.** [`GET /v1/routing/work-sessions/{id}/work-items`](https://developer.kustomer.com/api/queues-and-routing/get-work-items-by-work-session.md). List the session's work items and keep those with `status` `wrap-up`, with each one's `id` and `rev`.

```bash title="cURL"
curl "https://api.kustomerapp.com/v1/routing/work-sessions/$SESSION_ID/work-items" \
  --header "Authorization: Bearer $KUSTOMER_API_KEY"
```

```bash title="kusty"
kusty api GET /v1/routing/work-sessions/$SESSION_ID/work-items \
  | jq -r '.data[] | select(.attributes.status == "wrap-up") | [.id, .attributes.rev] | @tsv' > wrap-up.tsv
```

**Step 3.** [`PUT /v1/routing/work-items/{id}`](https://developer.kustomer.com/api/queues-and-routing/update-work-item.md). Set each item's `status` to `completed`, sending its `rev`. An item that is already completed, or changed since you listed it, returns `409 Conflict`; skip it.

```bash title="cURL"
curl --request PUT "https://api.kustomerapp.com/v1/routing/work-items/$WORK_ITEM_ID" \
  --header "Authorization: Bearer $KUSTOMER_API_KEY" \
  --header "Content-Type: application/json" \
  --data "{\"status\": \"completed\", \"rev\": $REV}"
```

```bash title="kusty"
while IFS=$'\t' read -r id rev; do
  kusty api PUT /v1/routing/work-items/$id --field status=completed --field rev:=$rev
done < wrap-up.tsv
```

### Example object

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

```json
{
  "id": "5deb232733485a00bea38a81",
  "type": "work_item",
  "attributes": {
    "resourceType": "conversation",
    "status": "completed",
    "paused": false,
    "channel": "email",
    "firstEnterQueueAt": "2019-12-07T03:57:27.595Z",
    "queuedCount": 3,
    "priority": 666,
    "itemSize": 123,
    "ivr": {
      "businessTime": 0,
      "time": 0
    },
    "handle": {
      "completedAt": "2019-12-07T03:57:27.773Z",
      "businessTime": 58,
      "time": 58
    },
    "wrapUp": {
      "enteredAt": "2019-12-07T03:57:27.773Z",
      "businessTime": 19,
      "time": 19
    },
    "completedAt": "2019-12-07T03:57:27.792Z",
    "updatedAt": "2019-12-07T03:57:27.792Z",
    "modifiedAt": "2019-12-07T03:57:27.335Z",
    "createdAt": "2019-12-07T03:57:27.330Z",
    "resourceRev": 1,
    "resourceCreatedAt": "1988-12-27T00:00:00.000Z",
    "resourceDirection": "in",
    "resourceFirstQueueTime": 976507047595,
    "resourceFirstRouteTime": 976507047646,
    "resourceFirstAssignTime": 976507047715,
    "rev": 12,
    "workItemNumber": 1,
    "lastRevision": {
      "enteredQueueAt": "2019-12-07T03:57:27.624Z",
      "queueTime": 70,
      "queueBusinessTime": 70,
      "routedAt": "2019-12-07T03:57:27.694Z",
      "acceptedAt": "2019-12-07T03:57:27.715Z"
    }
  },
  "relationships": {
    "org": {
      "data": {
        "type": "org",
        "id": "55d7998f2d3f9f8800099aed"
      },
      "links": {
        "self": "/v1/orgs/55d7998f2d3f9f8800099aed"
      }
    },
    "team": {
      "data": {
        "type": "team",
        "id": "5dd7998f2d3f9f880009ffff"
      },
      "links": {
        "self": "/v1/teams/5dd7998f2d3f9f880009ffff"
      }
    },
    "resource": {
      "data": {
        "type": "conversation",
        "id": "55d7998f2d3f9f8800099aff"
      }
    },
    "workSession": {
      "data": {
        "type": "work_session",
        "id": "5deb232733485a00bea38a7e"
      },
      "links": {
        "self": "/v1/routing/work-sessions/5deb232733485a00bea38a7e"
      }
    },
    "routedToSession": {
      "data": {
        "type": "work_session",
        "id": "5deb232733485a00bea38a7e"
      },
      "links": {
        "self": "/v1/routing/work-sessions/5deb232733485a00bea38a7e"
      }
    },
    "routedTo": {
      "data": {
        "type": "user",
        "id": "5dd7998f2d3f9f8800099aed"
      },
      "links": {
        "self": "/v1/users/5dd7998f2d3f9f8800099aed"
      }
    },
    "lastRevision": {
      "data": {
        "type": "work_item_revision",
        "id": "5deb232733485a00bea38a82"
      }
    },
    "assignedTo": {
      "data": {
        "type": "user",
        "id": "5dd7998f2d3f9f8800099aed"
      },
      "links": {
        "self": "/v1/users/5dd7998f2d3f9f8800099aed"
      }
    },
    "queue": {
      "data": {
        "type": "queue",
        "id": "5deb232733485a00bea38a7b"
      },
      "links": {
        "self": "/v1/routing/queues/5deb232733485a00bea38a7b"
      }
    },
    "acceptedBy": {
      "data": {
        "type": "user",
        "id": "5dd7998f2d3f9f8800099aed"
      },
      "links": {
        "self": "/v1/users/5dd7998f2d3f9f8800099aed"
      }
    }
  },
  "links": {
    "self": "/v1/routing/work-item/5deb232733485a00bea38a81"
  }
}
```

Fields:

- `attributes.resourceType` (string): The kind of record `resource` points at. It's `conversation` for routed conversations, the only type you can create through the API.
- `attributes.status` (string): Where the item is in routing: `ivr`, `queued`, `routed`, `assigned`, `wrap-up` or `completed`. Routing moves it forward; you can set `wrap-up` or `completed` with `PUT`.
- `attributes.paused` (boolean): `true` while the conversation is snoozed. A paused item uses no capacity and isn't routed. Set it with `paused` on `PUT`.
- `attributes.channel` (string): The conversation's channel, such as `email`, `chat` or `voice`.
- `attributes.firstEnterQueueAt` (string): When the item first entered a queue. Within the same priority, routing offers the item that has waited longest first.
- `attributes.queuedCount` (integer): How many times the item has entered a queue. More than 1 means it was transferred, rejected or timed out and requeued.
- `attributes.priority` (integer): Copied from the queue each time the item enters one. Lower numbers are routed first; queues allow 1 to 100.
- `attributes.itemSize` (integer): How much capacity the item uses on the agent's work session while assigned. Copied from the queue each time the item enters one.
- `attributes.ivr` (object): Time before the item first entered a queue, such as a caller in a phone menu. `time` is milliseconds; `businessTime` counts only business hours.
- `attributes.handle` (object): Time from the agent accepting the item until they finished it (`completedAt`), in milliseconds, with `businessTime` for business hours only.
- `attributes.wrapUp` (object): After-contact work: `enteredAt` is when wrap-up started, and `time` and `businessTime` are how long it lasted, in milliseconds.
- `attributes.completedAt` (string): When the item reached `completed`. A completed item never changes again; the conversation gets a new work item if it needs an agent later.
- `attributes.resourceRev` (integer): The conversation revision the item last reflected. A `PUT` that sends an older `resource.rev` fails with `409 Conflict`.
- `attributes.resourceCreatedAt` (string): When the conversation was created. The `resourceFirst…Time` values count from this moment.
- `attributes.resourceDirection` (string): `in` for conversations the customer started, `out` for outbound ones.
- `attributes.resourceFirstQueueTime` (integer): Milliseconds from the conversation's creation until this item first entered a queue.
- `attributes.resourceFirstRouteTime` (integer): Milliseconds from the conversation's creation until routing first offered this item to an agent.
- `attributes.resourceFirstAssignTime` (integer): Milliseconds from the conversation's creation until this item was first assigned to an agent.
- `attributes.rev` (integer): The revision. `PUT` requires it, and fails with `409 Conflict` if the item changed since you read it.
- `attributes.workItemNumber` (integer): Which work item this is for the conversation, counting from 1. A conversation that needs an agent again gets the next number.
- `attributes.lastRevision` (object): The item's latest stint in a queue: `enteredQueueAt`, how long it waited (`queueTime` and `queueBusinessTime`, in milliseconds), `routedAt` when it was offered and `acceptedAt` when it was accepted. Only the latest one is kept.
- `relationships.team` (object): The team the assigned agent was working as, whose queues and capacity rules applied.
- `relationships.resource` (object): The conversation being routed. Look up a conversation's live work item with `GET /v1/routing/conversations/{id}/work-items`.
- `relationships.workSession` (object): The work session of the agent holding the item. The item counts toward that session's capacity.
- `relationships.routedToSession` (object): The work session that offer went to.
- `relationships.routedTo` (object): The agent routing last offered the item to.
- `relationships.assignedTo` (object): The agent the item is assigned to. Set it with `assignedTo` on `PUT`; `null` puts the item back in its queue.
- `relationships.queue` (object): The queue the item is waiting in, or last waited in. Change it by sending `queue.id` or `queue.key` on `PUT`.
- `relationships.acceptedBy` (object): The agent who accepted the item.

### Relationships

- Points to **Teams** via `relationships.team`: The team the agent holding this work item was working as. Its team routing settings supplied the queues and capacity.
- Points to **Conversations** 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.
- Points to **Work sessions** via `relationships.workSession`: The work session holding this work item. While the item is assigned and not paused, it uses `itemSize` of the session's capacity.
- Points to **Work sessions** via `relationships.routedToSession`: The work session this work item was last offered to.
- Points to **Users** via `relationships.routedTo`: The agent this work item was last offered to.
- Points to **Users** via `relationships.assignedTo`: The agent this work item is assigned to.
- Points to **Queues** via `relationships.queue`: The queue this work item waits in, or last waited in. The queue's `priority` and `itemSize` are copied onto the item each time it enters.
- Points to **Users** via `relationships.acceptedBy`: The agent who accepted this work item.
- Referenced by **Queue metrics** via `relationships.latestWaitTimeWorkItem`: The work item whose time in the queue produced the latest wait in queue metrics. Not every response includes it.

### Permissions

Fewest roles for a read-only integration: `org.permission.routing.read`. For every endpoint: `org.permission.routing.read`, `org.permission.routing.create`, `org.permission.routing.update`.

## Path parameters

| Name | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | string | yes | Work Item ID |

## Request body

Content type: `application/json` (required)

- `queue` (object)
  - Any of:
    - any
    - any
  - `id` (oneOf)
    - One of:
      - string
      - string<object-id>
  - `key` (string)
  - `enteredAt` (string<date-time>)
- `routed` (oneOf)
  - One of:
    - object
      - `to` (string<object-id>, required)
      - `at` (string<date-time>)
    - object
      - `rejectedBy` (string<object-id>, required)
    - object
      - `timedout` (boolean, required)
- `accepted` (object)
  - `at` (string<date-time>)
  - `by` (string<object-id>, required)
  - `workSession` (string<object-id>)
- `status` (string): One of: `assigned`, `wrap-up`, `completed`.
- `paused` (boolean)
- `assignedTo` (oneOf)
  - One of:
    - string
    - string<object-id>
- `rev` (integer, required)
- `resource` (object)
  - `rev` (integer)

Example:

```json
{
  "queue": null,
  "routed": {
    "to": "string",
    "at": "2026-03-14T15:09:26.535Z"
  },
  "accepted": {
    "at": "2026-03-14T15:09:26.535Z",
    "by": "string",
    "workSession": "string"
  },
  "status": "assigned",
  "paused": true,
  "rev": 0
}
```

## Responses

### 200

OK

- `data` (object, required)
  - `id` (string, required)
  - `type` (string, required)
  - `attributes` (object, required)
    - `resourceType` (string, required)
    - `status` (string, required): One of: `ivr`, `queued`, `routed`, `assigned`, `wrap-up`, `!wrap-up`, `completed`.
    - `paused` (boolean, required)
    - `channel` (string, required)
    - `firstEnterQueueAt` (string, required)
    - `queuedCount` (integer, required)
    - `priority` (integer, required)
    - `itemSize` (integer, required)
    - `ivr` (object, required)
    - `updatedAt` (string, required)
    - `modifiedAt` (string, required)
    - `createdAt` (string, required)
    - `resourceRev` (integer, required)
    - `resourceCreatedAt` (string, required)
    - `resourceDirection` (string, required)
    - `resourceFirstQueueTime` (integer, required)
    - `rev` (integer, required)
    - `workItemNumber` (integer, required)
    - `lastRevision` (object, required)
  - `relationships` (object, required)
    - `org` (object, required)
    - `resource` (object, required)
    - `lastRevision` (object, required)
    - `queue` (object, required)
  - `links` (object, required)
    - `self` (string, required)

```json
{
  "data": {
    "id": "5deb2199bd41600079079b6b",
    "type": "work_item",
    "attributes": {
      "resourceType": "conversation",
      "status": "queued",
      "paused": false,
      "channel": "email",
      "firstEnterQueueAt": "2019-12-07T03:50:49.371Z",
      "queuedCount": 1,
      "priority": 666,
      "itemSize": 123,
      "ivr": {
        "businessTime": 0,
        "time": 0
      },
      "updatedAt": "2019-12-07T03:50:49.371Z",
      "modifiedAt": "2019-12-07T03:50:49.139Z",
      "createdAt": "2019-12-07T03:50:49.134Z",
      "resourceRev": 1,
      "resourceCreatedAt": "1988-12-27T00:00:00.000Z",
      "resourceDirection": "in",
      "resourceFirstQueueTime": 976506649371,
      "rev": 2,
      "workItemNumber": 1,
      "lastRevision": {
        "enteredQueueAt": "2019-12-07T03:50:49.371Z"
      }
    },
    "relationships": {
      "org": {
        "data": {
          "type": "org",
          "id": "55d7998f2d3f9f8800099aed"
        },
        "links": {
          "self": "/v1/orgs/55d7998f2d3f9f8800099aed"
        }
      },
      "resource": {
        "data": {
          "type": "conversation",
          "id": "55d7998f2d3f9f8800099aff"
        }
      },
      "lastRevision": {
        "data": {
          "type": "work_item_revision",
          "id": "5deb2199bd41600079079b6c"
        }
      },
      "queue": {
        "data": {
          "type": "queue",
          "id": "5deb2199bd41600079079b65"
        },
        "links": {
          "self": "/v1/routing/queues/5deb2199bd41600079079b65"
        }
      }
    },
    "links": {
      "self": "/v1/routing/work-item/5deb2199bd41600079079b6b"
    }
  }
}
```

### 400

Bad Request

### 401

Unauthorized

### 403

Forbidden

### 404

Not Found

### 409

Conflict

## Example request

```bash
curl --request PUT \
  --url 'https://api.kustomerapp.com/v1/routing/work-items/5f184e74c61792001af42e49' \
  --header "Authorization: Bearer $KUSTOMER_API_KEY" \
  --header 'Content-Type: application/json' \
  --data '{
  "queue": null,
  "routed": {
    "to": "string",
    "at": "2026-03-14T15:09:26.535Z"
  },
  "accepted": {
    "at": "2026-03-14T15:09:26.535Z",
    "by": "string",
    "workSession": "string"
  },
  "status": "assigned",
  "paused": true,
  "rev": 0
}'
```
