## Изменить to-do

`PATCH /v1/activity-todos/:id`

Меняет срок, текст, ответственного, напоминания или родителя у дела типа «To-do». Передавайте только изменяемые поля, плоско в корне JSON.

## Параметры

| Параметр | Тип | Обяз. | Описание |
|----------|-----|:-----:|---------|
| `id` (path) | number | да | ID to-do. Список: [`GET /v1/activities`](/docs/entities/activities/list) с фильтром `providerId=CRM_TODO` |

## Поля запроса (body)

Тело не может быть пустым: нужно хотя бы одно поле.

| Поле | Тип | Обяз. | Описание |
|------|-----|:-----:|---------|
| `deadline` | string | нет | Новый срок в формате ISO 8601, например `2026-11-03T15:00:00+03:00` |
| `title` | string | нет | Новый заголовок. В ответе приходит в поле `subject` |
| `description` | string | нет | Новое описание |
| `responsibleId` | number | нет | ID нового ответственного. Список: [`GET /v1/users`](/docs/entities/users/list) |
| `parentActivityId` | number | нет | ID дела, к которому привязывается to-do. Родитель должен относиться к тому же объекту CRM. Список дел объекта: [`GET /v1/activities`](/docs/entities/activities/list) с фильтром по `ownerTypeId` и `ownerId` |
| `pingOffsets` | number[] | нет | Напоминания: целые числа минут до срока, не меньше `0`. Заменяют прежний набор целиком |

Объект CRM дела не меняется: `ownerTypeId` и `ownerId` в теле отклоняются с `400 INVALID_PARAMS`, как и любое другое неизвестное поле. `colorId` из палитры отклоняется с `422`, вне палитры — с `400`, см. «Ошибки».

## Примеры

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

```bash
curl -X PATCH "https://vibecode.bitrix24.tech/v1/activity-todos/8379" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Проверить договор и счёт",
    "pingOffsets": [0, 30]
  }'
```

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

```bash
curl -X PATCH "https://vibecode.bitrix24.tech/v1/activity-todos/8379" \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "title": "Проверить договор и счёт",
    "pingOffsets": [0, 30]
  }'
```

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

```javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/activity-todos/8379', {
  method: 'PATCH',
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    title: 'Проверить договор и счёт',
    pingOffsets: [0, 30],
  }),
})

const { data } = await res.json()
console.log(data.subject)
```

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

```javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/activity-todos/8379', {
  method: 'PATCH',
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    title: 'Проверить договор и счёт',
    pingOffsets: [0, 30],
  }),
})

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

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

Ответ — дело, прочитанное после изменения. Форма та же, что у [`GET /v1/activities/:id`](/docs/entities/activities/get).

| Поле | Тип | Описание |
|------|-----|---------|
| `success` | boolean | `true` при успехе |
| `data` | object | Изменённое дело, все поля — [Поля дела](/docs/entities/activities/fields) |
| `data.id` | number | ID дела |
| `data.subject` | string | Заголовок из поля `title` |
| `data.deadline` | string | Срок дела в UTC |
| `data.associatedEntityId` | number | ID родительского дела или `0` без родителя |
| `data.updatedAt` | string | Время последнего изменения в UTC |

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

Показаны основные поля. Полный список: [Поля дела](/docs/entities/activities/fields).

```json
{
  "success": true,
  "data": {
    "id": 8379,
    "ownerId": 8845,
    "ownerTypeId": 2,
    "providerId": "CRM_TODO",
    "associatedEntityId": 0,
    "subject": "Проверить договор и счёт",
    "updatedAt": "2026-10-15T10:06:02.000Z",
    "deadline": "2026-11-03T12:00:00.000Z",
    "completed": false,
    "status": 1,
    "responsibleId": 1317,
    "description": "Позвонить клиенту"
  }
}
```

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

422 — to-do уже завершено:

```json
{
  "success": false,
  "error": {
    "code": "ACTIVITY_TODO_COMPLETED",
    "message": "The to-do is completed and cannot be updated"
  }
}
```

## Ошибки

| HTTP | Код | Описание |
|------|-----|----------|
| 400 | `INVALID_PARAMS` | `id` не положительное целое число |
| 400 | `INVALID_PARAMS` | Нарушена валидация тела: пустое тело, `responsibleId` или `parentActivityId` не положительное целое число, `title` или `description` не строка, срок не в формате ISO 8601, `pingOffsets` не массив неотрицательных целых чисел, неизвестное поле, `colorId` вне палитры |
| 400 | `INVALID_PARAMS` | Родительское дело из `parentActivityId` относится к другому объекту CRM |
| 400 | `MISSING_REQUIRED_FIELDS` | Тело запроса не JSON-объект |
| 404 | `ENTITY_NOT_FOUND` | Дело с таким `id` не to-do: у него другой провайдер, например звонок или открытая линия |
| 404 | `ENTITY_NOT_FOUND` | Дела с таким `id` или дела из `parentActivityId` не существует. To-do не меняется |
| 422 | `ACTIVITY_TODO_COMPLETED` | To-do завершено и не меняется |
| 422 | `UNSUPPORTED_ACTIVITY_BLOCKS` | В теле передан `colorId` из палитры. Цвет задаётся только при [создании](./create.md) |
| 422 | `ACTIVITY_UPDATE_NOT_APPLIED` | После записи прочитанное дело не совпало с запросом, или поля, не переданные в запросе, могли не сохраниться. Изменение могло примениться частично: прочитайте дело через [`GET /v1/activities/:id`](/docs/entities/activities/get) и сравните с ожидаемым, прежде чем повторять `PATCH` |
| 502 | `BITRIX_ERROR` | Не удалось прочитать данные дела до или после записи. Изменение могло примениться: прочитайте дело, прежде чем повторять `PATCH` |
| 403 | `WRITE_BLOCKED_READONLY_KEY` | Ключ только для чтения |
| 403 | `SCOPE_DENIED` | У ключа нет скоупа `crm` |
| 401 | `TOKEN_MISSING` | У ключа нет подключения к Битрикс24 |

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

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

**Непереданные поля сохраняются.** Если в теле только одно из полей `deadline`, `description` или `responsibleId`, меняется только оно. При любом другом наборе полей сервис читает текущее дело и сам дописывает к запросу заголовок, описание, срок и напоминания, которых нет в теле.

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

- [Создать to-do](./create.md)
- [Получить дело](/docs/entities/activities/get)
- [Завершить дело](/docs/entities/activities/complete)
- [Перенести срок](/docs/entities/activities/deadline)
- [To-do дела CRM](../todos.md)
