Iteration Layer
Image Generation

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

Zero data retention · GDPR Made & hosted in the EU $65 free trial credits No credit card required 14-day money-back guarantee

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.

Fits into your existing stack

Native SDKs for Node, Python, and Go. OpenAPI spec for everything else. MCP server for AI agents and Claude Code skills. n8n community node for visual workflows.

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

01

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
02

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)
03

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.
Input Preview
{
  "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 }
    }
  ]
}
Output Preview
Generated OG image with wave art and Iteration Layer branding

Deterministic 1200 × 630 OG image generated from JSON layers

Request
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
      }
    }
  ]
}'
Response
{
  "success": true,
  "data": {
    "buffer": "/9j/4AAQSkZJRgABAQ...",
    "mime_type": "image/jpeg"
  }
}
Request
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,
      },
    },
  ],
});
Response
{
  "success": true,
  "data": {
    "buffer": "/9j/4AAQSkZJRgABAQ...",
    "mime_type": "image/jpeg"
  }
}
Request
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,
            },
        },
    ],
)
Response
{
  "success": true,
  "data": {
    "buffer": "/9j/4AAQSkZJRgABAQ...",
    "mime_type": "image/jpeg"
  }
}
Request
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,
        },
      ),
    },
  },
)
Response
{
  "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

$29.99 /month
1,000 credits included
Most Popular

Startup

Save 40%

For growing teams

$119.99 /month
5,000 credits included

Business

Save 47%

For high-volume workloads

$319.99 /month
15,000 credits included

Or pay as you go from $0.022/credit with automatic volume discounts.

All APIs included Free trial credits per API Project-based budget caps Auto overage 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
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

Frequently asked questions

What layer types are available?
The API supports 7 layer types: solid color (with optional angled edges and border radius), gradient (linear and radial, with border radius), text (with markdown bold/italic), image (with optional AI background removal and border radius), QR code, barcode, and layout (horizontal/vertical flow with gap, alignment, padding, and nested children).
How do fonts work?
98 Google Fonts are bundled and ready to use by name — Inter, Roboto, Montserrat, Poppins, and more. You can also upload custom fonts as base64 in TTF, OTF, WOFF, or WOFF2 format.
What output formats are supported?
The API outputs PNG, JPEG, WebP, TIFF, GIF, and AVIF. Specify the format in the output_format field.
Can I remove image backgrounds?
Yes. Static image layers support AI-powered background removal. Enable it on the layer and the background is removed before compositing.
What barcode formats are supported?
The API supports 6 barcode formats: Code 128, EAN-13, EAN-8, Code 39, ITF, and Codabar.
Is the output deterministic?
Yes. The same input always produces the same output image. This makes it safe to use in CI pipelines and automated workflows.

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.