Для AI-агентов: markdown этой страницы — /docs-content/entities/documents/crm-upload.md индекс документации — /llms.txt
Загрузить CRM-документ
POST /v1/crm-documents/upload
Прикрепляет к записи CRM готовый файл документа, сформированный вне Битрикс24, без шаблона. Файл передаётся строкой base64, поля — внутри объекта fields.
Поля запроса (body)
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
fields.entityTypeId |
number | да | Тип записи CRM, положительное целое число: 2 — сделка, 3 — контакт, 4 — компания. Остальные типы — в списке «Типы записей CRM» на странице GET /v1/crm-documents |
fields.entityId |
number | да | ID записи, положительное целое число. Источник зависит от типа: сделки — GET /v1/deals, контакты — GET /v1/contacts, компании — GET /v1/companies |
fields.title |
string | да | Название документа |
fields.number |
string | да | Номер документа. Число вместо строки отклоняется |
fields.region |
string | да | Регион документа, например ru |
fields.fileContent |
string | да | Содержимое файла DOCX строкой base64, не больше 2 МиБ после декодирования |
fields.pdfContent |
string | нет | PDF-версия документа строкой base64, не больше 2 МиБ после декодирования |
fields.imageContent |
string | нет | Изображение документа строкой base64, не больше 2 МиБ после декодирования |
Тело запроса целиком — не больше 3 МиБ. Поля id, fileId, pdfId, imageId, moduleId, providerClassName и value заполняет Битрикс24: запрос с любым из них отклоняется с 400 READONLY_FIELD.
Примеры
В примерах contract.docx — ваш файл документа. Тело запроса собирается в файл document.json, затем отправляется.
curl — личный ключ
printf '{"fields":{"entityTypeId":2,"entityId":8781,"title":"Договор поставки","number":"VD-1","region":"ru","fileContent":"%s"}}' \
"$(base64 < contract.docx | tr -d '\n')" > document.json
curl -X POST "https://vibecode.bitrix24.tech/v1/crm-documents/upload" \
-H "X-Api-Key: YOUR_API_KEY" \
-H "Content-Type: application/json" \
--data-binary @document.json
curl — OAuth-приложение
printf '{"fields":{"entityTypeId":2,"entityId":8781,"title":"Договор поставки","number":"VD-1","region":"ru","fileContent":"%s"}}' \
"$(base64 < contract.docx | tr -d '\n')" > document.json
curl -X POST "https://vibecode.bitrix24.tech/v1/crm-documents/upload" \
-H "X-Api-Key: YOUR_APP_KEY" \
-H "Authorization: Bearer USER_SESSION_TOKEN" \
-H "Content-Type: application/json" \
--data-binary @document.json
JavaScript — личный ключ
import { readFile } from 'node:fs/promises'
const fileContent = (await readFile('contract.docx')).toString('base64')
const res = await fetch('https://vibecode.bitrix24.tech/v1/crm-documents/upload', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_API_KEY',
'Content-Type': 'application/json',
},
body: JSON.stringify({
fields: {
entityTypeId: 2,
entityId: 8781,
title: 'Договор поставки',
number: 'VD-1',
region: 'ru',
fileContent,
},
}),
})
const { success, data } = await res.json()
console.log('Документ:', data.id)
JavaScript — OAuth-приложение
import { readFile } from 'node:fs/promises'
const fileContent = (await readFile('contract.docx')).toString('base64')
const res = await fetch('https://vibecode.bitrix24.tech/v1/crm-documents/upload', {
method: 'POST',
headers: {
'X-Api-Key': 'YOUR_APP_KEY',
'Authorization': 'Bearer USER_SESSION_TOKEN',
'Content-Type': 'application/json',
},
body: JSON.stringify({
fields: {
entityTypeId: 2,
entityId: 8781,
title: 'Договор поставки',
number: 'VD-1',
region: 'ru',
fileContent,
},
}),
})
const { success, data } = await res.json()
Поля ответа
Возвращается HTTP-статус 201 Created и созданный документ. Полное описание полей документа — на странице Получить CRM-документ.
| Поле | Тип | Описание |
|---|---|---|
success |
boolean | Всегда true при успехе |
data.id |
string | Идентификатор документа |
data.title |
string | Название из fields.title |
data.number |
string | Номер из fields.number |
data.entityTypeId |
string | Тип записи CRM |
data.entityId |
string | ID записи CRM |
data.templateId |
string | Служебный шаблон загруженных документов. В списках шаблонов его нет |
data.createdBy |
string | ID сотрудника, загрузившего документ. Список: GET /v1/users |
data.downloadUrlMachine |
string | Адрес /v1/crm-documents/:id/download. Нужен X-Api-Key со скоупом crm |
data.pdfUrlMachine |
string | Адрес /v1/crm-documents/:id/pdf. Сразу в ответе, если передан fields.pdfContent |
Пример ответа
Показаны основные поля. Полный список: Получить CRM-документ.
{
"success": true,
"data": {
"downloadUrl": "https://example.bitrix24.ru/bitrix/services/main/ajax.php?action=crm.documentgenerator.document.download&SITE_ID=s1&id=1985",
"publicUrl": null,
"title": "Договор поставки",
"number": "VD-1",
"id": "1985",
"createTime": "2026-10-08T17:59:45+03:00",
"createdBy": "1317",
"stampsEnabled": false,
"isTransformationError": false,
"templateId": "275",
"entityId": "8781",
"entityTypeId": "2",
"downloadUrlMachine": "https://vibecode.bitrix24.tech/v1/crm-documents/1985/download"
}
}
Пример ответа при ошибке
400 — fileContent не строка base64:
{
"success": false,
"error": {
"code": "INVALID_PARAMS",
"message": "fileContent must be base64"
}
}
Ошибки
| HTTP | Код | Описание |
|---|---|---|
| 400 | MISSING_REQUIRED_FIELDS |
Нет объекта fields. Сообщение: fields is required |
| 400 | MISSING_REQUIRED_FIELDS |
Обязательное поле не передано или пустое. Сообщение называет поля: Empty required fields: number |
| 400 | READONLY_FIELD |
В fields передано поле, которое заполняет Битрикс24, например id |
| 400 | INVALID_PARAMS |
entityTypeId или entityId не положительное целое число |
| 400 | INVALID_PARAMS |
title, number или region не строка |
| 400 | INVALID_PARAMS |
fileContent, pdfContent или imageContent не строка base64. Сообщение называет поле |
| 400 | INVALID_PARAMS |
Тип entityTypeId не поддерживается для документов, например 999. Сообщение: Wrong "entityTypeId" field value |
| 413 | PAYLOAD_TOO_LARGE |
Файл больше 2 МиБ после декодирования. Сообщение называет поле: fileContent must not exceed 2 MiB |
| 413 | PAYLOAD_TOO_LARGE |
Тело запроса больше 3 МиБ. Сообщение: Request body too large |
| 429 | LARGE_BODY_BACKEND_BUSY |
Тело больше 1 МиБ, а платформа уже обрабатывает предельный объём крупных тел. Повторите запрос через Retry-After секунд |
| 502 | BITRIX_INVALID_RESPONSE |
Битрикс24 ответил без документа |
| 403 | WRITE_BLOCKED_READONLY_KEY |
Ключ работает в режиме только для чтения |
| 403 | SCOPE_DENIED |
Ключу не хватает скоупа crm |
| 401 | MISSING_API_KEY |
Не передан заголовок X-Api-Key |
| 401 | TOKEN_MISSING |
Ключу не сопоставлены токены — ключ OAuth-приложения вызван без пользовательской сессии |
Полный список общих ошибок API — Ошибки.
Известные особенности
Формат файла не проверяется. Проверяется только то, что fileContent — корректная строка base64. Файл сохраняется как передан, даже если это не DOCX, и скачивание DOCX вернёт те же байты.
Существование записи не проверяется. Документ создаётся и для entityId, которого нет среди записей этого типа: ответ 201, в том числе для контакта — в отличие от создания по шаблону. Документ, прикреплённый к несуществующему контакту, потом не читается и не удаляется: все методы отвечают 403 BITRIX_ACCESS_DENIED. Проверяйте запись заранее, например через GET /v1/contacts/:id.
PDF без pdfContent формируется позже. Если PDF-версия не передана, PDF формируется из DOCX после загрузки, и до этого скачивание PDF отвечает 409 DOCUMENT_NOT_READY.