Skip to main content
POST /v3/images is a deterministic, provider-agnostic image endpoint. You pass a model and a prompt; Opper runs the job and returns the image inline. The same call works across every image model (OpenAI GPT Image, Google Imagen, xAI, Pruna, and more) — model and prompt are owned by Opper, a small set of high-level parameters is normalized for you, and anything model-specific goes in parameters.
Image generation is synchronous by default: the response comes back on the same request with the image as base64 (plus a stored file_id + presigned url when you pass "store": true). Slow jobs (the top quality tiers on the newest models) can run in the background instead, see Heavy jobs. For looking at images instead of making them, see Vision & PDFs.

Generate an image

OpenAI’s current pair: gpt-image-2.5-flare for fast everyday generation and editing, gpt-image-2.5-sunburst when an edit has to land exactly — same rates, slower. Both take two tiers above high, xhigh and max, and bill from the tokens the provider reports rather than a fixed per-image table, so cost climbs steeply with the tier: max runs about 16x medium.
The response mirrors OpenAI’s images/generations shape, plus gateway extras:
Pass "store": true to also store each image, so you get a reusable file_id and a presigned url alongside the base64, or "response_format": "url" to store it and return only the stored URL instead of the base64. Without either, nothing is stored.
The file_id is a reusable handle — pass it as the image on a later edit or as the seed image on a video call, no re-upload. See Files for how files work, lifecycle, and storage quotas.

Parameters

model and prompt are required. The rest are optional; the high-level ones are normalized across providers, and parameters is forwarded verbatim to the provider, which validates it. Model-specific knobs go in parameters — for example DALL·E 3’s style (vivid | natural), or a diffusion model’s seed / negative_prompt. They’re forwarded verbatim and validated by the provider. See Discover models for how to list the keys a given model accepts.

Edit and image-to-image

Pass a source image alongside the prompt. Each input accepts an http(s) URL, a data-URI, or a file_id from a previous generation or upload. Models that only do text-to-image reject these with a clear 400.

Heavy jobs (async)

A synchronous call is bounded by a 3-minute server deadline. Nearly every generation fits: most models return in 5–30 s. The exception is the top quality tiers on the newest models — max on GPT Image 2.5 takes a minute or more. A job that overruns the deadline comes back as a 504 and is not billed. Set async: true to hand that job to the background worker. The call returns straight away with a 202, an id and a status_url. Poll the status URL: 202 while the job is processing, then 200 with status: "completed", a presigned url, the mime_type, the billed usage, and a reusable file_id when you passed "store": true. Async runs one image per request, so leave n at 1.
Submit + poll

Discover models

GET /v3/images/models reports the models you can use and their capabilities. Each model’s params.image block lists the normalized axes it accepts — sizes, aspect_ratios, resolutions, qualities — plus a parameters list of the native passthrough keys (e.g. seed, negative_prompt, personGeneration) you can put in parameters, so you can discover a model’s knobs instead of guessing.

What’s next

Vision & PDFs

Send images into a model instead of generating them.

Video

Turn a generated image into video.

Models

Which models generate images, and at what sizes.

Observe & Control

Inspect generations and manage spend rules.