---
title: Grounding with web and image search — Nano Banana 2.1 | Runware Docs
url: https://runware.ai/docs/models/google-nano-banana-2-1/guides/grounded-generation
description: 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](https://runware.ai/docs/models/google-nano-banana-2-1/guides/grounded-generation#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 deep navy social card titled TODAY'S RATES with three rows of flag icons, the currency pairs EUR / USD at 1.1252, GBP / USD at 1.3209, and USD / JPY at 158.1800, the date October 6, 2026, and the line Rates are indicative](https://runware.ai/docs/assets/hero.BiFdcEjO_ZT3OvJ.jpg)

> **Prompt**: 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](https://runware.ai/docs/models/google-nano-banana-2-1/guides/grounded-generation#the-two-settings)

Both are booleans under `settings`, and both are **off unless you turn them on**:

**TypeScript**:

```typescript
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
  }
})
```

**Python**:

```python
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**:

```bash
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
      }
    }
  ]'
```

**CLI**:

```bash
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
```

**JSON**:

```json
{
  "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
  }
}
```

`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.

> [!NOTE]
> 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](https://runware.ai/docs/models/google-nano-banana-2-1/guides/grounded-generation#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 deep blue retail banner with DEAL OF THE DAY in heavy white capitals, THURSDAY, OCTOBER 24, 2024 in yellow under it, and black wireless earbuds in an open charging case on the right](https://runware.ai/docs/assets/output-date-off.B4_iqkb5_15eeDq.jpg)

*Web search off*

> **Prompt**: 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 deep blue retail banner with DEAL OF THE DAY in heavy white capitals, TUESDAY, OCTOBER 6, 2026 in yellow under it, and black wireless earbuds in an open charging case on the right](https://runware.ai/docs/assets/output-date-on.DC3rFu2U_Z1KIEf4.jpg)

*Web search on*

> **Prompt**: 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](https://runware.ai/docs/models/google-nano-banana-2-1/guides/grounded-generation#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.

![The Sagrada Família in Barcelona seen across a pond on a clear morning, with two construction cranes over an unfinished center, its spires reflected in the water](https://runware.ai/docs/assets/output-landmark-off.DqXnYy2t_9LU6o.jpg)

*Image search off*

> **Prompt**: 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.

![The Sagrada Família in Barcelona seen across a pond on a clear morning, with no cranes and the completed central tower and its cross rising above the other spires, reflected in the water](https://runware.ai/docs/assets/output-landmark-on.BEDKn9fj_1DRoMv.jpg)

*Image search on*

> **Prompt**: 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](https://runware.ai/docs/models/google-nano-banana-2-1/guides/grounded-generation#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 with a photograph of a snow-streaked Mount Fuji above Lake Kawaguchi and a lakeside town, over a white strip titled HIKING MOUNT FUJI that lists CLIMBING SEASON JULY 1 - SEPT 10, 2026, YOSHIDA TRAIL FEE ¥4,000 PER PERSON (MANDATORY), and SUMMIT ELEVATION 3,776 METERS, each with a small icon](https://runware.ai/docs/assets/output-both.CyttL0q-_Z1h6IEP.jpg)

> **Prompt**: 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.

**TypeScript**:

```typescript
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
  }
})
```

**Python**:

```python
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**:

```bash
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
      }
    }
  ]'
```

**CLI**:

```bash
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
```

**JSON**:

```json
{
  "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](https://runware.ai/docs/models/google-nano-banana-2-1/guides/grounded-generation#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](https://runware.ai/docs/models/google-nano-banana-2-1/guides/grounded-generation#tips)

1. **Turn lookups on per prompt.** Both settings are off by default, and most prompts are better served that way.
    
2. **Name the entity and the fields.** The search runs on what the prompt names, so a vague request returns vague facts.
    
3. **Ask for "real" and "current" in words.** That is what separates a value to fetch from a value to make up.
    
4. **Verify figures before publishing.** The response does not include sources, so a number that matters needs a second check.
    
5. **Save grounded results.** The data is current as of generation, and a rerun fetches new values.