GPT Image 2.5 Sunburst
GPT Image 2.5 Sunburst Edit Image is available in the Business API catalog.
Capabilities
Best for
- •Concept art and mood boards
- •Product and marketing visuals
- •Batch generation at scale
Not for
- •Exact text rendering at small sizes
- •Precise brand-logo reproduction
- •Vector output
Authentication
api key header
The Pika API uses API keys to authenticate requests. Send your key in the X-API-Key header. Your API key is a secret. Don't expose it in browsers or other client-side code. Instead, call the API from your server. The signed-in playground uses a portal session and never sends your API key.
X-API-Key: YOUR_API_KEY
Endpoint
asynchronous · poll for the result
Reference Uploads
media inputs
Media inputs accept any public URL. To use a local file, POST its content_type and size_bytes to /v1/media/uploads, PUT the file to the returned upload_url, then pass the url.
# 1. Request a presigned upload URL. Send the file's content# type and its exact size in bytes.curl -X POST https://api.dev.pika.art/v1/media/uploads \-H "X-API-Key: YOUR_API_KEY" \-H "Content-Type: application/json" \-d '{"content_type": "image/png", "size_bytes": 12345}'# The response returns two URLs:# upload_url: a temporary URL to upload the file to. Expires in 5 minutes.# url: the permanent Pika URL. Pass it to the model as the input.# {# "upload_url": "https://upload.r2.pika.art/...?X-Amz-Signature=...",# "url": "https://cdn.pika.art/v2/media/uploads/org_abc/9f8e7d.png"# }# 2. Upload the file to upload_url, then pass url to the model.curl -X PUT "<upload_url>" \-H "Content-Type: image/png" \--data-binary @input.png
Generate
POST /v1/media/openai/gpt-image-2.5-sunburst/image-to-image
Request
curl -X POST https://api.dev.pika.art/v1/media/openai/gpt-image-2.5-sunburst/image-to-image \-H "X-API-Key: YOUR_API_KEY" \-H "Content-Type: application/json" \-d '{"prompt": "Using the supplied photograph as the base, keep its composition, camera angle, framing and lighting, and keep every element not named below exactly as it is. Keep the torn cut-paper collage treatment and the\ntopiary garden. Change only the following. Keep the transparent background and edge of the artwork.\n\nThe existing figure is now in full profile to camera, mid-stride and not looking at the camera, walking a great dane on a lead. Their coat changes from royal blue to a black-and-white cow-print coat.\n\nAdd a second figure walking in the opposite direction: an invented man walking a fluffy ginger cat on a lead, wearing an oversized charcoal peacoat and baggy pale-pink corduroy trousers.\n\nBoth figures and both animals are built from the same torn cut-paper collage material as the rest of the scene — layered fragments of coloured paper with visible torn fibrous edges, slightly offset and\nmis-registered.\n\nLighting stays as it is: one enormous softbox, fully diffused, soft and even, no hard shadows. Fine medium-format film grain. Colour soft but vibrant, never oversaturated, never dull. Any people are entirely fictional invented individuals, anatomically correct and complete. No text, no logos, no\nwatermark.","num_images": 1,"aspect_ratio": "16:9","output_format": "png","resolution": "1K","image_urls": ["https://cdn.pika.art/v2/media/uploads/a7112d4d-62ed-4a11-8dee-74e89c2ec037/7364d1f8a24840408bedc908790be67e.png"],"quality": "medium"}'
Response
{"id": "media_8f3a2c91-5b7d-4e0a-9c26-31d4f2a8e6b0","status": "queued"}
Request body
Accepted values
- aspect_ratio
- output_format
- resolution
- background
- quality
Input modes
Use a public URL directly, or POST { content_type, size_bytes } to /v1/media/uploads, PUT the image to the returned upload_url with the returned headers, then pass the url.
Use a public URL directly, or POST { content_type, size_bytes } to /v1/media/uploads, PUT the image to the returned upload_url with the returned headers, then pass the url.
Returns
Returns a job object with status , not the final output. Store the id from the response and poll the job until it completes.
Poll status
GET /v1/media/jobs/{request_id}
Request
curl https://api.dev.pika.art/v1/media/jobs/{request_id} \-H "X-API-Key: YOUR_API_KEY"
Response
{"id": "media_8f3a2c91-5b7d-4e0a-9c26-31d4f2a8e6b0","status": "running"}
Poll the job by id until it reaches a terminal state: completed or failed. A completed job carries its download URL in output, and GET /v1/media/jobs/{request_id}/content returns that same URL as { "url" } for clients that only kept the id.
The job object
Errors
shared across calls
Errors use conventional HTTP status codes with a JSON body of the shape {"message": "..."}. Validation failures return 422 with a message naming the offending field. Submit rejections after the job row exists (balance, rate limit) return the failed job envelope — branch on error.code.
| Status | When | Body |
|---|---|---|
| 401 Unauthorized | The API key is missing or invalid. | {"message":"Invalid API key"} |
| 403 Forbidden | An inactive key is rejected with a {"message"} body. A submit that the org balance or postpaid cycle limit cannot cover is rejected after the job row exists and returns the failed job envelope. GET /billing/balance separates the two: a 200 means the key is active, so the rejection was the balance or the cycle limit. | {"id":"media_8f3a2c91-5b7d-4e0a-9c26-31d4f2a8e6b0","status":"failed","error":{"code":"insufficient_balance","message":"Insufficient org balance"}} |
| 404 Not Found | No job with that id exists in your org, or the media path names an unknown vendor/model/function. | {"message":"media job not found"} |
| 409 Conflict | The result was requested before the job completed, or an Idempotency-Key header was reused with a different body. | {"message":"media job is not ready"} |
| 422 Unprocessable Entity | The request body failed validation: an invalid enum value, a missing required field, a wrong type, or malformed JSON. The JSON message names the offending field. A schema-valid parameter combination that cannot be priced instead fails after job creation and returns the failed job envelope with error code invalid_input. | {"message":"duration: Input should be less than or equal to 15"} |
| 429 Too Many Requests | Org limit reached: requests per minute or day, or concurrent jobs. Returned as the failed job envelope; check the Retry-After header and retry with a fresh Idempotency-Key. | {"id":"media_8f3a2c91-5b7d-4e0a-9c26-31d4f2a8e6b0","status":"failed","error":{"code":"rate_limited","message":"rate limit exceeded: rpm"}} |
| 503 Service Unavailable | The model rail or a backend dependency is temporarily unavailable. Returned as the failed job envelope; retry with backoff and a fresh Idempotency-Key. | {"id":"media_8f3a2c91-5b7d-4e0a-9c26-31d4f2a8e6b0","status":"failed","error":{"code":"provider_unavailable","message":"media dispatch unavailable"}} |