Загрузка файлов
Одним запросом — для скриншотов и коротких видео; по частям — для больших файлов и нестабильной сети. Ссылка на файл есть сразу после загрузки.
Одним запросом
POST /api/v1/uploads принимает multipart/form-data с полем file и необязательными title, tags, visibility, ttl, password и oneTime.
curl -X POST "https://lac.pics/api/v1/uploads" \
-H "Authorization: Bearer lac_api_YOUR_KEY" \
-H "Idempotency-Key: capture-2026-09-27-a7f3c1" \
-F "file=@capture.png" \
-F "visibility=unlisted"Изображения: PNG, JPEG, WebP и AVIF. Видео: MP4 и WebM. Тип определяется по первым байтам файла, а не по имени; HEIC не принимается. Размеры и число одновременных загрузок — в разделе Лимиты.
Повтор без дублей
Чтобы безопасно повторять загрузку после сетевой ошибки, передавай Idempotency-Key: случайную строку из 16–128 латинских букв, цифр, _ и - — одну на файл и его параметры.
- Не меньше 24 часов повтор с тем же ключом вернёт тот же файл (201) и не продлит его срок.
- 409 с
Retry-After— прошлая попытка ещё идёт; подожди и повтори с тем же ключом. - 409 без
Retry-After— с этим ключом загружали другой файл или другие параметры. - 410 — файл этой загрузки уже удалён или истёк.
Обработка видео
Видео сначала получает статус PROCESSING. Проверяй mediaStatus пакетным методом media-status: после READY доступны воспроизведение и постер. FAILED приходит с причиной в mediaError; обработку можно повторить.
Сервер не пережимает видео: принимает до 30 минут и до 3840×2160 в любой ориентации, H.264 + AAC в MP4 или VP9/AV1 + Opus в WebM, с потолком битрейта (limits.video в профиле аккаунта); остальное — 415 VIDEO_NOT_SUITABLE, такое сжимают приложение lacuna или сайт до отправки. Хранится одна версия: её показывают и скачивают. До READY загруженный файл скачивает только владелец — с ?download=1.
По частям
Для больших файлов и нестабильной сети файл делится на части по 2 МБ (не больше 50). Каждая часть отправляется отдельно, а оборванная загрузка продолжается с того места, где остановилась.
- Посчитай SHA-256 каждой части и отпечаток файла.
- Начни загрузку: POST /uploads/resumable с
Idempotency-Key. - Отправь части: PUT …/parts/{index}, до 3 одновременно.
- Заверши: POST …/complete с
completeKeyи настройками ссылки — ответ вернёт готовый файл.
Если ответ на завершение потерялся, прочитай состояние: в content будет файл. Незавершённых загрузок у аккаунта может быть до 10, каждая живёт 24 часа.
Субтитры видео
К готовому видео можно приложить субтитры SRT или WebVTT либо расшифровку текстом — одна дорожка на видео. Её видят все, кому доступно само видео. Распознавания речи нет: текст готовишь ты.
Из своей программы или скрипта
Подойдёт любая программа или скрипт, который умеет отправлять файл HTTP-запросом с заголовком: программа для скриншотов с «пользовательским загрузчиком», скрипт по расписанию, свой сервер.
- Создай ключ с пресетом «Только загрузка» в кабинете: API. Ему хватит права
content:write. - Укажи в программе адрес, заголовок и поле файла из таблицы ниже.
- Ссылку на файл программа берёт из ответа: поле
content.url.
| Настройка | Значение |
|---|---|
| Метод | POST |
| Адрес | https://lac.pics/api/v1/uploads |
| Заголовок | Authorization: Bearer lac_api_… — подробнее |
| Тело | multipart/form-data, файл — в поле file |
| Ссылка из ответа | content.url (JSON) |
Ключ даёт доступ к аккаунту — храни его как пароль и не вставляй в адрес запроса. Кто откроет файл, решает поле visibility: unlisted — все, у кого есть ссылка, private — только ты; без него действует настройка аккаунта.
Методы
- POST
/api/v1/uploadsЗагрузить файл - GET
/api/v1/media-statusСтатус обработки - POST
/api/v1/content/{id}/retryПовторить обработку - POST
/api/v1/uploads/resumableНачать загрузку по частям - PUT
/api/v1/uploads/resumable/{id}/parts/{index}Отправить часть - POST
/api/v1/uploads/resumable/{id}/completeЗавершить загрузку - GET
/api/v1/uploads/resumable/{id}Состояние загрузки - GET
/api/v1/uploads/resumableЗагрузки по частям - DELETE
/api/v1/uploads/resumable/{id}Отменить загрузку - PUT
/api/v1/content/{id}/video-textЗагрузить субтитры - GET
/api/v1/content/{id}/video-textСубтитры видео - DELETE
/api/v1/content/{id}/video-textУдалить субтитры