Skip to navigation

Nano Banana Pro

Generate or edit an image from text and up to 14 reference images, at 1K, 2K or 4K, delivered as PNG or JPEG.

  • 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 14 reference images given as public HTTPS links.
  • Priced per image by resolution: aspect ratio, number of references and prompt length do not change the price.
  • A failed task costs nothing: the reservation is returned in full.

Nano Banana Pro takes jpg for JPEG in output_format; the other Nano Banana models take jpeg.

POST/v1/images/tasksTry it

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.

Model IDs

All five models use this endpoint and the same fields; they differ in the values they accept. The values below come straight from the gateway contract.

Model IDresolutionMax imagesoutput_formatChoose it when
nano-banana-21K, 2K, 4K14png, jpegYou want 1K to 4K output with many references at a low price. The default choice.
nano-banana-2.11K, 2K, 4K14png, jpegYou want Nano Banana 2.1. It has the same fields and the same prices as Nano Banana 2.
nano-banana-2-lite1K14png, jpegYou only need 1K images.
nano-banana-pro1K, 2K, 4K14png, jpgYou want the Pro model: 1K, 2K or 4K, up to 14 references. It accepts jpg, not jpeg, and no banner ratios (1:4, 4:1, 1:8, 8:1).
nano-banana1K3png, jpegYou need the earlier generation; 1K only, at most 3 references.

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

1

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.

2

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.

3

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

ModeRequired inputsNotes
Text to imagemodel, promptLeave out images.
Edit or combine imagesmodel, prompt, images1 to 14 public HTTPS image links. Describe in prompt what to change, keep or combine.

Request parameters

model string Required

The model to run.

Value: nano-banana-pro

If the value is wrong

  • Missing: "model" is required
  • Unknown model ID: "model" nano-banana-9 is not catalogued
  • A video model sent to this endpoint: "model" seedance-2.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 “Use the first image for the product and the second for the background”.

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.

Items: 1–14
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 link must return the image file itself (PNG, JPEG or WebP) over public HTTPS, at most 50 MB. The gateway downloads the first bytes of every link before creating the task.
  • Links to web pages, login walls, expired signed URLs or hotlink-protected hosts are refused, because they do not return an image.
  • 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 14 items
  • An empty array: "images" requires at least 1 item
  • Not an https:// link: "images[0]" must be a public HTTPS URL
  • A private or unsafe address: "images[0]" must be a publicly reachable HTTPS image URL
  • The host answers with a 4xx error: "images[0]" could not be downloaded: the URL returned HTTP 404
  • The link returns something other than PNG, JPEG or WebP: "images[0]" is not a PNG, JPEG or WebP image: the URL returned text/html
  • Larger than 50 MB: "images[2]" is 63.4 MB; images must be 50 MB or smaller

Example

"images": [
"https://media.beatapi.io/samples/smart-bottle.png",
"https://media.beatapi.io/samples/neon-singer.png"
]

aspect_ratio string OptionalDefault: 1:1

Shape of the image as width:height.

Allowed values: 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9, auto
Default: 1:1

  • auto leaves the shape to the model. With images it normally follows the reference, but this is not guaranteed on every route; name the ratio if the shape matters.
  • Nano Banana Pro does not accept the extra-tall and extra-wide banner shapes 1:4, 4:1, 1:8 and 8:1; Nano Banana 2, 2.1 and 2 Lite do.

When you edit an image, auto usually keeps the shape of the reference. If you leave the field out, the default 1:1 is used and the result is square.

If the value is wrong

  • A value not in the list: "aspect_ratio" must be one of: [1:1 2:3 3:2 3:4 4:3 4:5 5:4 9:16 16:9 21:9 auto]

resolution string OptionalDefault: 1K

Size class of the image. Higher classes give larger images; 4K costs twice as much as 1K and 2K, which share one price. The exact pixel size depends on aspect_ratio and is decided by the model.

Allowed values: 1K, 2K, 4K
Default: 1K

  • Use the capital K: 2k is refused.

If the value is wrong

  • A value not in the list: "resolution" must be one of: [1K 2K 4K]

output_format string OptionalDefault: png

File type of the result.

Allowed values: png, jpg
Default: png

  • If the model returns the other of the two types, BeatAPI converts the image before storing it, so the file normally has the format you asked for; if a conversion fails, the file is stored as delivered. Transparent areas become white in a JPEG. An image too large to convert (above 64 megapixels) is stored as delivered. output.media[].mime_type always states the stored type (image/jpeg for jpg).
  • Write jpg, not jpeg: Nano Banana Pro is the only Nano Banana model that uses jpg.

If the value is wrong

  • A value not in the list (for example jpeg or webp): "output_format" must be one of: [png jpg]

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: PNG, JPEG or WebP, recognised from the file content rather than the file name or Content-Type; at most 50 MB each (decimal megabytes; checked when the host states the size); 1 to 14 links. GIF, HEIC and SVG are refused.
  • No pixel or aspect-ratio limit is checked for this model.
  • If a host does not answer in time, the link is not refused at create; a link that still cannot be fetched later fails the task with bad_request, and the task is refunded.
  • Have a local file? Upload it with POST /v1/files and pass the returned data.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:

  • quality, seed, background, size, enhance_prompt → field "quality" is not supported by model nano-banana-pro (with the field you sent).
  • Any other unknown field, such as n → unknown field: n. There is no n: one task makes one image.

Request examples

curl --request POST \
--url https://api.beatapi.io/v1/images/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "nano-banana-pro",
"prompt": "A minimalist product photo of a glass water bottle on wet black stone, soft rim light, shallow depth of field",
"aspect_ratio": "16:9",
"resolution": "2K"
}'

Text to image

A 2K landscape image from a prompt.

curl --request POST \
--url https://api.beatapi.io/v1/images/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "nano-banana-pro",
"prompt": "A minimalist product photo of a glass water bottle on wet black stone, soft rim light, shallow depth of field",
"aspect_ratio": "16:9",
"resolution": "2K"
}'

Edit one image

Change the background and keep the product. auto usually keeps the shape of the reference.

curl --request POST \
--url https://api.beatapi.io/v1/images/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "nano-banana-pro",
"prompt": "Keep the bottle exactly as it is. Replace the background with a sunlit kitchen counter and add a soft reflection under the bottle.",
"images": [
"https://media.beatapi.io/samples/smart-bottle.png"
],
"aspect_ratio": "auto"
}'

Combine several images

Name each reference in the prompt by its position.

curl --request POST \
--url https://api.beatapi.io/v1/images/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "nano-banana-pro",
"prompt": "Place the bottle from the first image on a neon-lit stage like the one in the second image. Keep the bottle label readable.",
"images": [
"https://media.beatapi.io/samples/smart-bottle.png",
"https://media.beatapi.io/samples/neon-singer.png"
],
"aspect_ratio": "1:1",
"resolution": "1K"
}'

4K JPEG poster

A tall poster delivered as JPEG. This model takes jpg for JPEG.

curl --request POST \
--url https://api.beatapi.io/v1/images/tasks \
--header "Authorization: Bearer $BEATAPI_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "nano-banana-pro",
"prompt": "A retro travel poster of a coastal city at sunset, bold flat colours, large title text \"SEASIDE\" at the top",
"aspect_ratio": "9:16",
"resolution": "4K",
"output_format": "jpg"
}'

Responses

Create a task (201)

The task object. output is null until the task succeeds. Fields marked “while running” disappear once the task finishes.

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "image",
"capability_id": "nano-banana-pro",
"capability_version": 1,
"media_type": "image",
"model": "nano-banana-pro",
"status": "queued",
"stage": "queued",
"created_at": 1791993600,
"updated_at": 1791993600,
"completed_at": null,
"poll_after_seconds": 5,
"output": null,
"usage": {
"credits_reserved": 0.05,
"credits_settled": 0,
"credits_refunded": 0,
"credits_charged": 0.05
},
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": null,
"error_message": null
}
}
FieldTypeDescription
data.idstringTask ID: task_ followed by 32 letters and digits. Use it to poll and to match webhook events.
data.objectstringAlways task.
data.task_kindstringimage or video.
data.capability_idstringThe model ID you sent.
data.capability_versionintegerContract version of the model, currently 1.
data.media_typestringimage or video.
data.modelstringThe model ID you sent (same as capability_id).
data.statusstringqueued, processing, succeeded or failed. Only the last two are final.
data.stagestringRepeats status; kept for older clients.
data.created_atintegerWhen the task was created, Unix seconds.
data.updated_atintegerLast change, Unix seconds.
data.completed_atinteger | nullWhen the task finished, Unix seconds; null while it runs.
data.poll_after_secondsintegerWhile running: how long to wait before the next poll (5 for images, 8 for videos).
data.typical_secondsobjectWhile running, when enough recent tasks exist: p50 and p90 completion times in seconds over the last window, from samples tasks.
data.outputobject | nullThe result; null until status is succeeded. See the output fields below.
data.usage.credits_reservednumberUSD held from your balance when the task was created.
data.usage.credits_chargednumberUSD this task costs; 0 on a failed task.
data.usage.credits_settlednumberUSD finally taken; set when the task succeeds, otherwise 0.
data.usage.credits_refundednumberUSD returned to your balance; equals the reservation on a failed task once the refund is recorded.
data.usage.billable_duration_secondsintegerVideo only: the seconds the price is based on. Absent when the model reports no duration.
data.request_idstringRequest ID. Include it when you contact support.
data.error_codestring | nullFailure code; null unless the task failed.
data.error_messagestring | nullWhat went wrong and what to change; null unless the task failed.

Finished task

GET /v1/tasks/{task_id} returns HTTP 200 with status: "succeeded" and the result in data.output.

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "image",
"capability_id": "nano-banana-pro",
"capability_version": 1,
"media_type": "image",
"model": "nano-banana-pro",
"status": "succeeded",
"stage": "succeeded",
"created_at": 1791993600,
"updated_at": 1791993690,
"completed_at": 1791993690,
"output": {
"media": [
{
"type": "image",
"url": "https://media.beatapi.io/outputs/task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ/0.png",
"mime_type": "image/png"
}
],
"r2_url": "https://media.beatapi.io/outputs/task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ/0.png"
},
"usage": {
"credits_reserved": 0.05,
"credits_settled": 0.05,
"credits_refunded": 0,
"credits_charged": 0.05
},
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": null,
"error_message": null
}
}

Output fields

FieldTypeDescription
output.mediaobject[]The generated files; one item for this model.
output.media[].typestringAlways image.
output.media[].urlstringHTTPS link to the stored image. Download and keep it; no retention period is promised.
output.media[].mime_typestringThe stored file type, normally the one output_format asked for: image/png or image/jpeg (image/jpeg when you asked for jpg).
output.r2_urlstringThe first media URL again, for older clients. Read media instead.

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.

{
"data": {
"id": "task_7Qm2Xc9LpR4vT8sKa1Nf6YbH3eWdJ0uZ",
"object": "task",
"task_kind": "image",
"capability_id": "nano-banana-pro",
"capability_version": 1,
"media_type": "image",
"model": "nano-banana-pro",
"status": "failed",
"stage": "failed",
"created_at": 1791993600,
"updated_at": 1791993690,
"completed_at": 1791993690,
"output": null,
"usage": {
"credits_reserved": 0.05,
"credits_settled": 0,
"credits_refunded": 0.05,
"credits_charged": 0
},
"retryable": true,
"request_id": "req_5f0c2a9e4b7d4e31",
"error_code": "processing_failed",
"error_message": "The task failed during processing on our side. Retry; a failed task is refunded."
}
}
FieldTypeDescription
data.error_codestringOne of bad_request and content_policy_violation (change the request) or processing_unavailable, processing_timeout, processing_failed and result_transfer_failed (try again later). See Errors.
data.error_messagestringA sentence that names the problem and the fix.
data.retryablebooleanPresent only on a failed task: true when the same request can succeed if you send it again.
data.usageobjectOnce the refund is recorded (normally at the moment the task fails): credits_charged and credits_settled are 0, and credits_refunded equals credits_reserved.

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.

import os
import time
import uuid
import requests
API = "https://api.beatapi.io"
HEADERS = {"Authorization": f"Bearer {os.environ['BEATAPI_API_KEY']}"}
def create_task(body: dict) -> dict:
# One Idempotency-Key per logical request: a retry with the same key cannot create a second task.
headers = {**HEADERS, "Idempotency-Key": str(uuid.uuid4())}
for attempt in range(3):
response = requests.post(f"{API}/v1/images/tasks", headers=headers, json=body, timeout=60)
if response.status_code in (429, 503) and attempt < 2:
time.sleep(int(response.headers.get("Retry-After", 10)))
continue
break
try:
payload = response.json()
except ValueError: # an edge error page is not JSON
response.raise_for_status()
raise
if not response.ok:
error = payload["error"]
raise RuntimeError(f"{response.status_code} {error['code']}: {error['message']} (request_id={error.get('request_id')})")
return payload["data"]
def wait_for_task(task_id: str, timeout_seconds: int = 1800) -> dict:
deadline = time.monotonic() + timeout_seconds
while time.monotonic() < deadline:
response = requests.get(f"{API}/v1/tasks/{task_id}", headers=HEADERS, timeout=30)
if response.status_code == 429 or response.status_code >= 500:
time.sleep(int(response.headers.get("Retry-After", 10)))
continue
response.raise_for_status()
task = response.json()["data"]
if task["status"] in ("succeeded", "failed"):
return task
time.sleep(task.get("poll_after_seconds", 5))
raise TimeoutError(f"task {task_id} is still running; keep polling later")
task = create_task({
"model": "nano-banana-pro",
"prompt": "A minimalist product photo of a glass water bottle on wet black stone, soft rim light, shallow depth of field",
"aspect_ratio": "16:9",
"resolution": "2K"
})
print("created", task["id"])
task = wait_for_task(task["id"])
if task["status"] == "failed":
raise SystemExit(f"{task['error_code']}: {task['error_message']}")
for item in task["output"]["media"]:
print(item["url"])

Billing

  • One image per task, priced by resolution only (table below). Aspect ratio, number of references and prompt length do not change the price.
  • The 1K and 2K tiers have the same price; 4K costs twice as much.
  • 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_refunded then equals credits_reserved.

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.

OptionList price (USD)
1 image · 1K$0.05
1 image · 2K$0.05
1 image · 4K$0.1

Common errors

Error or symptomCauseFix
400 "resolution" must be one of: [1K 2K 4K]Lower-case 2k, or a pixel size such as 2048x2048.Send 1K, 2K or 4K.
400 "output_format" must be one of: [png jpg]jpeg or webp sent to Nano Banana Pro.Send jpg for JPEG. (Nano Banana Pro is the only model that takes jpg.)
400 "aspect_ratio" must be one of: [1:1 2:3 3:2 3:4 4:3 4:5 5:4 9:16 16:9 21:9 auto]1:4, 4:1, 1:8 or 8:1 sent to a model without banner shapes.Use a listed ratio, or use Nano Banana 2, 2.1 or 2 Lite for the banner shapes.
400 unknown field: nAsking for several images in one task.Remove n and create one task per image.
400 field "seed" is not supported by model nano-banana-proA field from another image model (seed, quality, size, background, enhance_prompt).Remove the field.
400 "images[0]" must be a public HTTPS URLAn http:// link, a data: URI or a local path.Host the file on HTTPS, or upload it with POST /v1/files and use data.url.
400 "images[1]" is not a PNG, JPEG or WebP image: the URL returned text/htmlThe link opens a web page, a login page or an expired signed URL instead of the file.Link directly to the image file.
400 "images[0]" could not be downloaded: the URL returned HTTP 403The host blocks downloads from servers (hotlink protection or private bucket).Make the file public, or upload it with POST /v1/files.
An edited image comes back squareaspect_ratio was left out, so the default 1:1 was used.Name the ratio you want. auto usually keeps the shape of the reference.
Task failed with content_policy_violationThe prompt, a reference image or the generated image was refused by moderation. An image that shows a real person can be refused.Change the prompt or the image. Retrying unchanged fails again; nothing is charged.
Task failed with processing_timeoutThe image did not finish within the processing window.Retry; the failed task was refunded.
403 forbidden on an account that never topped upFree credit covers only some models.Top up once, or use a model available on free credit.

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.

{
"error": {
"code": "bad_request",
"message": "\"prompt\" is required",
"retryable": false,
"request_id": "req_5f0c2a9e4b7d4e31"
}
}
HTTP statuserror.codeWhat to do
400bad_request, content_policy_violationFix the request; the message names the field. Do not retry unchanged.
401missing_api_key, invalid_api_key (older clients may see unauthorized)Send a valid key as Authorization: Bearer <key>.
402insufficient_creditsTop up, or raise the key’s quota, then send it again.
403forbiddenThe key or account may not use this model (for example, free credit only covers some models). Do not retry unchanged.
404not_foundOn GET /v1/tasks/{task_id}: the task does not exist for this key’s account. Check the ID.
409idempotency_conflictUse a new Idempotency-Key, or wait for the first request with this key to finish.
429rate_limit_exceededWait Retry-After seconds (also error.retry_after_seconds), then retry.
500internal_errorRetry with backoff; contact support with request_id if it continues.
503processing_unavailable, processing_timeout, processing_failed, result_transfer_failedNothing was charged. Retry with exponential backoff.

Authentication

AuthorizationBearer

Send your API key as Authorization: Bearer <BEATAPI_API_KEY>.

Headers

Idempotency-KeystringOptional<=255 characters

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

This endpoint expects an object.
modelenumRequired

The model to run.

Value: nano-banana-pro

If the value is wrong

  • Missing: "model" is required
  • Unknown model ID: "model" nano-banana-9 is not catalogued
  • A video model sent to this endpoint: "model" seedance-2.5 is served by POST /v1/videos/tasks, not this endpoint
Allowed values:
promptstringRequired1-5000 characters

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 “Use the first image for the product and the second for the background”.

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
aspect_ratioenumOptionalDefaults to 1:1

Shape of the image as width:height.

Allowed values: 1:1, 2:3, 3:2, 3:4, 4:3, 4:5, 5:4, 9:16, 16:9, 21:9, auto

Default: 1:1

  • auto leaves the shape to the model. With images it normally follows the reference, but this is not guaranteed on every route; name the ratio if the shape matters.
  • Nano Banana Pro does not accept the extra-tall and extra-wide banner shapes 1:4, 4:1, 1:8 and 8:1; Nano Banana 2, 2.1 and 2 Lite do.

Notes: When you edit an image, auto usually keeps the shape of the reference. If you leave the field out, the default 1:1 is used and the result is square.

If the value is wrong

  • A value not in the list: "aspect_ratio" must be one of: [1:1 2:3 3:2 3:4 4:3 4:5 5:4 9:16 16:9 21:9 auto]
imageslist of stringsOptional

Reference images to edit or combine. Sending this field switches the request from text-to-image to image editing.

Items: 1–14

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 link must return the image file itself (PNG, JPEG or WebP) over public HTTPS, at most 50 MB. The gateway downloads the first bytes of every link before creating the task.
  • Links to web pages, login walls, expired signed URLs or hotlink-protected hosts are refused, because they do not return an image.
  • 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 14 items
  • An empty array: "images" requires at least 1 item
  • Not an https:// link: "images[0]" must be a public HTTPS URL
  • A private or unsafe address: "images[0]" must be a publicly reachable HTTPS image URL
  • The host answers with a 4xx error: "images[0]" could not be downloaded: the URL returned HTTP 404
  • The link returns something other than PNG, JPEG or WebP: "images[0]" is not a PNG, JPEG or WebP image: the URL returned text/html
  • Larger than 50 MB: "images[2]" is 63.4 MB; images must be 50 MB or smaller

Example

"images": [
  "https://media.beatapi.io/samples/smart-bottle.png",
  "https://media.beatapi.io/samples/neon-singer.png"
]
output_formatenumOptionalDefaults to png

File type of the result.

Allowed values: png, jpg

Default: png

  • If the model returns the other of the two types, BeatAPI converts the image before storing it, so the file normally has the format you asked for; if a conversion fails, the file is stored as delivered. Transparent areas become white in a JPEG. An image too large to convert (above 64 megapixels) is stored as delivered. output.media[].mime_type always states the stored type (image/jpeg for jpg).
  • Write jpg, not jpeg: Nano Banana Pro is the only Nano Banana model that uses jpg.

If the value is wrong

  • A value not in the list (for example jpeg or webp): "output_format" must be one of: [png jpg]
Allowed values:
resolutionenumOptionalDefaults to 1K

Size class of the image. Higher classes give larger images; 4K costs twice as much as 1K and 2K, which share one price. The exact pixel size depends on aspect_ratio and is decided by the model.

Allowed values: 1K, 2K, 4K

Default: 1K

  • Use the capital K: 2k is refused.

If the value is wrong

  • A value not in the list: "resolution" must be one of: [1K 2K 4K]
Allowed values:

Response

The task object. output is null until the task succeeds. Fields marked “while running” disappear once the task finishes.

Errors

400
Bad Request Error
401
Unauthorized Error
402
Payment Required Error
403
Forbidden Error
409
Conflict Error
429
Too Many Requests Error
500
Internal Server Error
503
Service Unavailable Error