Nano Banana Pro API: tutorial em Python, edição de imagem e preço
Um POST, uma consulta, um download: um script de Nano Banana Pro que funciona.

Nesta página
- Resposta curta
- O id do modelo e o que você precisa
- O script em Python
- Editar uma imagem existente
- 1K, 2K e 4K: o que cada um entrega
- Erros que você vai encontrar
- Perguntas frequentes
- Qual é o id de modelo da API Nano Banana Pro?
- Quanto custa uma imagem do Nano Banana Pro?
- O Nano Banana Pro desenha texto em chinês?
- Devo pedir 1K, 2K ou 4K?
- Por que minha edição voltou 400 invalid_request?
- Fontes conferidas
- Histórico de atualizações
O Nano Banana Pro é o gemini-3-pro-image do Google, e no OmniaKey você chama com um único POST /v1/media/tasks. Nossos três testes em 3:4 voltaram em 896x1200, 1792x2400 e 3584x4800, e todas as palavras do pôster estavam escritas corretamente.
Resposta curta
- Modelo:
gemini-3-pro-imageé o id GA do Google. A ficha do modelo no Vertex traz data de lançamento em 28 de maio de 2026. - Chamada: envie
POST https://api.omniakey.com/v1/media/taskscom umaIdempotency-Key, consulteGET /v1/media/tasks/{id}até o status ser succeeded e baixeassets[0].url. - Parâmetros:
parameters.aspect_ratioeparameters.image_size; os valores de tamanho são 1K, 2K e 4K, com K maiúsculo. - Limite da requisição: 1 MiB para o corpo inteiro, incluindo os dados de imagem em Base64.
- Preço do Google: $0.134 por imagem 1K/2K e $0.24 por imagem 4K, da página de preços da API Gemini.
- Nossos tokens: as três tarefas reportaram 1,133, 1,225 e 2,480 tokens de saída. A $120 por milhão de tokens de imagem, isso dá $0.136, $0.147 e $0.298.
- Edição: use
operation: "edit"e coloque a imagem de origem eminput.imagecomo{data, mime_type}.
A página do modelo Nano Banana Pro no OmniaKey também aceita gemini-3-pro-image-preview, o id de snapshot mais antigo, pelo mesmo preço.
O id do modelo e o que você precisa
O id para escrever no código é gemini-3-pro-image. A ficha do modelo no Vertex lista o modelo como GA, com lançamento em 28 de maio de 2026, e saída em 1K, 2K e 4K.
O id -preview aponta para o mesmo modelo. A tabela de modelos de imagem do OmniaKey descreve gemini-3-pro-image-preview como "Same model, -preview snapshot id", com a mesma tarifa por chamada.
Você precisa de duas coisas:
- Uma chave de API do OmniaKey, exportada para o script ler:
export OMNIAKEY_API_KEY="your-key". - Python 3. O script abaixo usa só a biblioteca padrão: urllib, json, time, uuid, base64 e pathlib. Não há SDK para instalar.
O script em Python
Três passos: criar a tarefa, consultar e baixar a imagem. Salve como nano_banana.py e rode com python3 nano_banana.py.
import base64
import json
import os
import time
import urllib.request
import uuid
from pathlib import Path
API = "https://api.omniakey.com/v1/media/tasks"
HEADERS = {
"Authorization": f"Bearer {os.environ['OMNIAKEY_API_KEY']}",
"Content-Type": "application/json",
}
def call(url, payload=None, headers=None, method=None):
body = json.dumps(payload).encode() if payload is not None else None
req = urllib.request.Request(url, data=body, headers=headers or HEADERS, method=method)
with urllib.request.urlopen(req, timeout=60) as resp:
return resp.status, json.loads(resp.read())
def create_task(prompt, aspect_ratio="3:4", image_size="2K", image_path=None):
body = {
"model": "gemini-3-pro-image",
"type": "image",
"operation": "generate" if image_path is None else "edit",
"input": {"prompt": prompt},
"parameters": {"aspect_ratio": aspect_ratio, "image_size": image_size},
}
if image_path:
encoded = base64.b64encode(Path(image_path).read_bytes()).decode("utf-8")
body["input"]["image"] = {"data": encoded, "mime_type": "image/png"}
headers = {**HEADERS, "Idempotency-Key": str(uuid.uuid4())}
status, task = call(API, body, headers, "POST")
print("created", task["id"], "HTTP", status)
return task
def wait(task_id, interval=3, timeout=300):
deadline = time.time() + timeout
while time.time() < deadline:
_, task = call(f"{API}/{task_id}")
print(task["status"], task["progress"]["percent"])
if task["status"] in ("succeeded", "failed", "canceled"):
return task
time.sleep(interval)
# A timeout is not a failure: keep the task id and poll it again.
raise TimeoutError(f"task {task_id} is still running")
def download(task, out_path):
asset = task["assets"][0]
with urllib.request.urlopen(asset["url"], timeout=120) as resp:
Path(out_path).write_bytes(resp.read())
print("saved", out_path, asset["mime_type"], asset["byte_size"], "bytes")
if __name__ == "__main__":
task = create_task(
"A vintage travel poster for the Night Train from Zürich to Milano, "
"departing 21:40 from platform 7. A steam train crosses a stone arch "
"bridge below snowy mountains under a deep blue night sky, with a cream "
"border. Spell every word exactly as written.",
aspect_ratio="3:4",
image_size="2K",
)
task = wait(task["id"])
if task["status"] != "succeeded":
raise SystemExit(f"{task['status']}: {task.get('error')}")
download(task, "night-train.jpg")
image_size aceita 1K, 2K ou 4K. O guia de imagens do Google é explícito: "You must use an uppercase 'K' … Lowercase parameters (e.g., 1k) will be rejected." Envie 2K, não 2k.
Idempotency-Key é obrigatório. Um UUID novo por requisição é a regra simples; reutilize uma chave apenas quando repetir exatamente o mesmo corpo. O OmniaKey devolve a tarefa original com HTTP 200 em vez de cobrar duas vezes, e responde 409 se a mesma chave chegar com outro corpo.
A chamada de criação retorna 202 com um id. A documentação de tarefas de mídia do OmniaKey descreve o ciclo completo; a tarefa concluída carrega os campos abaixo:
{
"id": "task_AbMRVqzSnVh0VwBj0S7NuMUxy5sZtfHP",
"status": "succeeded",
"progress": {"percent": 100, "stage": "completed"},
"usage": {"total_tokens": 1133},
"assets": [
{
"kind": "image",
"mime_type": "…",
"url": "https://…signed-url…"
}
]
}
Leia assets[0].url e baixe na hora: o link assinado dura cerca de uma hora, e o registro da tarefa fica 24 horas. O campo mime_type diz o formato; os modelos Gemini costumam devolver JPEG.
O mesmo script em 1:1 e 2K, com um letreiro em chinês no prompt, devolveu isto:

Editar uma imagem existente
Ponha operation: "edit" e passe a imagem de origem em input.image como {data, mime_type}. O script acima já faz isso quando você passa um image_path:
task = create_task(
"Hang this poster in a thin black frame on a warm white wall, with a brass "
"picture light above it, a low wooden cabinet below and a trailing plant on "
"the right. Keep the poster exactly as it is.",
aspect_ratio="1:1",
image_size="2K",
image_path="night-train-2k.png",
)
O corpo que ele envia fica assim:
{
"model": "gemini-3-pro-image",
"type": "image",
"operation": "edit",
"input": {
"prompt": "Hang this poster in a thin black frame on a warm white wall…",
"image": {"data": "…base64…", "mime_type": "image/png"}
},
"parameters": {"aspect_ratio": "1:1", "image_size": "2K"}
}
A origem do exemplo é um PNG, então o script marca image/png; troque esse rótulo para um JPEG. Para várias referências, use input.images e dê a cada item o mesmo formato {data, mime_type}. O guia do Google põe o limite em 14 imagens de referência; no gemini-3-pro-image a divisão é 6 imagens de objeto, 5 de personagem e 3 de estilo.
Mantenha o corpo abaixo de 1 MiB. O Base64 deixa o arquivo cerca de um terço maior, então reduza ou comprima a origem antes de codificar. Nossa edição usou o pôster de 2K e preservou cada palavra e o layout:

1K, 2K e 4K: o que cada um entrega
Rodamos o mesmo prompt de pôster em 3:4 nos três tamanhos. Os pixels bateram exatamente com a tabela do Google para 3:4: 896x1200 em 1K, 1792x2400 em 2K e 3584x4800 em 4K. O texto do pôster saiu certo em todos os tamanhos.



O que muda com o tamanho é o detalhe, não a grafia:
- 1K: a frente do trem fica apertada: faróis, rodas e bielas quase se encostam.
- 2K: o vilarejo e suas duas torres aparecem na encosta da direita, a chaminé solta um fio claro de fumaça e a ponte mostra sete arcos.
- 4K: os três vagões e o tender ficam separados, e a alvenaria mostra juntas de espessuras diferentes. A mecânica sob a locomotiva continua simplificada.
A velocidade subiu com o tamanho: 28.4 s, 48.2 s e 66.9 s. Rodamos cada tamanho uma vez, então leia esses segundos como uma única passada.
O Google cobra a saída de imagem a $120 por milhão de tokens, e a tabela dele dá 1,120 tokens tanto para 1K quanto para 2K e 2,000 tokens para 4K. Daí sai a estimativa dele:
1,120 × $120 ÷ 1,000,000 = $0.134 per 1K image
1,120 × $120 ÷ 1,000,000 = $0.134 per 2K image
2,000 × $120 ÷ 1,000,000 = $0.24 per 4K image
Nossas tarefas reportaram mais tokens que os exemplos do Google. Aqui está a mesma conta com os nossos números:
1,133 × $120 ÷ 1,000,000 = $0.136 per 1K image
1,225 × $120 ÷ 1,000,000 = $0.147 per 2K image
2,480 × $120 ÷ 1,000,000 = $0.298 per 4K image
| Tamanho | Pixels, 3:4 | Nosso tempo | Nossos tokens | Estimativa do Google |
|---|---|---|---|---|
| 1K | 896x1200 | 28.4 s | 1,133 | $0.134 |
| 2K | 1792x2400 | 48.2 s | 1,225 | $0.134 |
| 4K | 3584x4800 | 66.9 s | 2,480 | $0.24 |
O OmniaKey cobra a chamada de imagem por valor fixo, não por token, então o valor não muda com essas contagens; a tarifa atual por chamada está na página do modelo, e uma tarefa com falha é reembolsada. A estimativa do Google pela tarifa de tokens para as mesmas três imagens é $0.134, $0.134 e $0.24.
Erros que você vai encontrar
As falhas listadas aqui quase sempre se resumem a um nome de campo ou a um tamanho de arquivo, não ao modelo. Estas são as que a documentação de mídia do OmniaKey lista para este endpoint:
| HTTP | Código ou status | O que significa | O que fazer |
|---|---|---|---|
| 400 | invalid_request | Corpo malformado, operação não suportada ou parâmetro errado | Confira o JSON e os nomes de campo abaixo |
| 503 | no_available_channel | Nenhum canal atende este modelo agora | Troque de modelo; repetir não resolve |
| — | failed | A tarefa terminou sem resultado | Leia error.code e error.message |
Uma tarefa failed não é erro HTTP: a chamada de criação deu certo, então consulte a tarefa e leia o objeto error. Tarefas que falharam ou foram canceladas são reembolsadas automaticamente.
Uma origem em resolução total enviada em Base64 pode empurrar o corpo acima de 1 MiB. Reduza primeiro e olhe o comprimento codificado, não só o tamanho do arquivo.
O guia do Google recusa um 1k minúsculo. Use 1K, 2K ou 4K.
A documentação de imagem do OmniaKey também recusa size e um mime_type de primeiro nível nos modelos Gemini, porque não são parâmetros do Gemini. Use parameters.aspect_ratio e parameters.image_size, e leia o formato de saída no campo mime_type da resposta.
Perguntas frequentes
Qual é o id de modelo da API Nano Banana Pro?
gemini-3-pro-image. A ficha Vertex do Google o lista como GA, com lançamento em 28 de maio de 2026, e o OmniaKey aceita o mesmo id. O id antigo gemini-3-pro-image-preview ainda funciona no OmniaKey e aponta para o mesmo modelo.
Quanto custa uma imagem do Nano Banana Pro?
O Google estima $0.134 para uma imagem 1K ou 2K e $0.24 para uma 4K, na tarifa de $120 por milhão de tokens de imagem. Nossas tarefas reportaram 1,133, 1,225 e 2,480 tokens, o que dá $0.136, $0.147 e $0.298 nessa tarifa. A página do modelo no OmniaKey mostra a tarifa própria por chamada.
O Nano Banana Pro desenha texto em chinês?
Sim. Nosso letreiro em 2K voltou com três linhas corretas em chinês — 同福客栈, 住宿 餐饮 茶水 e 010-6789 4321 — com os 11 dígitos e o hífen.
Devo pedir 1K, 2K ou 4K?
Para um pôster como o nosso, 2K é o meio útil. Os três tamanhos escreveram o pôster corretamente, então 4K compra detalhe mais fino — vagões separados e juntas de tijolo — e não texto melhor. Use 1K para rascunhos em que 896x1200 basta.
Por que minha edição voltou 400 invalid_request?
As causas comuns são corpo acima de 1 MiB, origem no campo errado ou um modelo Gemini recebendo size ou um mime_type de primeiro nível. Coloque a imagem em input.image como {data, mime_type}, mantenha o corpo codificado abaixo de 1 MiB e use aspect_ratio e image_size.
Fontes conferidas
- Google Cloud: ficha do modelo Gemini 3 Pro Image — conferida em 3 nov 2026.
- Google: guia de geração de imagens da API Gemini — conferido em 3 nov 2026.
- Google: preços da API Gemini — conferidos em 3 nov 2026.
- Google: anúncio do Nano Banana Pro — conferido em 3 nov 2026.
Histórico de atualizações
- 2026-11-03: primeira versão; cinco chamadas de teste feitas naquele dia pelo OmniaKey.
Modelos deste artigo
Artigos relacionados
Nano Banana 2.1: análise, acesso à API, preços e migração
Compare o Nano Banana 2.1 com o Nano Banana 2 e crie tarefas de imagem compatíveis diretamente na OmniaKey.
Fotos de produto com Nano Banana: 8 prompts testados
Oito prompts, 22 edições, dois modelos: quais fotos mantiveram o rótulo, onde o tênis saiu espelhado e qual modelo escolher para cada trabalho.
Seedream 5.0 Pro vs Nano Banana Pro: teste com o mesmo prompt e preço
Cinco prompts iguais, dois modelos, tempos medidos e o preço por imagem 2K.
