{"slug": "nano-banana-2-1-api-in-production-latency-failures-and-concurrency-from-760-real", "title": "Nano Banana 2.1 API in production: latency, failures and concurrency from 760 real jobs", "summary": "An APIKO engineer published production measurements from 760 Nano Banana 2.1 image jobs collected over one week, finding a 68-second median submit-to-result latency, a 97.0% success rate, and a long 4K tail where one in ten jobs exceeded four minutes. After adding a hedged second request for slow or fast-failing jobs, the following 344 jobs saw zero failures at the cost of roughly 8% extra requests, about a quarter for 4K. A 90-job simultaneous load test completed 90/90 with no rate-limit errors, though 2K and 4K result files of 6–20 MB added 10–16 seconds of download time.", "body_md": "Most Nano Banana 2.1 write-ups compare image quality. I needed different numbers before telling customers what to expect: how long a request really takes at 1K, 2K and 4K, how often it fails and why, and what happens when 90 jobs arrive at once. The numbers below come from one week of production traffic plus a load test, all through the same OpenAI-compatible endpoint.\n\n*Disclosure: I work on APIKO, the gateway these jobs ran through. The timings include our queueing and polling, so treat them as \"what a client waits\", not as raw model speed.*\n\nSeven days, Oct 14–21, 2026: 760 Nano Banana 2.1 jobs from 10 accounts. 92% were edits (prompt plus one or more reference images), and 75% were 2K. So the typical request is an edit with a reference image, not plain text-to-image.\n\nTime from submit to finished result:\n\n|  | p50 | p90 | p99 | \n|---|---|---|---|\n| all jobs | 68 s | 116 s | 325 s | \n| 1K | 49 s |  |  | \n| 2K | 75 s |  |  | \n| 4K | 80 s | 262 s |  | \n\n4K is barely slower than 2K at the median, but its tail is long: one in ten 4K jobs took over four minutes. Time of day also mattered more than I expected. Jobs during the Asian evening (10:00–16:00 UTC) had a median of 77 s, against 58 s during the Asian daytime.\n\nThis is why I would not call the model with a synchronous HTTP request. nginx closes an idle upstream connection after 60 s by default (`proxy_read_timeout`), and plenty of proxies and serverless runtimes have similar limits, all below the median for a 2K edit.\n\nThe week had 23 failed jobs (97.0% success):\n\nOnly the first group is worth engineering around. We started sending a second request when the first one fails fast or runs far past its usual time, and kept whichever finished first. In the 344 jobs after that change, there were zero failures. The cost is extra requests: about 8% overall, and about a quarter of 4K jobs, because 4K has the longest tail.\n\nThe other two groups are on the caller: host reference images somewhere the model can reach (or upload them once and reuse the URL), and expect the occasional content refusal.\n\nOn Oct 24 we fired real community prompts all at the same instant, again mostly 2K edits with some 4K:\n\n|  | 70 jobs | 90 jobs | \n|---|---|---|\n| succeeded | 70/70 | 90/90 | \n| submit call returned | p50 2.8 s | p50 3.1 s | \n| all results ready | 83 s | 115 s | \n| 2K p50 | 58 s | 66 s | \n| 4K p50 | 68 s | 105 s | \n\nNo rate-limit errors at either level. One request in the 90 run got an instant upstream 504 and was retried transparently. Result files are big: a 2K image was 6–8 MB and a 4K one 18–20 MB, which took 10–16 s just to download. If you show results in a UI, budget for that download as well as the generation.\n\nSubmit asynchronously, poll every few seconds, and give up only after several minutes:\n\n``` python\nimport os, time, requests\n\nBASE = \"https://api.apiko.app/v1\"\nH = {\"Authorization\": f\"Bearer {os.environ['APIKO_API_KEY']}\"}\n\njob = requests.post(f\"{BASE}/images/edits\", headers=H, timeout=60, json={\n    \"model\": \"nano-banana-2.1\",\n    \"prompt\": \"Turn this product photo into a clean studio shot on white\",\n    \"images\": [\"https://example.com/product.jpg\"],\n    \"resolution\": \"2k\",               # 1k | 2k | 4k\n    \"async\": True,\n}).json()\n\ndeadline = time.time() + 600          # the 4K tail can pass 4 minutes\nwhile time.time() < deadline:\n    time.sleep(5)\n    task = requests.get(f\"{BASE}/tasks/{job['id']}\", headers=H, timeout=30).json()\n    if task[\"status\"] in (\"completed\", \"failed\"):\n        print(task)\n        break\n```\n\nRequest fields for text-to-image, edits, aspect ratios and tiers are in the [API reference](https://apiko.app/docs/api-manual/image-series/nano-banana-2.1/images); live price and availability are on the [Nano Banana 2.1 API page](https://apiko.app/models/nano-banana-2.1). Result links expire after 24 hours, so copy anything you want to keep.", "url": "https://wpnews.pro/news/nano-banana-2-1-api-in-production-latency-failures-and-concurrency-from-760-real", "canonical_source": "https://dev.to/apikoapp/nano-banana-21-api-in-production-latency-failures-and-concurrency-from-760-real-jobs-541d", "published_at": "2026-10-30 10:13:12+00:00", "updated_at": "2026-10-30 10:20:31.272319+00:00", "lang": "en", "topics": ["ai-products", "ai-tools", "ai-infrastructure", "generative-ai"], "entities": ["APIKO", "Nano Banana 2.1", "OpenAI", "nginx"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/nano-banana-2-1-api-in-production-latency-failures-and-concurrency-from-760-real", "markdown": "https://wpnews.pro/news/nano-banana-2-1-api-in-production-latency-failures-and-concurrency-from-760-real.md", "text": "https://wpnews.pro/news/nano-banana-2-1-api-in-production-latency-failures-and-concurrency-from-760-real.txt", "jsonld": "https://wpnews.pro/news/nano-banana-2-1-api-in-production-latency-failures-and-concurrency-from-760-real.jsonld"}}