Image Processing API
45+ image tools as a REST API. Resize, crop, filter, watermark, compose pipelines, and generate workflows with AI.
45+ Tools
Resize, crop, blur, sharpen, watermark, color adjust, effects, and more
Pipelines
Chain multiple tools in a single request — up to 20 steps
AI Workflows
Describe what you want in plain English, get a ready-to-run pipeline
Batch Processing
Process up to 10 images in one call with the same tool or pipeline
Overview
The launch.pics API lets you process images programmatically. Send an image (as a file upload or base64), choose a tool and parameters, and get the result back as base64 JSON or binary image.
Authentication
All /api/v1/ processing endpoints require an API key. Pass it via the X-API-Key header:
curl -X POST https://launch.pics/api/v1/resize \
-H "X-API-Key: lp_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{"image_base64": "...", "width": 800}'
/api/v1/health and /api/v1/tools endpoints are public — no API key needed.Base URL
Rate Limits
| Endpoint | Limit |
|---|---|
| Single tool processing | 200 requests/hour |
| Pipeline | 100 requests/hour |
| Batch | 50 requests/hour |
| AI workflow generation | 30 requests/hour |
Rate limit headers are included in responses: X-RateLimit-Remaining, X-RateLimit-Reset.
Error Handling
Errors return JSON with an error field:
// 400 Bad Request
{"error": "No image provided. Send as multipart file (field: image) or JSON (image_base64)."}
// 401 Unauthorized
{"error": "API key required. Get one at https://launch.pics/docs/"}
// 403 Forbidden
{"error": "Invalid API key"}
// 404 Not Found
{"error": "Unknown tool: foo", "available": ["resize", "crop", ...]}
// 429 Too Many Requests
{"error": "Rate limit exceeded"}
// 500 Internal Server Error
{"error": "Processing failed: details..."}
Health Check
/api/v1/health
Check API status and discover available endpoints. No authentication required.
curl https://launch.pics/api/v1/health
{
"status": "ok",
"version": "1.0.0",
"api": "launch.pics Image Processing API",
"tools_count": 38,
"endpoints": {
"docs": "https://launch.pics/docs/",
"tools": "/api/v1/tools",
"process": "/api/v1/{tool}",
"pipeline": "/api/v1/pipeline",
"generate": "/api/v1/generate-workflow",
"batch": "/api/v1/batch"
}
}
List Tools
/api/v1/tools
List all available tools with their parameter specifications. No authentication required.
curl https://launch.pics/api/v1/tools
List Fonts
/api/v1/fonts
List all available fonts for text overlays, organized by category. No authentication required.
curl https://launch.pics/api/v1/fonts
Returns fonts organized into categories: sans-serif, serif, monospace, and display. Includes aliases like sans, serif, mono, bold, impact for convenience.
Use font names in any text tool via the font parameter: "font": "roboto-bold"
Popular Fonts
| Name | Category | Best For |
|---|---|---|
| roboto | Sans-serif | General purpose, clean UI text |
| roboto-bold | Sans-serif | Headlines, emphasis |
| open-sans | Sans-serif | Body text, readable at small sizes |
| lato | Sans-serif | Modern, elegant headings |
| lato-black | Display | Bold statements, headers |
| noto-serif | Serif | Classic, formal text |
| fira-code | Monospace | Code snippets, technical text |
| impact | Display | Memes, bold impact text |
Process Image
/api/v1/{tool_name}
Apply a single tool to an image. Accepts both JSON (base64) and multipart form uploads.
Input Options
Option A: JSON body
curl -X POST https://launch.pics/api/v1/resize \
-H "X-API-Key: lp_your_key" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgo...",
"width": 800,
"height": 600,
"mode": "contain"
}'
Option B: Multipart form data
curl -X POST https://launch.pics/api/v1/resize \
-H "X-API-Key: lp_your_key" \
-F "image=@photo.jpg" \
-F "width=800" \
-F "mode=contain"
Output
Default response is JSON with base64-encoded image:
{
"image_base64": "iVBORw0KGgo...",
"format": "PNG",
"size": {"width": 800, "height": 600},
"tool": "resize"
}
For binary image response, set Accept: image/png (or image/jpeg, image/webp):
curl -X POST https://launch.pics/api/v1/resize \
-H "X-API-Key: lp_your_key" \
-H "Accept: image/png" \
-F "image=@photo.jpg" \
-F "width=800" \
--output resized.png
Pipeline
/api/v1/pipeline
Chain multiple tools in sequence. Steps execute in order, each receiving the output of the previous step. Maximum 20 steps.
Request
curl -X POST https://launch.pics/api/v1/pipeline \
-H "X-API-Key: lp_your_key" \
-H "Content-Type: application/json" \
-d '{
"image_base64": "iVBORw0KGgo...",
"steps": [
{"tool": "resize", "params": {"width": 800}},
{"tool": "contrast", "params": {"factor": 1.3}},
{"tool": "sharpen", "params": {"amount": 1.5}},
{"tool": "watermark", "params": {"text": "© 2026", "position": "bottom-right", "opacity": 128}},
{"tool": "compress", "params": {"quality": 85, "format": "WEBP"}}
],
"output_format": "WEBP",
"quality": 85
}'
Response
{
"image_base64": "UklGRp4A...",
"format": "WEBP",
"original_size": {"width": 3000, "height": 2000},
"final_size": {"width": 800, "height": 533},
"steps_completed": [
{"step": 0, "tool": "resize", "status": "ok", "size": {"width": 800, "height": 533}},
{"step": 1, "tool": "contrast", "status": "ok", "size": {"width": 800, "height": 533}},
{"step": 2, "tool": "sharpen", "status": "ok", "size": {"width": 800, "height": 533}},
{"step": 3, "tool": "watermark", "status": "ok", "size": {"width": 800, "height": 533}},
{"step": 4, "tool": "compress", "status": "ok", "size": {"width": 800, "height": 533}}
]
}
Generate Workflow (AI)
/api/v1/generate-workflow
Describe what you want in natural language, and AI generates a pipeline configuration you can execute with /api/v1/pipeline.
Request
curl -X POST https://launch.pics/api/v1/generate-workflow \
-H "X-API-Key: lp_your_key" \
-H "Content-Type: application/json" \
-d '{"description": "Make it 800px wide, add a vintage film look, and compress as JPEG"}'
Response
{
"description": "Make it 800px wide, add a vintage film look, and compress as JPEG",
"steps": [
{"tool": "resize", "params": {"width": 800}},
{"tool": "sepia", "params": {"intensity": 0.6}},
{"tool": "vignette", "params": {"strength": 0.4}},
{"tool": "contrast", "params": {"factor": 0.9}},
{"tool": "film-grain", "params": {"amount": 0.3}},
{"tool": "compress", "params": {"quality": 85, "format": "JPEG"}}
],
"step_count": 6
}
steps array that can be passed directly to the /api/v1/pipeline endpoint along with your image.Batch Processing
/api/v1/batch
Process up to 10 images with the same tool or pipeline in a single request.
Single tool on multiple images
curl -X POST https://launch.pics/api/v1/batch \
-H "X-API-Key: lp_your_key" \
-H "Content-Type: application/json" \
-d '{
"images": ["base64_image_1...", "base64_image_2...", "base64_image_3..."],
"tool": "resize",
"params": {"width": 400},
"output_format": "WEBP",
"quality": 80
}'
Pipeline on multiple images
{
"images": ["base64_1...", "base64_2..."],
"steps": [
{"tool": "resize", "params": {"width": 800}},
{"tool": "sharpen", "params": {"amount": 1.5}},
{"tool": "compress", "params": {"quality": 85, "format": "JPEG"}}
]
}
Response
{
"results": [
{"index": 0, "image_base64": "...", "size": {"width": 400, "height": 300}},
{"index": 1, "image_base64": "...", "size": {"width": 400, "height": 267}},
{"index": 2, "error": "Invalid image: cannot identify image file"}
],
"processed": 2,
"errors": 1,
"format": "WEBP"
}
Key Usage
/api/v1/keys/usage
Check your API key usage statistics.
curl https://launch.pics/api/v1/keys/usage \
-H "X-API-Key: lp_your_key"
{
"name": "my-app",
"requests": 1247,
"rate_limit": "200/hour",
"created": "2026-04-01T21:00:00Z",
"last_used": "2026-04-01T22:30:00Z"
}
All Tools Reference
Every tool can be used as a standalone endpoint (/api/v1/{tool}) or as a step in a pipeline.
Image Manipulation
| Tool | Description | Key Params |
|---|---|---|
| resize | Resize image | width, height, mode (contain|cover|stretch) |
| crop | Crop to region | x, y, width, height |
| rotate | Rotate/flip | angle, flip_h, flip_v |
| mirror | Mirror image | direction (horizontal|vertical) |
| circle-crop | Crop to circle | none |
| border | Add border | width, color (hex) |
Color & Adjustment
| Tool | Description | Key Params |
|---|---|---|
| brightness | Adjust brightness | factor (0.1-3.0, 1.0=original) |
| contrast | Adjust contrast | factor (0.1-3.0) |
| saturation | Adjust saturation | factor (0.0-3.0) |
| hue-shift | Shift hue | degrees (-180 to 180) |
| levels | Input/output levels | black_point, white_point, gamma |
| color-adjust | Temperature/tint | temperature, tint |
| color-replace | Replace a color | from_color, to_color, tolerance |
| grayscale | Convert to grayscale | none |
| invert | Invert colors | none |
Effects & Filters
| Tool | Description | Key Params |
|---|---|---|
| blur | Gaussian blur | radius (1-50) |
| sharpen | Sharpen image | amount (0.5-5.0) |
| sepia | Sepia tone | intensity (0.0-1.0) |
| vignette | Edge darkening | strength (0.0-1.0) |
| film-grain | Film grain noise | amount (0.0-1.0) |
| pixelate | Pixelate | block_size (2-50) |
| posterize | Reduce colors | bits (1-8) |
| threshold | B&W threshold | level (0-255) |
| edge-detect | Detect edges | none |
| emboss | Emboss effect | none |
| solarize | Solarize | threshold (0-255) |
| duotone | Duotone effect | dark_color, light_color |
| halftone | Halftone dots | dot_size (4-20) |
| oil-paint | Oil painting | radius (2-8) |
| sketch | Pencil sketch | none |
| tilt-shift | Miniature effect | blur, focus_position, focus_width |
| noise | Add noise | amount, type (gaussian|salt_pepper) |
Creative & AI
| Tool | Description | Key Params |
|---|---|---|
| meme | Meme-style top/bottom text | top_text, bottom_text, font_size |
| og-image | Open Graph image (1200x630) | title, subtitle, title_font, overlay_opacity |
| gradient-text | Gradient-colored text | text, font, color_start, color_end, direction |
| badge | Corner badge/label | text, position, bg_color, shape (pill|rect|circle) |
| vintage | Vintage/retro effect | intensity (0.0-1.0) |
| collage | Grid collage layout | cols, rows, spacing, bg_color |
| split-tone | Split toning colors | shadow_color, highlight_color, strength |
| color-grade | Professional LGG grading | lift_r/g/b, gamma_r/g/b, gain_r/g/b |
| smart-resize | Smart center-crop resize | width, height |
SVG Tools
| Tool | Description | Key Params |
|---|---|---|
| svg-trace | Convert bitmap to SVG vector art | threshold (0-255), color (hex), detail (low|normal|high), smoothness (0-1.5) |
| svg-to-png | Render SVG content to PNG | svg (raw SVG string), width, height, scale |
| svg-pattern | Generate SVG pattern overlay | pattern (dots|lines|grid|waves|diamonds|hexagons), size, color, opacity |
Overlay & Compositing
| Tool | Description | Key Params |
|---|---|---|
| text-overlay | Full text system | text, font, font_size, color, position, align, shadow_color, bg_color, bg_radius, stroke_color, uppercase |
| watermark | Text watermark | text, position, opacity, font_size |
| shadow | Drop shadow | offset_x, offset_y, blur, color |
| transparency | Set transparency | opacity, remove_color, tolerance |
Format & Output
| Tool | Description | Key Params |
|---|---|---|
| convert | Convert format | format (PNG|JPEG|WEBP|GIF), quality |
| compress | Compress/optimize | quality (1-100), format (JPEG|WEBP) |
Code Examples
Python
import requests, base64
API_KEY = "lp_your_key"
BASE = "https://launch.pics/api/v1"
# Read image and encode
with open("photo.jpg", "rb") as f:
img_b64 = base64.b64encode(f.read()).decode()
# Single tool
r = requests.post(f"{BASE}/resize", json={
"image_base64": img_b64,
"width": 800,
"mode": "contain"
}, headers={"X-API-Key": API_KEY})
result = r.json()
with open("resized.png", "wb") as f:
f.write(base64.b64decode(result["image_base64"]))
# Pipeline
r = requests.post(f"{BASE}/pipeline", json={
"image_base64": img_b64,
"steps": [
{"tool": "resize", "params": {"width": 800}},
{"tool": "sepia", "params": {"intensity": 0.6}},
{"tool": "vignette", "params": {"strength": 0.3}},
{"tool": "compress", "params": {"quality": 85, "format": "JPEG"}}
]
}, headers={"X-API-Key": API_KEY})
JavaScript / Node.js
const fs = require('fs');
const API_KEY = 'lp_your_key';
const BASE = 'https://launch.pics/api/v1';
const imageBase64 = fs.readFileSync('photo.jpg').toString('base64');
// Single tool
const response = await fetch(`${BASE}/resize`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': API_KEY
},
body: JSON.stringify({
image_base64: imageBase64,
width: 800,
mode: 'contain'
})
});
const { image_base64, size } = await response.json();
fs.writeFileSync('resized.png', Buffer.from(image_base64, 'base64'));
// AI-generated workflow
const workflow = await fetch(`${BASE}/generate-workflow`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-API-Key': API_KEY },
body: JSON.stringify({ description: 'Make it thumbnail-sized with a vintage look' })
}).then(r => r.json());
// Execute the generated workflow
const result = await fetch(`${BASE}/pipeline`, {
method: 'POST',
headers: { 'Content-Type': 'application/json', 'X-API-Key': API_KEY },
body: JSON.stringify({ image_base64: imageBase64, steps: workflow.steps })
}).then(r => r.json());
cURL
# Upload a file directly
curl -X POST https://launch.pics/api/v1/resize \
-H "X-API-Key: lp_your_key" \
-F "image=@photo.jpg" \
-F "width=800" \
-F "mode=contain"
# Get binary image back (pipe to file)
curl -X POST https://launch.pics/api/v1/grayscale \
-H "X-API-Key: lp_your_key" \
-H "Accept: image/png" \
-F "image=@photo.jpg" \
--output grayscale.png
Ready to start?
Contact andy@agentwire.email to get your API key.