Building with the API

Generate Images with the OpenAI API (gpt-image)

3 min read

There are two doors to the same models. The Images API is the direct one: prompt in, image out. The Responses API lets a chat model decide to call an image_generation tool as part of a conversation, so you can refine an image in follow-up turns.

1. Key

export OPENAI_API_KEY="sk-..."   # macOS/Linux; PowerShell: $env:OPENAI_API_KEY="sk-..."
pip install openai

Both SDK calls below read the key from the environment.

2. Images API: prompt in, PNG out

from openai import OpenAI
import base64

client = OpenAI()

result = client.images.generate(
    model="gpt-image-2",
    prompt="A children's book drawing of a veterinarian using a stethoscope to listen to the heartbeat of a baby otter.",
)

with open("otter.png", "wb") as f:
    f.write(base64.b64decode(result.data[0].b64_json))

Returns the image as base64 in data[0].b64_json; decoding it and writing the bytes gives you a PNG. gpt-image-2 is the current model; gpt-image-1.5, gpt-image-1 and gpt-image-1-mini are the cheaper/older options.

3. Responses API: the model generates as a tool

from openai import OpenAI
import base64

client = OpenAI()

response = client.responses.create(
    model="gpt-6-astra",
    input="Generate an image of a gray tabby cat hugging an otter with an orange scarf",
    tools=[{"type": "image_generation"}],
)

images = [o.result for o in response.output if o.type == "image_generation_call"]
if images:
    with open("otter.png", "wb") as f:
        f.write(base64.b64decode(images[0]))

The text model plans the prompt and calls the tool; the image comes back as an image_generation_call output item with base64 in result. Continue the same conversation (“make the scarf blue”) to edit it.

4. The knobs

result = client.images.generate(
    model="gpt-image-2",
    prompt="Flat vector icon of a paper plane, single color, transparent background",
    size="1024x1024",        # or 1536x1024, 1024x1536, auto
    quality="high",          # low, medium, high, auto
    output_format="png",     # png (default), jpeg, webp
    background="transparent" # transparent, opaque, auto
)

n makes several images per call; output_compression (0–100) shrinks JPEG/WebP; moderation="low" relaxes the content filter — blocked requests come back as a moderation_blocked error.

5. Edits

The edits endpoint takes an input image (and optionally a mask marking the region to replace) plus a prompt, and returns the modified image in the same base64 shape. It’s the route for “same picture, change one thing”; for a new picture, generate again.


Next: your first OpenAI API request · generate images locally with FLUX.

Open the full interactive version (with copy buttons) ↗

← All guides