---
title: "Create an image job (Idempotency-Key required): text or reference images to one image, billed per image; 202 with the image"
method: POST
path: "/v1/images"
tags: ["platform-api"]
---

# Create an image job (Idempotency-Key required): text or reference images to one image, billed per image; 202 with the image

`POST /v1/images`

## Request

- Base URL: `https://api.cuddler.ai`
- URL: `https://api.cuddler.ai/v1/images`
- Auth: HTTP bearer

## Headers

- `Idempotency-Key` string, required: Required. One key per logical request (e.g. `ep03-shot042-take1`), never reusable: the same key and body answer with the original object and `Idempotent-Replayed: true`; the same key with a different body is 409 (and so is any reuse once the job's request trace was removed, 180 days after it finished).

## Request body

- object
  - `model` 'seedream-5' | 'seedream-5-pro' | 'qwen-image-3' | 'z-image-turbo' | 'grok-imagine-2.0' | 'ideogram-4' | 'ideogram-4.5' | 'recraft-4.1' | 'nano-banana-2.1' | 'nano-banana-2' | 'nano-banana-2-lite' | 'nano-banana-pro' | 'imagen-4-ultra' | 'imagen-4' | 'imagen-4-fast' | 'imagen-3' | 'imagen-3-fast' | 'gpt-image-2.5-sunburst' | 'gpt-image-2.5-flare' | 'gpt-image-2' | 'gpt-image-1.5' | 'gpt-image-1-mini' | 'gpt-image-1', required
  - `mode` 'text' | 'reference' | 'edit'
  - `variant` 'default' | 'fast' | 'pro' | 'standard' | 'turbo' | '4k' | 'base' | 'utility' | 'utility-pro'
  - `max_usd` string: Maximum USD this job may charge; creation refuses a larger hold and settlement never exceeds this ceiling
  - `prompt` string, required
  - `resolution` '0.5K' | '1K' | '2K' | '4K'
  - `aspect_ratio` '1:1' | '4:3' | '3:4' | '16:9' | '9:16'
  - `reference_images` string[]
  - `seed` integer
  - `webhook_url` string, uri
  - `metadata` object

## Response `200`

Replay: this Idempotency-Key already created this image

- object
  - `object` 'image', required
  - `id` string, required
  - `status` 'queued' | 'running' | 'succeeded' | 'failed' | 'canceled', required
  - `model` 'seedream-5' | 'seedream-5-pro' | 'qwen-image-3' | 'z-image-turbo' | 'grok-imagine-2.0' | 'ideogram-4' | 'ideogram-4.5' | 'recraft-4.1' | 'nano-banana-2.1' | 'nano-banana-2' | 'nano-banana-2-lite' | 'nano-banana-pro' | 'imagen-4-ultra' | 'imagen-4' | 'imagen-4-fast' | 'imagen-3' | 'imagen-3-fast' | 'gpt-image-2.5-sunburst' | 'gpt-image-2.5-flare' | 'gpt-image-2' | 'gpt-image-1.5' | 'gpt-image-1-mini' | 'gpt-image-1', required
  - `prompt` string, required
  - `resolution` '0.5K' | '1K' | '2K' | '4K', required
  - `aspect_ratio` '1:1' | '4:3' | '3:4' | '16:9' | '9:16', required
  - `created_at` string, required
  - `started_at` string, nullable, required
  - `completed_at` string, nullable, required
  - `queue_position` integer, nullable, required
  - `estimate` object, required
    - `usd` string, required
    - `hold_usd` string, required
  - `usage` object, nullable, required
    - `images` integer, required
    - `usd` string, required
    - `usd_micros` integer, required
  - `output` object, nullable, required
    - `url` string, uri, required
    - `url_expires_at` string, required
    - `retained_until` string, required
    - `width` integer, nullable, required
    - `height` integer, nullable, required
    - `content_type` string, required
  - `error` object, nullable, required
    - `code` 'content_policy' | 'reference_rejected' | 'invalid_parameters' | 'upstream_error' | 'timeout' | 'internal_error', required
    - `message` string, required
  - `metadata` object, required
  - `price_version` string, required
  - `api_key_id` string, required

## Other responses

- `202`: Created: the image, with its price held. Usually already succeeded (rendered within the request); queued or running when the organization is at its limit or the render outlasted the request; failed (nothing charged, see error) when it could not be made
- `400`: invalid_request — validation failed (details.issues): Idempotency-Key, canvas, reference count, uploads that are not ready or not this organization's
- `401`: unauthorized — no key, or an unknown or revoked one (WWW-Authenticate: Bearer)
- `402`: insufficient_balance — the available balance does not cover the hold
- `403`: model_not_enabled; organization_suspended; forbidden — a test key
- `404`: not_found — the Platform API is switched off, or the object does not exist
- `409`: idempotency_conflict — the key was already used with a different body (videos and images share keys)
- `422`: content_blocked — the prompt or a reference is not allowed under the content policy
- `429`: rate_limited / queue_full / daily_limit_reached (Retry-After)
- `500`: internal_error — quote request_id when contacting support
- `503`: unavailable — moderation or storage could not answer; nothing was held, retry (Retry-After)

---

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