Generate deterministic images from JSON templates
Define a canvas, stack layers, and generate pixel-perfect images from JSON. Same input, same output — every time.
See Image Generation in action
Start from a real implementation pattern, not blank docs. See the input, runnable code, and structured output your workflow can use next.
{
"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"
}
}
Use the same workflow from code, agents, or n8n
When an automation moves from prototype to production, you should not have to rebuild it for every environment. Iteration Layer lets scripts, agents, and n8n workflows call the same European AI workflow runtime.
EU AI workflow runtime
Run document, image, and file steps through one EU-hosted workflow layer with shared API conventions and billing.
Agent-ready by design
Expose the same document and image actions to MCP tools and Claude Code skills, then reuse the API contract when workflows graduate into scripts or automations.
Verified n8n node
Install the verified Iteration Layer node in n8n, then route documents and generated files through the same provider from visual workflows.
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.
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.
Get your image
Receive composited image as base64 JSON, or use a webhook for async delivery.
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.
European by design
Your data is processed on EU-hosted infrastructure and never stored beyond temporary logs. Zero data retention, GDPR-compliant workflows, and a Data Processing Agreement are available for every customer. Learn more about our security practices .
EU-hosted core processing
Application and processing infrastructure runs in Europe, with provider-scope ISO 27001 and BSI C5 evidence documented for procurement reviews.
Zero data retention
Customer files and processing results are not stored after the request. Usage logs are retained for 90 days and automatically deleted.
Clear answers for security teams
Give reviewers the answers they need up front: where files are processed, what is retained, which subprocessors are involved, and how AI inputs, outputs, review gates, and audit records move through each workflow.
Pricing
Start usage-based. Switch to a subscription when your volume becomes predictable.
Usage-based
Graduated pricing. Your effective rate decreases automatically as monthly usage grows.
- No monthly commitment
- Pay only for credits used
- Automatic volume discounts as usage grows
Predictable volume
Fixed recurring credit packs with lower effective credit prices for steady usage.
- Lower effective per-credit prices
- Fixed recurring credit packs
- Predictable monthly budget
Try Iteration Layer with 100 credits
Start with one shared trial pool before choosing subscription or pay-as-you-go billing.
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 |
|---|---|---|---|---|
|
|
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
|
|
|
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
|
|
|
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
|
|
|
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?
Build your first workflow in minutes
Chain our APIs into a workflow you can test with your own data during the 7-day trial.