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.images/generations shape, plus gateway extras:
"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.
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 afile_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.