# Отправить CRM-форму клиенту

`POST /v1/openlines/sessions/send-form`

Отправляет CRM-форму в диалог Открытой линии. Клиент получает реальное сообщение. Битрикс24 проверяет доступ текущего пользователя к чату.

Нужны оба скоупа: `imopenlines` и `crm`, и ключ с правом записи.

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

| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
| `sessionId` | integer | да | Положительный ID сессии Открытой линии, не `chatId`. Поиск: [`POST /v1/openlines/sessions/search`](/docs/openlines/sessions/search) |
| `formId` | integer | да | Положительный ID CRM-формы. Список: [`GET /v1/crm-forms`](/docs/entities/crm-forms/list) |

Принимаются только эти два поля. Код, название и публичный код безопасности формы сервер получает сам. При получении этих данных могут быть созданы отсутствующие загрузчики JavaScript для форм в Битрикс24.

## Примеры

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

```bash
curl -X POST 'https://vibecode.bitrix24.tech/v1/openlines/sessions/send-form' \
  -H 'X-Api-Key: YOUR_API_KEY' \
  -H 'Content-Type: application/json' \
  -d '{"sessionId":9,"formId":8}'
```

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

```bash
curl -X POST 'https://vibecode.bitrix24.tech/v1/openlines/sessions/send-form' \
  -H 'X-Api-Key: YOUR_APP_KEY' \
  -H 'Authorization: Bearer USER_SESSION_TOKEN' \
  -H 'Content-Type: application/json' \
  -d '{"sessionId":9,"formId":8}'
```

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

```javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/openlines/sessions/send-form', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ sessionId: 9, formId: 8 }),
})
const { data } = await res.json()
console.log(data.sent)
```

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

```javascript
const res = await fetch('https://vibecode.bitrix24.tech/v1/openlines/sessions/send-form', {
  method: 'POST',
  headers: {
    'X-Api-Key': 'YOUR_APP_KEY',
    'Authorization': 'Bearer USER_SESSION_TOKEN',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ sessionId: 9, formId: 8 }),
})
const { data } = await res.json()
console.log(data.sent)
```

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

| Поле | Тип | Описание |
|---|---|---|
| `success` | boolean | Всегда `true` при успехе |
| `data.sent` | boolean | Всегда `true`: Битрикс24 принял вызов отправки |

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

```json
{
  "success": true,
  "data": {
    "sent": true
  }
}
```

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

404 — сессия не найдена:

```json
{
  "success": false,
  "error": {
    "code": "NO_SESSION_ERROR",
    "message": "Error getting session info"
  }
}
```

## Ошибки

| HTTP | Код | Описание |
|---|---|---|
| 400 | `MISSING_REQUIRED_FIELDS` | Нет `sessionId` или `formId` |
| 400 | `INVALID_PARAMS` | Тело не JSON-объект, передано поле кроме `sessionId` и `formId`, или ID не положительное целое число |
| 400 | `SESSION_ID_EMPTY` | Битрикс24 отклонил запрос: не передан ID сессии |
| 400 | `FORM_INFO_EMPTY` | Битрикс24 отклонил запрос: нет данных формы |
| 403 | `SCOPE_DENIED` | У ключа нет скоупа `imopenlines` или `crm` |
| 403 | `WRITE_BLOCKED_READONLY_KEY` | Ключ только на чтение |
| 403 | `ACCESS_ERROR` | Битрикс24 отказал в доступе к диалогу |
| 404 | `NO_SESSION_ERROR` | Сессия с таким `sessionId` не найдена |
| 404 | `ENTITY_NOT_FOUND` | Формы с таким `formId` нет на портале. Текст сообщения приходит от Битрикс24 |
| 404 | `ENTITY_NOT_FOUND` | Форма есть, но не найдена в списке форм портала. Сообщение `CRM form not found` |
| 502 | `BITRIX_RESPONSE_INVALID` | Битрикс24 вернул некорректные данные формы или не подтвердил отправку |

Тексты отказов Битрикс24 передаются без изменений. Общие отказы — [Лимиты и оптимизация](/docs/optimization), полный список общих ошибок API — [Ошибки](/docs/errors).

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

**`sent` не подтверждает доставку.** Поле означает, что Битрикс24 принял вызов, а не что клиент получил сообщение. Внутренние коды формы не возвращаются.

**Повтор после сбоя может отправить дубль.** Если ответ не пришёл или пришёл `502 BITRIX_RESPONSE_INVALID`, форма могла уже уйти клиенту. Перед повтором проверьте диалог, иначе клиент получит форму дважды.

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

- [Поиск сессий](/docs/openlines/sessions/search)
- [Список форм](/docs/entities/crm-forms/list)
- [Отправить данные посетителя](/docs/entities/crm-forms/results)
- [Лимиты и оптимизация](/docs/optimization)
