promptstringRequiredWrite the required Flare image brief within 5,000 characters; no text is supplied by default, and very long prompts incur a small per-token fee.
- Default
- Not specified
- Constraints
- minLength:1maxLength:5000
GPT Image 2.6 Flare builds a new image from your written scene, with quality and resolution selected separately.
Examples use the selected endpoint’s public parameter definitions. Replace the API key and example media, then send the request from your server.
SDKs & integrationshttps://api.spicyapi.ai/api/v1/jobs/createTaskKeep the API key in the server environment variable SPICY_API_KEY. Use Bearer authentication and Content-Type: application/json for JSON requests.
Authorization: Bearer $SPICY_API_KEY# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
-H "Authorization: Bearer $SPICY_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
-d '{
"model": "openai/gpt-image-2.6-flare/text-to-image",
"input": {
"prompt": "A ceramic teapot on a linen cloth, soft window light, muted palette",
"quality": "medium",
"background": "auto",
"resolution": "1k",
"num_outputs": 1,
"aspect_ratio": "1:1"
}
}'
# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
-H "Authorization: Bearer $SPICY_API_KEY"Generated from this model’s input schema — the same one the API validates every request against.
Place these fields inside the request body’s input object. Names and types match the API. Do not assume a default when none is specified.
promptstringRequiredWrite the required Flare image brief within 5,000 characters; no text is supplied by default, and very long prompts incur a small per-token fee.
output_qualityintegerOptionalPick Flare’s JPEG or WebP compression from 0 to 100: higher keeps more detail in a larger file, while PNG and GIF output ignore it and Flare’s price does not change.
frame_duration_msintegerOptionalSet Flare frame_duration_ms between 20 and 2000 (default 200) to pace the loop described in your prompt.
frame_countintegerOptionalAffects priceFlare animation accepts frame_count 2–16 and starts at 9 when omitted; cap it at 12 for 768 or 16 for 512.
output_formatstringOptionalChoose png by default, or request jpeg, webp or gif with Flare. To draft an animation, supply aspect_ratio and avoid transparent backgrounds; edit requests cannot return GIF.
"png""jpeg""webp""gif"backgroundstringOptionalChoose auto, opaque or transparent for the Flare background; its default is not specified here, transparency needs PNG or WebP, and this selection adds no fee.
"auto""transparent""opaque"num_outputsintegerOptionalAffects priceSet the Flare result count from 1 through 10; the default count is not specified here, and each image has its own charge.
reasoning_effortstringOptionalFlare offers low, medium and high for reasoning_effort, defaulting to high if omitted. More planning can help dense lettering or complex layouts but extends the wait without changing the charge.
"low""medium""high"qualitystringOptionalAffects priceFlare offers low, medium, high, xhigh and max detail, starting at medium; moving higher adds detail, time and cost.
"low""medium""high""xhigh""max"resolutionstringOptionalAffects priceFlare still images use 1k (about 1 MP), 2k (about 3.7 MP) or 4k (about 8.3 MP). GIF frame sizes are 512 (about 0.26 MP, maximum 16 frames) and 768 (about 0.59 MP, maximum 12).
"1k""2k""4k""512""768"aspect_ratiostringOptionalFlare stills start at 1:1 if aspect_ratio is omitted; GIF drafts must specify it. Fifteen ratios span 1:3 to 3:1 with no extra ratio fee.
"1:1""16:9""9:16""4:3""3:4""3:2""2:3""21:9""9:21""2:1""1:2""3:1""1:3""5:4""4:5"{
"type": "object",
"required": [
"prompt"
],
"x-pricing": {
"billingMode": "formula",
"variantFields": [
"quality",
"resolution"
]
},
"properties": {
"prompt": {
"type": "string",
"x-ui": {
"order": 100,
"widget": "textarea"
},
"maxLength": 5000,
"minLength": 1,
"description": "Describe the picture: subject, setting, light and any short text to render in quotes."
},
"quality": {
"enum": [
"low",
"medium",
"high",
"xhigh",
"max"
],
"type": "string",
"x-ui": {
"order": 76,
"widget": "select",
"affects_price": true
},
"default": "medium",
"description": "Rendering quality. Higher tiers add detail, time and cost."
},
"background": {
"enum": [
"auto",
"transparent",
"opaque"
],
"type": "string",
"x-ui": {
"order": 50,
"widget": "radio"
},
"default": "auto",
"description": "Background treatment. Transparent needs PNG or WebP output."
},
"resolution": {
"enum": [
"1k",
"2k",
"4k",
"512",
"768"
],
"type": "string",
"x-ui": {
"order": 78,
"widget": "radio",
"affects_price": true
},
"default": "1k",
"description": "Output size tier: 1k is about 1 megapixel, 2k about 3.7, 4k about 8.3. For GIF output use 512 or 768, the size of one frame."
},
"frame_count": {
"type": "integer",
"x-ui": {
"step": 1,
"order": 19,
"widget": "slider",
"affects_price": true
},
"maximum": 16,
"minimum": 2,
"description": "Number of frames in a GIF, 2 to 16 (default 9). Every 8 frames are billed as one more frame sheet. Only with gif output."
},
"num_outputs": {
"type": "integer",
"x-ui": {
"step": 1,
"order": 60,
"widget": "slider",
"affects_price": true
},
"default": 1,
"maximum": 10,
"minimum": 1,
"description": "How many images to return, each billed separately."
},
"aspect_ratio": {
"enum": [
"1:1",
"16:9",
"9:16",
"4:3",
"3:4",
"3:2",
"2:3",
"21:9",
"9:21",
"2:1",
"1:2",
"3:1",
"1:3",
"5:4",
"4:5"
],
"type": "string",
"x-ui": {
"order": 80,
"widget": "select"
},
"default": "1:1",
"description": "Output aspect ratio."
},
"output_format": {
"enum": [
"png",
"jpeg",
"webp",
"gif"
],
"type": "string",
"x-ui": {
"order": 20,
"widget": "select"
},
"default": "png",
"description": "File format of the returned images. gif returns an animated loop; describe the motion in the prompt."
},
"output_quality": {
"type": "integer",
"x-ui": {
"step": 1,
"order": 15,
"widget": "slider"
},
"maximum": 100,
"minimum": 0,
"description": "Compression quality for JPEG and WebP output, from 0 to 100."
},
"reasoning_effort": {
"enum": [
"low",
"medium",
"high"
],
"type": "string",
"x-ui": {
"order": 74,
"widget": "select"
},
"description": "How much the model plans the picture before drawing. Higher helps dense text and complex layouts and takes longer; the price does not change. Leave it unset for the model default (high)."
},
"frame_duration_ms": {
"type": "integer",
"x-ui": {
"step": 10,
"unit": "ms",
"order": 18,
"widget": "slider"
},
"maximum": 2000,
"minimum": 20,
"description": "How long each GIF frame stays on screen, 20 to 2000 milliseconds (default 200). Only with gif output."
}
},
"additionalProperties": false
}HTTP 202 means the task was accepted, not completed. Save the returned taskId and query that task. Do not create another task while waiting for its result.
HTTP/1.1 202 Accepted
Location: /api/v1/jobs/recordInfo?taskId=job_01k3m8x9q2z4v7n5p6r8s0t1w3
{
"code": 200,
"msg": "success",
"request_id": "req_example_create",
"data": {
"taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
"state": "queued",
"estimatedCost": "0.750000"
}
}The accepted response includes the estimate so your app can show the same amount in task history and billing.
curl --get "https://api.spicyapi.ai/api/v1/jobs/recordInfo" \
--data-urlencode "taskId=$TASK_ID" \
-H "Authorization: Bearer $SPICY_API_KEY"Start polling at about 2 seconds and gradually increase the interval. Stop at a terminal state. After a connection failure, query the original taskId. Retry creation only with the original idempotency key and body.
import { verifyWebhook } from "@spicyapi/sdk";
// express.raw keeps the bytes we signed; express.json never matches.
app.post("/hooks/spicy", express.raw({ type: "application/json" }), (req, res) => {
const { payload } = verifyWebhook({
rawBody: req.body,
timestamp: req.header("X-Webhook-Timestamp"),
signature: req.header("X-Webhook-Signature"),
payloadVersion: Number(req.header("X-Webhook-Payload-Version")),
secret: process.env.SPICY_WEBHOOK_SECRET,
});
res.status(200).end();
void handleFinishedTask(payload);
});Pass callBackUrl when you create the task and the finished record is POSTed to you — no polling loop at all. Every delivery carries X-Webhook-Timestamp, X-Webhook-Signature and X-Webhook-Payload-Version. The signature is a base64 HMAC-SHA256 over taskId.timestamp.sha256(body), so it must be checked against the raw bytes: parsing the JSON and re-serialising it changes them and the check will fail. Failed deliveries are retried, so the same taskId can arrive twice — make the handler idempotent. Answer 2xx first and do the work afterwards; a slow handler is treated as a failed delivery.
Consume output only when state is succeeded. On failure, use errorCode, errorMessage and request_id to investigate. Example costs and states do not represent an actual bill.
{
"code": 200,
"msg": "success",
"request_id": "req_example_record",
"data": {
"taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
"model": "openai/gpt-image-2.6-flare/text-to-image",
"state": "succeeded",
"output": {
"assets": [
{
"key": "tasks/2026/08/28/job_01k3m8x9q2z4v7n5p6r8s0t1w3/3f7a1c9e5b2d48f0a6c1e3d5b7f9a1c3.png",
"mime": "image/png",
"url": "https://example.r2.cloudflarestorage.com/results/job_01k3m8x9q2z4v7n5p6r8s0t1w3/result.png?X-Amz-Signature=SIGNATURE_FROM_RESPONSE",
"expiresAt": "2026-08-28T12:20:08.000Z"
}
]
},
"cost": "0.750000",
"settled": true,
"createdAt": "2026-08-28T12:00:00Z",
"completedAt": "2026-08-28T12:00:30Z"
}
}For each available asset, open or download assets[].url directly without an API Authorization header. The signed URL expires at expiresAt; poll the task again to refresh it while the asset remains within its retention period. A pending or unavailable asset has no URL. Treat signed URLs as private.
Use SpicyAPI in your app, terminal, AI assistant or visual workflow. Choose a setup guide below.
You do not have to write any of the code above. Connect the MCP server once and any agent that speaks MCP — Claude Code, Codex, Cursor, Windsurf, VS Code, Gemini CLI, Cline, LibreChat — can run this model by name, or run it from your shell with a single command.
Use openai/gpt-image-2.6-flare/text-to-image to generate a portrait of a dancer under neon light, and save it to ./out/.
The agent looks the model up in the live catalogue, uploads the local file for you, then shows the exact quote and its maximum charge and waits for your confirmation. Nothing is billed until you say yes.
claude mcp add spicyapi -e SPICY_API_KEY=$SPICY_API_KEY \
-- npx --yes --package=@spicyapi/mcp spicyapi-mcp
npx skills add spicyapi-ai/spicy-skillThe first line gives the agent the tools; the second gives it the Skill — the operating rules for them, so it quotes before it bills, uploads local files instead of pasting bytes, and reads the finished asset URL rather than guessing. Every other client takes the same server through its own config file: see the developer hub.
npx @spicyapi/cli tasks create --model openai/gpt-image-2.6-flare/text-to-image \
--input-json '{"prompt":"A ceramic teapot on a linen cloth, soft window light, muted palette","quality":"medium","background":"auto","resolution":"1k","num_outputs":1,"aspect_ratio":"1:1"}' \
--waitThe input is this endpoint’s own schema, same as the examples above. --wait polls until the task is finished and prints it; add --yes to skip the confirmation prompt in CI. Set SPICY_API_KEY first — one key works for the API, the CLI and the MCP server.
npx @spicyapi/cli tasks create --model openai/gpt-image-2.6-flare/text-to-image \
--input-json '{…}' --retention 1h --wait
npx @spicyapi/cli tasks get $TASK_ID # read back the retention that applied--retention only ever shortens the window — 30m, 1h, 7d, or 0 to delete as soon as the task reaches a terminal state. The value that actually applies is the shortest of your request, your account settings and the platform maximum, so read it back from the task record rather than assuming the number you asked for took effect. Passing a longer window than your account allows does nothing.
Install the SpicyAPI nodes from ComfyUI Manager or with the command below, then search for GPT Image 2.6 Flare · Text to Image on the canvas. The node has the same options as this page and shows its price before it runs.
cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapiThe embedded panel reads the same schema as this page, so it cannot drift from the API. If your docs need the content to be searchable, read the JSON under /api/embed/models/ and render it yourself.
<iframe src="https://spicyapi.ai/embed/en/models/gpt-image-2-6-flare/api?model=openai%2Fgpt-image-2.6-flare%2Ftext-to-image" width="100%" height="560" loading="lazy" title="Request example" style="border:1px solid rgba(0,0,0,.12)"></iframe>