## Снять отметку «отгружено»

`POST /v1/shipments/:id/unship`

Снимает с отгрузки заказа интернет-магазина отметку «отгружено», например перед удалением отгрузки или после ошибочной отметки.

## Параметры

| Параметр | Тип | Обяз. | Описание |
|----------|-----|:-----:|---------|
| `id` (path) | number | да | ID отгрузки, целое положительное число. Список: [`GET /v1/shipments`](./list.md) |

Передайте пустой объект `{}` с заголовком `Content-Type: application/json` либо отправьте запрос без тела и без этого заголовка.

## Примеры

### curl — личный ключ

```bash
curl -X POST "https://vibecode.bitrix24.tech/v1/shipments/1205/unship" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{}'
```

### curl — OAuth-приложение

```bash
curl -X POST "https://vibecode.bitrix24.tech/v1/shipments/1205/unship" \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{}'
```

### JavaScript — личный ключ

```javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/shipments/1205/unship', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: '{}',
})

const { success, data } = await res.json()
console.log('Отгружено:', data.deducted)
```

### JavaScript — OAuth-приложение

```javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/shipments/1205/unship', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
    'Content-Type': 'application/json',
  },
  body: '{}',
})

const { success, data } = await res.json()
```

## Поля ответа

| Поле | Тип | Описание |
|------|-----|---------|
| `success` | boolean | `true` при успехе |
| `data` | object | Отгрузка со всеми полями в состоянии после снятия отметки — см. [Поля отгрузки](./fields.md) |
| `data.deducted` | boolean | Всегда `false` в успешном ответе |
| `data.dateDeducted` | datetime | Дата, когда снята отметка. Поле не обнуляется |
| `data.empDeductedId` | number | ID сотрудника, последним менявшего отметку. Поле не обнуляется. Список: [`GET /v1/users`](/docs/entities/users/list) |
| `data.reasonUndoDeducted` | string | Остаётся `null`: метод не принимает причину снятия отметки |

## Пример ответа

```json
{
  "success": true,
  "data": {
    "accountNumber": "1027/2",
    "allowDelivery": true,
    "basePriceDelivery": 500,
    "canceled": false,
    "comments": "Тестовая отгрузка для документации",
    "companyId": null,
    "currency": "RUB",
    "customPriceDelivery": false,
    "dateAllowDelivery": "2026-10-06T11:31:17.000Z",
    "dateCanceled": null,
    "dateDeducted": "2026-10-06T16:45:13.000Z",
    "dateInsert": "2026-10-06T11:30:44.000Z",
    "dateMarked": null,
    "dateResponsibleId": "2026-10-06T11:30:44.000Z",
    "deducted": false,
    "deliveryDocDate": null,
    "deliveryDocNum": "ТН-1205",
    "deliveryId": 1,
    "deliveryName": "Доставка курьером",
    "deliveryXmlId": null,
    "discountPrice": 0,
    "empAllowDeliveryId": 1317,
    "empCanceledId": null,
    "empDeductedId": 1317,
    "empMarkedId": null,
    "empResponsibleId": 1317,
    "externalDelivery": false,
    "id": 1205,
    "id1c": null,
    "marked": false,
    "orderId": 1027,
    "priceDelivery": 500,
    "reasonMarked": null,
    "reasonUndoDeducted": null,
    "responsibleId": 1295,
    "shipmentItems": [],
    "statusId": "DN",
    "statusXmlId": null,
    "system": false,
    "trackingDescription": null,
    "trackingLastCheck": null,
    "trackingNumber": "VIBE-DOC-3",
    "trackingStatus": null,
    "updated1c": false,
    "version1c": null,
    "xmlId": "bx_6ac4cdd46e442"
  }
}
```

## Пример ответа при ошибке

404 — отгрузка не найдена:

```json
{
  "success": false,
  "error": {
    "code": "ENTITY_NOT_FOUND",
    "message": "shipment is not exists"
  }
}
```

## Ошибки

| HTTP | Код | Описание |
|------|-----|---------|
| 400 | `INVALID_ID` | `id` в пути не является целым положительным числом. Текст ошибки — `Shipment ID must be a positive integer.` |
| 400 | `INVALID_PARAMS` | Тело запроса не пустое либо не является объектом. Текст ошибки — `This action takes an empty body.` |
| 404 | `ENTITY_NOT_FOUND` | Отгрузки с таким `id` нет. Текст ошибки — `shipment is not exists` |
| 422 | `BITRIX_NO_EFFECT` | Битрикс24 не подтвердил смену отметки. Текст ошибки — `Bitrix24 did not confirm the shipped mark change.` |
| 422 | `BITRIX_NO_EFFECT` | Отметка снята, но отгрузку не удалось перечитать. Текст ошибки — `Bitrix24 did not return the shipment after the action.` |
| 422 | `BITRIX_NO_EFFECT` | Отгрузка перечитана, но `deducted` в ней не `false`. Текст ошибки — `Bitrix24 did not persist the requested shipped mark.` |
| 422 | `BITRIX_ERROR` | Битрикс24 отклонил снятие отметки. Текст причины — в `message` |
| 403 | `BITRIX_ACCESS_DENIED` | У пользователя ключа нет прав на изменение заказов в Битрикс24 |
| 403 | `WRITE_BLOCKED_READONLY_KEY` | Ключ работает в режиме только для чтения |
| 403 | `SCOPE_DENIED` | API-ключ не имеет скоупа `sale` |
| 401 | `MISSING_API_KEY` | Не передан заголовок `X-Api-Key` |
| 401 | `TOKEN_MISSING` | API-ключ не имеет настроенных токенов |

Полный список общих ошибок API — [Ошибки](/docs/errors).

## Известные особенности

**Повторный вызов ничего не меняет.** Для отгрузки без отметки запрос отвечает `200` с той же отгрузкой. Поэтому после `422 BITRIX_NO_EFFECT` запрос можно повторить либо проверить `deducted` через [`GET /v1/shipments/:id`](./get.md).

## Смотрите также

- [Поставить отметку «отгружено»](./ship.md)
- [Получить отгрузку](./get.md)
- [Удалить отгрузку](./delete.md)
- [Поля отгрузки](./fields.md)
- [Позиции отгрузок](/docs/entities/shipment-items)
- [Отгрузки](/docs/entities/shipments)
