Nano Banana 2.1

Nano Banana 2.1 is Google's updated image generation and editing model in the Nano Banana 2 family. It improves graphic composition and subject consistency, and it follows complex prompts and edit instructions more accurately. It works from text alone or from as many as fourteen reference images plus one reference video, and it can ground a generation in live web and image search so the result reflects current facts and real visual references. It generates at 1K, 2K and 4K, with three levels of thinking that trade speed for reasoning depth, which suits layout-heavy design work, recurring characters and products, and precise multi-step edits.

Complete technical specification for integration
Ready-to-use code snippets for common workflows
Step-by-step tutorials for advanced use cases
← All GuidesGrounding with web and image search
How to ground Nano Banana 2.1 in live facts and real appearances with settings.webSearch and settings.imageSearch, and when to leave both lookups off.
Introduction
Ask an image model for a card with today's exchange rates and it will render numbers, all of them invented. The model knows nothing after its training cutoff, so a prompt that depends on a current fact gets confident fiction set in clean type.
Nano Banana 2.1 can look things up before it renders. settings.webSearch lets it read the web for facts the image has to state, and settings.imageSearch lets it retrieve pictures of something the image has to resemble.

A social media card for a travel money app titled "TODAY'S RATES" in bold white capitals on a deep navy background. Below the title, three rows, each with a pair of small circular flag icons, a currency pair label, and the real current mid-market exchange rate looked up from the web, to four decimal places: "EUR / USD", "GBP / USD", and "USD / JPY". At the bottom in small light gray type, today's real date and the line "Rates are indicative". Clean modern fintech design, crisp legible numerals, generous spacing.
The three rates and the date on that card were fetched while the request ran. This guide covers the two settings, what each one grounds, how to phrase a prompt a search can act on, and when a lookup is not worth the wait.
The two settings
Both are booleans under settings, and both are off unless you turn them on:
import { createClient } from '@runware/sdk'
const client = await createClient({ apiKey: process.env.RUNWARE_API_KEY })
await client.connect()
const [result] = await client.run({
model: 'google:nano-banana@2.1',
positivePrompt: 'A social media card for a travel money app titled "TODAY\'S RATES" in bold white capitals on a deep navy background. Below the title, three rows, each with a pair of small circular flag icons, a currency pair label, and the real current mid-market exchange rate looked up from the web, to four decimal places: "EUR / USD", "GBP / USD", and "USD / JPY". At the bottom in small light gray type, today\'s real date and the line "Rates are indicative". Clean modern fintech design, crisp legible numerals, generous spacing.',
width: 2400,
height: 1792,
settings: {
webSearch: true
}
})import asyncio
import os
from runware import Runware
async def main():
async with Runware(api_key=os.environ["RUNWARE_API_KEY"]) as client:
results = await client.run({
"model": "google:nano-banana@2.1",
"positivePrompt": "A social media card for a travel money app titled \"TODAY'S RATES\" in bold white capitals on a deep navy background. Below the title, three rows, each with a pair of small circular flag icons, a currency pair label, and the real current mid-market exchange rate looked up from the web, to four decimal places: \"EUR / USD\", \"GBP / USD\", and \"USD / JPY\". At the bottom in small light gray type, today's real date and the line \"Rates are indicative\". Clean modern fintech design, crisp legible numerals, generous spacing.",
"width": 2400,
"height": 1792,
"settings": {
"webSearch": True
}
})
asyncio.run(main())curl https://api.runware.ai/v1 \
-H "Authorization: Bearer $RUNWARE_API_KEY" \
-H "Content-Type: application/json" \
-d '[
{
"taskType": "imageInference",
"taskUUID": "a3d81f06-7c29-4b54-9e03-6f1c8a5d2b79",
"model": "google:nano-banana@2.1",
"positivePrompt": "A social media card for a travel money app titled \"TODAY'S RATES\" in bold white capitals on a deep navy background. Below the title, three rows, each with a pair of small circular flag icons, a currency pair label, and the real current mid-market exchange rate looked up from the web, to four decimal places: \"EUR / USD\", \"GBP / USD\", and \"USD / JPY\". At the bottom in small light gray type, today's real date and the line \"Rates are indicative\". Clean modern fintech design, crisp legible numerals, generous spacing.",
"width": 2400,
"height": 1792,
"settings": {
"webSearch": true
}
}
]'runware run google:nano-banana@2.1 \
positivePrompt="A social media card for a travel money app titled \"TODAY'S RATES\" in bold white capitals on a deep navy background. Below the title, three rows, each with a pair of small circular flag icons, a currency pair label, and the real current mid-market exchange rate looked up from the web, to four decimal places: \"EUR / USD\", \"GBP / USD\", and \"USD / JPY\". At the bottom in small light gray type, today's real date and the line \"Rates are indicative\". Clean modern fintech design, crisp legible numerals, generous spacing." \
width=2400 \
height=1792 \
settings.webSearch=true{
"taskType": "imageInference",
"taskUUID": "a3d81f06-7c29-4b54-9e03-6f1c8a5d2b79",
"model": "google:nano-banana@2.1",
"positivePrompt": "A social media card for a travel money app titled \"TODAY'S RATES\" in bold white capitals on a deep navy background. Below the title, three rows, each with a pair of small circular flag icons, a currency pair label, and the real current mid-market exchange rate looked up from the web, to four decimal places: \"EUR / USD\", \"GBP / USD\", and \"USD / JPY\". At the bottom in small light gray type, today's real date and the line \"Rates are indicative\". Clean modern fintech design, crisp legible numerals, generous spacing.",
"width": 2400,
"height": 1792,
"settings": {
"webSearch": true
}
}Response
[
{
"taskType": "imageInference",
"taskUUID": "a3d81f06-7c29-4b54-9e03-6f1c8a5d2b79",
"imageUUID": "5b9e2c74-d1a6-4f38-8c05-e7a3f0b6d914",
"imageURL": "https://im.runware.ai/image/os/a14d18/ws/2/ii/5b9e2c74-d1a6-4f38-8c05-e7a3f0b6d914.jpg"
}
]settings.webSearch gives the model text it can quote: a rate, a date, a schedule, a name. settings.imageSearch gives it pictures it can match: the shape of a building, the look of a specific vehicle. The two are independent, so a request can turn on either one or both.
The response carries the generated image and nothing about the pages or pictures the model consulted. A grounded result cannot be traced to its sources, so check any figure that matters before it ships.
A grounded image reflects what the search returned at that moment. Keep the file you approved, because the same prompt tomorrow returns tomorrow's values.
Grounding a fact with web search
The simplest fact a model cannot know is today's date. The two banners below share one prompt that asks for it. The first request left web search off, and the second turned it on.

A retail website banner for an electronics store's daily offer. On the left, the heading "DEAL OF THE DAY" in heavy white capitals, and under it today's real date written out in full with the day of the week, in a lighter yellow weight. On the right, a pair of black wireless earbuds in an open charging case on a glossy dark surface with a soft blue rim light. Deep blue gradient background, clean modern design.

A retail website banner for an electronics store's daily offer. On the left, the heading "DEAL OF THE DAY" in heavy white capitals, and under it today's real date written out in full with the day of the week, in a lighter yellow weight. On the right, a pair of black wireless earbuds in an open charging case on a glossy dark surface with a soft blue rim light. Deep blue gradient background, clean modern design.
Both banners look finished, and only one of the dates is real. The first reads Thursday, October 24, 2024, a real calendar date that was two years stale. The second reads Tuesday, October 6, 2026, the day it was generated.
A wrong fact renders as cleanly as a right one, so nothing in the image signals the difference. Web search covers anything the image states: a date, a price, a score, an opening time.
Grounding a look with image search
Image search is for a subject with one correct appearance that the model may not know in its current state. The Sagrada Família is a clean test. The cross on its central tower went up in February 2026, which finished the tallest part of the basilica, so most photos of the building ever taken show it unfinished.

A destination header photograph for a travel app: the Sagrada Família in Barcelona as it looks today, seen from across the pond in Plaça de Gaudí on a clear morning, the whole basilica in frame with its towers reflected in the water. Natural color, deep focus, photoreal travel photography, no people in the foreground, no text.

A destination header photograph for a travel app: the Sagrada Família in Barcelona as it looks today, seen from across the pond in Plaça de Gaudí on a clear morning, the whole basilica in frame with its towers reflected in the water. Natural color, deep focus, photoreal travel photography, no people in the foreground, no text.
With the lookup off, the model draws the building it remembers, cranes included. With it on, it retrieves current photos and renders the basilica as it stands now, with the finished central tower and its cross. Reach for image search whenever a reader could check the image against reality: a landmark, a venue, a stadium, a specific generation of a product.
Writing a prompt a search can act on
A lookup needs a query, and the query comes from the prompt. Four habits make a prompt searchable:
- Name the entity exactly. "The Sagrada Família in Barcelona" is a query. "A famous basilica" is a description, and there is nothing to look up.
- Ask for the real value in words. "The real current exchange rate" and "today's real date" tell the model the value has to be fetched and not composed.
- Say which fields you need. "To four decimal places" and "with the day of the week" define what the search has to return.
- Give a look a time anchor. "As it looks today" asks for the current state of a place that has changed.
The card below needs both lookups, a real view for the photograph and real values for the strip under it:

A travel information card for hiking Mount Fuji that fills the whole frame edge to edge. The top two-thirds is a photograph of Mount Fuji as it really looks from the north shore of Lake Kawaguchi in early summer, with the lake in the foreground. The bottom third is a clean white information strip with the title "HIKING MOUNT FUJI" in bold dark capitals and three facts under it in dark type, each with a small line icon: the official climbing season dates for the Yoshida Trail this year, the current mandatory entry fee per person for the Yoshida Trail in yen, and the summit elevation in meters. Use the real current values from the web. Crisp legible sans serif, no other text.
import { createClient } from '@runware/sdk'
const client = await createClient({ apiKey: process.env.RUNWARE_API_KEY })
await client.connect()
const [result] = await client.run({
model: 'google:nano-banana@2.1',
positivePrompt: 'A travel information card for hiking Mount Fuji that fills the whole frame edge to edge. The top two-thirds is a photograph of Mount Fuji as it really looks from the north shore of Lake Kawaguchi in early summer, with the lake in the foreground. The bottom third is a clean white information strip with the title "HIKING MOUNT FUJI" in bold dark capitals and three facts under it in dark type, each with a small line icon: the official climbing season dates for the Yoshida Trail this year, the current mandatory entry fee per person for the Yoshida Trail in yen, and the summit elevation in meters. Use the real current values from the web. Crisp legible sans serif, no other text.',
width: 2400,
height: 1792,
settings: {
webSearch: true,
imageSearch: true
}
})import asyncio
import os
from runware import Runware
async def main():
async with Runware(api_key=os.environ["RUNWARE_API_KEY"]) as client:
results = await client.run({
"model": "google:nano-banana@2.1",
"positivePrompt": "A travel information card for hiking Mount Fuji that fills the whole frame edge to edge. The top two-thirds is a photograph of Mount Fuji as it really looks from the north shore of Lake Kawaguchi in early summer, with the lake in the foreground. The bottom third is a clean white information strip with the title \"HIKING MOUNT FUJI\" in bold dark capitals and three facts under it in dark type, each with a small line icon: the official climbing season dates for the Yoshida Trail this year, the current mandatory entry fee per person for the Yoshida Trail in yen, and the summit elevation in meters. Use the real current values from the web. Crisp legible sans serif, no other text.",
"width": 2400,
"height": 1792,
"settings": {
"webSearch": True,
"imageSearch": True
}
})
asyncio.run(main())curl https://api.runware.ai/v1 \
-H "Authorization: Bearer $RUNWARE_API_KEY" \
-H "Content-Type: application/json" \
-d '[
{
"taskType": "imageInference",
"taskUUID": "f6c20b93-5e7a-4d14-a8b2-1d9e4c7f3a50",
"model": "google:nano-banana@2.1",
"positivePrompt": "A travel information card for hiking Mount Fuji that fills the whole frame edge to edge. The top two-thirds is a photograph of Mount Fuji as it really looks from the north shore of Lake Kawaguchi in early summer, with the lake in the foreground. The bottom third is a clean white information strip with the title \"HIKING MOUNT FUJI\" in bold dark capitals and three facts under it in dark type, each with a small line icon: the official climbing season dates for the Yoshida Trail this year, the current mandatory entry fee per person for the Yoshida Trail in yen, and the summit elevation in meters. Use the real current values from the web. Crisp legible sans serif, no other text.",
"width": 2400,
"height": 1792,
"settings": {
"webSearch": true,
"imageSearch": true
}
}
]'runware run google:nano-banana@2.1 \
positivePrompt="A travel information card for hiking Mount Fuji that fills the whole frame edge to edge. The top two-thirds is a photograph of Mount Fuji as it really looks from the north shore of Lake Kawaguchi in early summer, with the lake in the foreground. The bottom third is a clean white information strip with the title \"HIKING MOUNT FUJI\" in bold dark capitals and three facts under it in dark type, each with a small line icon: the official climbing season dates for the Yoshida Trail this year, the current mandatory entry fee per person for the Yoshida Trail in yen, and the summit elevation in meters. Use the real current values from the web. Crisp legible sans serif, no other text." \
width=2400 \
height=1792 \
settings.webSearch=true \
settings.imageSearch=true{
"taskType": "imageInference",
"taskUUID": "f6c20b93-5e7a-4d14-a8b2-1d9e4c7f3a50",
"model": "google:nano-banana@2.1",
"positivePrompt": "A travel information card for hiking Mount Fuji that fills the whole frame edge to edge. The top two-thirds is a photograph of Mount Fuji as it really looks from the north shore of Lake Kawaguchi in early summer, with the lake in the foreground. The bottom third is a clean white information strip with the title \"HIKING MOUNT FUJI\" in bold dark capitals and three facts under it in dark type, each with a small line icon: the official climbing season dates for the Yoshida Trail this year, the current mandatory entry fee per person for the Yoshida Trail in yen, and the summit elevation in meters. Use the real current values from the web. Crisp legible sans serif, no other text.",
"width": 2400,
"height": 1792,
"settings": {
"webSearch": true,
"imageSearch": true
}
}When to leave both off
Each lookup adds time to the request, which is the reason to enable them per prompt and not across a whole pipeline.
A prompt about an invented subject gives a search nothing to find. A fictional brand or an illustration described fully in the prompt renders the same with or without a lookup, minus the wait. The test is whether the image could be wrong about the world. If nothing in it can be checked against a fact or a real appearance, leave both settings off.
Tips
-
Turn lookups on per prompt. Both settings are off by default, and most prompts are better served that way.
-
Name the entity and the fields. The search runs on what the prompt names, so a vague request returns vague facts.
-
Ask for "real" and "current" in words. That is what separates a value to fetch from a value to make up.
-
Verify figures before publishing. The response does not include sources, so a number that matters needs a second check.
-
Save grounded results. The data is current as of generation, and a rerun fetches new values.