Deterministic image generation from JSON templates
Same input, same output — every time. No AI randomness. Define a canvas, stack layers — solid colors, text, images, gradients, QR codes, barcodes — and get a pixel-perfect image back.
No credit card required — start with free trial credits
One output feeds the next
Image Generation is part of a complete content pipeline. One key, one credit pool, and structured JSON responses designed to chain together.
Mix and match freely
Extract data from a document, generate visuals from the results, then compile everything into a finished report. Mix, match, and build your own pipeline.
Three steps to your first image
Define your canvas
Set dimensions and output format. Add layers in order — each composites on top of the previous.
- 7 layer types: solid color, gradient, text, image, QR code, barcode, layout
- Per-layer opacity and rotation control
Add content to layers
Text with pre-bundled Google fonts and markdown. Images with AI background removal and smart crop. QR codes and barcodes with custom colors.
- Auto-scaling text to fit dimensions
- Custom fonts via base64 (TTF, OTF, WOFF, WOFF2)
- AI smart crop (centers on faces, people, and objects)
- AI background removal
- 6 barcode formats (Code 128, EAN-13, EAN-8, Code 39, ITF, Codabar)
Get your image
Receive composited image as base64 JSON, or use a webhook for async delivery.
- 6 output formats: PNG, JPEG, WebP, TIFF, GIF, AVIF
- Deterministic — same input always produces the same image
Templates As Code
Define images as JSON layers — solid colors, text, shapes, gradients, QR codes, and barcodes. Version in Git, generate from CI, and get identical output every time.
AI-Powered Layers
Remove backgrounds and smart-crop to faces or objects directly in your composition. No separate API calls or post-processing.
Zero-Config Typography
98 bundled Google Fonts ready to use, or upload your own TTF, OTF, WOFF, or WOFF2. Markdown bold/italic, auto-scaling, and line wrapping included.
Real-world pipelines, ready to ship
Each recipe chains multiple APIs into a complete workflow. Pick one, tweak it, and deploy — or use it as a starting point for your own pipeline.
Generate A+ Content Banner
Generate an Amazon A+ Content banner image for book marketing with cover art, title, and branding.
Generate Book Cover Spreads
Generate print-ready book cover spreads with back cover, spine, and front cover in a single image.
Generate Certificate Image
Generate a professional certificate image with recipient name, course title, and completion date for digital sharing, social media, or email delivery.
Generate Email Banner
Generate a personalized email banner image with text, logo, and brand colors.
Generate Event Ticket
Generate an event ticket image with QR code, event name, date, venue, and seat information.
Generate Front Book Cover
Generate a front cover image with custom artwork, title text, and author attribution.
Generate OG Image
Generate a branded Open Graph image with a generative wave background, logo, and tagline.
Generate Product Listing Image
Generate a product listing image with photo, price badge, and promotional text overlay.
Generate Product Promo Card
Generate a product promotional card with a product photo, sale badge, and pricing text.
Generate Product Slide
Generate a branded product slide image with headline, feature pills, and a call-to-action — all arranged with layout layers.
Generate Real Estate Listing Graphic
Generate a branded property listing graphic with a property photo, status badge, price, address, and key stats.
Generate Report Card Image
Generate a visual KPI report card with a headline metric, secondary stats, and branding — shareable as an image.
Generate Social Card
Generate an Open Graph social sharing card with dynamic title, description, and branding.
Generate Social Media Book Promo
Generate a vertical story image for TikTok or Instagram book promotion with cover art, hook text, and author branding.
Generate YouTube Thumbnail
Generate a YouTube thumbnail with bold title text, gradient background, and a static image cutout.
Watermark an Image
Apply a text watermark to a photo using layer-based image composition for brand protection and copyright.
One n8n node for your entire pipeline
Most n8n document workflows chain three or four separate services. The Iteration Layer community node covers extraction, transformation, and generation in a single install — wire up multi-step pipelines visually instead of writing glue code.
Start building right now
One API call, one credit deducted. Chains naturally with our other APIs — pipe the output of one into the next without glue code. You'll be up and running in minutes.
- Full OpenAPI 3.1 specification available for code generation and IDE integration.
- MCP server support for seamless integration with AI agents and tools.
- Comprehensive documentation with examples for every field type and edge case.
{
"dimensions": {
"width_in_px": 1200,
"height_in_px": 630
},
"output_format": "jpeg",
"layers": [
{
"index": 0,
"type": "solid-color",
"hex_color": "#FFFFFF"
},
{
"index": 1,
"type": "image",
"file": {
"type": "base64",
"name": "waves.svg",
"base64": "<wave-svg-base64>"
},
"position": { "x_in_px": 20, "y_in_px": 20 },
"dimensions": { "width_in_px": 1160, "height_in_px": 478 },
"border_radius": 24
},
{
"index": 2,
"type": "image",
"file": {
"type": "base64",
"name": "logo.svg",
"base64": "<logo-svg-base64>"
},
"position": { "x_in_px": 20, "y_in_px": 542 },
"dimensions": { "width_in_px": 56, "height_in_px": 56 }
},
{
"index": 3,
"type": "text",
"text": "Iteration Layer",
"font_name": "Inter",
"font_size_in_px": 32,
"font_weight": "bold",
"text_color": "#000000",
"vertical_align": "center",
"position": { "x_in_px": 90, "y_in_px": 542 },
"dimensions": { "width_in_px": 400, "height_in_px": 56 }
},
{
"index": 4,
"type": "text",
"text": "Image & Document Extraction and Generation APIs",
"font_name": "Inter",
"font_size_in_px": 32,
"font_weight": "medium",
"text_color": "#6B7280",
"text_align": "right",
"vertical_align": "center",
"should_auto_scale": true,
"position": { "x_in_px": 20, "y_in_px": 542 },
"dimensions": { "width_in_px": 1160, "height_in_px": 56 }
}
]
}
Deterministic 1200 × 630 OG image generated from JSON layers
curl -X POST \
https://api.iterationlayer.com/image-generation/v1/generate \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"dimensions": {
"width_in_px": 1200,
"height_in_px": 630
},
"output_format": "jpeg",
"layers": [
{
"index": 0,
"type": "solid-color",
"hex_color": "#FFFFFF"
},
{
"index": 1,
"type": "image",
"file": {
"type": "base64",
"name": "waves.svg",
"base64": "<wave-svg-base64>"
},
"position": {
"x_in_px": 20.0,
"y_in_px": 20.0
},
"dimensions": {
"width_in_px": 1160,
"height_in_px": 478
},
"border_radius": 24
},
{
"index": 2,
"type": "image",
"file": {
"type": "base64",
"name": "logo.svg",
"base64": "<logo-svg-base64>"
},
"position": {
"x_in_px": 20.0,
"y_in_px": 542.0
},
"dimensions": {
"width_in_px": 56,
"height_in_px": 56
}
},
{
"index": 3,
"type": "text",
"text": "Iteration Layer",
"font_name": "Inter",
"font_size_in_px": 32,
"font_weight": "bold",
"text_color": "#000000",
"vertical_align": "center",
"position": {
"x_in_px": 90.0,
"y_in_px": 542.0
},
"dimensions": {
"width_in_px": 400,
"height_in_px": 56
}
},
{
"index": 4,
"type": "text",
"text": "Image & Document Extraction and Generation APIs",
"font_name": "Inter",
"font_size_in_px": 32,
"font_weight": "medium",
"text_color": "#6B7280",
"text_align": "right",
"vertical_align": "center",
"should_auto_scale": true,
"position": {
"x_in_px": 20.0,
"y_in_px": 542.0
},
"dimensions": {
"width_in_px": 1160,
"height_in_px": 56
}
}
]
}'
{
"success": true,
"data": {
"buffer": "/9j/4AAQSkZJRgABAQ...",
"mime_type": "image/jpeg"
}
}
import { IterationLayer } from "iterationlayer";
const client = new IterationLayer({
apiKey: "YOUR_API_KEY",
});
const waveSvgBase64 = generateWaveSvg(slug);
const logoSvgBase64 = Buffer.from(logoSvg).toString("base64");
const result = await client.generateImage({
dimensions: {
width_in_px: 1200,
height_in_px: 630,
},
output_format: "jpeg",
layers: [
{
index: 0,
type: "solid-color",
hex_color: "#FFFFFF",
},
{
index: 1,
type: "image",
file: {
type: "base64",
name: "waves.svg",
base64: waveSvgBase64,
},
position: {
x_in_px: 20,
y_in_px: 20,
},
dimensions: {
width_in_px: 1160,
height_in_px: 478,
},
border_radius: 24,
},
{
index: 2,
type: "image",
file: {
type: "base64",
name: "logo.svg",
base64: logoSvgBase64,
},
position: {
x_in_px: 20,
y_in_px: 542,
},
dimensions: {
width_in_px: 56,
height_in_px: 56,
},
},
{
index: 3,
type: "text",
text: "Iteration Layer",
font_name: "Inter",
font_size_in_px: 32,
font_weight: "bold",
text_color: "#000000",
vertical_align: "center",
position: { x_in_px: 90, y_in_px: 542 },
dimensions: {
width_in_px: 400,
height_in_px: 56,
},
},
{
index: 4,
type: "text",
text: "Image & Document Extraction and Generation APIs",
font_name: "Inter",
font_size_in_px: 32,
font_weight: "medium",
text_color: "#6B7280",
text_align: "right",
vertical_align: "center",
should_auto_scale: true,
position: { x_in_px: 20, y_in_px: 542 },
dimensions: {
width_in_px: 1160,
height_in_px: 56,
},
},
],
});
{
"success": true,
"data": {
"buffer": "/9j/4AAQSkZJRgABAQ...",
"mime_type": "image/jpeg"
}
}
from iterationlayer import IterationLayer
client = IterationLayer(
api_key="YOUR_API_KEY"
)
wave_svg_base64 = generate_wave_svg(slug)
logo_svg_base64 = base64.b64encode(logo_svg.encode()).decode()
result = client.generate_image(
dimensions={
"width_in_px": 1200,
"height_in_px": 630,
},
output_format="jpeg",
layers=[
{
"index": 0,
"type": "solid-color",
"hex_color": "#FFFFFF",
},
{
"index": 1,
"type": "image",
"file": {
"type": "base64",
"name": "waves.svg",
"base64": wave_svg_base64,
},
"position": {
"x_in_px": 20,
"y_in_px": 20,
},
"dimensions": {
"width_in_px": 1160,
"height_in_px": 478,
},
"border_radius": 24,
},
{
"index": 2,
"type": "image",
"file": {
"type": "base64",
"name": "logo.svg",
"base64": logo_svg_base64,
},
"position": {
"x_in_px": 20,
"y_in_px": 542,
},
"dimensions": {
"width_in_px": 56,
"height_in_px": 56,
},
},
{
"index": 3,
"type": "text",
"text": "Iteration Layer",
"font_name": "Inter",
"font_size_in_px": 32,
"font_weight": "bold",
"text_color": "#000000",
"vertical_align": "center",
"position": {
"x_in_px": 90,
"y_in_px": 542,
},
"dimensions": {
"width_in_px": 400,
"height_in_px": 56,
},
},
{
"index": 4,
"type": "text",
"text": "Image & Document Extraction and Generation APIs",
"font_name": "Inter",
"font_size_in_px": 32,
"font_weight": "medium",
"text_color": "#6B7280",
"text_align": "right",
"vertical_align": "center",
"should_auto_scale": True,
"position": {
"x_in_px": 20,
"y_in_px": 542,
},
"dimensions": {
"width_in_px": 1160,
"height_in_px": 56,
},
},
],
)
{
"success": true,
"data": {
"buffer": "/9j/4AAQSkZJRgABAQ...",
"mime_type": "image/jpeg"
}
}
import il "github.com/iterationlayer/sdk-go"
client := il.NewClient("YOUR_API_KEY")
waveSvgBase64 := generateWaveSvg(slug)
logoSvgBase64 := base64.StdEncoding.EncodeToString([]byte(logoSvg))
result, err := client.GenerateImage(
il.GenerateImageRequest{
Dimensions: il.Dimensions{
WidthInPx: 1200,
HeightInPx: 630,
},
OutputFormat: "jpeg",
Layers: []il.Layer{
il.NewSolidColorBackgroundLayer(0, "#FFFFFF"),
il.NewImageLayer(
1,
il.NewFileFromBase64("waves.svg", waveSvgBase64),
il.Position{
XInPx: 20,
YInPx: 20,
},
il.Dimensions{
WidthInPx: 1160,
HeightInPx: 478,
},
),
il.NewImageLayer(
2,
il.NewFileFromBase64("logo.svg", logoSvgBase64),
il.Position{
XInPx: 20,
YInPx: 542,
},
il.Dimensions{
WidthInPx: 56,
HeightInPx: 56,
},
),
il.NewTextLayer(
3, "Iteration Layer",
"Inter", 32, "#000000",
il.Position{
XInPx: 90,
YInPx: 542,
},
il.Dimensions{
WidthInPx: 400,
HeightInPx: 56,
},
),
il.NewTextLayer(
4,
"Image & Document Extraction and Generation APIs",
"Inter", 32, "#6B7280",
il.Position{
XInPx: 20,
YInPx: 542,
},
il.Dimensions{
WidthInPx: 1160,
HeightInPx: 56,
},
),
},
},
)
{
"success": true,
"data": {
"buffer": "/9j/4AAQSkZJRgABAQ...",
"mime_type": "image/jpeg"
}
}
Official SDKs for every major language
Install the SDK, set your API key, and start chaining requests. Full type safety, automatic retries, and idiomatic error handling included.
Your data stays in the EU
Your data is processed on EU servers and never stored beyond temporary logs. Zero retention, GDPR-compliant by design, with a Data Processing Agreement available for every customer. Learn more about our security practices .
No data storage, no model training
We don't store your files or processing results, and your data is never used to train or improve AI models. Logs are automatically deleted after 90 days.
EU-hosted infrastructure
All processing runs on servers located in the European Union. Your data never leaves the EU.
GDPR-compliant by design
Full compliance with EU data protection regulations. Data Processing Agreement available for all customers.
Pricing
Start with free trial credits. No credit card required.
Developer
For individuals & small projects
Startup
Save 40%For growing teams
Business
Save 47%For high-volume workloads
Or pay as you go from $0.022/credit with automatic volume discounts.
Still evaluating?
Compare Iteration Layer against the biggest alternatives at a glance, then open the full head-to-head pages when you want the details.
| Feature | Iteration Layer | Bannerbear | Placid | Puppeteer |
|---|---|---|---|---|
| Template definition |
JSON layers
Templates defined as JSON layer arrays — versionable and diffable
|
Visual editor
Templates created and stored in the Bannerbear visual editor platform
|
Visual editor
Templates created and managed in the Placid visual editor as platform state
|
HTML/JS
Takes screenshots of HTML pages rendered in a headless browser
|
| Layer composition |
Per layer
Independent text, image, and shape layers composited pixel-perfectly
|
Template vars
Dynamic content via template variables defined in the visual editor
|
Template vars
Dynamic content via template variables defined in the visual editor
|
Browser rendering
Browser rendering can vary based on font loading, CSS interpretation, and rendering timing
|
| AI operations |
Included
Background removal and smart crop with object detection available per layer
|
None
No AI-based image operations available
|
None
No AI-based image operations available — composes static layers only
|
None
No AI-based image operations available — takes browser screenshots only
|
| Output formats |
4 formats
PNG, JPEG, WebP, and PDF output
|
4 formats
PNG, JPEG, PDF, and video output supported
|
3 formats
PNG, JPEG, PDF, and video output supported
|
4 formats
PNG, JPEG, WebP, and PDF output supported via Chromium
|
See how we compare to our competitors
Bannerbear Placid Puppeteer HTML/CSS to Image Satori / Vercel OGFrequently asked questions
What layer types are available?
How do fonts work?
What output formats are supported?
Can I remove image backgrounds?
What barcode formats are supported?
Is the output deterministic?
Built for how you work
Whether you're building pipelines in code, automating workflows, orchestrating AI agents, or shipping client projects — Iteration Layer fits your process.
Developers
One vendor, one credit pool — stop maintaining five libraries for document and image processing.
Operations Teams
Automate the manual document and image tasks that eat hours every week — no custom code required.
AI Agents
Give your AI agents a complete content processing toolkit via a single MCP server.
Agencies
One account, one credit pool — deploy the same processing pipeline across every client project.