API Playground
Test every endpoint interactively. Set your API key above, fill in the parameters, and hit send.
System
GET
/healthz
Health check
no auth
▶
When to use: Verify the service is running and responsive.
- Kubernetes / Docker health probes (liveness & readiness)
- Uptime monitoring dashboards (e.g. UptimeRobot, Datadog)
- CI/CD pipelines to confirm a deployment succeeded
Upload
POST
/api/v1/media/upload
Upload file with optional variants
▶
When to use: Upload a file directly from your backend server.
- Server-side uploads where your backend has the file (e.g. processing a form submission)
- Enable
generateVariantsto auto-create thumbnail, small, medium, large, and WebP versions on upload - Use
async=truefor large images — returns immediately with ajobIdyou can poll - Use
async=false(default) for small images when you need variants ready instantly
file *
Drop file here or browse
orgSlug *
alt
caption
description
POST
/api/v1/media/upload/presigned
Get presigned upload URL
▶
When to use: Let the client (browser/mobile) upload directly to S3 without routing the file through your server.
- Frontend file uploads — your backend calls this to get a signed URL, then the client
PUTs the file directly to S3 - Reduces server bandwidth and latency for large files
- The signed URL expires, so it's safe to hand to the client
objectKey.
orgSlug *
filename *
mimeType
Query
GET
/api/v1/media/{id}
Get media file by ID
▶
When to use: Fetch a single media file with all its metadata and variants.
- Media detail pages or editors
- Loading full file info including variants after an upload
id *
GET
/api/v1/media/list
List media files (paginated)
▶
When to use: Browse and search media files for the authenticated organization.
- Media library / gallery views
- Search by filename or filter by MIME type prefix
- Paginated results with total count
limit
offset
search
type
sort
order
POST
/api/v1/media/batch
Get multiple media files by IDs
▶
When to use: Fetch multiple media files in a single request (max 100 IDs).
- Loading media for a page with multiple images
- Resolving media references from a CMS or content store
ids * (comma-separated)
PATCH
/api/v1/media/{id}
Update media metadata
▶
When to use: Update metadata fields on an existing media file.
- Edit alt text, captions, or descriptions after upload
- Toggle
isPrivatevisibility - Only provided fields are updated — omitted fields remain unchanged
id *
alt
caption
description
GET
/api/v1/media/{id}/variants
Get variants for a media file
▶
When to use: Fetch all generated variants (thumbnail, small, medium, etc.) for a media file.
- Building responsive image sets with
<picture>/srcset - Checking which variants have been generated
id *
Processing
POST
/api/v1/media/crop
Crop an image
▶
When to use: Crop, rotate, or reformat an already-uploaded image in place.
- User-driven image editing — e.g. a profile photo cropper in your UI sends the crop coordinates here
- The original file is replaced with the cropped version
- Enable
regenerateVariantsto rebuild all size variants from the new crop - Supports rotation (0/90/180/270), scaling, quality, and format conversion (webp, jpeg, png)
async=true if you also regenerate variants, since that adds processing time.
objectKey *
bucketName
format
x
y
width *
height *
rotate
scale
quality
Variants
POST
/api/v1/media/variants
Regenerate variants
▶
When to use: Rebuild all image variants (thumbnail, small, medium, large, original_webp) from the current original file.
- After a presigned upload — the file is in S3 but no variants exist yet
- After changing variant size/quality definitions and you need to backfill existing images
- If variants were corrupted or accidentally deleted
jobId to poll via the Job Status endpoint. Requires Redis.
objectKey *
bucketName
GET
/api/v1/media/variants/info
Get variants info
▶
When to use: List all generated variants (with URLs, sizes, and MIME types) for a given original file.
- Build responsive
<picture>/srcsetelements by fetching available sizes - Admin panels — show which variants exist and their file sizes
- Verify that variant generation completed successfully
objectKey *
bucket
GET
/api/v1/media/variant/{bucket}/{variantName}/*
Variant redirect
▶
When to use: Get a redirect to the public CDN URL for a specific variant by name.
- Quick access when you know the variant name you want (
thumbnail,small,medium,large,original_webp) - Useful in server-side rendering — resolve the variant URL without storing it in your database
- Returns a
302redirect to the CDN URL, so the client follows it automatically
bucket *
variantName *
path (folder) *
Downloads
GET
/api/v1/media/presign
Presign download URL
▶
When to use: Generate a temporary, signed download URL for a file stored in S3.
- Private files that should not be publicly accessible via CDN
- Time-limited access — share a link that expires (1 second to 24 hours)
- The URL points directly to S3 (not CDN) since the signature is bound to the origin host
objectKey *
bucket
expiry (seconds)
GET
/api/v1/media/download/{bucket}/*
Download file
▶
When to use: Stream a file directly through the media service (proxied from S3).
- When you need authenticated downloads — the request requires the API key
- Useful if S3 is not publicly accessible and you can't use presigned URLs
- Sets
Cache-Control: public, max-age=31536000, immutablefor browser caching
bucket *
objectKey (path) *
Delete
DELETE
/api/v1/media/
Delete file + variants
▶
When to use: Permanently delete a file and all of its generated variants from S3.
Delete by media ID or by object key. Provide one or the other.
- User deletes a photo or attachment from your application
- Cleanup after content moderation flags inappropriate content
- Deletes the entire folder prefix — original + thumbnail + small + medium + large + original_webp
id
objectKey
bucketName
Jobs
GET
/api/v1/media/job/{jobId}
Poll async job status
▶
When to use: Check the progress of an async variant generation or crop job.
- Poll after receiving a
jobIdfrom upload (async), crop (async), or variant regeneration - States:
pending→active→completedorfailed - Use for progress bars or "processing..." indicators in your UI
- If
failed, thefailedReasonfield explains what went wrong
jobId *