Rewrites all documentation with accurate project details (Fastify, port 1349, single-container Docker, all 33+ tools, full database schema). Adds getting started guide and configuration reference. Updates help and settings dialogs to link to the docs site.
5.4 KiB
REST API
The API server runs on port 1349 by default and serves all endpoints under /api. Interactive Swagger documentation is available at /api/docs when the server is running.
Authentication
Requests can be authenticated in two ways:
- Session cookie -- Log in via
POST /api/auth/loginand the server sets a session cookie. - API key -- Pass an
Authorization: Bearer si_...header with an API key.
Some endpoints (health check, login, Swagger docs) are public and don't require authentication.
Tools
Execute a tool
POST /api/v1/tools/:toolId
Content-Type: multipart/form-data
Send a multipart request with:
file-- The image filesettings-- JSON string with tool-specific options
Response:
{
"jobId": "abc123",
"downloadUrl": "/api/v1/download/abc123/output.png",
"originalSize": 245000,
"processedSize": 180000
}
Available tool IDs
Image operations: resize, crop, rotate, flip, convert, compress, strip-metadata, border
Color: color-adjustments, grayscale, sepia, invert, color-palette, replace-color
Text and codes: watermark-text, watermark-image, text-overlay, qr-generate, barcode-read, ocr
Composition: compose, collage, split, image-to-pdf
Analysis: info, compare, find-duplicates
Conversion: svg-to-raster, vectorize, favicon, gif-tools
AI-powered: remove-background, upscale, blur-faces, erase-object, smart-crop
Utility: bulk-rename
Batch processing
POST /api/v1/tools/:toolId/batch
Content-Type: multipart/form-data
Send multiple files with the same settings. Returns a ZIP file containing all processed images. The response includes an X-Job-Id header you can use to track progress.
File management
Upload files
POST /api/v1/upload
Content-Type: multipart/form-data
Upload one or more images. Returns file identifiers for use with other endpoints.
Download results
GET /api/v1/download/:jobId/:filename
Download a processed image by job ID and filename.
Pipelines
Pipelines chain multiple tools together. The output of each step becomes the input for the next.
Execute a pipeline
POST /api/v1/pipeline/execute
Content-Type: multipart/form-data
Body fields:
file-- The input imagesteps-- JSON array of{ "toolId": "resize", "settings": { ... } }objects
Response includes jobId, downloadUrl, and details about each completed step.
Save a pipeline
POST /api/v1/pipeline/save
Content-Type: application/json
{
"name": "Thumbnail generator",
"description": "Resize and compress for web thumbnails",
"steps": [
{ "toolId": "resize", "settings": { "width": 200, "height": 200, "fit": "cover" } },
{ "toolId": "compress", "settings": { "quality": 80 } },
{ "toolId": "convert", "settings": { "format": "webp" } }
]
}
List saved pipelines
GET /api/v1/pipeline/list
Delete a pipeline
DELETE /api/v1/pipeline/:id
Progress tracking
For long-running jobs (AI operations, batch processing), you can track progress via Server-Sent Events.
GET /api/v1/jobs/:jobId/progress
The stream emits JobProgress objects:
{
"status": "processing",
"progress": 45,
"completedFiles": ["image1.jpg", "image2.jpg"],
"failedFiles": [],
"errors": []
}
The connection closes automatically 5 seconds after the job completes.
API keys
Generate a key
POST /api/v1/api-keys
Content-Type: application/json
{ "name": "My integration" }
Returns the raw key (prefixed with si_). This is the only time the full key is shown.
List keys
GET /api/v1/api-keys
Returns key metadata (name, prefix, creation date) but not the full key.
Delete a key
DELETE /api/v1/api-keys/:id
Settings
Get all settings
GET /api/v1/settings
Update settings
PUT /api/v1/settings
Content-Type: application/json
Admin only. Accepts a JSON object of key-value pairs.
Auth endpoints
Login
POST /api/auth/login
Content-Type: application/json
{ "username": "admin", "password": "admin" }
Returns a session token and sets a cookie.
Get current session
GET /api/auth/session
Change password
POST /api/auth/change-password
Content-Type: application/json
{ "currentPassword": "old", "newPassword": "new" }
List users (admin)
GET /api/auth/users
Create user (admin)
POST /api/auth/register
Content-Type: application/json
{ "username": "newuser", "password": "pass", "role": "user" }
Delete user (admin)
DELETE /api/auth/users/:id
Health check
GET /api/v1/health
Returns 200 OK if the server is running. Used by Docker's health check.
Rate limiting
All endpoints are rate-limited to RATE_LIMIT_PER_MIN requests per minute per IP (default: 100). When exceeded, the server returns 429 Too Many Requests.
Error responses
Errors follow a consistent format:
{
"statusCode": 400,
"error": "Bad Request",
"message": "Invalid image format"
}
Common status codes:
400-- Invalid input (bad format, missing required fields)401-- Not authenticated403-- Not authorized (e.g., non-admin trying admin endpoints)413-- File too large (exceedsMAX_UPLOAD_SIZE_MB)429-- Rate limited500-- Server error