
## Создать дело

`POST /v1/activity-configurable`

Создаёт конфигурируемое дело в таймлайне CRM-сущности. Набор полей дела задаёт `fields`, внешний вид — `layout`.

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

| Поле | Тип | Обяз. | Описание |
|------|-----|:-----:|---------|
| **`ownerTypeId`** | number | да | Тип CRM-сущности:<br>1 — лид<br>2 — сделка<br>3 — контакт<br>4 — компания<br>7 — предложение<br>31 — счёт<br>≥128 — смарт-процесс, id типа — в [`GET /v1/smart-processes`](/docs/entities/smart-processes/list) |
| **`ownerId`** | number | да | ID сущности, в таймлайне которой создаётся дело |
| **`fields`** | object | да | Поля дела |
| `fields.typeId` | string | нет | Тип дела. По умолчанию `CONFIGURABLE`. Свой тип регистрируется в Битрикс24 как конфигурируемый в контексте того же приложения |
| `fields.completed` | boolean | нет | Дело закрыто. Принимает `true`/`false`, `1`/`0`, `Y`/`N` |
| `fields.deadline` | string | нет | Крайний срок исполнения, ISO 8601. Несовместим с `fields.isIncomingChannel` |
| `fields.pingOffsets` | number[] | нет | Смещения в минутах относительно `fields.deadline`, в которые формируются напоминания |
| `fields.isIncomingChannel` | boolean | нет | Дело создано из входящего канала. Принимает `true`/`false`, `1`/`0`, `Y`/`N` |
| `fields.responsibleId` | number | нет | ID ответственного сотрудника. Список: `GET /v1/users` |
| `fields.badgeCode` | string | нет | Код значка дела на канбане |
| `fields.originatorId` | string | нет | ID внешнего источника данных |
| `fields.originId` | string | нет | ID записи во внешнем источнике |
| **`layout`** | object | да | Оформление дела в таймлайне |
| `layout.icon.code` | string | да | Код иконки дела |
| `layout.header.title` | string | да | Заголовок дела |
| `layout.body.logo.code` | string | да | Код логотипа в теле. Тело без `logo` Битрикс24 отклоняет |
| `layout.body.blocks` | object | нет | Именованные блоки тела |
| `layout.footer.buttons` | object | нет | Кнопки футера |

Блок в `layout.body.blocks` имеет `type` и `properties`. Основные типы блоков:

- `text` — значение
- `link` — ссылка с действием
- `lineOfBlocks` — строка из вложенных блоков
- `withTitle` — блок с подписью

Действие у ссылок и кнопок задаёт поле `type`:

- `redirect` — переход по адресу из поля `uri`
- `openRestApp` — открытие приложения с параметрами `actionParams`
- `restEvent` — событие приложению по `id`, для пунктов меню

## Примеры

Примеры приведены только для OAuth-приложения.

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

```bash
curl -X POST https://vibecode.bitrix24.tech/v1/activity-configurable \
  -H "X-Api-Key: YOUR_APP_KEY" \
  -H "Authorization: Bearer USER_SESSION_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "ownerTypeId": 1,
    "ownerId": 999,
    "fields": { "typeId": "CONFIGURABLE", "completed": true, "responsibleId": 1, "badgeCode": "CUSTOM" },
    "layout": {
      "icon": { "code": "call-completed" },
      "header": { "title": "Входящий звонок" },
      "body": {
        "logo": { "code": "call-incoming" },
        "blocks": {
          "phone": { "type": "text", "properties": { "value": "+7 999 888 7777" } }
        }
      },
      "footer": {
        "buttons": {
          "startCall": {
            "title": "О клиенте",
            "type": "primary",
            "action": { "type": "openRestApp", "actionParams": { "clientId": 456 } }
          }
        }
      }
    }
  }'
```

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

```javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/activity-configurable', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    ownerTypeId: 1,
    ownerId: 999,
    fields: { typeId: 'CONFIGURABLE', completed: true, responsibleId: 1, badgeCode: 'CUSTOM' },
    layout: {
      icon: { code: 'call-completed' },
      header: { title: 'Входящий звонок' },
      body: {
        logo: { code: 'call-incoming' },
        blocks: {
          phone: { type: 'text', properties: { value: '+7 999 888 7777' } },
        },
      },
      footer: {
        buttons: {
          startCall: {
            title: 'О клиенте',
            type: 'primary',
            action: { type: 'openRestApp', actionParams: { clientId: 456 } },
          },
        },
      },
    },
  }),
})

const { data } = await res.json()
console.log('Activity ID:', data.activity.id)
```

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

| Поле | Тип | Описание |
|------|-----|---------|
| `success` | boolean | Всегда `true` при успехе |
| `data.activity.id` | number | ID созданного дела |

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

```json
{
  "success": true,
  "data": { "activity": { "id": 8053 } }
}
```

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

422 — не заполнен `logo` в теле:

```json
{
  "success": false,
  "error": {
    "code": "BITRIX_ERROR",
    "message": "Поле logo в BodyDto должно быть заполнено."
  }
}
```

## Ошибки

| HTTP | Код | Описание |
|------|-----|---------|
| 400 | `VALIDATION_ERROR` | Не передан `ownerTypeId`, `ownerId`, `fields` или `layout` |
| 422 | `BITRIX_ERROR` | Битрикс24 отклонил запрос: пустой `layout`, не заполнен `layout.body.logo`, вызов вне контекста приложения, входящее дело с `deadline` |
| 403 | `SCOPE_DENIED` | Ключу не хватает скоупа `crm` |
| 401 | `TOKEN_MISSING` | Ключ авторизации передан без токена сессии в заголовке `Authorization: Bearer` |

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

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

**Только в контексте приложения.** Нужен ключ авторизации `vibe_app_*` с токеном сессии в заголовке `Authorization: Bearer`. Персональный API-ключ `vibe_api_*` Битрикс24 отклоняет с `ERROR_WRONG_CONTEXT`.

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

- [Получить дело](/docs/entities/activities/configurable/get)
- [Обновить дело](/docs/entities/activities/configurable/update)
- [Конфигурируемые дела](/docs/entities/activities/configurable)
- [Дела](/docs/entities/activities)
