Ir al contenido principal

La edición de imagen de Nano Banana 2.1 toma de una a catorce imágenes de origen y una descripción del cambio, en 1k, 2k o 4k. Conserva rostros y detalles de producto entre ediciones y puede imprimir texto nuevo en la imagen.

Desde $0.022/imagen30% por debajo del precio oficialCon Official fallback: hasta $0.048

Playground

Enviar una solicitud

Inicio rápido

Los ejemplos usan las definiciones públicas de parámetros del endpoint seleccionado. Sustituye la clave de API y los medios de ejemplo, y envía la solicitud desde tu servidor.

SDK e integraciones
POSThttps://api.spicyapi.ai/api/v1/jobs/createTask

Autenticación de API

Guarda la clave de API en la variable de entorno del servidor SPICY_API_KEY. Usa autenticación Bearer y Content-Type: application/json en las solicitudes JSON.

Authorization: Bearer $SPICY_API_KEY
Nano Banana 2.1 · Image Editing · Resultado de ejemplo
Resultado de ejemploUsar este ejemplo
# Generate the idempotency key once; reuse it when retrying after a lost response.
export SPICY_IDEMPOTENCY_KEY="${SPICY_IDEMPOTENCY_KEY:-$(uuidgen)}"
curl -X POST https://api.spicyapi.ai/api/v1/jobs/createTask \
  -H "Authorization: Bearer $SPICY_API_KEY" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: $SPICY_IDEMPOTENCY_KEY" \
  -d '{
  "model": "google/nano-banana-2.1/edit",
  "input": {
    "aspect_ratio": "auto",
    "enable_image_search": false,
    "enable_web_search": false,
    "image_urls": [
      "https://example.com/reference.png"
    ],
    "output_format": "png",
    "prompt": "A ceramic teapot on a linen cloth, soft window light, muted palette",
    "resolution": "1k"
  }
}'

# Copy data.taskId from the response into TASK_ID, then poll the status.
TASK_ID="TASK_ID_FROM_RESPONSE"
curl "https://api.spicyapi.ai/api/v1/jobs/recordInfo?taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Generado a partir del esquema de entrada de este modelo: el mismo con el que la API valida cada solicitud.

Parámetros de entrada

Incluye estos campos en el objeto input del cuerpo de la solicitud. Los nombres y tipos coinciden con la API. No supongas un valor predeterminado si no está indicado.

image_urlsarray<string>ObligatorioAfecta al precio

De 1 a 14 imágenes de origen, en el orden al que se refiere tu prompt. La ruta económica acepta hasta 10; una edición con 11 a 14 pasa por la ruta oficial al precio oficial, así que deja activado Official fallback. En la ruta oficial, cada imagen de origen suma un pequeño cargo fijo.

Valor predeterminado
Sin especificar
Restricciones
minItems:1
maxItems:14
promptstringObligatorio

Hasta 5.000 caracteres. Di qué cambia y luego enumera qué debe seguir igual; llama a las imágenes de origen la primera imagen, la segunda imagen y así. Las palabras entre comillas dobles se imprimen en la imagen.

Valor predeterminado
Sin especificar
Restricciones
minLength:1
maxLength:5000
official_fallbackbooleanOpcional

Activado por defecto. Cada edición se ejecuta primero por la ruta económica. Si esa ruta no puede completarla, por ejemplo porque rechaza una edición de nivel Suave, la edición se vuelve a ejecutar por la ruta oficial y se cobra al precio oficial en lugar del precio económico. Desactívala para pagar solo el precio económico; entonces la edición puede rechazarse o fallar, y las ediciones con más de 10 imágenes de origen, la búsqueda web y la búsqueda de imágenes no están disponibles.

Valor predeterminado
true
output_formatstringOpcional

png (predeterminado) o jpeg. Los archivos JPEG pesan varias veces menos; el precio es el mismo.

Valor predeterminado
"png"
Valores permitidos
"png""jpeg"
enable_image_searchbooleanOpcionalAfecta al precio

Desactivado de forma predeterminada. Al activarlo, el modelo busca imágenes de referencia en la web, útil cuando la edición añade un lugar o un producto reales que no subiste. Suma un cargo de búsqueda a la solicitud, visible en la cotización. En ese caso, la edición pasa por la ruta oficial al precio oficial, así que deja activado Official fallback.

Valor predeterminado
false
enable_web_searchbooleanOpcionalAfecta al precio

Desactivado de forma predeterminada. Al activarlo, el modelo consulta datos actuales antes de dibujar. Suma un cargo de búsqueda a la solicitud, visible en la cotización. En ese caso, la edición pasa por la ruta oficial al precio oficial, así que deja activado Official fallback.

Valor predeterminado
false
resolutionstringOpcionalAfecta al precio

1k (predeterminado), 2k o 4k. Una imagen cuadrada mide 1024, 2048 o 4096 píxeles de lado; cada nivel tiene su propio precio.

Valor predeterminado
"1k"
Valores permitidos
"1k""2k""4k"
aspect_ratiostringOpcional

auto (predeterminado) conserva el formato de la imagen de origen; con varias imágenes de origen, elige un formato de forma explícita. Hay catorce formatos disponibles, incluidos 4:1, 1:4, 8:1 y 1:8. El formato no cambia el precio. En nuestras ejecuciones, ampliar una foto a 4:1 quedó natural, mientras que en 8:1 quedaron uniones visibles en los lados añadidos.

Valor predeterminado
"auto"
Valores permitidos
"auto""1:1""3:2""2:3""3:4""4:3""4:5""5:4""9:16""16:9""21:9""1:4""4:1""1:8""8:1"

Seguir la tarea

HTTP 202 significa que la tarea se aceptó, no que haya terminado. Guarda el taskId devuelto y consulta esa tarea. No crees otra mientras esperas el resultado.

Solicitud aceptada
HTTP/1.1 202 Accepted
Location: /api/v1/jobs/recordInfo?taskId=job_01k3m8x9q2z4v7n5p6r8s0t1w3

{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_create",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "state": "queued",
    "estimatedCost": "0.750000"
  }
}

La respuesta de aceptación incluye la estimación para que tu aplicación pueda mostrar el mismo importe en el historial de tareas y en la facturación.

Consultar la tarea
curl --get "https://api.spicyapi.ai/api/v1/jobs/recordInfo" \
  --data-urlencode "taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Empieza consultando cada 2 segundos aproximadamente y ve espaciando los intentos. Párate en un estado final. Si se cae la conexión, consulta el taskId original. Vuelve a crear la tarea solo con la clave de idempotencia y el cuerpo originales.

O recibe el resultado por callback
import { verifyWebhook } from "@spicyapi/sdk";

// express.raw keeps the bytes we signed; express.json never matches.
app.post("/hooks/spicy", express.raw({ type: "application/json" }), (req, res) => {
  const { payload } = verifyWebhook({
    rawBody: req.body,
    timestamp: req.header("X-Webhook-Timestamp"),
    signature: req.header("X-Webhook-Signature"),
    payloadVersion: Number(req.header("X-Webhook-Payload-Version")),
    secret: process.env.SPICY_WEBHOOK_SECRET,
  });
  res.status(200).end();
  void handleFinishedTask(payload);
});

Pasa callBackUrl al crear la tarea y recibirás el registro terminado por POST, sin un bucle de consultas de estado. Cada entrega lleva X-Webhook-Timestamp, X-Webhook-Signature y X-Webhook-Payload-Version. La firma es un HMAC-SHA256 en base64 sobre taskId.timestamp.sha256(body), así que debes verificarla con los bytes originales: si analizas el JSON y vuelves a serializarlo, los bytes cambian y la verificación falla. Las entregas fallidas se reintentan, de modo que el mismo taskId puede llegar dos veces; haz que tu manejador sea idempotente. Responde 2xx primero y haz el trabajo después: un manejador lento se trata como una entrega fallida.

Leer el resultado

Procesa output solo cuando state sea succeeded. Si falla, consulta errorCode, errorMessage y request_id. Los costos y estados de ejemplo no representan una factura real.

Ejemplo de respuesta completada
{
  "code": 200,
  "msg": "success",
  "request_id": "req_example_record",
  "data": {
    "taskId": "job_01k3m8x9q2z4v7n5p6r8s0t1w3",
    "model": "google/nano-banana-2.1/edit",
    "state": "succeeded",
    "output": {
      "assets": [
        {
          "key": "tasks/2026/08/28/job_01k3m8x9q2z4v7n5p6r8s0t1w3/3f7a1c9e5b2d48f0a6c1e3d5b7f9a1c3.png",
          "mime": "image/png",
          "url": "https://example.r2.cloudflarestorage.com/results/job_01k3m8x9q2z4v7n5p6r8s0t1w3/result.png?X-Amz-Signature=SIGNATURE_FROM_RESPONSE",
          "expiresAt": "2026-08-28T12:20:08.000Z"
        }
      ]
    },
    "cost": "0.750000",
    "settled": true,
    "createdAt": "2026-08-28T12:00:00Z",
    "completedAt": "2026-08-28T12:00:30Z"
  }
}

Para cada archivo disponible, abre o descarga assets[].url directamente, sin la cabecera Authorization de la API. El enlace firmado expira en expiresAt: vuelve a consultar la tarea para renovarlo mientras el archivo siga dentro del periodo de conservación. Un archivo pendiente o no disponible no trae URL. Trata los enlaces firmados como datos privados.

SDK e integraciones

Usa SpicyAPI en tu app, terminal, asistente de IA o flujo visual. Elige una guía de configuración.

Úsalo en ComfyUI

Instala los nodos de SpicyAPI desde ComfyUI Manager o con el comando de abajo y busca Nano Banana 2.1 · Image Editing en el lienzo. El nodo tiene las mismas opciones que esta página y muestra su precio antes de ejecutarse.

cd ComfyUI/custom_nodes
git clone https://github.com/spicyapi-ai/comfyui-spicyapi