Nano Banana API

Nano Banana is suited for fast image generation and practical image-to-image transformations.

Model keys

  • google/nano-banana — Nano Banana

Supported modes and inputs

Model Mode Label Input requirements
google/nano-banana text_to_image Text to Image Prompt max 5000 chars
google/nano-banana image_to_image Image to Image Prompt max 5000 chars
Images reference: 1-10 files, 30 MB, formats jpg, png, webp, bmp, gif

Options

Model Option Default Allowed values Applies to
google/nano-banana output_format png png, jpeg All modes
google/nano-banana aspect_ratio 1:1 1:1, 16:9, 9:16, 4:3, 3:4, 3:2, 2:3, 5:4, 4:5, 21:9, auto All modes

Pricing

Model Pricing
google/nano-banana 1 credit per image

Production guidance

  • Pass mode explicitly.
  • Use only option values listed above.
  • Upload media with POST /api/v1/files before calling media-input modes.
  • Use the exact model key for the variant you want.

Example: text to image

curl https://img2vid.net/api/v1/generations \
  -H "Authorization: Bearer $BUBLE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "google/nano-banana",
    "mode": "text_to_image",
    "prompt": "A premium editorial product image of a minimalist ceramic coffee grinder on a warm walnut counter, soft studio lighting",
    "aspect_ratio": "1:1",
    "output_format": "png"
  }'

Example: image to image

Upload an image first, then pass the returned URL to image_urls.

curl https://img2vid.net/api/v1/generations \
  -H "Authorization: Bearer $BUBLE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "google/nano-banana",
    "mode": "image_to_image",
    "prompt": "Transform the source into a clean commercial product image while preserving the main object",
    "image_urls": ["https://example.com/source.png"],
    "aspect_ratio": "1:1",
    "output_format": "png"
  }'

SDK examples

The examples below use this page's public model key, mode, and parameter values. They assume you have already initialized the SDK client as shown in the Quickstart and imported the required language SDK types. For media-input modes, upload local files first and pass the returned URL through public fields such as image_urls, start_frame, or video_urls.

JavaScript / TypeScript

const task = await buble.generations.create({
  model: 'google/nano-banana',
  mode: 'text_to_image',
  prompt:
    'A premium editorial product image of a minimalist ceramic coffee grinder on a warm walnut counter, soft studio lighting',
  aspect_ratio: '1:1',
  output_format: 'png',
});

const result = await buble.generations.wait(task.data.id);
console.log(result.data.result?.images?.[0]?.url);

Python

task = client.generations.create(
    model="google/nano-banana",
    mode="text_to_image",
    prompt="A premium editorial product image of a minimalist ceramic coffee grinder on a warm walnut counter, soft studio lighting",
    aspect_ratio="1:1",
    output_format="png",
)

result = client.generations.wait(task["data"]["id"])
print(result["data"]["result"]["images"][0]["url"])

Go

task, err := client.Generations.Create(ctx, &buble.CreateGenerationRequest{
	Model:  "google/nano-banana",
	Mode:   "text_to_image",
	Prompt: "A premium editorial product image of a minimalist ceramic coffee grinder on a warm walnut counter, soft studio lighting",
	Params: map[string]any{
		"aspect_ratio": "1:1",
		"output_format": "png",
	},
})
if err != nil {
	return err
}

result, err := client.Generations.Wait(ctx, task.Data.ID)
if err != nil {
	return err
}
fmt.Println(result.Data.Result.Images[0].URL)

Rust

let task = client.generations().create(
    CreateGenerationRequest::new("google/nano-banana")
        .mode("text_to_image")
        .prompt("A premium editorial product image of a minimalist ceramic coffee grinder on a warm walnut counter, soft studio lighting")
        .param("aspect_ratio", "1:1")?
        .param("output_format", "png")?,
).await?;

let result = client
    .generations()
    .wait(&task.data.id, WaitOptions::default())
    .await?;

Swift

let task = try await client.generations.create(
    try CreateGenerationRequest(model: "google/nano-banana")
        .mode("text_to_image")
        .prompt("A premium editorial product image of a minimalist ceramic coffee grinder on a warm walnut counter, soft studio lighting")
        .param("aspect_ratio", "1:1")
        .param("output_format", "png")
)

let result = try await client.generations.wait(task.data.id)
print(result.data.result?.images?.first?.url.absoluteString ?? "")

Dart / Flutter

final task = await client.generations.create(
  CreateGenerationRequest(
    model: 'google/nano-banana',
    mode: 'text_to_image',
    prompt: 'A premium editorial product image of a minimalist ceramic coffee grinder on a warm walnut counter, soft studio lighting',
  ).withParam('aspect_ratio', '1:1').withParam('output_format', 'png'),
);

final result = await client.generations.wait(task.data.id);
print(result.data.result?.images.firstOrNull?.url);

Elixir

{:ok, task} =
  Buble.Generations.create(client, %{
    model: "google/nano-banana",
    mode: "text_to_image",
    prompt: "A premium editorial product image of a minimalist ceramic coffee grinder on a warm walnut counter, soft studio lighting",
    aspect_ratio: "1:1",
    output_format: "png"
  })

{:ok, result} = Buble.Generations.wait(client, task["data"]["id"])
IO.puts(result["data"]["result"]["images"] |> List.first() |> Map.fetch!("url"))

Java

Envelope<GenerationTask> task = client.generations().create(
        CreateGenerationRequest.builder()
                .model("google/nano-banana")
                .mode("text_to_image")
                .prompt("A premium editorial product image of a minimalist ceramic coffee grinder on a warm walnut counter, soft studio lighting")
                .param("aspect_ratio", "1:1")
                .param("output_format", "png")
                .build());

Envelope<GenerationTask> result = client.generations().wait(task.getData().getId());

.NET

var task = await client.Generations.CreateAsync(new CreateGenerationRequest
{
    Model = "google/nano-banana",
    Mode = "text_to_image",
    Prompt = "A premium editorial product image of a minimalist ceramic coffee grinder on a warm walnut counter, soft studio lighting"
}.WithParam("aspect_ratio", "1:1").WithParam("output_format", "png"));

var result = await client.Generations.WaitAsync(task!.Data!.Id!);

PHP

$task = $client->generations()->create(
    CreateGenerationRequest::make(
        model: 'google/nano-banana',
        mode: 'text_to_image',
        prompt: 'A premium editorial product image of a minimalist ceramic coffee grinder on a warm walnut counter, soft studio lighting',
    )
    ->withParam('aspect_ratio', '1:1')
    ->withParam('output_format', 'png')
);

$result = $client->generations()->wait($task['data']['id']);

Ruby

task = client.generations.create(
  model: "google/nano-banana",
  mode: "text_to_image",
  prompt: "A premium editorial product image of a minimalist ceramic coffee grinder on a warm walnut counter, soft studio lighting",
  aspect_ratio: "1:1",
  output_format: "png"
)

result = client.generations.wait(task.dig("data", "id"))
puts result.dig("data", "result", "images", 0, "url")