---
title: "Bing Images scraper"
description: "Scrape Bing Images results as JSON: full-size image URLs, thumbnails, titles, source pages and domains, and pixel dimensions for any search query."
canonical: https://www.zenrows.com/scrape/bing-images
updated: 2026-10-22
---

# Bing Images scraper

The Zenrows Bing Images scraper turns a Bing image search URL into structured JSON: search query, and for each result the full-size media URL, thumbnail URL, title, source page URL, source domain, width and height in pixels, and the detail page link. Fetch in Adaptive Stealth Mode opens the page, Extract returns the fields, through the API, CLI or an AI agent.

- Site: bing.com
- Returns: Image URLs, sizes, titles and source pages per query

## Run it: one Bing image search in, JSON out

```json Input
{
  "url": "https://www.bing.com/images/search?q=mountain+lake&setlang=en-US",
  "mode": "auto",
  "extract": "auto",
  "proxy_country": "us"
}
```

```json Output
{
  "image_results": [
    {
      "detail_page_url": "/images/search?view=detailV2&ccid=UI40OfyI&id=2CFE603F11F40D73EEEBE6131D33D0BC686C02F3…",
      "height_px": 3463,
      "media_url": "https://images.pexels.com/photos/326235/pexels-photo-326235.jpeg?cs=srgb&dl=pexels-pixabay-326235.jpg&fm=jpg",
      "source_domain": "pexels.com",
      "source_page_url": "https://www.pexels.com/search/mountains/",
      "thumbnail_url": "https://ts3.mm.bing.net/th?id=OIP.UI40OfyI0EFuXBAU-PClYQHaE8&pid=15.1",
      "title": "Mountains Photos, Download The BEST Free Mountains Stock Photos & HD Images",
      "width_px": 5194
    },
    {
      "height_px": 1440,
      "media_url": "https://wallpaperaccess.com/full/1321369.jpg",
      "source_domain": "wallpaperaccess.com",
      "source_page_url": "https://wallpaperaccess.com/beautiful-mountain-desktop",
      "thumbnail_url": "https://ts3.mm.bing.net/th?id=OIP.yCoClSrFACl4Imuxq2-vlwHaEK&pid=15.1",
      "title": "Beautiful Mountain Desktop Wallpapers - Top Free Beautiful Mountain ...",
      "width_px": 2560
    }
  ],
  "search_query": {
    "text": "mountain lake"
  }
}
```

Request and output of a live call to a Bing Images search on Oct 22, 2026, trimmed for length. A field is returned when the page shows it.

## What data can you scrape from Bing Images?

An image search page returns one record per image with the file, the page it comes from and its size. These are the fields teams use most, with the path where each lives in the JSON.

| Field | What it holds | Example |
|---|---|---|
| `search_query.text` | The query the page was searched with | `mountain lake` |
| `image_results[].media_url` | URL of the full-size image file | `https://wallpaperaccess.com/full/1321369.jpg` |
| `image_results[].thumbnail_url` | URL of Bing's thumbnail | `https://ts3.mm.bing.net/th?id=OIP.yCoClSrFACl4Imuxq2-vlwHaEK&pid=15.1` |
| `image_results[].title` | The title Bing shows under the image | `Beautiful Mountain Desktop Wallpapers…` |
| `image_results[].source_page_url` | The web page the image appears on | `https://wallpaperaccess.com/beautiful-mountain-desktop` |
| `image_results[].source_domain` | Domain of that page | `wallpaperaccess.com` |
| `image_results[].width_px` | Width of the full-size image in pixels | `2560` |
| `image_results[].height_px` | Height of the full-size image in pixels | `1440` |
| `image_results[].detail_page_url` | Bing's detail page for the image | `/images/search?view=detailV2&ccid=…` |

## How to scrape Bing Images with Zenrows

1. **Create a free Zenrows account** and copy your API key from the dashboard.
2. **Build the search URL.** An image search is `https://www.bing.com/images/search?q=YOUR+QUERY`, with the query URL-encoded. Add `setlang=en-US` to keep the page in English.
3. **Send it with the default configuration**: Adaptive Stealth Mode to open the page, Extract to return the fields, and the country whose results you want.
4. **Read `parsed.image_results`** from the response. Each entry has the file URL, the source page and the size, so you can filter by `width_px` and `height_px` in code.
5. **Run your list of queries in Batch** once one URL comes back the way you want.

```python Python
# pip install requests
import json
import requests

params = {
    "apikey": "YOUR_ZENROWS_API_KEY",
    "url": "https://www.bing.com/images/search?q=mountain+lake&setlang=en-US",
    "mode": "auto",          # Adaptive Stealth Mode
    "extract": "auto",       # structured JSON
    "proxy_country": "us",   # results as seen from the US
}
response = requests.get("https://api.zenrows.com/v1/", params=params, timeout=180)
response.raise_for_status()

data = response.json()["parsed"]
for image in data.get("image_results", []):
    print(image.get("width_px"), image.get("height_px"), image.get("media_url"))
print(json.dumps(data["image_results"][:1], indent=2))
```

```javascript Node.js
// Node 18+ (built-in fetch)
const params = new URLSearchParams({
  apikey: "YOUR_ZENROWS_API_KEY",
  url: "https://www.bing.com/images/search?q=mountain+lake&setlang=en-US",
  mode: "auto",
  extract: "auto",
  proxy_country: "us",
});

const response = await fetch(`https://api.zenrows.com/v1/?${params}`, {
  signal: AbortSignal.timeout(180_000),
});
if (!response.ok) throw new Error(`${response.status}: ${await response.text()}`);

const { parsed } = await response.json();
for (const image of parsed.image_results ?? []) {
  console.log(image.width_px, image.height_px, image.media_url);
}
```

```bash cURL
curl "https://api.zenrows.com/v1/?apikey=YOUR_ZENROWS_API_KEY&url=https%3A%2F%2Fwww.bing.com%2Fimages%2Fsearch%3Fq%3Dmountain%2Blake%26setlang%3Den-US&mode=auto&extract=auto&proxy_country=us"

# Only the fields you need
curl "https://api.zenrows.com/v1/?apikey=YOUR_ZENROWS_API_KEY&url=https%3A%2F%2Fwww.bing.com%2Fimages%2Fsearch%3Fq%3Dmountain%2Blake%26setlang%3Den-US&mode=auto&extract=auto&proxy_country=us&extract_fields=image_results.media_url%2Cimage_results.source_page_url%2Cimage_results.width_px"
```

```python Python SDK
# pip install zenrows
from zenrows import ZenRowsClient

client = ZenRowsClient("YOUR_ZENROWS_API_KEY")
response = client.get(
    "https://www.bing.com/images/search?q=mountain+lake&setlang=en-US",
    params={"mode": "auto", "extract": "auto", "proxy_country": "us"},
)
for image in response.json()["parsed"].get("image_results", []):
    print(image["source_domain"], image["media_url"])
```

## Input

The scraper takes one Bing Images URL per request, plus the options below. The same parameters go into every task of a Batch job, so the input for a thousand queries is a list of URLs with these settings.

| Parameter | Type | Default | Description |
|---|---|---|---|
| `url` | string | required | A Bing image search URL (`/images/search?q=…`) |
| `mode` | string | `auto` | Adaptive Stealth Mode: starts with the lightest setup and adds rendering and protected-site handling only when the page needs them |
| `extract` | string | `auto` | Returns the page's fields as JSON in `parsed`, next to the raw `html` |
| `extract_fields` | string | all fields | Comma-separated paths to keep, such as `image_results.media_url,image_results.width_px` |
| `proxy_country` | string | any | Two-letter country code. Bing ranks images for the visitor's location |
| `wait_for` | string | none | A CSS selector to wait for before the page is read |
| `session_id` | integer | none | Reuse the same session across several requests, up to 10 minutes |

```json Batch input
{
  "type": "regular",
  "status": "closed",
  "zenrows_params": {
    "mode": "auto",
    "extract": "auto",
    "proxy_country": "us"
  },
  "tasks": [
    { "url": "https://www.bing.com/images/search?q=mountain+lake&setlang=en-US", "external_id": "mountain-lake" },
    { "url": "https://www.bing.com/images/search?q=alpine+meadow&setlang=en-US", "external_id": "alpine-meadow" }
  ]
}
```

## Output

Every response is JSON with two keys: `html`, the page as Bing served it, and `parsed`, the structured record. The sample below is a trimmed output of a live request.

```json Image search results
{
  "image_results": [
    {
      "detail_page_url": "/images/search?view=detailV2&ccid=4p1rlK2g&id=487BB525B60F28C6D5FCD9D6D36AF1D50720AA47…",
      "height_px": 2558,
      "media_url": "https://cdn.wallpapersafari.com/19/32/09IDzL.jpg",
      "source_domain": "wallpapersafari.com",
      "source_page_url": "https://wallpapersafari.com/w/09IDzL",
      "thumbnail_url": "https://ts1.mm.bing.net/th?id=OIP.4p1rlK2gGISRVLKBfvyFEgHaE7&pid=15.1",
      "title": "Free Download Mountain Forest Landscape Fog Lake Ultrahd 4k Wallpaper ...",
      "width_px": 3839
    },
    {
      "height_px": 1707,
      "media_url": "https://get.pxhere.com/photo/landscape-nature-outdoor-wilderness-mountain-snow-cloud…-846922.jpg",
      "source_domain": "pxhere.com",
      "source_page_url": "https://pxhere.com/en/photo/846922",
      "thumbnail_url": "https://ts2.explicit.bing.net/th?id=OIP.XU1IOvOEO-JX4peXtawvOAHaE8&pid=15.1",
      "title": "Free Images : landscape, nature, outdoor, wilderness, snow, cloud, hill ...",
      "width_px": 2560
    }
  ],
  "search_query": {
    "text": "mountain lake"
  }
}
```

Need a spreadsheet? Load `parsed["image_results"]` into pandas with `pd.json_normalize(...)` and write CSV or Excel. Need the page for an LLM? Ask for Markdown instead of JSON.

## Scrape Bing Images from your coding agent

Claude Code, Cursor, Codex and any MCP client can scrape Bing Images from a prompt.

The agent calls the same Fetch and Extract request a developer would, so the JSON above is what it reads. Connect the Zenrows MCP server once, or install the CLI and let the agent run it in the terminal.

```bash Connect the MCP server (Claude Code)
claude mcp add zenrows -e ZENROWS_API_KEY=YOUR_ZENROWS_API_KEY -- npx -y @zenrows/mcp
```

```json MCP config (Cursor, Claude Desktop, Windsurf)
{
  "mcpServers": {
    "zenrows": {
      "command": "npx",
      "args": ["-y", "@zenrows/mcp"],
      "env": { "ZENROWS_API_KEY": "YOUR_ZENROWS_API_KEY" }
    }
  }
}
```

```bash Or run the CLI
npx -y @zenrows/cli init
zenrows extract "https://www.bing.com/images/search?q=mountain+lake&setlang=en-US" --proxy-country us
```

```text Then ask your agent
Use Zenrows to search Bing Images for "mountain lake" and list the source
domain, image URL and size of the ten largest images as a table:
https://www.bing.com/images/search?q=mountain+lake&setlang=en-US
```

## Scrape Bing Images at scale with Batch and Crawl

**Batch** runs a list of image search URLs as one job: thousands of queries in parallel, with your own ID on each result. Use it to collect image URLs for a keyword list, or to track which domains show up for your brand terms.

**Crawl** follows links from a page you already have. Start it on an image search page, keep the links that contain `/images/search`, and it reaches the detail pages Bing lists for each image. Send your keyword list to Batch for broader coverage.

```bash Batch (cURL)
curl -X POST "https://async.api.zenrows.com/v1/jobs" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "type": "regular",
    "status": "closed",
    "zenrows_params": { "mode": "auto", "extract": "auto", "proxy_country": "us" },
    "tasks": [
      { "url": "https://www.bing.com/images/search?q=mountain+lake&setlang=en-US", "external_id": "mountain-lake" },
      { "url": "https://www.bing.com/images/search?q=alpine+meadow&setlang=en-US", "external_id": "alpine-meadow" }
    ]
  }'

# Read the results when the job finishes
curl "https://async.api.zenrows.com/v1/jobs/JOB_ID/results?status=successful" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY"
```

```bash Batch (CLI)
# queries.jsonl: one {"url": "...", "external_id": "...", "extract": "auto"} per line
zenrows batch create queries.jsonl --proxy-country us --wait
zenrows batch results <job-id> --out bing-images.jsonl
```

```bash Crawl (cURL)
curl -X POST "https://api.zenrows.com/v1/crawls" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "url": "https://www.bing.com/images/search?q=mountain+lake&setlang=en-US",
    "depth": 1,
    "max_pages": 50,
    "include_patterns": ["/images/search"]
  }'
```

**Scheduled jobs** run the same Batch job on a timetable, on Zenrows' side: every few hours, once a day, at set times on chosen days, or once at a future date. Each run keeps its own results, a webhook can tell your app when a run finishes, and you can pause or resume the schedule at any time, with no cron server to keep alive.

```bash Scheduled job (cURL)
# Runs every day on Zenrows' side; each run keeps its own results
curl -X POST "https://async.api.zenrows.com/v1/jobs" \
  -H "X-API-Key: YOUR_ZENROWS_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
      "type": "scheduled",
      "status": "closed",
      "schedule": {
        "rate": {
          "every": 1,
          "unit": "day"
        }
      },
      "zenrows_params": {
        "mode": "auto",
        "extract": "auto",
        "proxy_country": "us"
      },
      "tasks": [
        {
          "url": "https://www.bing.com/images/search?q=mountain+lake&setlang=en-US",
          "external_id": "bing-images"
        }
      ]
    }'

# Or at set times: "schedule": { "calendar": { "times_of_day": ["09:00"],
#   "cadence": { "weekly": { "days": ["mon", "thu"] } } }, "timezone": "Europe/Madrid" }
```

## What teams do with Bing Images data

| Use case | Data they pull | Who runs it |
|---|---|---|
| Image dataset building | Full-size URLs, dimensions and source pages for a keyword list | Machine learning and data teams |
| Brand and logo monitoring | Which domains and pages show images for your brand terms | Brand and marketing teams |
| Competitor visual research | Images and source pages that rank for competing product names | Marketing and creative teams |
| Image SEO research | Titles, source domains and ranking position for target queries | SEO teams and agencies |
| Content and rights audits | Source page of each image, to trace where a visual appears | Legal, brand protection and publishing teams |
| AI agents and RAG | Image URLs with titles and sources for retrieval | AI and data teams |

## Tips for scraping Bing Images

- **URL-encode the query.** `q=mountain+lake` uses `+` for spaces. A keyword list works best as one URL per query in Batch.
- **Filter on `width_px` and `height_px`.** Each result carries the full-size dimensions, so keep only the images large enough for your use in code.
- **Use `source_page_url` to check where an image lives.** It is the page that shows the image, while `media_url` is the file itself.
- **Set the country of your market.** Bing ranks images for the visitor's location, so request from the country you track.
- **Add `setlang=en-US` for a stable page.** It keeps labels and titles in one language when you compare queries.
- **Key results on `media_url`.** The file URL is a good identifier for removing duplicates across queries.

## Frequently asked questions

### Is it legal to scrape Bing Images?

Collecting publicly available data from Bing, such as image URLs, titles and source pages shown to every visitor, is common practice for research and monitoring. The images themselves belong to their owners and can be protected by copyright, and pictures of people fall under personal data laws such as the GDPR and the CCPA, so check the license of an image before you reuse it. Check Bing's terms for your use case and ask your lawyer if you are unsure.

### Is there an official Bing Images API?

Microsoft offered a Bing Image Search API as part of the Bing Search APIs, and it has been retired. Check Microsoft's documentation for the current options. A scraper reads the public results page instead.

### What Bing Images pages can I scrape?

Image search result pages ( /images/search?q=… ). Send the URL as it appears in your browser. The Bing scraper covers web search results.

### Can I get the full-size image URL?

Yes. image_results[].media_url is the URL of the full-size file, thumbnail_url is Bing's thumbnail and source_page_url is the page that shows the image.

### Can I filter images by size?

Yes. Each result returns width_px and height_px , so filter the list in your code. Keep the images above the size you need and drop the rest.

### How do I scrape Bing Images with Python?

Send a GET request to https://api.zenrows.com/v1/ with your API key, the search URL, Adaptive Stealth Mode and Extract turned on, as in the Python example above. The response's parsed key holds the results as a Python dictionary. The zenrows package on PyPI wraps the same request.

### How many Bing Images queries can I scrape?

Send one URL per request, or a whole list as a Batch job that runs the URLs in parallel and keeps your own ID on each result. One Batch job accepts more than 10,000 URLs, sent inline or as a CSV file.

### Do I need to write or maintain selectors?

No. Extract returns each field by name, so your code reads parsed instead of parsing Bing's HTML. For a field of your own, send a separate request with CSS selectors instead of Extract.

### Can AI agents scrape Bing Images with Zenrows?

Yes. Connect the Zenrows MCP server to Claude, Cursor, Codex or any MCP client, or give your agent the Zenrows CLI. Ask for the images you want in plain language and the agent calls Fetch and Extract for you.

### Can I scrape Bing on a schedule?

Yes. Create a scheduled Batch job with your Bing URLs and the same settings as a single request, and Zenrows runs it on its side: every few hours, once a day, at set times on chosen days, or once at a future date. Each run keeps its own results, a webhook can notify your app when a run finishes, and the schedule can be paused or resumed at any time.

### Which integrations work with the Bing Images scraper?

Zenrows works with n8n, Make, Zapier, Clay, Dify, LangChain, LlamaIndex, CrewAI and Mastra, plus the Python, Node.js and Go SDKs and any HTTP client. Send results to Google Sheets, a database or a data warehouse from the workflow tool you already use. See the integrations page for the full list.

### What format does the data come in?

JSON by default, with the structured record in parsed and the original page in html . You can also ask for the page as Markdown or plain text, which is what most LLM and RAG pipelines want.

## More Bing scrapers

- [Bing scraper](https://www.zenrows.com/scrape/bing.md)

All scrapers: https://www.zenrows.com/scrape. Start free: https://app.zenrows.com/register. Docs: https://docs.zenrows.com
