Vai al contenuto principale

La modifica immagine di Nano Banana 2.1 accetta da una a quattordici immagini sorgente e una descrizione del cambiamento, a 1k, 2k o 4k. Mantiene volti e dettagli dei prodotti nelle modifiche e può stampare nuovo testo nell’immagine.

Da $0.022/immagine30% sotto il prezzo di listino del produttore del modelloCon Official fallback: fino a $0.048

Playground

Invia una richiesta

Guida rapida

Gli esempi usano le definizioni pubbliche dei parametri dell’endpoint selezionato. Sostituisci la chiave API e i media di esempio, poi invia la richiesta dal tuo server.

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

Autenticazione dell’API

Tieni la chiave API nella variabile d’ambiente del server SPICY_API_KEY. Per le richieste JSON usa l’autenticazione Bearer e Content-Type: application/json.

Authorization: Bearer $SPICY_API_KEY
Nano Banana 2.1 · Image Editing · Risultato di esempio
Risultato di esempioUsa questo esempio
# 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"

Generato dallo schema di input di questo modello, lo stesso su cui l’API valida ogni richiesta.

Parametri di input

Metti questi campi dentro l’oggetto input del corpo della richiesta. Nomi e tipi corrispondono all’API. Quando un valore predefinito non è indicato, non darlo per scontato.

image_urlsarray<string>ObbligatorioIncide sul prezzo

Da 1 a 14 immagini sorgente, nell’ordine a cui si riferisce il prompt. Il percorso economico ne accetta fino a 10; una modifica con 11-14 immagini passa dal percorso ufficiale al prezzo ufficiale, quindi lascia attivo Official fallback. Sul percorso ufficiale ogni sorgente aggiunge un piccolo costo fisso.

Predefinito
Non specificato
Vincoli
minItems:1
maxItems:14
promptstringObbligatorio

Fino a 5.000 caratteri. Di’ cosa cambia, poi elenca cosa deve restare uguale; indica le sorgenti come prima immagine, seconda immagine e così via. Le parole tra virgolette doppie vengono stampate nell’immagine.

Predefinito
Non specificato
Vincoli
minLength:1
maxLength:5000
official_fallbackbooleanFacoltativo

Attivo per impostazione predefinita. Ogni modifica viene eseguita prima sulla rotta economica. Se quella rotta non riesce a completarla, per esempio perché rifiuta una modifica di livello Lieve, la modifica viene rieseguita sulla rotta ufficiale e addebitata al prezzo ufficiale invece che al prezzo economico. Disattivala per pagare solo il prezzo economico; in quel caso la modifica può essere rifiutata o fallire, e le modifiche con più di 10 immagini di origine, la ricerca web e la ricerca immagini non sono disponibili.

Predefinito
true
output_formatstringFacoltativo

png (predefinito) o jpeg. I file JPEG sono molte volte più piccoli; il prezzo è lo stesso.

Predefinito
"png"
Valori ammessi
"png""jpeg"
enable_image_searchbooleanFacoltativoIncide sul prezzo

Disattivato per impostazione predefinita. Se attivo, il modello cerca immagini di riferimento sul web, utile quando la modifica aggiunge un luogo o un prodotto reale che non hai caricato. Aggiunge un costo di ricerca alla richiesta, visibile nel preventivo. In quel caso la modifica passa dal percorso ufficiale al prezzo ufficiale, quindi lascia attivo Official fallback.

Predefinito
false
enable_web_searchbooleanFacoltativoIncide sul prezzo

Disattivato per impostazione predefinita. Se attivo, il modello verifica fatti attuali prima di disegnare. Aggiunge un costo di ricerca alla richiesta, visibile nel preventivo. In quel caso la modifica passa dal percorso ufficiale al prezzo ufficiale, quindi lascia attivo Official fallback.

Predefinito
false
resolutionstringFacoltativoIncide sul prezzo

1k (predefinito), 2k o 4k. Un’immagine quadrata misura 1024, 2048 o 4096 pixel di lato; ogni livello ha il suo prezzo.

Predefinito
"1k"
Valori ammessi
"1k""2k""4k"
aspect_ratiostringFacoltativo

auto (predefinito) mantiene la forma dell’immagine sorgente; con più sorgenti scegli un formato in modo esplicito. Sono disponibili quattordici formati, tra cui 4:1, 1:4, 8:1 e 1:8. Il formato non cambia il prezzo. Nelle nostre prove, estendere una foto a 4:1 dava un risultato naturale, mentre a 8:1 restavano giunture visibili nei lati aggiunti.

Predefinito
"auto"
Valori ammessi
"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"

Segui l’attività

HTTP 202 significa che l’attività è stata accettata, non che sia finita. Salva il taskId restituito e interroga quell’attività. Non crearne un’altra mentre aspetti il risultato.

Risposta di accettazione
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 risposta di accettazione include la stima, così la tua applicazione può mostrare lo stesso importo nella cronologia delle attività e nella fatturazione.

Leggi l’attività
curl --get "https://api.spicyapi.ai/api/v1/jobs/recordInfo" \
  --data-urlencode "taskId=$TASK_ID" \
  -H "Authorization: Bearer $SPICY_API_KEY"

Comincia a interrogare ogni 2 secondi circa e allunga l’intervallo man mano. Fermati a uno stato terminale. Dopo una caduta di connessione, interroga il taskId originale. Ripeti la creazione solo con la chiave di idempotenza e il corpo originali.

Oppure lascia che sia la callback a trovarti
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);
});

Passa callBackUrl quando crei l’attività e il record finito ti arriva via POST: nessun ciclo di polling. Ogni consegna porta X-Webhook-Timestamp, X-Webhook-Signature e X-Webhook-Payload-Version. La firma è un HMAC-SHA256 in base64 su taskId.timestamp.sha256(body), quindi va verificata sui byte grezzi: se analizzi il JSON e lo riserializzi i byte cambiano e la verifica fallisce. Le consegne fallite vengono ritentate, quindi lo stesso taskId può arrivare due volte: rendi idempotente il gestore. Rispondi prima con un 2xx e fai il lavoro dopo; un gestore lento viene trattato come una consegna fallita.

Leggi il risultato

Usa l’output solo quando lo stato è succeeded. In caso di fallimento, indaga con errorCode, errorMessage e request_id. Costi e stati degli esempi non rappresentano un addebito reale.

Esempio di risposta completata
{
  "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"
  }
}

Per ogni asset disponibile, apri o scarica assets[].url direttamente, senza l’header Authorization dell’API. L’URL firmato scade a expiresAt; interroga di nuovo l’attività per rinnovarlo finché l’asset resta entro il periodo di conservazione. Un asset in attesa o non disponibile non ha URL. Tratta gli URL firmati come privati.

SDK e integrazioni

Usa SpicyAPI nella tua app, nel terminale, con un assistente IA o in un workflow visivo. Scegli una guida di configurazione.

Usalo in ComfyUI

Installa i nodi SpicyAPI da ComfyUI Manager o con il comando qui sotto, poi cerca Nano Banana 2.1 · Image Editing sulla tela. Il nodo ha le stesse opzioni di questa pagina e mostra il prezzo prima dell’esecuzione.

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