Files
SnapOtter/apps/docs/ru/api/rest.md
T
SnapOtterandGitHub d10d0f544f fix: release QA hardening across processing, media, security, and CI gates (#649)
A release-readiness QA pass over the whole product. The commits split into
defects a user would hit and gates that were reporting green while measuring
nothing.

## Fixes that change behaviour

Rate limiting was bypassable on every install: TRUST_PROXY defaulted to true, so
request.ip came from a client-set header and a forged X-Forwarded-For got past
the login limiter. The default is now a private-network trust list.

A transient Postgres outage stranded in-flight jobs, leaving finished output on
disk with no row pointing at it. A reconciler now resolves those rows and adopts
the bytes rather than dropping the work.

A Redis connection that moved to a new address wedged every read-blocked
consumer, so completions stopped signalling while health still answered 200.
Socket timeouts plus subscriber pings recover it.

Installing more than one AI bundle left the shared venv multi-versioned and
silently broke three tools. The installer now reconciles distributions to one
version each.

Converting an image to JXL at quality 1 through 4 returned a 500, because
libjxl 0.7 rejects the distance those values compute. The quality is floored at
what the encoder honours. A missing ffmpeg was also reported to the user as a
corrupt upload; it now says the engine is unavailable.

RAW uploads reached an unpatched LibRaw on arm64, so it is built from source at
0.22.2, and the release scan was split so it can fail on an unfixed critical
instead of hiding it behind ignore-unfixed.

## Gates that could not fail

Two mutation lanes ran zero mutants because Stryker crawled the gitignored docs
build; coverage discarded its whole report on any failing test; the lint gate
skipped root tests, scripts, and two workspaces; and several generated matrices
counted a host missing ffmpeg as a passing tool. Each now measures what it
claims.

Full evidence and the outstanding release items are tracked locally and are not
part of this branch.
2026-07-27 15:37:30 +08:00

66 KiB
Raw Blame History

description, i18n_output_hash, i18n_source_hash, i18n_provenance
description i18n_output_hash i18n_source_hash i18n_provenance
Полный справочник REST API. Эндпоинты инструментов, пакетная обработка, конвейеры, файловая библиотека, аутентификация, команды и административные операции. b2ec4e36cb9f 7e0a0db4abe0 human

Справочник REST API

Интерактивная документация API с примерами запросов и ответов доступна по адресу http://localhost:1349/api/docs.

Машиночитаемые спецификации:

  • /api/v1/openapi.yaml - спецификация OpenAPI 3.1
  • /llms.txt - удобная для LLM сводка
  • /llms-full.txt - полная удобная для LLM документация

Аутентификация

Все эндпоинты требуют аутентификации, если AUTH_ENABLED=false.

Токен сессии

# Login
curl -X POST http://localhost:1349/api/auth/login \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"admin"}'
# Returns: {"token":"<session-token>"}

# Use token (tool routes are POST multipart)
curl -X POST http://localhost:1349/api/v1/tools/image/resize \
  -H "Authorization: Bearer <session-token>" \
  -F "file=@photo.jpg" \
  -F 'settings={"width":800}'

Сессии истекают через 7 дней (настраивается через SESSION_DURATION_HOURS).

API-ключи

# Create a key (returns key once - store it)
curl -X POST http://localhost:1349/api/v1/api-keys \
  -H "Authorization: Bearer <session-token>" \
  -H "Content-Type: application/json" \
  -d '{"name":"my-script"}'
# Returns: {"key":"si_<96 hex chars>","id":"...","name":"my-script"}

# Use the key
curl -X POST http://localhost:1349/api/v1/tools/image/resize \
  -H "Authorization: Bearer si_<your-key>" \
  -F "file=@photo.jpg" \
  -F 'settings={"width":800}'

Ключи имеют префикс si_ и хранятся как scrypt-хеши: необработанный ключ показывается один раз и после этого получить его повторно невозможно.

Эндпоинты аутентификации

Метод Путь Доступ Описание
POST /api/auth/login Публичный Вход, получение токена сессии
POST /api/auth/logout Auth Уничтожение текущей сессии
GET /api/auth/session Auth Проверка текущей сессии
POST /api/auth/change-password Auth Смена собственного пароля (аннулирует все остальные сессии и API-ключи)
GET /api/auth/users Admin Список всех пользователей
POST /api/auth/register Admin Создание нового пользователя
PUT /api/auth/users/:id Admin Обновление роли или команды пользователя
POST /api/auth/users/:id/reset-password Admin Сброс пароля пользователя
DELETE /api/auth/users/:id Admin Удаление пользователя
GET /api/v1/config/auth Публичный Проверка, включена ли аутентификация ({ authEnabled: bool })
POST /api/auth/mfa/enroll Auth Начало регистрации TOTP MFA. Требует enterprise-функцию mfa
POST /api/auth/mfa/verify Auth Подтверждение регистрации MFA кодом TOTP
POST /api/auth/mfa/complete Публичный Завершение ожидающего запроса на вход через MFA
POST /api/auth/mfa/disable Auth Отключение MFA для текущего пользователя
POST /api/auth/users/:id/mfa/reset Admin (users:manage) Сброс MFA для пользователя
GET /api/auth/oidc/login Публичный Начало входа через OIDC, когда OIDC включён
GET /api/auth/oidc/callback Публичный Callback авторизации OIDC
GET /api/auth/saml/metadata Публичный XML-метаданные SAML SP, когда SAML включён
GET /api/auth/saml/login Публичный Начало входа через SAML
POST /api/auth/saml/callback Публичный Служба потребителя утверждений SAML

Когда для пользователя включён MFA, POST /api/auth/login возвращает {"requiresMfa":true,"mfaToken":"...","mfaRequired":true|false} вместо токена сессии. Отправьте этот mfaToken вместе с кодом TOTP или кодом восстановления на /api/auth/mfa/complete.

Разрешения

Разрешение Admin User
Использование инструментов
Собственные файлы/конвейеры/API-ключи
Просмотр файлов/конвейеров/ключей всех пользователей -
Запись настроек -
Управление пользователями и командами -
Управление брендингом -

Проверка состояния

Метод Путь Доступ Описание
GET /api/v1/health Публичный Базовая проверка состояния. Возвращает {"status":"healthy","version":"..."} с кодом 200 или {"status":"unhealthy"} с кодом 503, если база данных недоступна.
GET /api/v1/readyz Публичный Проба готовности. Проверяет PostgreSQL, Redis, дисковое пространство и S3, если он настроен. Возвращает 503, когда экземпляр не должен принимать трафик.
GET /api/v1/admin/health Admin (system:health) Подробная диагностика, включая время работы, режим хранилища, состояние базы данных, состояние очереди и доступность GPU.

Использование инструментов

Каждый инструмент следует одному и тому же шаблону:

# Single file
curl -X POST http://localhost:1349/api/v1/tools/<section>/<toolId> \
  -H "Authorization: Bearer <token>" \
  -F "file=@input.jpg" \
  -F 'settings={"width":800,"height":600}'

# Batch (returns ZIP)
curl -X POST http://localhost:1349/api/v1/tools/<section>/<toolId>/batch \
  -H "Authorization: Bearer <token>" \
  -F "files=@a.jpg" \
  -F "files=@b.jpg" \
  -F 'settings={...}'

<section> - это одно из image, video, audio, pdf или files.

  • Загрузка - это multipart/form-data.
  • settings - это JSON-строка с опциями конкретного инструмента.
  • clientJobId - необязательное поле формы для корреляции прогресса, задаваемой вызывающей стороной.
  • fileId - необязательное поле формы, ссылающееся на существующий элемент файловой библиотеки. Если оно присутствует, обработанный результат сохраняется как новая версия, и ответ включает savedFileId.
  • Быстрые инструменты обычно возвращают JSON с кодом 200: {"jobId":"...","downloadUrl":"/api/v1/download/<jobId>/<filename>","originalSize":1234,"processedSize":567}. Получите обработанный файл из downloadUrl.
  • Любой поставленный в очередь инструмент может вернуть JSON с кодом 202, если он долго выполняется или превышает окно синхронного ожидания: {"jobId":"...","async":true}. Подключитесь к SSE для отслеживания прогресса, затем загрузите результат по завершении (см. Отслеживание прогресса).
  • Пакетные маршруты возвращают ZIP-архив, передаваемый напрямую (с заголовком X-Job-Id), для инструментов, зарегистрированных в общем пакетном реестре.

Справочник инструментов

Пресеты конвертации

Общий каталог включает 83 специальных эндпоинта пресетов конвертации, таких как jpg-to-png, mov-to-mp4, m4a-to-mp3, pdf-to-jpg и excel-to-csv. Пресеты - это полноценные маршруты инструментов:

POST /api/v1/tools/<section>/<presetId>

Каждый пресет фиксирует выходной формат и делегирует базовому инструменту, такому как convert, convert-video, extract-audio, convert-audio, image-to-pdf, pdf-to-image, svg-to-raster или convert-spreadsheet. Полную таблицу маршрутов и необязательные настройки см. в Пресеты конвертации.

Основное

ID инструмента Название Ключевые настройки
resize Изменение размера width, height, fit (cover/contain/fill/inside/outside), percentage, withoutEnlargement, плюс 23 пресета для соцсетей
crop Обрезка left, top, width, height, unit (px/percent)
rotate Поворот и отражение angle, horizontal (bool), vertical (bool)
convert Конвертация format (jpg/png/webp/avif/tiff/gif/heic/heif), quality
compress Сжатие mode (quality/targetSize), quality (1100), targetSizeKb

Оптимизация

ID инструмента Название Ключевые настройки
optimize-for-web Оптимизация для веба format (webp/jpeg/avif/png), quality, maxWidth, maxHeight, progressive, stripMetadata
strip-metadata Удаление метаданных -
edit-metadata Редактирование метаданных title, description, author, copyright, keywords, gps (lat/lon), dateTime
bulk-rename Массовое переименование pattern (поддерживает {n}, {date}, {original}), startIndex, padding
image-to-pdf Изображение в PDF pageSize (A4/Letter/...), orientation, margin, targetSize ({value, unit})
favicon Генератор фавиконов padding, backgroundColor, borderRadius - генерирует все стандартные размеры

Корректировки

ID инструмента Название Ключевые настройки
adjust-colors Настройка цветов brightness, contrast, exposure, saturation, temperature, tint, hue, sharpness, red, green, blue, effect (none/grayscale/sepia/invert)
sharpening Резкость method (adaptive/unsharp-mask/high-pass), sigma, m1, m2, x1, y2, y3, amount, radius, threshold, strength, kernelSize (3/5), denoise (off/light/medium/strong)
replace-color Замена цвета sourceColor, targetColor (замена), makeTransparent, tolerance
color-blindness Симуляция дальтонизма simulationType (protanopia/deuteranopia/tritanopia/protanomaly/deuteranomaly/tritanomaly/achromatopsia/blueConeMonochromacy, по умолчанию "deuteranomaly")
duotone Дуотон shadow (hex), highlight (hex), intensity (0-100)
pixelate Пикселизация blockSize (2-128), region ({left, top, width, height} для частичной пикселизации)
vignette Виньетка strength (0.1-1), color (hex), radius, softness, roundness, centerX, centerY

AI-инструменты

Все AI-инструменты работают на вашем оборудовании: по умолчанию на CPU или на NVIDIA CUDA, когда доступен поддерживаемый графический процессор NVIDIA. Аппаратное ускорение iGPU Intel/AMD через VA-API, Quick Sync или OpenCL для AI-инференса сегодня не поддерживается. Интернет не требуется.

ID инструмента Название AI-модель Ключевые настройки
remove-background Удаление фона rembg (BiRefNet / U2-Net) model, backgroundType (transparent/color/gradient/blur/image), backgroundColor, gradientColor1, gradientColor2, gradientAngle, blurEnabled, blurIntensity, shadowEnabled, shadowOpacity
upscale Апскейл изображения RealESRGAN scale (2/4), model, faceEnhance, denoise, format, quality
erase-object Ластик объектов LaMa (ONNX) Маска отправляется как вторая файловая часть (fieldname mask), format, quality
ocr OCR / Извлечение текста Tesseract (быстрый); RapidOCR + PP-OCR ONNX (сбалансированный/лучший) quality (быстрый/сбалансированный/лучший), language, enhance
blur-faces Размытие лиц / PII MediaPipe blurRadius, sensitivity
smart-crop Умная обрезка MediaPipe + Sharp mode (subject/face/trim), strategy (attention/entropy), width, height, padding, facePreset (closeup/head-shoulders/upper-body/half-body), sensitivity, threshold, padToSquare, padColor, targetSize, quality
image-enhancement Улучшение изображения На основе анализа mode (auto/exposure/contrast/color/sharpness), strength
enhance-faces Улучшение лиц GFPGAN / CodeFormer model (gfpgan/codeformer), strength, sensitivity, centerFace
colorize AI-колоризация DDColor intensity, model
noise-removal Удаление шума Ступенчатое шумоподавление tier (quick/balanced/quality/maximum), strength, detailPreservation, colorNoise, format, quality
red-eye-removal Удаление красных глаз Ориентиры лица + анализ цвета sensitivity, strength
restore-photo Восстановление фото Многоступенчатый конвейер mode (auto/light/heavy), scratchRemoval, faceEnhancement, fidelity, denoise, denoiseStrength, colorize
passport-photo Фото на паспорт Ориентиры MediaPipe Двухфазный процесс. Анализ использует multipart file; генерация использует JSON с countryCode, bgColor, printLayout (none/4x6/a4), ориентирами, размерами изображения
content-aware-resize Контентно-зависимое изменение размера Seam carving (caire) width, height, protectFaces, blurRadius, sobelThreshold, square
transparency-fixer Исправление прозрачности PNG BiRefNet HR-matting defringe (0-100), outputFormat (png/webp)
background-replace Замена фона rembg (BiRefNet) backgroundType (color/gradient), color (hex), gradientColor1, gradientColor2, gradientAngle, feather (0-20), format (png/webp)
blur-background Размытие фона rembg (BiRefNet) intensity (1-100), feather (0-20), format (png/webp)
ai-canvas-expand AI-расширение холста LaMa (outpainting) extendTop, extendRight, extendBottom, extendLeft (px), tier (fast/balanced/high), format, quality

Водяной знак и наложение

ID инструмента Название Ключевые настройки
watermark-text Текстовый водяной знак text, font, fontSize, color, opacity, position, rotation, tile
watermark-image Водяной знак-изображение opacity, position, scale - второй файл является водяным знаком
text-overlay Наложение текста text, font, fontSize, color, x, y, background, padding, borderRadius
compose Композиция изображений x, y, opacity, blend - второй файл накладывается поверх
meme-generator Генератор мемов templateId, textLayout (top-bottom/top-only/bottom-only/center/side-by-side), textBoxes ([{id, text}]), fontFamily (anton/arial-black/comic-sans/montserrat/bebas-neue/permanent-marker/roboto), fontSize, textColor, strokeColor, textAlign, allCaps. Поддерживает режим шаблона (тело JSON с templateId) или режим пользовательского изображения (multipart с файлом).

Утилиты

ID инструмента Название Ключевые настройки
info Информация об изображении - (возвращает width, height, format, size, channels, hasAlpha, DPI, EXIF)
compare Сравнение изображений mode (side-by-side/overlay/diff), diffThreshold - второй файл является целью сравнения
find-duplicates Поиск дубликатов threshold (расстояние перцептивного хеша, по умолчанию 8) - несколько файлов
color-palette Цветовая палитра count (количество доминирующих цветов), format (hex/rgb)
qr-generate Генератор QR-кодов data, size, margin, colorDark, colorLight, errorCorrectionLevel, dotStyle, cornerStyle, logo (необязательный файл)
barcode-read Считыватель штрихкодов - (автоматически определяет QR, EAN, Code128, DataMatrix и т. д.)
image-to-base64 Изображение в Base64 format (data-uri/plain), mimeType
html-to-image HTML в изображение url, format (png/jpg/webp), quality, fullPage, devicePreset (desktop/tablet/mobile/custom), viewportWidth, viewportHeight
histogram Гистограмма scale (linear/log) - возвращает график RGB-гистограммы + статистику по каналам
lqip-placeholder LQIP-заполнитель width (4-64), blur, strategy (blur/pixelate/solid), format (webp/png/jpeg), quality
barcode-generate Генератор штрихкодов text, type (code128/ean13/upca/code39/itf14/datamatrix), scale (1-8), includeText (bool). Тело JSON, без загрузки файла.

Компоновка и композиция

ID инструмента Название Ключевые настройки
collage Коллаж / Сетка template (25+ макетов), gap, backgroundColor, borderRadius - несколько файлов
stitch Сшивка / Объединение direction (horizontal/vertical/grid), gap, backgroundColor, alignment - несколько файлов
split Разделение изображения mode (grid/rows/cols), rows, cols, tileWidth, tileHeight
border Рамка и обрамление width, color, style (solid/gradient/pattern), borderRadius, padding, shadow
beautify Оформление скриншота backgroundType (solid/linear-gradient/radial-gradient/image/transparent), gradientStops, padding, borderRadius, shadowPreset, frame (none/macos-light/macos-dark/windows-light/windows-dark/browser-light/browser-dark/iphone/macbook/ipad/...), socialPreset (none/twitter/linkedin/instagram-square/instagram-story/facebook/producthunt), watermarkText, outputFormat
circle-crop Круглая обрезка zoom (1-5), offsetX, offsetY, borderWidth, borderColor, background (transparent/hex), outputSize
image-pad Отступы изображения target (16:9/9:16/1:1/4:3/3:4/custom), ratioW, ratioH, background (color/transparent/blur), color (hex), padding (0-50%)
sprite-sheet Спрайт-лист columns (1-16), padding, background (hex), format (png/webp/jpeg), quality - несколько файлов (2-64 изображения)

Формат и конвертация

ID инструмента Название Ключевые настройки
svg-to-raster SVG в растр format (png/jpeg/webp/avif/tiff/gif/heif), width, height, scale, dpi, background
vectorize Изображение в SVG colorMode (bw/color), threshold, colorPrecision, filterSpeckle, pathMode (none/polygon/spline)
gif-tools Инструменты GIF action (resize/optimize/reverse/speed/extract-frames/rotate/add-text), параметры конкретного действия
gif-webp Конвертер GIF/WebP quality (1-100), lossless (bool), resizePercent (10-100)

Инструменты для видео

ID инструмента Название Ключевые настройки
convert-video Конвертация видео format (mp4/mov/webm/avi/mkv), quality (high/balanced/small)
compress-video Сжатие видео quality (light/balanced/strong), resolution (original/1080p/720p/480p)
trim-video Обрезка видео startS, endS, precise (bool, покадрово точный срез)
mute-video Отключение звука видео -
video-to-gif Видео в GIF fps (1-30), width, startS, durationS (макс. 60 с)
resize-video Изменение размера видео width, height, preset (custom/2160p/1440p/1080p/720p/480p/360p)
crop-video Обрезка кадра видео width, height, x, y
rotate-video Поворот видео transform (cw90/ccw90/180/hflip/vflip)
change-fps Изменение FPS fps (1-120)
video-color Цвет видео brightness, contrast, saturation, gamma
video-speed Скорость видео factor (0.25-4), keepPitch (bool)
reverse-video Реверс видео - (макс. 5 минут)
video-loudnorm Нормализация звука - (EBU R128)
aspect-pad Отступы по соотношению сторон target (16:9/9:16/1:1/4:3/3:4), color (hex)
blur-pad Отступы с размытием target (16:9/9:16/1:1/4:3/3:4), blur (2-50)
watermark-video Водяной знак на видео text, position, fontSize, opacity, color
stabilize-video Стабилизация видео smoothing (5-60, в кадрах)
gif-to-video GIF в видео format (mp4/webm/mov)
video-to-webp Видео в WebP fps, width, quality, loop (bool)
video-to-frames Видео в кадры mode (all/nth/timestamps), n, timestamps, format (png/jpg)
merge-videos Объединение видео - (несколько файлов, приведённых к разрешению первого видео)
replace-audio Замена аудио - (видео + аудиофайл, два файла)
burn-subtitles Вшивание субтитров fontSize (8-72) - видео + файл субтитров
embed-subtitles Встраивание субтитров language (код ISO 639-2/B) - видео + файл субтитров
extract-subtitles Извлечение субтитров - (выводит SRT)
images-to-video Изображения в видео secondsPerImage (0.5-10), resolution (1080p/720p/square), fps - несколько файлов
video-metadata Очистка метаданных видео -
auto-subtitles Автосубтитры (AI) language (auto/en/de/fr/es/zh/ja/ko/id/th/vi), format (srt/vtt)
extract-audio Извлечение аудио format (mp3/wav/m4a/ogg)

Инструменты для аудио

ID инструмента Название Ключевые настройки
convert-audio Конвертация аудио format (mp3/wav/ogg/flac/m4a), bitrateKbps (32-320)
trim-audio Обрезка аудио startS, endS
volume-adjust Регулировка громкости gainDb (-30 до 30)
normalize-audio Нормализация звука - (EBU R128, -16 LUFS)
fade-audio Затухание аудио fadeInS (0-30), fadeOutS (0-30)
reverse-audio Реверс аудио -
audio-speed Скорость аудио factor (0.25-4)
pitch-shift Сдвиг тона semitones (-12 до 12)
audio-channels Аудиоканалы mode (stereo-to-mono/mono-to-stereo/swap)
silence-removal Удаление тишины thresholdDb (-80 до -20), minSilenceS (0.1-5)
noise-reduction Шумоподавление strength (light/medium/strong)
merge-audio Объединение аудио format (mp3/wav/flac/m4a) - несколько файлов
split-audio Разделение аудио mode (time/parts/silence), segmentS, parts, thresholdDb, minSilenceS
ringtone-maker Создание рингтона startS, durationS (1-30)
waveform-image Изображение осциллограммы width, height, color (hex)
audio-metadata Метаданные аудио strip (bool), title, artist, album
transcribe-audio Транскрибация аудио (AI) language (auto/en/de/fr/es/zh/ja/ko/id/th/vi), outputFormat (txt/srt/vtt)

Инструменты для документов

ID инструмента Название Ключевые настройки
merge-pdf Объединение PDF - (несколько файлов, до 20 PDF)
split-pdf Разделение PDF mode (range/every), range, everyN (1-500)
compress-pdf Сжатие PDF mode (quality/targetSize), quality (1-100), targetSizeKb
rotate-pdf Поворот PDF angle (90/180/270), range (диапазон страниц)
extract-pages Извлечение страниц range (синтаксис qpdf, напр. "1-5,8,10-z")
remove-pages Удаление страниц pages (диапазон qpdf для удаления)
organize-pdf Упорядочивание PDF order (порядок страниц qpdf, напр. "3,1,2,5-z")
protect-pdf Защита PDF userPassword, ownerPassword (AES-256)
unlock-pdf Снятие защиты PDF password
repair-pdf Восстановление PDF -
linearize-pdf Веб-оптимизация PDF - (линеаризация для быстрого веб-просмотра)
grayscale-pdf PDF в оттенки серого -
pdfa-convert Конвертация PDF/A - (архивный PDF/A-2)
crop-pdf Обрезка PDF margin (0-2000 пунктов)
nup-pdf N-up PDF perSheet (2/3/4/8/9/12/16)
booklet-pdf Буклет PDF perSheet (2/4/6/8)
watermark-pdf Водяной знак PDF text, position, fontSize, opacity, rotation
pdf-page-numbers Номера страниц PDF position (bl/bc/br/tl/tc/tr), fontSize
flatten-pdf Сведение PDF - (запекает формы и аннотации)
redact-pdf Редактирование (редакция) PDF terms (string[]), caseSensitive (bool)
sign-pdf Подписание PDF Пользовательский multipart-маршрут с PDF file, файлами подписи sig0, sig1 и JSON-массивом placements
pdf-to-text PDF в текст -
pdf-to-word PDF в Word -
pdf-metadata Метаданные PDF title, author, subject, keywords
convert-document Конвертация документа format (docx/odt/rtf/txt)
convert-presentation Конвертация презентации format (pptx/odp)
convert-spreadsheet Конвертация таблицы format (xlsx/ods/csv)
excel-to-pdf Excel в PDF -
word-to-pdf Word в PDF -
powerpoint-to-pdf PowerPoint в PDF -
html-to-pdf HTML в PDF - (удалённые ресурсы отключены)
markdown-to-docx Markdown в Word -
markdown-to-html Markdown в HTML -
markdown-to-pdf Markdown в PDF - (удалённые ресурсы отключены)
epub-convert Конвертация EPUB format (pdf/docx/html/md)
to-epub Конвертация в EPUB - (принимает .docx, .md, .html, .txt)
ocr-pdf PDF OCR (AI) quality (fast/balanced/best), language (auto/en/de/fr/es/zh/ja/ko), pages
pdf-to-image PDF в изображение pages (all/range), format, dpi, quality
pdf-to-jpg PDF в JPG pages, dpi, quality, colorMode
pdf-to-png PDF в PNG pages, dpi, quality, colorMode
pdf-to-tiff PDF в TIFF pages, dpi, quality, colorMode

Инструменты для файлов

ID инструмента Название Ключевые настройки
chart-maker Конструктор диаграмм kind (bar/line/pie), title, width, height
csv-excel CSV в Excel sheet (номер листа для входа XLSX) - двунаправленный
csv-json CSV в JSON pretty (bool) - двунаправленный
json-xml JSON в XML pretty (bool) - двунаправленный
split-csv Разделение CSV rowsPerFile (1-1000000), keepHeader (bool)
merge-csvs Объединение CSV - (несколько файлов, совпадающие столбцы)
yaml-json YAML / JSON - (двунаправленный)
xml-to-csv XML в CSV - (автоматически находит повторяющиеся элементы)
excel-to-csv Excel в CSV специальный пресет конвертации на основе convert-spreadsheet
create-zip Создание ZIP - (несколько файлов, 2-50 файлов)
extract-zip Извлечение ZIP - (защита от zip-бомб)

HTML в изображение

Снимок веб-страницы в виде изображения. В отличие от других инструментов, этот эндпоинт принимает application/json вместо multipart-формы (загрузка файла не требуется).

Эндпоинт: POST /api/v1/tools/image/html-to-image

Content-Type: application/json

Параметр Тип По умолчанию Описание
url string (обязательно) URL для захвата (только http/https)
format string "png" Выходной формат: jpg, png, webp
quality number 90 Качество 1-100 (только JPG/WebP)
fullPage boolean false Захват всей прокручиваемой страницы
devicePreset string "desktop" desktop, tablet, mobile, custom
viewportWidth number 1280 Пользовательская ширина области просмотра 320-3840
viewportHeight number 720 Пользовательская высота области просмотра 320-2160

Пример:

curl -X POST http://localhost:1349/api/v1/tools/image/html-to-image \
  -H "Authorization: Bearer $TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"url": "https://snapotter.com", "format": "png", "devicePreset": "desktop"}'

Ответ:

{
  "jobId": "uuid",
  "downloadUrl": "/api/v1/download/{jobId}/screenshot.png",
  "originalSize": 0,
  "processedSize": 54321
}

Подмаршруты инструментов

Некоторые инструменты предоставляют дополнительные эндпоинты помимо стандартного POST /api/v1/tools/<section>/<toolId>:

Метод Путь Описание
GET /api/v1/tools/popular Возвращает популярные ID инструментов, откатываясь к кураторскому списку по умолчанию, когда данных об использовании мало
POST /api/v1/tools/image/remove-background/effects Применяет фоновые эффекты (color/gradient/blur/shadow) без повторного запуска AI. Использует кешированную маску от исходного удаления.
POST /api/v1/tools/image/edit-metadata/inspect Читает существующие метаданные EXIF/IPTC/XMP из изображения
POST /api/v1/tools/image/strip-metadata/inspect Проверка полей метаданных перед удалением
POST /api/v1/tools/image/passport-photo/analyze Фаза 1: AI-детекция лиц + удаление фона. Возвращает ориентиры лица и кешированные данные.
POST /api/v1/tools/image/passport-photo/generate Фаза 2: Обрезка, изменение размера и разбиение на плитки с использованием кешированного анализа. Без повторного запуска AI.
POST /api/v1/tools/image/gif-tools/info Получение метаданных GIF (количество кадров, размеры, длительность)
POST /api/v1/tools/pdf/pdf-to-image/info Получение метаданных PDF (количество страниц, размеры)
POST /api/v1/tools/pdf/pdf-to-image/preview Генерация превью конкретной страницы PDF
POST /api/v1/tools/pdf/pdf-to-jpg/info Получение метаданных PDF для специального пресета JPG
POST /api/v1/tools/pdf/pdf-to-jpg/preview Генерация превью страницы PDF для пресета JPG
POST /api/v1/tools/pdf/pdf-to-png/info Получение метаданных PDF для специального пресета PNG
POST /api/v1/tools/pdf/pdf-to-png/preview Генерация превью страницы PDF для пресета PNG
POST /api/v1/tools/pdf/pdf-to-tiff/info Получение метаданных PDF для специального пресета TIFF
POST /api/v1/tools/pdf/pdf-to-tiff/preview Генерация превью страницы PDF для пресета TIFF
POST /api/v1/tools/image/svg-to-raster/batch Пакетная конвертация нескольких SVG в растр
POST /api/v1/tools/image/image-enhancement/analyze Анализ качества изображения и возврат рекомендаций по улучшению
POST /api/v1/tools/image/optimize-for-web/preview Лёгкое превью для настройки параметров в реальном времени. Возвращает оптимизированное изображение с заголовками размера.

Пакетная обработка

Применение общего инструмента с поддержкой пакетной обработки к нескольким файлам сразу. Возвращает ZIP-архив. Пользовательские многофайловые или многошаговые маршруты, такие как подписание PDF и маршруты пресетов PDF-в-изображение, используют собственный контракт эндпоинта вместо общего маршрута /batch.

Инструмент ocr-pdf поддерживает этот общий маршрут /batch.

curl -X POST http://localhost:1349/api/v1/tools/image/compress/batch \
  -H "Authorization: Bearer <token>" \
  -F "files=@a.jpg" \
  -F "files=@b.jpg" \
  -F "files=@c.jpg" \
  -F 'settings={"quality":80}'

Параллелизм контролируется через CONCURRENT_JOBS (по умолчанию: автоопределение по ядрам CPU). MAX_BATCH_SIZE ограничивает количество файлов на пакет (по умолчанию: 100; установите 0 для снятия ограничения).

Конвейеры

Выполнение конвейера

# Single file
curl -X POST http://localhost:1349/api/v1/pipeline/execute \
  -H "Authorization: Bearer <token>" \
  -F "file=@input.jpg" \
  -F 'pipeline={"steps":[
    {"toolId":"resize","settings":{"width":1200}},
    {"toolId":"compress","settings":{"quality":80}},
    {"toolId":"watermark-text","settings":{"text":"© 2025"}}
  ]}'

# Batch (multiple files → ZIP)
curl -X POST http://localhost:1349/api/v1/pipeline/batch \
  -H "Authorization: Bearer <token>" \
  -F "files=@a.jpg" \
  -F "files=@b.jpg" \
  -F 'pipeline={"steps":[{"toolId":"resize","settings":{"width":800}}]}'

Выход каждого шага является входом следующего шага. Конвейеры по умолчанию допускают 20 шагов, настраивается через MAX_PIPELINE_STEPS. Установите MAX_PIPELINE_STEPS=0 для снятия ограничения.

Сохранение и управление конвейерами

Метод Путь Описание
POST /api/v1/pipeline/save Сохранить именованный конвейер (name, description, steps[])
GET /api/v1/pipeline/list Список сохранённых конвейеров (администраторы видят все; пользователи видят свои)
DELETE /api/v1/pipeline/:id Удалить (владелец или администратор)
GET /api/v1/pipeline/tools Список ID инструментов, допустимых для шагов конвейера

Отслеживание прогресса

Долго выполняющиеся задания, поставленные в очередь инструменты, пакетные задания и конвейеры передают прогресс в реальном времени через Server-Sent Events. Поток прогресса публичен и привязан к идентификатору задания, поэтому клиентам не нужно отправлять заголовок Authorization для его чтения.

# Connect to the SSE stream (jobId is in the JSON response body from the tool endpoint)
curl -N http://localhost:1349/api/v1/jobs/<jobId>/progress

Формат события:

data: {"jobId":"...","type":"single","phase":"processing","stage":"Upscaling","percent":42}
data: {"jobId":"...","type":"single","phase":"complete","percent":100,"result":{"downloadUrl":"/api/v1/download/..."}}
data: {"jobId":"...","type":"batch","status":"processing","completedFiles":2,"totalFiles":5,"failedFiles":0,"errors":[]}

Вы можете запросить отмену поставленного в очередь или выполняющегося задания через POST /api/v1/jobs/:jobId/cancel. Ответом будет {"canceled":true|false}.

Файловая библиотека

Постоянное хранилище файлов с историей версий.

Метод Путь Описание
POST /api/v1/upload Загрузка файлов в рабочую область (временная обработка)
POST /api/v1/files/upload Загрузка файлов в постоянную файловую библиотеку
POST /api/v1/files/save-result Сохранение результата обработки инструмента как новой версии файла
GET /api/v1/files Список сохранённых файлов (с пагинацией и поиском)
GET /api/v1/files/:id Получение метаданных файла + цепочки версий
GET /api/v1/files/:id/download Загрузка файла
GET /api/v1/files/:id/thumbnail Получение JPEG-миниатюры 300px
DELETE /api/v1/files Массовое удаление файлов и их цепочек версий (тело: { ids: [...] })
POST /api/v1/fetch-urls Загрузка удалённых URL в рабочую область для импорта по URL
POST /api/v1/preview Генерация совместимого с браузером WebP-превью (для форматов HEIC/HEIF/RAW)
GET /api/v1/files/:id/preview Потоковая передача кешированного или сгенерированного совместимого с браузером превью для сохранённого PDF, офисного документа, видео- или аудиофайла
POST /api/v1/preview/generate Генерация MP4- или MP3-превью по запросу для загруженного медиафайла без предварительного сохранения
GET /api/v1/download/:jobId/:filename Загрузка обработанного файла из рабочей области

Чтобы автоматически сохранить результат инструмента в библиотеку, включите fileId как поле multipart-формы, ссылающееся на существующий файл библиотеки. Обработанный результат будет сохранён как новая версия.

Управление API-ключами

Метод Путь Доступ Описание
POST /api/v1/api-keys Auth Генерация нового ключа - показывается один раз
GET /api/v1/api-keys Auth Список ключей (name, id, lastUsedAt - не необработанный ключ)
DELETE /api/v1/api-keys/:id Auth Удаление ключа

Команды

Метод Путь Доступ Описание
GET /api/v1/teams Admin (teams:manage) Список команд
POST /api/v1/teams Admin (teams:manage) Создание команды
PUT /api/v1/teams/:id Admin (teams:manage) Переименование команды
DELETE /api/v1/teams/:id Admin (teams:manage) Удаление команды (нельзя удалить команду по умолчанию или команды с участниками)

Настройки

Конфигурация среды выполнения использует закрытый набор распознаваемых ключей. Для чтения требуется settings:read, а для записи — settings:write; для ключей безопасности и соответствия дополнительно требуются security:manage или compliance:manage. Секретные настройки требуют полномочий администратора в полном объёме, а учётные данные и состояние, управляемые специализированными конечными точками, здесь доступны только для чтения. Пакетные обновления проверяются до записи любого значения.

Метод Путь Описание
GET /api/v1/settings Получить все настройки
PUT /api/v1/settings Массовое обновление настроек (тело JSON с парами «ключ-значение»)
GET /api/v1/settings/:key Получить конкретную настройку по ключу

Примеры ключей: disabledTools (JSON-массив идентификаторов инструментов), enableExperimentalTools (логическое значение), loginAttemptLimit (политика безопасности) и auditRetentionDays (политика соответствия). Неизвестные ключи отклоняются.

Предпочтения

Пользовательские предпочтения отделены от настроек экземпляра. Любой аутентифицированный пользователь может читать и обновлять собственную карту предпочтений.

Метод Путь Описание
GET /api/v1/preferences Получить предпочтения текущего пользователя как { "preferences": { ... } }
PUT /api/v1/preferences Вставить или обновить один или несколько ключей предпочтений для текущего пользователя

Роли

Управление пользовательскими ролями с гранулярными разрешениями.

Метод Путь Доступ Описание
GET /api/v1/roles Admin (audit:read) Список всех ролей с количеством пользователей
POST /api/v1/roles Admin (security:manage) Создание пользовательской роли (name, description, permissions)
PUT /api/v1/roles/:id Admin (security:manage) Обновление пользовательской роли (нельзя изменять встроенные роли)
DELETE /api/v1/roles/:id Admin (security:manage) Удаление пользовательской роли (нельзя удалять встроенные роли; затронутые пользователи возвращаются к роли user)

Доступные разрешения (17): tools:use, files:own, files:all, apikeys:own, apikeys:all, pipelines:own, pipelines:all, settings:read, settings:write, users:manage, teams:manage, features:manage, system:health, audit:read, compliance:manage, webhooks:manage, security:manage.

Журнал аудита

Эндпоинт только для администраторов для просмотра действий, связанных с безопасностью.

Метод Путь Доступ Описание
GET /api/v1/audit-log Admin (audit:read) Журнал аудита с пагинацией и необязательными фильтрами

Параметры запроса:

Параметр Описание
page Номер страницы (по умолчанию: 1)
limit Записей на страницу (по умолчанию: 50, макс.: 100)
action Фильтр по типу действия (напр. ROLE_CREATED, ROLE_DELETED)
ip Фильтр по исходному IP-адресу
from Фильтр записей после этой даты в формате ISO 8601
to Фильтр записей до этой даты в формате ISO 8601

Аналитика

Метод Путь Доступ Описание
GET /api/v1/config/analytics Публичный Получить действующую конфигурацию аналитики (ключ PostHog, Sentry DSN, частота выборки). Ключи, DSN и идентификатор экземпляра пусты, когда аналитика выключена, будь то из-за настройки на этапе компиляции или настройки экземпляра analyticsEnabled.
POST /api/v1/feedback Auth Отправить явную обратную связь пользователя в настроенный проект PostHog как feedback_submitted. Маршрут учитывает шлюз аналитики, ограничивает частоту отправок, удаляет контактные поля, если contactOk не равно true, и никогда не принимает содержимое файлов, имена файлов, пути загрузки или необработанный текст приватных ошибок. Когда аналитика отключена, он возвращает { "ok": true, "accepted": false }.
PUT /api/v1/settings Admin (settings:write) Установить отказ на уровне всего экземпляра. Отправьте тело JSON { "analyticsEnabled": "false" }, чтобы отключить аналитику для всех, или "true", чтобы снова включить её.

Функции / AI-бандлы

Управление бандлами AI-функций (установка/удаление пакетов AI-моделей в среде Docker). Предпочтительнее использовать эндпоинт установки на уровне инструмента при включении инструмента из пользовательской автоматизации: некоторым AI-инструментам нужно более одного общего бандла, и этот эндпоинт пропускает уже установленные бандлы, ставя в очередь только недостающие.

OCR — это необязательное расширение, а не жесткая зависимость. Его уровень fast Tesseract работает без пакета; POST /api/v1/admin/features/ocr/install устанавливает подписанный пакет RapidOCR для balanced и best на Linux amd64 или arm64. Точная среда выполнения OCR использует CPU на хостах только с ЦП и NVIDIA и требует не менее 4 GiB эффективной памяти (настроенный предел cgroup контейнера, в противном случае память хоста). SnapOtter сообщает о requiredMemoryBytes, effectiveMemoryBytes и причине совместимости insufficient-memory и отклоняет несовместимую установку перед загрузкой. Это требование к памяти не применяется к fast. Пакет составляет около 208-234 MiB для загрузки и 409-488 MiB для установки, в зависимости от цели; подписанный индекс связывает точные размеры, применяемые во время установки.

Метод Путь Доступ Описание
GET /api/v1/features Auth Список всех бандлов функций и их статуса установки
POST /api/v1/admin/features/:bundleId/install Admin (features:manage) Установить бандл функции (асинхронно, возвращает jobId для отслеживания прогресса)
POST /api/v1/admin/tools/:toolId/features/install Admin (features:manage) Установить каждый бандл, который требуется инструменту; возвращает статус queued/skipped по каждому бандлу
POST /api/v1/admin/features/:bundleId/uninstall Admin (features:manage) Удалить бандл функции и очистить файлы моделей
GET /api/v1/admin/features/disk-usage Admin (features:manage) Получить общее использование диска AI-моделями
POST /api/v1/admin/features/import Администратор (features:manage) Импортируйте устаревший пакет AI (file) или подписанный оффлайн OCR выпускать (index плюс archive)

Импорт OCR с воздушным зазором должен включать подписанный ocr-runtime-index.json выпуска и соответствующий архив платформы. SnapOtter применяет ту же подпись Ed25519, хэш артефакта, совместимость, извлечение и дымовые тесты, которые используются при онлайн-установке:

curl -X POST http://localhost:1349/api/v1/admin/features/import \
  -H "Authorization: Bearer <admin-token>" \
  -F "index=@ocr-runtime-index.json" \
  -F "archive=@ocr-linux-amd64-cpu-py312.tar.gz"

Используйте архив linux-arm64-cpu-py311 на arm64. Подписанный артефакт для другой цели скорее отклоняется, чем устанавливается.

Административные операции

Операционные эндпоинты для наблюдаемости, поддержки, отчётности об использовании и статуса резервного копирования.

Метод Путь Доступ Описание
GET /api/v1/admin/log-level Admin (settings:write) Прочитать текущий уровень логирования во время выполнения
POST /api/v1/admin/log-level Admin (settings:write) Изменить уровень логирования во время выполнения (fatal, error, warn, info, debug, trace или silent)
GET /api/v1/metrics Admin (system:health) Метрики Prometheus в текстовом формате
GET /api/v1/admin/support-bundle Admin (system:health) Загрузить отредактированный диагностический ZIP-бандл поддержки
GET /api/v1/admin/usage Admin (audit:read) Данные панели использования, с необязательным параметром запроса days
GET /api/v1/admin/backup-status Admin (system:health) Прочитать метаданные последнего резервного копирования и статус актуальности
POST /api/v1/admin/backup-status Admin (system:health) Записать завершённое резервное копирование (type, необязательно sizeBytes, необязательно notes)

Enterprise API

Эти маршруты ограничены лицензией через связанную с ними enterprise-функцию. Они по-прежнему требуют указанного разрешения SnapOtter.

Встроенный администратор с полными правами — это прошедший аутентификацию субъект с ролью admin и полным набором действующих разрешений администратора. Область действия ключа API, в которой отсутствует хотя бы одно разрешение администратора, не соответствует этому требованию.

Метод Путь Доступ Описание
GET /api/v1/enterprise/audit/export Admin (audit:read) Экспорт записей аудита в JSON или CSV с фильтрами
GET /api/v1/enterprise/config/export Встроенный администратор с полными правами Экспорт отредактированной конфигурации экземпляра, пользовательских ролей и команд
POST /api/v1/enterprise/config/import Встроенный администратор с полными правами Импорт конфигурации, с необязательным пробным запуском
GET /api/v1/enterprise/ip-allowlist Admin (security:manage) Прочитать настроенный список разрешённых CIDR
PUT /api/v1/enterprise/ip-allowlist Admin (security:manage) Обновить список разрешённых CIDR с предотвращением самоблокировки
GET /api/v1/enterprise/legal-hold Admin (compliance:manage) Список правовых блокировок пользователей и команд
PUT /api/v1/enterprise/legal-hold Admin (compliance:manage) Применить или снять правовую блокировку с пользователя или команды
POST /api/v1/enterprise/scim/token Admin (users:manage) Сгенерировать bearer-токен SCIM, возвращается один раз
DELETE /api/v1/enterprise/scim/token Admin (users:manage) Отозвать текущий bearer-токен SCIM
GET /api/v1/enterprise/siem/config Admin (webhooks:manage) Прочитать конфигурацию пересылки SIEM
PUT /api/v1/enterprise/siem/config Admin (webhooks:manage) Обновить конфигурацию пересылки SIEM
GET /api/v1/enterprise/webhooks Admin (webhooks:manage) Список назначений вебхуков
POST /api/v1/enterprise/webhooks Admin (webhooks:manage) Создать назначение вебхука
PUT /api/v1/enterprise/webhooks/:index Admin (webhooks:manage) Обновить назначение вебхука
DELETE /api/v1/enterprise/webhooks/:index Admin (webhooks:manage) Удалить назначение вебхука
POST /api/v1/enterprise/webhooks/:index/test Admin (webhooks:manage) Отправить тестовую полезную нагрузку вебхука
POST /api/v1/enterprise/users/:id/export Admin (compliance:manage) Запустить задание экспорта пользователя по GDPR
GET /api/v1/enterprise/users/:id/export/:jobId Admin (compliance:manage) Прочитать статус экспорта GDPR и URL для загрузки
DELETE /api/v1/enterprise/users/:id/purge Admin (compliance:manage) Безвозвратно очистить данные пользователя после подтверждения
DELETE /api/v1/enterprise/teams/:id/purge Admin (compliance:manage) Безвозвратно очистить данные команды после подтверждения
GET /api/v1/admin/version Admin (system:health) Прочитать метаданные версии приложения, сборки, Node и схемы
GET /api/v1/admin/migrations/pending Admin (system:health) Сравнить упакованные миграции с применёнными миграциями
GET /api/v1/admin/upgrade-check Admin (system:health) Запустить проверки готовности к обновлению

SCIM 2.0

Эндпоинты обнаружения SCIM публичны. Эндпоинты пользователей и групп требуют bearer-токена SCIM, сгенерированного выше.

Метод Путь Доступ Описание
GET /api/v1/scim/v2/ServiceProviderConfig Публичный Возможности сервера SCIM
GET /api/v1/scim/v2/Schemas Публичный Обнаружение схемы SCIM
GET /api/v1/scim/v2/ResourceTypes Публичный Обнаружение типов ресурсов SCIM
GET /api/v1/scim/v2/Users Токен SCIM Список пользователей, с необязательным фильтром SCIM
POST /api/v1/scim/v2/Users Токен SCIM Создать пользователя
GET /api/v1/scim/v2/Users/:id Токен SCIM Получить пользователя
PUT /api/v1/scim/v2/Users/:id Токен SCIM Заменить пользователя
DELETE /api/v1/scim/v2/Users/:id Токен SCIM Мягкая деактивация пользователя
GET /api/v1/scim/v2/Groups Токен SCIM Список команд как групп SCIM
POST /api/v1/scim/v2/Groups Токен SCIM Создать команду
GET /api/v1/scim/v2/Groups/:id Токен SCIM Получить команду
PUT /api/v1/scim/v2/Groups/:id Токен SCIM Заменить команду и членство в группе
DELETE /api/v1/scim/v2/Groups/:id Токен SCIM Удалить команду

Шаблоны мемов

Вспомогательный API для инструмента генератора мемов.

Метод Путь Доступ Описание
GET /api/v1/meme-templates Auth Список всех доступных шаблонов мемов с позициями текстовых полей
GET /api/v1/meme-templates/full/:filename Auth Отдать полноразмерное изображение шаблона
GET /api/v1/meme-templates/thumbs/:filename Auth Отдать миниатюру шаблона
GET /api/v1/meme-templates/fonts/:filename Auth Отдать файл шрифта, используемый для отрисовки текста мема

Ответы с ошибками

Все ошибки возвращают JSON:

{
  "error": "Human-readable message",
  "code": "MACHINE_READABLE_CODE"
}
Статус Значение
400 Недопустимый запрос / ошибка валидации
401 Не аутентифицирован
403 Недостаточно разрешений
404 Ресурс не найден
413 Файл слишком большой (см. MAX_UPLOAD_SIZE_MB)
422 Обработка не удалась после валидации
429 Ограничение частоты запросов (см. RATE_LIMIT_PER_MIN)
501 Требуемый AI-бандл функции не установлен (FEATURE_NOT_INSTALLED)
500 Внутренняя ошибка сервера