Generate Image (OpenRouter)
OpenRouter's image endpoint, for images.generate() in OpenRouter's SDKs (set the base URL to this gateway's /v1). It is the same implementation as /v1/images/generations and /v1/images/edits; what differs is the default answer: base64 (response_format b64_json), because OpenRouter's SDKs require b64_json in every item. Send input_references to edit with a model that has reference editing.
Model-specific settings (steps, guidance_scale, negative_prompt) go at the top level, or under provider.options for an SDK that cannot add fields: OpenRouter's SDKs keep only the slugs on their closed list, so use provider. there. A key the model does not declare is a 400 naming it.
Billing is output megapixels only (usage.megapixels, at the model's price per megapixel in usage.cost); reference images are not billed, and a failed request is not billed.
Body
application/jsonOne request shape for POST /v1/images, /v1/images/generations and (as JSON) /v1/images/edits: OpenRouter's image request, OpenAI's image request and the parameter names each model declares in GET /v1/images/models are all accepted on all three routes.
Every field is read, accepted and ignored by design (user, session_id, trace, and provider's routing fields such as order and sort), quality (auto, low, medium, high, standard, hd; any other value is a 400), or refused with a 400 naming it: moderation, style, input_fidelity, lora, loras, partial_images above 0, and any field the model does not declare. Limits below are z-image-turbo's; each model's own are in GET /v1/images/models.
-
prompt string required
A text description of the desired image(s). The maximum length is the model's (4000 characters for
z-image-turbo), counted as Unicode characters rather than bytes.at most 4000 characters -
model string
The model to use for image generation. Defaults to
z-image-turbo.GET /v1/images/modelslists the image models currently served. An unknown model returns 404.default z-image-turbo -
n integer
The number of images to generate. The images in one request are generated together, so changing
ncan change every image, including the first, for the sameseed.default 1range 1–10 -
response_format string
How the image comes back.
urlis a presigned link that expires after one hour;b64_jsonis the image inline as base64. The default isb64_jsononPOST /v1/images(OpenRouter's SDKs require it) andurlon/v1/images/generationsand/v1/images/edits.urlb64_json -
size string
WIDTHxHEIGHTin pixels, or a resolution label (1K,2K, ...). Forz-image-turboany sides that are multiples of 16, an area from 65,536 to 4,194,304 pixels and a longer side at most 4 times the shorter (so768x768works and1000x1000is a 400).autois the same as leaving it out. Anaspect_ratioorresolutionbeside an explicit size must agree with it.default 1024x1024 -
width integer deprecated
Legacy spelling of
size, kept because this API once documented it as ignored. Needsheightand meanssize"{width}x{height}"under the same rules; a 400 if it disagrees with asizesent beside it. Usesize. -
height integer deprecated
See
width. -
aspect_ratio string
One of the model's aspect ratios (
GET /v1/images/models). Withresolution, or alone at the model's default resolution, it picks the size. -
resolution string
One of the model's resolutions (
512,768,1K,1.5K,2Kforz-image-turbo;4Kis a 400). -
seed integer (int64)
Random seed. Must be an integer; fractional values are rejected rather than rounded. When omitted, each request uses a random seed.
Repeating a request with the same seed and the same value for every other field, including
nandsize, returns the same images from the same model version on the same hardware. A model or engine update can change the images a seed produces, and replicas on different GPUs can differ in the last bits. -
output_format stringdefault pngpngjpegwebp
-
output_compression integer
The encoder quality for
jpegandwebp, the compression level forpng. The engine's own default applies when omitted.range 0–100 -
background string
autoandopaquegive an opaque image.transparentonly works on a model whose spec supports it (it also needsoutput_formatpngorwebp); onz-image-turboit is a 400.default autoautoopaquetransparent -
input_references array of objects
OpenRouter's reference images, for a model with reference editing (
z-image-turbohas none, so it is a 400 naming this field). Each is{"type": "image_url", "image_url": {"url": "<https URL or base64 data URI>"}}. The gateway fetches an https URL itself. -
steps integer
The number of denoising steps (
z-image-turbo: 1 to 50, default 8). Generation time grows roughly linearly with steps. Also accepted asnum_inference_steps, and underprovider.options(seeprovider).For
z-image-turbothe last step of the schedule lands at zero noise and does not change the image, soNsteps applyN - 1denoising updates. The default of 8 applies 7; 9 matches the 8 updates in the upstream Z-Image-Turbo reference.range 1–50 -
num_inference_steps integer
Alias of
steps.range 1–50 -
guidance_scale number (float)
Classifier-free guidance strength. When omitted, the model's default is used: 0 for
z-image-turbo, which is also the upstream recommendation for Turbo models.0turns guidance off. Values above 0 turn it on, which enablesnegative_promptand roughly doubles the model work per step. Higher values are not a quality setting forz-image-turbo.range 0–20 -
negative_prompt string
Text describing what to steer the image away from. It only takes effect when
guidance_scaleis above 0; at thez-image-turbodefault of 0 it is ignored. It changes the output, but does not guarantee that the described content is absent. -
provider object
OpenRouter's provider preferences. The routing fields (
order,only,ignore,sort,allow_fallbacks, ...) are accepted and ignored.optionscarries the model's own settings (steps,guidance_scale,negative_prompt) for clients that cannot add top-level fields. From OpenRouter's SDKs useoptions.stealth: they keep only the slugs on their closed list and drop any other,vultrincluded, without an error. The first form present wins, the top level before any option; a key the model does not declare is a 400 naming its path. -
stream boolean
trueanswerstext/event-stream: oneimage_event (see the response), thengeneration. completed [DONE]. Always base64. Not withnabove 1. -
partial_images integer
OpenAI's partial image count. Only 0 is accepted; a stream carries the finished image only.
range 0–0 -
user string
Accepted and ignored.
-
session_id string
Accepted and ignored.
-
trace object
Accepted and ignored.
Responses
OK. With stream: true, text/event-stream carrying one image_ event and [DONE].
application/json · create-image-response-payload
A field the model does not accept or a malformed input. The message names the field.
application/json · error-payload
The API key is missing, unknown or not active. Send it as Authorization: Bearer <key>.
application/json · error-payload
The model does not exist
application/json · error-payload
A reference image over 20 MB, or the images over 64 MB together
application/json · error-payload
Too many requests for this model from your subscription in the last minute, or too many running at once. Wait for Retry-After, then retry.
application/json · error-payload
The model is temporarily unavailable
application/json · error-payload
The model answered without an image
application/json · error-payload
curl https://api.vultrinference.com/v1/images \
-H "Authorization: Bearer $VULTR_INFERENCE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "z-image-turbo",
"prompt": "Studio photograph of a red ceramic teapot beside a blue cup on a wooden table.",
"aspect_ratio": "16:9",
"resolution": "1K",
"provider": {
"options": {
"stealth": {
"steps": 8
}
}
}
}'import os
import requests
response = requests.post(
"https://api.vultrinference.com/v1/images",
headers={"Authorization": f"Bearer {os.environ['VULTR_INFERENCE_API_KEY']}"},
json={
"model": "z-image-turbo",
"prompt": "Studio photograph of a red ceramic teapot beside a blue cup on a wooden table.",
"aspect_ratio": "16:9",
"resolution": "1K",
"provider": {
"options": {
"stealth": {
"steps": 8,
},
},
},
},
)
print(response.json())const response = await fetch("https://api.vultrinference.com/v1/images", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.VULTR_INFERENCE_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
"model": "z-image-turbo",
"prompt": "Studio photograph of a red ceramic teapot beside a blue cup on a wooden table.",
"aspect_ratio": "16:9",
"resolution": "1K",
"provider": {
"options": {
"stealth": {
"steps": 8
}
}
}
}),
});
console.log(await response.json());{
"created": 0,
"data": [
{
"media_type": "image/png"
}
],
"size": "1024x1024",
"output_format": "png",
"background": "opaque",
"usage": {
"prompt_tokens": 0,
"completion_tokens": 0,
"total_tokens": 0,
"input_tokens": 0,
"output_tokens": 0,
"cost": 0.02097152,
"megapixels": 1.048576
}
}