Grok Imagine Image 2.0
Generate or edit one image from text and up to 5 reference images, at a flat price per image.
- Asynchronous: the create call returns a task ID in a moment; the image arrives when the task succeeds.
- One image per task. To get several images, create several tasks.
- Text to image, or edit and combine up to 5 reference images given as public HTTPS links.
- The request has four fields:
model,prompt,imagesandaspect_ratio. There is no resolution, quality, seed or output format to set. - A failed task costs nothing: the reservation is returned in full.
Opens this model in the API Explorer. Enter your BeatAPI API key to create a task: the call is real and is billed to your own balance.
Endpoint and authentication
POST https://api.beatapi.io/v1/images/tasks
Authorization
string
Required
Your BeatAPI API key, sent as Bearer <BEATAPI_API_KEY>. Create keys in the Dashboard. Keep keys on your server; never ship them in a browser or mobile app.
Send the body as JSON with Content-Type: application/json. Idempotency-Key is optional: send a unique value (at most 255 characters) per logical request and reuse it only to retry that exact body. Within 24 hours a retry with the same key and body returns the first response again with Idempotent-Replayed: true; the same key with a different body returns 409 idempotency_conflict. Responses other than 2xx are not stored, so a retry after a 400 or 402 runs again.
How a request works
Create the task
POST the parameters below to the endpoint. A 201 means the task was accepted and its price reserved from your balance; the work runs in the background. Save data.id.
Wait for it to finish
Call GET /v1/tasks/{task_id} and wait data.poll_after_seconds between calls (5 s for images, 8 s for videos) until status is succeeded or failed. Or register a webhook for task.succeeded and task.failed; keep polling as the fallback, because a task stopped by the processing timeout sends no event.
Save the result
On succeeded, download every data.output.media[].url and store the files you need; BeatAPI does not promise how long result URLs stay available. On failed, read data.error_code and data.error_message: the reserved amount was returned to your balance, and data.retryable says whether sending the same request again can succeed.
Input modes
Request parameters
model
string
Required
The model to run.
Value: grok-imagine-image-2.0
If the value is wrong
- Missing:
"model" is required - Unknown model ID:
"model" grok-imagine-image-9 is not catalogued - A video model sent to this endpoint:
"model" grok-imagine-video-1.5 is served by POST /v1/videos/tasks, not this endpoint
prompt
string
Required
What to draw, or what to change in the reference images. Plain language works best: subject, style, lighting, composition, and any text that must appear in the image.
Length: 1–5000 characters
- Length is counted in characters (a CJK character counts as one).
- When you send
images, say which image does what, for example “Keep the product from the first image and change the setting”.
If the value is wrong
- Missing:
"prompt" is required - Empty or longer than the limit:
"prompt" has an unsupported length - Not a string:
"prompt" must be a string
images
string[]
Optional
Reference images to edit or combine. Sending this field switches the request from text-to-image to image editing; no separate mode flag exists.
Items: 1–5
Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.
- Each entry must be a public
https://link to an image file. BeatAPI checks the form of the link when you create the task; it does not download the image or check its format or size at that point (see the notes under the limits). - Links to web pages, login walls, expired signed URLs or hotlink-protected hosts do not return an image and fail the task after it was created.
- Positions in error messages are 0-based:
images[0]is the first link.
If the value is wrong
- More than the maximum:
"images" accepts at most 5 items - An empty array:
"images" requires at least 1 item - Not an https:// link:
"images[0]" must be a public HTTPS URL - Not an array:
"images" must be an array
Example
aspect_ratio
string
OptionalDefault: 1:1
Requested shape of the image as width:height.
Allowed values: auto, 1:1, 2:3, 3:2, 16:9, 9:16
Default: 1:1
autoleaves the shape to the model instead of fixing one. It is accepted only when you sendimages.- If you leave the field out,
1:1is used, including when you sendimages.
If the value is wrong
- A value not in the list:
"aspect_ratio" must be one of: [auto 1:1 2:3 3:2 16:9 9:16] autowithoutimages:Grok Imagine Image 2.0 aspect_ratio=auto requires at least one image
Input media limits
The gateway reads every input before the task is created and refuses one outside these limits with a 400 bad_request that names the input. Nothing is charged.
- Reference images: 1 to 5 public HTTPS links.
- BeatAPI does not download these links or check their format, size or pixel dimensions when you create the task, so a bad link is not refused up front. The model fetches each link itself.
- A link the model cannot fetch or read fails the task after it was created, normally with
bad_request, and the task is refunded. Use direct links to ordinary image files on a host that answers servers without a login. - Have a local file? Upload it with
POST /v1/filesand pass the returneddata.url.
Fields this model does not accept
The image endpoint knows a few fields that other image models use. Sending one of them here is refused instead of being ignored, so you never pay for a setting that had no effect:
resolution,output_format,quality,seed,background,size,enhance_prompt→field "resolution" is not supported by model grok-imagine-image-2.0(with the field you sent).- Any other unknown field, such as
n→unknown field: n. There is non: one task makes one image.
If a request has several bad fields, the message names only one of them; fix it and send again.
Because there is no output_format, the stored file is whatever type the model returns. Read output.media[].mime_type to see it.
Request examples
Text to image
A 3:2 landscape image from a prompt.
Edit one image
Keep the product and change the setting. auto is allowed here because an image is sent.
Combine several images
Name each reference in the prompt by its position.
Vertical image
A 9:16 image for a phone screen.
Responses
Create a task (201)
The task object. output is null until the task succeeds. Fields marked “while running” disappear once the task finishes.
Finished task
GET /v1/tasks/{task_id} returns HTTP 200 with status: "succeeded" and the result in data.output.
Output fields
Failed task
A failed task is still HTTP 200 on GET /v1/tasks/{task_id}: the failure is in the body. The reservation is returned in full, so nothing is charged.
Complete example
Create a task, wait for it with the server’s polling hint, and print the result URLs. Set BEATAPI_API_KEY in your environment and install requests.
Billing
- One image per task at the single list price below. The price list has one row for this model and no field that changes it.
- The price is reserved when the task is created, from your balance and from the key’s quota if it has one. A request refused before a task exists costs nothing.
- A succeeded task keeps the reserved amount. A failed task returns it in full:
credits_refundedthen equalscredits_reserved, andcredits_chargedandcredits_settledare 0.
Current list prices, the same as on Pricing. An account with a negotiated discount pays less; data.usage on the task always shows the amount actually charged.
Common errors
HTTP errors at a glance
Errors before a task exists arrive as a non-2xx response, and nothing is charged. Branch on error.code or error.retryable; message names the problem. The full list and retry policy are on Errors.
Authentication
Send your API key as Authorization: Bearer <BEATAPI_API_KEY>.
Headers
Send the body as JSON with Content-Type: application/json. Idempotency-Key is optional: send a unique value (at most 255 characters) per logical request and reuse it only to retry that exact body. Within 24 hours a retry with the same key and body returns the first response again with Idempotent-Replayed: true; the same key with a different body returns 409 idempotency_conflict. Responses other than 2xx are not stored, so a retry after a 400 or 402 runs again.
Request
The model to run.
Value: grok-imagine-image-2.0
If the value is wrong
- Missing:
"model" is required - Unknown model ID:
"model" grok-imagine-image-9 is not catalogued - A video model sent to this endpoint:
"model" grok-imagine-video-1.5 is served by POST /v1/videos/tasks, not this endpoint
What to draw, or what to change in the reference images. Plain language works best: subject, style, lighting, composition, and any text that must appear in the image.
Length: 1–5000 characters
- Length is counted in characters (a CJK character counts as one).
- When you send
images, say which image does what, for example “Keep the product from the first image and change the setting”.
If the value is wrong
- Missing:
"prompt" is required - Empty or longer than the limit:
"prompt" has an unsupported length - Not a string:
"prompt" must be a string
Requested shape of the image as width:height.
Allowed values: auto, 1:1, 2:3, 3:2, 16:9, 9:16
Default: 1:1
autoleaves the shape to the model instead of fixing one. It is accepted only when you sendimages.- If you leave the field out,
1:1is used, including when you sendimages.
If the value is wrong
- A value not in the list:
"aspect_ratio" must be one of: [auto 1:1 2:3 3:2 16:9 9:16] autowithoutimages:Grok Imagine Image 2.0 aspect_ratio=auto requires at least one image
Reference images to edit or combine. Sending this field switches the request from text-to-image to image editing; no separate mode flag exists.
Items: 1–5
Each item is a public https:// URL. For a local file, upload it first with POST /v1/files and pass the returned data.url.
- Each entry must be a public
https://link to an image file. BeatAPI checks the form of the link when you create the task; it does not download the image or check its format or size at that point (see the notes under the limits). - Links to web pages, login walls, expired signed URLs or hotlink-protected hosts do not return an image and fail the task after it was created.
- Positions in error messages are 0-based:
images[0]is the first link.
If the value is wrong
- More than the maximum:
"images" accepts at most 5 items - An empty array:
"images" requires at least 1 item - Not an https:// link:
"images[0]" must be a public HTTPS URL - Not an array:
"images" must be an array
Example
"images": [
"https://media.beatapi.io/samples/smart-bottle.png"
]
Response
The task object. output is null until the task succeeds. Fields marked “while running” disappear once the task finishes.

