---
title: "Bulk render many items to stored URLs"
method: POST
path: "/bulk"
tags: ["Render"]
---

# Bulk render many items to stored URLs

`POST /bulk`

## Request

- Base URL: `https://render.imejis.io`
- URL: `https://render.imejis.io/bulk`
- Auth: one of:
  - API key in header `dma-api-key`
  - API key in query parameter `dma-api-key`

Render MANY images in one call — the same design in several sizes, the same design with different data, a mix of designs, or the ordered slides of a CAROUSEL. Authenticate with a render key (`dma-api-key`) as a header or `?dma-api-key=` query param. Send `{ "items": [ ... ] }` (1-25); each item is rendered and stored, returning a URL. `results` preserves input order (result[i] ↔ items[i]), so for a carousel the array IS the slide sequence. Request-level `delivery`/`format`/`quality`/`expiresIn` are defaults; any item may override `format`/`quality`/`variation`/`overrides`. Each item is one metered render (N items = N renders); a failed item does not abort the rest.

## Query parameters

- `dma-api-key` string

## Request body

- object
  - `items` object[], required: The renders to produce, in order. Same design + varying `variation` = several sizes; same design + varying `overrides` = data variants; different `designId` = multiple designs; one item per slide = a carousel.
    - `designId` string, required: The design's render code (as in the render URL).
    - `variation` string: Size id (from GET /designs/v2/{id}/config `variations`); omit or 'master' for the base size.
    - `overrides` object: Dynamic-field overrides for this item (`key.field` form; a bare key is ignored).
    - `format` 'png' | 'jpeg' | 'webp' | 'pdf'
    - `quality` integer
    - `filename` string: Optional label echoed back on this item’s result row.
  - `delivery` 'hosted' | 'signed': URL type for every item (default hosted).
  - `format` 'png' | 'jpeg' | 'webp' | 'pdf': Default output format for items that omit their own.
  - `quality` integer
  - `expiresIn` integer: signed only — link lifetime in minutes (default 60, max 7 days = 10080).

## Response `200`

Per-item results in input order — each carries a stored `url` on success or an `error` on failure — plus a `summary`.

- object
  - `success` boolean
  - `results` object[]: One entry per input item, in the same order (result[i] ↔ items[i]).
    - `index` integer
    - `designId` string
    - `filename` string
    - `variation` string
    - `success` boolean
    - `url` string: Stored URL (on success).
    - `delivery` 'hosted' | 'signed'
    - `format` 'png' | 'jpeg' | 'webp' | 'pdf'
    - `expiresAt` string, date-time: Signed delivery only.
    - `warnings` string[]
    - `error` string: Failure reason (on failure).
  - `summary` object
    - `total` integer
    - `succeeded` integer
    - `failed` integer

## Other responses

- `400`: Invalid request (e.g. no items, too many items, or an item missing designId).
- `401`: Missing or invalid credentials.
- `429`: Render quota is used up. Check remaining quota, then retry after the plan window resets (`data.resetAt`).

---

[API](https://skmtc.dev/imejis/apis/imejis-api.md) · [All operations](https://skmtc.dev/imejis/apis/imejis-api/llms.txt) · [OpenAPI document](https://skmtc.dev/imejis/apis/imejis-api/revisions/4efd1a660d9c?raw)
