TokenLab

Images

Create Image

Creates an image given a prompt

POST
/v1/images/generations

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, and nano-banana-pro support aspect_ratio plus resolution (1k, 2k, 4k) for their public text-to-image, image-to-image, and image-edit operations.
  • nano-banana-2 supports aspect_ratio and resolution (1k, 2k, 4k) for both text-to-image and image-to-image generation.
  • gemini-3.1-flash-lite-image and nano-banana-2-lite support text-to-image, image-to-image, and image-edit at 1k resolution only.
  • nano-banana supports aspect_ratio but does not expose public resolution selection.
  • For image-to-image with gemini-3.1-flash-image, gemini-nano-banana-2.1, gemini-3.1-flash-lite-image, or gemini-3-pro-image, use this endpoint with operation: "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, or nano-banana-pro on this endpoint (/v1/images/generations) with operation: "image-to-image" and image_urls. Image-edit requests for nano-banana-2, nano-banana-2.1, nano-banana-2-lite, and nano-banana-pro also use this endpoint, with operation: "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 multipart image file. images[] and file_id are not accepted on /v1/images/generations; create /v1/files references only for /v1/images/edits models that document images[].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.

modelstringrequired

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.

promptstringrequired

Text description of the desired image.

image_urlstring

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.

image_urlsstring[]

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.

reference_image_urlsstring[]

Additional reference image URLs for models that distinguish primary inputs from references.

imagefile

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.

nintegerdefault: 1

Number of images to generate (1-10, model dependent).

sizestring

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.

aspect_ratiostring

Model-dependent aspect ratio selector.

Common Google image-family values include 1:1, 16:9, 9:16, 3:2, and 2:3.

resolutionstring

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.

qualitystring

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.

response_formatstring

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 in data[].url when TokenLab stored it. When the model returns a link, each image is in data[].url.
  • url: each image is only in data[].url.
  • b64_json: each image is only in data[].b64_json as Base64 data.

Links are TokenLab media-result URLs. They stay valid for 30 days. See Data retention.

asyncbooleandefault: false

Set 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.

stylestring

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.

userstring

A unique identifier for the end-user.

Response

Inline Response

createdinteger

Unix timestamp of creation.

dataarray

Array of generated images.

Each object contains:

  • url (string): TokenLab media-result URL of the image, valid for 30 days. Not present when response_format is b64_json. When response_format is omitted, it is missing if TokenLab could not store the image.
  • b64_json (string): Base64 image data. Present when response_format is b64_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.

createdinteger

Unix timestamp of creation.

task_idstring

Unique task identifier for polling.

statusstring

Initial status: pending.

poll_urlstring

Relative URL to poll for results, for example /v1/tasks/{id}.

dataarray

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
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"
  }'
Python
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)
JavaScript
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
<?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
AuthorizationBearer <token>

API Key authentication. Create or manage API keys in Dashboard > API > API Keys.

In: header

Headers

X-TokenLab-Delivery-Policy?string

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"

Request Body

Response

application/json

application/json

application/json

application/json

application/json

application/json

application/json