Начать загрузку по частям
POST/api/v1/uploads/resumable
- Доступ
- Ключ API
- Право
content:write
Фиксирует размер файла, хеши его частей по 2 МБ и отпечаток. У аккаунта может быть до 10 незавершённых загрузок, каждая живёт 24 часа. Повтор с тем же Idempotency-Key и теми же байтами возвращает ту же загрузку.
Пример запроса
curl -X POST "https://lac.pics/api/v1/uploads/resumable" \
-H "Authorization: Bearer lac_api_YOUR_KEY" \
-H "Idempotency-Key: 6c1e0f7a-3b2d-4e8f-9a01-5d4c3b2a1f0e" \
-H "Content-Type: application/json" \
-d '{
"accountId": "cmf8a1x2k0000q7lh3v9w2e4d",
"filename": "recording.mp4",
"size": 4194304,
"chunkSize": 2097152,
"chunkHashes": [
"9d1e6b0c7a52f3e84b1c0d9a7e6f5b4c3d2e1f0a9b8c7d6e5f4a3b2c1d0e9f8a",
"0a1b2c3d4e5f60718293a4b5c6d7e8f90a1b2c3d4e5f60718293a4b5c6d7e8f9"
],
"fingerprint": "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8"
}'Параметры
Заголовки
X-Lacuna-AccountstringНеобязательно: id аккаунта, которому должна принадлежать загрузка. Другой аккаунт — 409 до чтения состояния и данных.
Idempotency-Keystring · uuidобязательныйUUID, один на файл: повтор с тем же ключом и теми же байтами вернёт ту же загрузку.
Тело запроса
application/jsonобязательный
accountIdstringобязательныйid аккаунта (
user.idизGET /account), к которому привязана загрузка.длина 1–128
filenamestringобязательныйИмя файла. Хранится без управляющих символов и разделителей пути, до 180 символов с сохранением расширения.
длина 1–1 024
sizeinteger · int64обязательныйРазмер файла в байтах, не больше
limits.maxUploadBytes(413UPLOAD_TOO_LARGE): самый большой лимит тарифа или предел сервера 4 ГБ, если у тарифа лимита на файл нет (params.ceiling=server). Первая часть показывает тип: другой формат (400UPLOAD_FORMAT_UNSUPPORTED) или файл больше лимита своего типа (413IMAGE_TOO_LARGE/VIDEO_TOO_LARGE) сразу отменяет загрузку.1–4 294 967 296
chunkSizeintegerобязательныйРазмер части: 2 097 152 байта (2 МБ).
значения:
2097152chunkHashesмассив stringобязательныйSHA-256 каждой части по порядку, в шестнадцатеричном виде.
1–2 048 элементов
fingerprintstringобязательныйSHA-256 строки UTF-8
lacuna-resumable-v1\n{size}\n2097152\n{хеши частей через \n}\n. Имя файла и дата изменения в отпечаток не входят.шаблон
^[a-f0-9]{64}$
Ответы
200Готово
ResumableUploadidstring · uuidобязательныйid загрузки.
statestringобязательныйСостояние:
UPLOADING,COMPLETING,COMPLETED,CANCELLEDилиEXPIRED.значения:
"UPLOADING""COMPLETING""COMPLETED""CANCELLED""EXPIRED"filenamestringобязательныйИмя файла. Хранится без управляющих символов и разделителей пути, до 180 символов с сохранением расширения.
sizeinteger · int64обязательныйРазмер в байтах.
1–4 294 967 296
chunkSizeintegerобязательныйРазмер части: 2 097 152 байта (2 МБ).
значения:
2097152chunkCountintegerобязательныйЧисло частей.
1–50
fingerprintstringобязательныйSHA-256 строки UTF-8
lacuna-resumable-v1\n{size}\n2097152\n{хеши частей через \n}\n. Имя файла и дата изменения в отпечаток не входят.шаблон
^[a-f0-9]{64}$receivedмассив integerобязательныйНомера подтверждённых частей.
без повторов
receivedBytesinteger · int64обязательныйПодтверждено байт.
0–4 294 967 296
expiresAtstring · date-timeобязательныйКогда незавершённая загрузка истечёт.
contentContentобязательныйили nullГотовый файл после завершения; иначе null.
Content40 полейidstringобязательныйid файла.
titlestringобязательныйНазвание.
tagsмассив stringобязательныйТеги.
до 10 элементов · без повторов
originalNamestringИсходное имя файла.
typestringобязательныйIMAGE,VIDEO,PASTEилиFOLDER— папка с кодом.значения:
"IMAGE""VIDEO""PASTE""FOLDER"mimestringобязательныйMIME-тип сохранённого файла.
pasteFormatstringили nullФормат заметки.
значения:
"plain""markdown""code"pasteLanguagestringили nullЯзык подсветки заметки.
folderFilesintegerили nullУ папки с кодом — сколько в ней файлов; у остального null.
от 1
revisionintegerобязательныйРевизия текста заметки для правки.
от 1
accessVersionintegerобязательныйShare access version: 1 for a new file, raised by every change of visibility, password or one-time. From 2 on,
urlcarries it as ?v= so messengers build a fresh link card instead of the one they kept for the previous access.от 1
sizeinteger · int64обязательныйРазмер в байтах.
visibilitystringобязательныйДоступ:
private,unlistedилиpublic.значения:
"private""unlisted""public"allowDownloadbooleanобязательныйПоказывается ли кнопка скачивания.
passwordProtectedbooleanобязательныйЕсть ли пароль.
oneTimebooleanобязательныйОдноразовая ли ссылка.
consumedAtstring · date-timeили nullКогда одноразовая ссылка была открыта.
readExpiresAtstring · date-timeили nullДо какого момента открывший одноразовую ссылку может смотреть файл.
readMaxExpiresAtstring · date-timeили nullСамый поздний конец доступа по одноразовой ссылке.
hasVideoTextbooleanЕсть ли у видео субтитры или расшифровка.
videoTextRevisionintegerРевизия текста видео.
0–2 147 483 647
viewsintegerобязательныйЗасчитанные открытия гостями, без повторов в пределах доступа зрителя (обычно сутки). Просмотры владельца не считаются.
от 0
viewLimitintegerили nullЛимит просмотров (Pro) или null.
1–1 000 000
viewLimitReachedAtstring · date-timeили nullКогда лимит просмотров исчерпан; null, пока просмотры есть или лимита нет.
mediaStatusstringОбработка:
PROCESSING— идёт,READY— готово,FAILED— не удалась. Воспроизведение и превью — послеREADY; оригинал владелец может скачать и раньше, с?download=1.значения:
"PROCESSING""READY""FAILED"mediaErrorstringили nullПричина, если обработка не удалась.
widthintegerили nullШирина в пикселях.
heightintegerили nullВысота в пикселях.
durationMsintegerили nullДлительность видео в миллисекундах.
videoCodecstringили nullКодек видео.
hasAudiobooleanЕсть ли звук.
previewUrlstringили nullАдрес зашифрованного превью; доступ — как у самого файла.
expiresAtstring · date-timeили nullКогда файл и ссылка перестанут работать; null — без срока.
createdAtstring · date-timeобязательныйКогда создан.
urlstring · uriобязательныйСсылка на страницу файла.
mediaUrlstringобязательныйАдрес самого файла.
moderationHoldstringили nullАвтопроверка:
review— скрыт до решения модератора,blocked— скрыт модератором. Другие видят такой файл как приватный.значения:
"review""blocked"favoritebooleanВ избранном (в списках).
ownedbooleanСвой файл (в списках).
authorobjectАвтор.
3 поля
idstringid автора.
usernamestringНикнейм.
namestringИмя.
- 401Нужен действующий ключ
- 403Нет права или функции тарифа
- 404Не найдено
- 408Тело запроса перестало приходить
- 409Конфликт
- 410Файл удалён или истёк
- 429Слишком много запросов
- 500Сбой на сервере
- 503Сервис занят или недоступен
Пример ответа
{
"id": "Xq3u9RkT0bLmA7cV2pWz1eFy",
"state": "COMPLETED",
"filename": "recording.mp4",
"size": 4194304,
"chunkSize": 2097152,
"chunkCount": 2,
"fingerprint": "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8",
"received": [
0,
1
],
"receivedBytes": 4194304,
"expiresAt": "2026-09-28T09:30:00.000Z",
"content": {
"id": "Xq3u9RkT0bLmA7cV2pWz1eFy",
"title": "capture",
"tags": [
"release"
],
"originalName": "capture.png",
"type": "IMAGE",
"mime": "image/png",
"pasteFormat": null,
"pasteLanguage": null,
"folderFiles": 1,
"revision": 1,
"accessVersion": 1,
"size": 482133,
"visibility": "unlisted",
"allowDownload": true,
"passwordProtected": false,
"oneTime": false,
"consumedAt": null,
"readExpiresAt": null,
"readMaxExpiresAt": null,
"hasVideoText": false,
"videoTextRevision": 0,
"views": 3,
"viewLimit": null,
"viewLimitReachedAt": null,
"mediaStatus": "READY",
"mediaError": null,
"width": 1920,
"height": 1080,
"durationMs": null,
"videoCodec": null,
"hasAudio": false,
"previewUrl": null,
"expiresAt": null,
"createdAt": "2026-09-27T09:30:00.000Z",
"url": "https://lac.pics/s/Xq3u9RkT0bLmA7cV2pWz1eFy",
"mediaUrl": "/api/media/Xq3u9RkT0bLmA7cV2pWz1eFy",
"moderationHold": null,
"favorite": false,
"owned": true,
"author": {
"id": "cmf8a1x2k0000q7lh3v9w2e4d",
"username": "alex",
"name": "Alex"
}
}
}Коды ошибок
| Код | Статус | Текст |
|---|---|---|
UPLOAD_FORMAT_UNSUPPORTED | 400 | Поддерживаются статичные PNG, JPEG, WebP, AVIF, а также MP4 и WebM. Изображение — до 40 мегапикселей. |
IMAGE_TOO_LARGE | 413 | Изображение больше допустимого размера. Сожми его или уменьши разрешение. |
UPLOAD_TOO_LARGE | 413 | Файл больше допустимого размера. |
VIDEO_TOO_LARGE | 413 | Видео больше допустимого размера. Сожми его в «Сжатии» — в кабинете lacuna или в приложении для Windows. |
Ответы любого метода с ключом — неверный или истёкший ключ, нет права, частые запросы — в разделе Ошибки.