POST/v1/uploads
Начать загрузку по частям
create_upload
Открывает сессию загрузки большого файла (до лимита установки для загрузок по частям, по умолчанию 5 ГБ): имя, тип содержимого, размер и purpose — назначение, то есть что будет использовать загрузку: card_file (POST /v1/cards), archive (POST /v1/cards/archive) или import_attachment (вложение документа своего источника). В ответе — id (upl_ и 32 шестнадцатеричных символа), размер части part_size и число частей part_count. Каждая часть, кроме последней, — ровно part_size байт (от 5 до 100 МиБ), а последняя — остаток. Незавершённая загрузка живёт 24 часа (expires_at).
Расширение имени файла не из форматов назначения возвращает 415 uploads.unsupported_format (вложение импорта принимает любое расширение). Файл больше лимита установки или общего хранилища организации по её тарифу возвращает 413 uploads.too_large. Если с учётом незавершённых загрузок организации места в хранилище не хватает, возвращается 402 limits.storage.
Части идут через Sursa (PUT /v1/uploads/{upload_id}/parts/{n}) и шифруются ключом организации в файловом хранилище; прямых ссылок на хранилище нет. Видеть и использовать загрузку может только ключ API или пользователь, который её создал. Добавлено в 1.62.0.
Аутентификация
Передайте ключ API в заголовке Authorization: Authorization: Bearer <ключ>.
Параметры заголовков
Idempotency-KeystringКлюч для безопасного повтора записи: от 1 до 255 печатных символов ASCII; рекомендуется UUID v4 на каждую логическую операцию. Повтор с тем же ключом в течение 24 часов не выполняет операцию заново: он возвращает сохранённый ответ (статус, заголовки и тело) с заголовком
Idempotency-Replayed: true. Тот же ключ с другим методом, путём,Content-Typeили телом — ответ409 api.idempotency_mismatch; пока первый запрос ещё выполняется —409 api.idempotency_in_progressсRetry-After: 1. После ответа 5xx или 429 ключ освобождается, и повтор выполняет операцию заново. Ключ действует в пределах организации и вызывающей стороны (ключ API, пользователь или ключ своего источника).length ≥ 1, length ≤ 255
Тело запроса
application/json
filenamestringобязательноИмя файла с расширением; расширение определяет формат.
length ≥ 1, length ≤ 255
content_typestringОбъявленный тип содержимого (MIME); он сравнивается с сигнатурой файла.
length ≤ 255
sizeinteger (int64)обязательноРазмер файла в байтах.
≥ 1
sha256stringSHA-256 файла, если она известна заранее;
completeсравнивает с ней контрольную сумму.
Ответы
201Сессия загрузки создана.
Заголовки ответа
RateLimit-PolicyДействующие лимиты в формате черновика IETF
draft-ietf-httpapi-ratelimit-headers: элементы через запятую"<name>";q=<quota>;w=<window in seconds>.key— частота запросов ключа API (квота — допустимый всплеск, окно — время до полного восстановления; для сессии этоuser, без учётных данных —ip);minute,dayиmonth— квоты организации на календарную минуту, день и месяц по UTC.RateLimitСколько осталось по каждому лимиту из
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitЛимит самой строгой записи в
RateLimit-Policy(той, где осталось меньше всего запросов).X-RateLimit-RemainingСколько запросов осталось в пределах самого строгого лимита.
X-RateLimit-ResetЧерез сколько секунд сбросится самый строгий лимит.
Idempotency-Replayedtrue— ответ воспроизведён из сохранённого для этогоIdempotency-Key: операция повторно не выполнялась.
application/json
idstringобязательноID загрузки (
upl_и 32 шестнадцатеричных символа).filenamestringобязательноИмя файла (без папок).
content_typestringобязательноОбъявленный тип содержимого; пусто, если не объявлен.
sizeinteger (int64)обязательноРазмер файла в байтах.
sha256string | nullобязательноSHA-256 файла, объявленная при создании или на шаге
complete;null, если ещё неизвестна.part_sizeinteger (int64)обязательноРазмер каждой части, кроме последней (от 5 до 100 МиБ).
part_countintegerобязательноЧисло частей.
≥ 1, ≤ 1000
parts_receivedintegerобязательноЧисло полученных частей.
≥ 0
Полученные части по номерам (пусто в ответе
POST /v1/uploads).reject_reasonstring | nullобязательноПричина отказа (
rejected):checksum_mismatch,type_mismatch,unsupported_format,infected,scan_unavailable,unsafe_content. Перечисление может расширяться;null, если отказа нет.reject_detailsobject | nullобязательноПодробности отказа (расширение, объявленный и определённый формат, контрольные суммы);
null, если отказа нет.created_atstring (date-time)обязательноКогда создана загрузка.
expires_atstring (date-time)обязательноКрайний срок, чтобы завершить загрузку и, когда она готова, использовать её.
completed_atstring (date-time) | nullобязательноКогда закончилась проверка (
readyилиrejected).consumed_atstring (date-time) | nullобязательноКогда загрузка использована (карточкой, архивом или импортом).
401Учётные данные не переданы (нет ни cookie сессии, ни ключа API) или ключ не найден.
Заголовки ответа
RateLimit-PolicyДействующие лимиты в формате черновика IETF
draft-ietf-httpapi-ratelimit-headers: элементы через запятую"<name>";q=<quota>;w=<window in seconds>.key— частота запросов ключа API (квота — допустимый всплеск, окно — время до полного восстановления; для сессии этоuser, без учётных данных —ip);minute,dayиmonth— квоты организации на календарную минуту, день и месяц по UTC.RateLimitСколько осталось по каждому лимиту из
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitЛимит самой строгой записи в
RateLimit-Policy(той, где осталось меньше всего запросов).X-RateLimit-RemainingСколько запросов осталось в пределах самого строгого лимита.
X-RateLimit-ResetЧерез сколько секунд сбросится самый строгий лимит.
application/json
402Организация достигла лимита тарифа (карточки, хранилище или пользователи). В `error.details` — `kind`, `limit` и `used`.
Заголовки ответа
RateLimit-PolicyДействующие лимиты в формате черновика IETF
draft-ietf-httpapi-ratelimit-headers: элементы через запятую"<name>";q=<quota>;w=<window in seconds>.key— частота запросов ключа API (квота — допустимый всплеск, окно — время до полного восстановления; для сессии этоuser, без учётных данных —ip);minute,dayиmonth— квоты организации на календарную минуту, день и месяц по UTC.RateLimitСколько осталось по каждому лимиту из
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitЛимит самой строгой записи в
RateLimit-Policy(той, где осталось меньше всего запросов).X-RateLimit-RemainingСколько запросов осталось в пределах самого строгого лимита.
X-RateLimit-ResetЧерез сколько секунд сбросится самый строгий лимит.
application/json
403Действие запрещено: недостаточно прав роли, нет доступа к коллекции или карточке, запрос выполняется в режиме «Смотреть как» либо организация приостановлена или удалена (`detail` — объект с `code: org_suspended | org_deleted`).
Заголовки ответа
RateLimit-PolicyДействующие лимиты в формате черновика IETF
draft-ietf-httpapi-ratelimit-headers: элементы через запятую"<name>";q=<quota>;w=<window in seconds>.key— частота запросов ключа API (квота — допустимый всплеск, окно — время до полного восстановления; для сессии этоuser, без учётных данных —ip);minute,dayиmonth— квоты организации на календарную минуту, день и месяц по UTC.RateLimitСколько осталось по каждому лимиту из
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitЛимит самой строгой записи в
RateLimit-Policy(той, где осталось меньше всего запросов).X-RateLimit-RemainingСколько запросов осталось в пределах самого строгого лимита.
X-RateLimit-ResetЧерез сколько секунд сбросится самый строгий лимит.
application/json
413Тело запроса больше допустимого размера.
Заголовки ответа
RateLimit-PolicyДействующие лимиты в формате черновика IETF
draft-ietf-httpapi-ratelimit-headers: элементы через запятую"<name>";q=<quota>;w=<window in seconds>.key— частота запросов ключа API (квота — допустимый всплеск, окно — время до полного восстановления; для сессии этоuser, без учётных данных —ip);minute,dayиmonth— квоты организации на календарную минуту, день и месяц по UTC.RateLimitСколько осталось по каждому лимиту из
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitЛимит самой строгой записи в
RateLimit-Policy(той, где осталось меньше всего запросов).X-RateLimit-RemainingСколько запросов осталось в пределах самого строгого лимита.
X-RateLimit-ResetЧерез сколько секунд сбросится самый строгий лимит.
application/json
415Формат файла не поддерживается.
Заголовки ответа
RateLimit-PolicyДействующие лимиты в формате черновика IETF
draft-ietf-httpapi-ratelimit-headers: элементы через запятую"<name>";q=<quota>;w=<window in seconds>.key— частота запросов ключа API (квота — допустимый всплеск, окно — время до полного восстановления; для сессии этоuser, без учётных данных —ip);minute,dayиmonth— квоты организации на календарную минуту, день и месяц по UTC.RateLimitСколько осталось по каждому лимиту из
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitЛимит самой строгой записи в
RateLimit-Policy(той, где осталось меньше всего запросов).X-RateLimit-RemainingСколько запросов осталось в пределах самого строгого лимита.
X-RateLimit-ResetЧерез сколько секунд сбросится самый строгий лимит.
application/json
422Ошибка проверки: тело или параметры не соответствуют схеме (`detail` — список ошибок проверки) либо значение параметра вне допустимого диапазона (`detail` — сообщение).
Заголовки ответа
RateLimit-PolicyДействующие лимиты в формате черновика IETF
draft-ietf-httpapi-ratelimit-headers: элементы через запятую"<name>";q=<quota>;w=<window in seconds>.key— частота запросов ключа API (квота — допустимый всплеск, окно — время до полного восстановления; для сессии этоuser, без учётных данных —ip);minute,dayиmonth— квоты организации на календарную минуту, день и месяц по UTC.RateLimitСколько осталось по каждому лимиту из
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitЛимит самой строгой записи в
RateLimit-Policy(той, где осталось меньше всего запросов).X-RateLimit-RemainingСколько запросов осталось в пределах самого строгого лимита.
X-RateLimit-ResetЧерез сколько секунд сбросится самый строгий лимит.
application/json
429Слишком много запросов (`api.rate_limited`), квота организации на минуту, день или месяц исчерпана (`api.quota_exceeded`; в `error.details` — `quota`, `limit` и `reset_at`), достигнут лимит организации или сервис ответов занят (`answers.engine_busy`). Подождите время, указанное в заголовке `Retry-After`.
Заголовки ответа
Retry-AfterСколько секунд подождать перед повтором запроса.
RateLimit-PolicyДействующие лимиты в формате черновика IETF
draft-ietf-httpapi-ratelimit-headers: элементы через запятую"<name>";q=<quota>;w=<window in seconds>.key— частота запросов ключа API (квота — допустимый всплеск, окно — время до полного восстановления; для сессии этоuser, без учётных данных —ip);minute,dayиmonth— квоты организации на календарную минуту, день и месяц по UTC.RateLimitСколько осталось по каждому лимиту из
RateLimit-Policy:"<name>";r=<remaining>;t=<seconds until reset>.X-RateLimit-LimitЛимит самой строгой записи в
RateLimit-Policy(той, где осталось меньше всего запросов).X-RateLimit-RemainingСколько запросов осталось в пределах самого строгого лимита.
X-RateLimit-ResetЧерез сколько секунд сбросится самый строгий лимит.
application/json
Коды ошибок
Коды, которые эта операция может вернуть в error.code, помимо общих кодов любого запроса.
Безопасные повторы
Передавайте заголовок Idempotency-Key (например, UUID) с каждым POST и PATCH. Повтор с тем же ключом в течение 24 часов возвращает сохранённый ответ, а не выполняет запрос снова.
Лимиты частоты
В ответах есть заголовки RateLimit и RateLimit-Policy, а также прежние X-RateLimit-Limit, X-RateLimit-Remaining и X-RateLimit-Reset. В ответе 429 есть Retry-After в секундах: подождите и повторите запрос.