# OpenAI GPT Image 1.5 — Text To Image > Try GPT-Image-1.5 on GPT Proto. Generate and edit images from text with fast speed, low cost, strong prompt accuracy, realistic visuals, and clear text output. ## Overview - **Endpoint**: `POST https://gptproto.com/api/v3/openai/gpt-image-1.5/text-to-image` - **Result URL**: `GET https://gptproto.com/api/v3/predictions/{result_id}/result` — the submit response also returns the authoritative URL in `data.urls.get` - **Model ID**: `gpt-image-1.5` - **Vendor**: OpenAI - **Scene**: `text-to-image` - **Category**: text-to-image - **Modalities**: input text → output image - **Playground**: https://gptproto.com/model/openai/gpt-image-1.5 - **API documentation**: https://docs.gptproto.com/docs/allapi/OpenAI/gpt-image-1.5/official-format/text-to-image - **Other scenes of this model**: `image-edit` — same auth, different endpoint path and input schema ## Authentication Every request needs a GPTProto API key in the `Authorization` header. Create one at https://gptproto.com/dashboard/api-key, then export it: ```bash export GPTPROTO_API_KEY="your-api-key" ``` Header: `Authorization: Bearer $GPTPROTO_API_KEY` (plus `Content-Type: application/json` on POST). ## Pricing Platform price by tier (USD, already includes the GPTProto discount): - **Image Output** — $0.0224 per 1K tokens - **Image Input** — $0.0056 per 1K tokens - **Cached Input** — $0.0014 per 1K tokens - **Text Input** — $0.0035 per 1K tokens - **Text Output** — $0.007 per 1K tokens Price range: $0 – $0 per generation. Prices may change. The model page always shows the live price: https://gptproto.com/model/openai/gpt-image-1.5 ## API Information The API is asynchronous: POST the endpoint to create a prediction, then poll its result URL until `status` is `completed` or `failed`. ### Input Schema The endpoint accepts the following JSON body parameters: - **`prompt`** (`string`, _required_): A text description of the desired image(s). The maximum length is 32000 characters for gpt-image-1. - **`n`** (`range`, _optional_): The number of images to generate. Must be between 1 and 10. - Default: `1` - Range: 1–10 - **`background`** (`enum`, _optional_): Allows to set transparency for the background of the generated image(s). This parameter is only supported for gpt-image-1. Must be one of transparent, opaque or auto (default value). When auto is used, the model will automatically determine the best background for the image. - Default: `auto` - Options: opaque, auto, transparent - **`quality`** (`enum`, _optional_): The size of the generated images. Must be one of 1024x1024, 1536x1024 (landscape), 1024x1536 (portrait), or auto (default value) for gpt-image-1 - Default: `auto` - Options: high, medium, low, auto - **`size`** (`enum`, _optional_): The size of the generated images. Must be one of 1024x1024, 1536x1024 (landscape), 1024x1536 (portrait), or auto (default value) for gpt-image-1 - Default: `auto` - Options: 1024x1024, 1536x1024, 1024x1536, auto - **`enable_sync_mode`** (`boolean`, _optional_): Allows the usage of synchronous mode for image generation - Options: true, false - **`response_format`** (`enum`, _optional_): The format of the returned image(s) - Default: `url` - Options: b64_json, url **Required Parameters Example**: ```json { "prompt": "A tiny origami fox sailing a teacup across a moonlit puddle" } ``` **Full Example**: ```json { "prompt": "A tiny origami fox sailing a teacup across a moonlit puddle", "n": 1, "background": "auto", "quality": "auto", "size": "auto", "enable_sync_mode": false, "response_format": "url" } ``` ### Output Schema Both submit and poll return the same envelope: - **`data.id`** (`string`): Prediction id. Use it as `result_id` when polling for the result. - **`data.status`** (`string`): One of `created`, `running`, `completed`, `failed`. See Status Values below. - **`data.outputs`** (`array of string`): Generated files. Empty until `status` is `completed`; then it holds the output URLs (or base64 strings when the model exposes a base64 option). - **`data.urls.get`** (`string`): Authoritative result URL for this prediction. Prefer it over building the poll URL yourself. - **`data.error`** (`string | null`): Failure reason when `status` is `failed`, otherwise `null`. - **`data.executionTime`** (`integer`): Total processing time in milliseconds. - **`data.timings.inference`** (`integer`): Model inference time in milliseconds. - **`data.hasNsfwContents`** (`array of boolean`): Per-output moderation flags. - **`message`** (`string`): `success` on a normal response, otherwise the error message. - **`code`** (`integer`): Business status code. `200` means the request was accepted. **Example Response — submit (task accepted)**: ```json { "data": { "id": "pred_example_01", "model": "gpt-image-1.5", "outputs": [], "urls": { "get": "https://gptproto.com/api/v3/predictions/pred_example_01/result" }, "hasNsfwContents": [], "status": "created", "createdAt": "2026-01-01T12:00:00Z", "executionTime": 0, "timings": { "inference": 0 } }, "message": "success", "code": 200 } ``` **Example Response — poll (completed)**: ```json { "data": { "id": "pred_example_01", "model": "gpt-image-1.5", "outputs": [ "https://oss-us.gptproto.com/example/output.png" ], "urls": { "get": "https://gptproto.com/api/v3/predictions/pred_example_01/result" }, "status": "completed", "error": null, "executionTime": 12345, "timings": { "inference": 12000 }, "has_nsfw_contents": [], "created_at": "2026-01-01T12:00:00Z" }, "message": "success", "code": 200 } ``` ### Status Values - `created` — Task accepted. Use `data.id` as `result_id` for polling. - `running` — Generation is in progress. Keep polling. - `completed` — Finished successfully. Generated files are in `data.outputs`. - `failed` — Generation failed. Read `data.error` for the reason. ## Usage Examples ### 1. Submit a request ```bash curl --request POST "https://gptproto.com/api/v3/openai/gpt-image-1.5/text-to-image" \ --header "Authorization: Bearer $GPTPROTO_API_KEY" \ --header "Content-Type: application/json" \ --data '{ "prompt": "A tiny origami fox sailing a teacup across a moonlit puddle", "n": 1, "background": "auto", "quality": "auto", "size": "auto", "enable_sync_mode": false, "response_format": "url" }' ``` ```python import os import requests url = "https://gptproto.com/api/v3/openai/gpt-image-1.5/text-to-image" headers = { "Authorization": f"Bearer {os.environ['GPTPROTO_API_KEY']}", "Content-Type": "application/json" } payload = { "prompt": "A tiny origami fox sailing a teacup across a moonlit puddle", "n": 1, "background": "auto", "quality": "auto", "size": "auto", "enable_sync_mode": False, "response_format": "url" } response = requests.request("POST", url, headers=headers, json=payload) print(response.json()) ``` ```typescript const response = await fetch("https://gptproto.com/api/v3/openai/gpt-image-1.5/text-to-image", { method: "POST", headers: { "Authorization": `Bearer ${process.env.GPTPROTO_API_KEY}`, "Content-Type": "application/json", }, body: JSON.stringify({ prompt: "A tiny origami fox sailing a teacup across a moonlit puddle", n: 1, background: "auto", quality: "auto", size: "auto", enable_sync_mode: false, response_format: "url", }), }); const data = await response.json(); console.log(data); ``` ### 2. Poll until the task finishes Replace `YOUR_RESULT_ID` with `data.id` from the submit response (or call `data.urls.get` directly), and keep polling every 1–3 seconds while `status` is `created` or `running`. ```bash result_id="YOUR_RESULT_ID" curl --request GET "https://gptproto.com/api/v3/predictions/$result_id/result" \ --header "Authorization: Bearer $GPTPROTO_API_KEY" ``` ```python import os import requests result_id = "YOUR_RESULT_ID" url = f"https://gptproto.com/api/v3/predictions/{result_id}/result" headers = { "Authorization": f"Bearer {os.environ['GPTPROTO_API_KEY']}" } response = requests.request("GET", url, headers=headers) print(response.json()) ``` ```typescript const result_id = "YOUR_RESULT_ID"; const response = await fetch(`https://gptproto.com/api/v3/predictions/${result_id}/result`, { method: "GET", headers: { "Authorization": `Bearer ${process.env.GPTPROTO_API_KEY}`, }, }); const data = await response.json(); console.log(data); ``` ## Example Prompts - A majestic Bengal tiger with vivid orange and black striped fur, piercing amber eyes, powerful muscular build, perched on a moss-covered rock, dense green jungle with dappled sunlight filtering through tall canopy, serene yet fierce atmosphere, high-resolution digital art with vi… - A vast and majestic mountain range at sunrise, golden light spilling over snow-capped peaks, endless valleys filled with mist, crystal-clear rivers winding toward a shimmering lake, giant waterfalls cascading into deep canyons, flocks of birds soaring through the glowing clouds,… - A colossal interstellar fleet cruising through hyperspace corridors, starship hulls reflecting the glow of distant supernovas, shimmering energy beams connecting flagship and escorts, wormholes pulsing with cosmic light, vast nebula storms swirling in the distance, cinematic slow… ## HTTP Status Codes - `400` — malformed body, a parameter or value this model does not accept, or input blocked by the provider's content moderation - `401` — missing or invalid API key - `403` — insufficient credits - `413` — request body too large - `429` — rate limited; retry with backoff - `500` — An internal server error occurred - `502` — An internal server error occurred - `504` — Gateway timeout — upstream service did not respond in time; retry later ## Additional Resources - [Model playground](https://gptproto.com/model/openai/gpt-image-1.5) - [API documentation](https://docs.gptproto.com/docs/allapi/OpenAI/gpt-image-1.5/official-format/text-to-image) - [All models](https://gptproto.com/model) - [API keys](https://gptproto.com/dashboard/api-key) - [Platform overview for LLMs](https://gptproto.com/llms-full.txt) - Any other model: `https://gptproto.com/model/{vendor}/{model}/{scene}/llms.txt`