Iteration Layer
Menu
Features
Use Cases
Docs
Resources
Pricing
Image Generation

Generate deterministic images from JSON templates

Define a canvas, stack layers, and generate pixel-perfect images from JSON. Same input, same output — every time.

Zero data retention Made & hosted in the EU 100 trial credits

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.

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"
  }
}

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.

Input 40+ file formats
Extraction Documents, websites, and markdown
Generation Documents, images, and sheets
Output Structured format

Fits into your existing stack

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

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

01

Define your canvas

Set dimensions and output format. Add layers in order — each composites on top of the previous.

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.

03

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.

Pay as you go

Usage-based

$0.099 to $0.069 / credit

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
Subscriptions

Predictable volume

From $19 /month

Fixed recurring credit packs with lower effective credit prices for steady usage.

  • Lower effective per-credit prices
  • Fixed recurring credit packs
  • Predictable monthly budget
Trial Week

Try Iteration Layer with 100 credits

$1 / 7 days

Start with one shared trial pool before choosing subscription or pay-as-you-go billing.

All APIs included 7-day trial 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.

Build your first workflow in minutes

Chain our APIs into a workflow you can test with your own data during the 7-day trial.

Zero data retention Made & hosted in the EU 100 trial credits