Images
Create Image
Creates an image given a prompt
Overview
Use GET /v1/models?recommended_for=image to get current image models, then send the selected model explicitly.
gpt-image-2 is a token-priced GPT Image model. TokenLab follows OpenAI's official usage breakdown for text input, image input, reported cached input, and image output tokens; it is not billed as a fixed per-image model.
For gpt-image-2 image generation, supported public parameters are prompt, n, size, quality, response_format, async, background, output_format, output_compression or compression, moderation, and user. background accepts auto or opaque; transparent is not supported. Omit size or quality to let TokenLab use auto; custom size values must use the flexible WIDTHxHEIGHT contract documented below.
input_fidelity is not part of the current TokenLab supported fields for gpt-image-2; omit it or the request returns 400 unsupported_parameter.
Model behavior notes
Google Gemini image-family models do not share the same selector contract:
gemini-3.1-flash-image,gemini-nano-banana-2.1,gemini-3-pro-image,nano-banana-2.1, andnano-banana-prosupportaspect_ratioplusresolution(1k,2k,4k) for their public text-to-image, image-to-image, and image-edit operations.nano-banana-2supportsaspect_ratioandresolution(1k,2k,4k) for both text-to-image and image-to-image generation.gemini-3.1-flash-lite-imageandnano-banana-2-litesupport text-to-image, image-to-image, and image-edit at1kresolution only.nano-bananasupportsaspect_ratiobut does not expose publicresolutionselection.- For image-to-image with
gemini-3.1-flash-image,gemini-nano-banana-2.1,gemini-3.1-flash-lite-image, orgemini-3-pro-image, use this endpoint withoperation: "image-to-image"and reference images. Send image-edit requests for these models to/v1/images/edits. - For Nano Banana reference-image requests, use
nano-banana-2,nano-banana-2.1,nano-banana-2-lite, ornano-banana-proon this endpoint (/v1/images/generations) withoperation: "image-to-image"andimage_urls. Image-edit requests fornano-banana-2,nano-banana-2.1,nano-banana-2-lite, andnano-banana-proalso use this endpoint, withoperation: "image-edit". Do not send Nano Banana reference-image requests to/v1/images/edits. - Reference images on this endpoint can be supplied as JSON
image_url/image_urls, or as a multipartimagefile.images[]andfile_idare not accepted on/v1/images/generations; create/v1/filesreferences only for/v1/images/editsmodels that documentimages[].file_id.
For Google image families, prefer aspect_ratio and only send resolution when the model explicitly supports it.
xAI Grok Imagine image models (grok-imagine-image, grok-imagine-image-quality, and legacy grok-imagine-image-pro) support aspect_ratio plus resolution (1k, 2k). grok-imagine-image-pro is retained as a compatibility ID for grok-imagine-image-quality.
Request Body
Synchronous request timeout: Some image requests return the final image inline and wait for generation to finish. High-resolution or high-quality requests can take close to a minute or longer, so set your HTTP client timeout to at least 120s. If the create response includes status: "pending", task_id, or poll_url, follow the returned poll_url instead.
Model to use (for example, gpt-image-2, flux-pro-1.1, or nano-banana-pro). Query GET /v1/models?recommended_for=image for the current recommended list.
Text description of the desired image.
Public HTTPS reference image URL for image-to-image generation. For Nano Banana reference-image requests, set operation to image-to-image; nano-banana-pro may include resolution.
Public HTTPS reference image URLs. Use this for one or more reference images in JSON requests. file_id and images[] are not supported on this endpoint.
Additional reference image URLs for models that distinguish primary inputs from references.
Multipart reference image file for image-to-image generation. Use this when the source image is private or header-protected. This is different from a /v1/files file_id, which is not accepted on this endpoint.
1Number of images to generate (1-10, model dependent).
Image size. Use this for OpenAI-style image families and other models that accept exact pixel sizes.
For gpt-image-2, size accepts auto or WIDTHxHEIGHT. Custom dimensions must both be multiples of 16, the longest edge must be at most 3840px, the long/short ratio must be at most 3:1, and total pixels must be between 655,360 and 8,294,400. aspect_ratio and resolution are not part of the current TokenLab model details for gpt-image-2.
For Google image models with resolution tiers (gemini-3.1-flash-image, gemini-nano-banana-2.1, gemini-3-pro-image, gemini-3.1-flash-lite-image, nano-banana-2, nano-banana-2.1, and nano-banana-pro), size accepts an output size from the model's size table, such as 1376x768 (16:9 at 1K), or a resolution tier: 1K, 2K, or 4K. TokenLab sends a tier as resolution, so the request and its price are the same as with resolution. A tier that the model does not support (for example 2K on gemini-3.1-flash-lite-image), or a tier that is different from resolution, returns 400 with code invalid_image_size_contract and the model's allowed_resolutions. For these models, the recommended form is aspect_ratio with resolution.
Model-dependent aspect ratio selector.
Common Google image-family values include 1:1, 16:9, 9:16, 3:2, and 2:3.
Model-dependent output resolution. gemini-3.1-flash-image, gemini-nano-banana-2.1, gemini-3-pro-image, nano-banana-2, nano-banana-2.1, and nano-banana-pro support 1k, 2k, and 4k; Grok Imagine image models support 1k and 2k. Omit this field unless the selected model and operation explicitly support it.
Image quality. GPT Image models such as gpt-image-2 use auto, low, medium, or high. Other models may use different values; check the model details before sending a non-default value.
How the images are returned: url or b64_json.
- Omitted: when the model returns image bytes, each image is in
data[].b64_json, and also indata[].urlwhen TokenLab stored it. When the model returns a link, each image is indata[].url. url: each image is only indata[].url.b64_json: each image is only indata[].b64_jsonas Base64 data.
Links are TokenLab media-result URLs. They stay valid for 30 days. See Data retention.
falseSet to true with gpt-image-2 or official FLUX/BFL image models to create a task first. Completed async image tasks return URLs regardless of the requested response_format; use synchronous requests when you need b64_json.
Optional style selector. Only send this when the selected model explicitly documents it; omit it for gpt-image-2 unless the model metadata says otherwise.
A unique identifier for the end-user.
Response
Inline Response
Unix timestamp of creation.
Array of generated images.
Each object contains:
url(string): TokenLab media-result URL of the image, valid for 30 days. Not present whenresponse_formatisb64_json. Whenresponse_formatis omitted, it is missing if TokenLab could not store the image.b64_json(string): Base64 image data. Present whenresponse_formatisb64_json, or when it is omitted and the model returns image bytes.revised_prompt(string): Optional prompt revision, when the selected model returns one
Async Task Response
Set async: true with gpt-image-2 or official FLUX/BFL image models to create a task instead of waiting for the final image in the create request. The response includes status: "pending", task_id, and poll_url. Poll /v1/tasks/{task_id} until the task reaches completed or failed.
Async image tasks return final image URLs only. If you need raw b64_json image data, use a synchronous request.
Billing may reserve the estimated amount when the task is created. Completed tasks are billed by actual usage, and failed or timed-out tasks are released or refunded.
Unix timestamp of creation.
Unique task identifier for polling.
Initial status: pending.
Relative URL to poll for results, for example /v1/tasks/{id}.
Empty while the task is pending. Completed image tasks return generated image URLs in data[].url.
When you receive status: "pending", use poll_url or GET /v1/tasks/{task_id} to retrieve the result.
Request
curl -X POST "https://api.tokenlab.sh/v1/images/generations" \
-H "Authorization: Bearer sk-your-api-key" \
-H "Content-Type: application/json" \
-d '{
"model": "gemini-3-pro-image",
"prompt": "A cinematic portrait of a white cat sitting on a rainy windowsill",
"aspect_ratio": "16:9",
"resolution": "2k"
}'from openai import OpenAI
client = OpenAI(
api_key="sk-your-api-key",
base_url="https://api.tokenlab.sh/v1"
)
response = client.images.generate(
model="gemini-3-pro-image",
prompt="A cinematic portrait of a white cat sitting on a rainy windowsill",
extra_body={"aspect_ratio": "16:9", "resolution": "2k"}
)
print(response.data[0].url)import OpenAI from 'openai';
const client = new OpenAI({
apiKey: 'sk-your-api-key',
baseURL: 'https://api.tokenlab.sh/v1'
});
const response = await client.images.generate({
model: 'gemini-3-pro-image',
prompt: 'A cinematic portrait of a white cat sitting on a rainy windowsill',
aspect_ratio: '16:9',
resolution: '2k'
});
console.log(response.data[0].url);<?php
$ch = curl_init('https://api.tokenlab.sh/v1/images/generations');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'Authorization: Bearer sk-your-api-key'
],
CURLOPT_POSTFIELDS => json_encode([
'model' => 'gemini-3-pro-image',
'prompt' => 'A cinematic portrait of a white cat sitting on a rainy windowsill',
'aspect_ratio' => '16:9',
'resolution' => '2k'
])
]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
echo $data['data'][0]['url'];Ratio-only image-family example: for nano-banana, send aspect_ratio but omit resolution:
{
"model": "nano-banana",
"prompt": "A clean editorial product shot of a citrus soda can",
"aspect_ratio": "16:9"
}Nano Banana Pro reference-image example: send the request to /v1/images/generations, not /v1/images/edits. resolution is optional and may be set to 1k, 2k, or 4k:
{
"model": "nano-banana-pro",
"prompt": "Create a clean cinematic character image based on the reference images",
"operation": "image-to-image",
"image_urls": ["https://example.com/reference-1.png"],
"aspect_ratio": "1:1",
"resolution": "2k"
}Direct multipart upload example for private or local source images. Do not pass a file_id to /v1/images/generations:
curl -X POST "https://api.tokenlab.sh/v1/images/generations" \
-H "Authorization: Bearer sk-your-api-key" \
-F "model=nano-banana-pro" \
-F "prompt=Create a clean cinematic character image based on this reference" \
-F "operation=image-to-image" \
-F "image=@reference.png" \
-F "aspect_ratio=1:1" \
-F "resolution=2k"Response
{
"created": 1706000000,
"data": [
{
"url": "https://...",
"revised_prompt": "A fluffy white cat with bright eyes sitting peacefully on a wooden windowsill, watching raindrops stream down the glass window..."
}
]
}Choose a Model
Query GET /v1/models?recommended_for=image or use the Models page for current availability, capabilities, and prices.
Do not hard-code a model as always synchronous or always asynchronous. If the create response returns status: "pending", follow poll_url and poll until completion.
Handling Task-Based Responses
For image models, always check whether the response contains status: "pending" / status: "processing":
import requests
import time
def generate_image(prompt, model="gpt-image-2"):
# Create image request
response = requests.post(
"https://api.tokenlab.sh/v1/images/generations",
headers={"Authorization": "Bearer sk-your-api-key"},
json={"model": model, "prompt": prompt, "async": True},
timeout=120
)
response.raise_for_status()
data = response.json()
# Check if task-based
if data.get("status") in ("pending", "processing"):
task_id = data["task_id"]
poll_url = data.get("poll_url")
print(f"Image task started: {task_id}")
# Poll for result
while True:
status_resp = requests.get(
f"https://api.tokenlab.sh{poll_url}" if poll_url else f"https://api.tokenlab.sh/v1/tasks/{task_id}",
headers={"Authorization": "Bearer sk-your-api-key"},
timeout=30
)
status_resp.raise_for_status()
status_data = status_resp.json()
if status_data["status"] == "completed":
return status_data["data"][0]["url"]
elif status_data["status"] == "failed":
raise Exception(status_data.get("error", "Generation failed"))
time.sleep(3)
else:
# Inline response
return data["data"][0]["url"]
# Usage
url = generate_image("a beautiful sunset over mountains", model="gpt-image-2")
print(f"Generated image: {url}")Hy Image 3.5 Preview creates 1024-pixel square images from text and edits reference images using written instructions. It is useful for drafting visuals and refining a composition.
{
"model": "hy-image-v3.5-preview",
"prompt": "A yellow lemon on a white table",
"size": "1024x1024",
"n": 1,
"response_format": "url"
}Authorization
BearerAuth API Key authentication. Create or manage API keys in Dashboard > API > API Keys.
In: header
Headers
Per-request Delivery policy. Overrides the API key and Workspace defaults. Auto tries TokenLab Verified first and may switch once to Official only before output, request acceptance, or persistent resource creation.
Value in
- "auto"
- "verified"
- "official"
Response
application/json
application/json
application/json
application/json
application/json
application/json
application/json