# Bing Image Search API Scraper - No Azure Key Needed (`thodor/bing-images`) Actor

Bing Image Search API scraper tool. Microsoft retired v7 in 2025; this returns hundreds of full-size Bing image URLs per keyword with source pages. No Azure key.

- **URL**: https://apify.com/thodor/bing-images.md
- **Developed by:** [Thodor](https://apify.com/thodor) (community)
- **Categories:** Other, Social media
- **Stats:** 13 total users, 2 monthly users, 100.0% runs succeeded, 1 bookmarks
- **User rating**: No ratings yet

## Pricing

from $2.20 / 1,000 results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.
Since this Actor supports Apify Store discounts, the price gets lower the higher subscription plan you have.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

Actors are web data automations that power AI and operations. They run on the Apify platform to scrape websites, process data, connect APIs, and automate workflows.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.
Actors are written with capital "A".

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.
The best way to integrate Actors is as follows.

- **AI agents and MCP clients** — the [Apify MCP server](https://docs.apify.com/integrations/mcp.md) at `https://mcp.apify.com` (remote, streamable HTTP, OAuth on first use).
- **Agentic workflows and local Actor development** — [Agent Skills](https://apify.com/.well-known/agent-skills/index.json) with the [Apify CLI](https://docs.apify.com/cli/docs.md): `npm install -g apify-cli`, then `apify login`.
- **JavaScript/TypeScript projects** — the official [JS/TS client](https://docs.apify.com/api/client/js/docs.md): `npm install apify-client`.
- **Python projects** — the official [Python client](https://docs.apify.com/api/client/python/docs.md): `pip install apify-client`.
- **Any other language** — the [REST API](https://docs.apify.com/api/v2.md).

For usage examples, see the [API](#api) section below.

For more details, see Apify documentation as [Markdown index](https://docs.apify.com/llms.txt) and [Markdown full-text](https://docs.apify.com/llms-full.txt).

# README

A **Bing Image Search API** replacement and Bing images scraper tool: type a keyword, get hundreds of unique **full-size image URLs** back with source pages and metadata, as JSON, CSV, or Excel. No Microsoft API key, no Azure subscription, no quota forms.

Microsoft [retired the Bing Search APIs](https://learn.microsoft.com/en-us/bing/search-apis/bing-image-search/overview) in August 2025; old v7 keys now return HTTP 410 and the official replacement, [Grounding with Bing Search](https://learn.microsoft.com/en-us/azure/ai-services/agents/how-to/tools/bing-grounding), needs Azure billing and restricts how you store results. This actor fills the gap and reaches further than the old API did: it queries Bing across multiple markets and proxy regions in parallel, so one keyword returns 200 to 350 unique images instead of the ~35 a browser shows.

### 📋 How to scrape Bing Images

1. Enter keywords in **Search queries**, one per line.
2. Toggle regions: **Europe** and **US** are on by default, **Asia** is opt-in.
3. Click **Start**. A query takes 10 to 20 seconds.
4. Open the **Output** tab and click **Export** for JSON, CSV, Excel, or HTML.

### 🎁 So what do you get?

| 🖼️ Full-size image URL | 🔗 Source page | 🧬 md5 hash for dedup |
| --- | --- | --- |
| 🏷️ Title and description | 🗺️ Which Bing markets returned it | 🌍 Which regions surfaced it |
| ⚡ Bing CDN thumbnail | 📌 Bing image and content IDs | 🧾 Full provenance per row |

### ⚖️ Compared to the retired Bing Image Search API

| | Bing API v7 | This actor |
|---|---|---|
| 🚦 Status | ❌ Retired, keys return HTTP 410 | ✅ Working |
| 🖼️ Results per query | 35 per page | ✅ 200 to 350 unique |
| 🔑 Access | ❌ Azure key, quota tiers | ✅ Register on Apify, $5 free monthly credit |
| 📦 Output rights | ⚠️ Storage restrictions in the successor | ✅ Keep, cache, train on it |
| 🧬 Dedup hash | ❌ | ✅ `md5` on every row |

#### Migrating from Bing API v7

Porting code that parsed the old Bing image API `images/search` response? The fields map one to one:

| Bing API v7 (`value[]` field) | This actor |
|---|---|
| `contentUrl` | `image_url` |
| `hostPageUrl` | `page_url` |
| `thumbnailUrl` | `thumbnail_url` |
| `name` | `title` |
| `imageId` | `mid` |
| no v7 equivalent | `md5`, `regions`, `markets`, `provenance` |

Not carried over: `width`, `height`, `contentSize`, and `accentColor`. If your pipeline depends on any of these, open a ticket on the Issues tab and I'll add them.

### 🎯 Three things people run this for

| | How |
|---|---|
| 🧠 **ML training datasets** | One query per class label; the `query` field on every row becomes the label. The fast.ai dataset workflow, without the dead API key |
| 🛍️ **Product and competitor research** | Batch a list of product keywords and export one spreadsheet of images, sources, and titles |
| 📈 **SEO across regions** | `markets` shows which Bing market surfaced each image. Searching `cat` returns very different images from Bing Japan than Bing Europe |

### 📥 Input

```json
{
  "queries": ["red running shoes", "blue running shoes"]
}
```

- `queries`: one search per keyword
- `scanEU`: default `true`. Bing's European markets (nl-BE, en-GB)
- `scanUS`: default `true`. Bing's US market (en-US)
- `scanAsia`: default `false`. Bing's Asian markets (ja-JP), worth enabling for Asian subjects
- `marketOverride`: a single Bing `mkt` code like `pt-BR` or `ar-SA`. Overrides the region toggles
- `safeSearch`: default `false` for maximum coverage. Set `true` for Bing's moderate filter

#### 🧠 A dataset with one query per class

```json
{"queries": ["running shoes", "hiking boots", "sandals"]}
```

#### 🇧🇷 One specific market

```json
{"queries": ["tênis de corrida"], "marketOverride": "pt-BR"}
```

### 📤 Output

One row per unique image, deduplicated by Bing's `md5` hash within each query.

<img src="https://api.apify.com/v2/key-value-stores/LHcvkclm26dcJvwP1/records/bing-image-search-api-results.png" width="700" alt="Bing Image Search API results in the Apify console: full-size image URLs, source pages, thumbnails, and metadata">

```json
{
  "query": "bart de wever",
  "image_url": "https://upload.wikimedia.org/.../Bart_De_Wever_2025.jpg",
  "page_url": "https://nl.wikipedia.org/wiki/Bart_De_Wever",
  "thumbnail_url": "https://ts4.mm.bing.net/th?id=OIP...",
  "title": "Bart De Wever - Wikipedia",
  "md5": "138a8fac7b9e922fb529b9ce1ef932ae",
  "desc": "Belgian Prime Minister",
  "regions": ["EU", "US"],
  "markets": ["nl-BE", "en-GB", "en-US"],
  "proxy_countries": ["DE", "AE"]
  // HIDDEN: mid, cid, provenance (the full market/region/proxy tuple per sighting)
}
```

> ⚠️ **Dedup is per query.** The same image matched by two of your queries gives two rows, one per query, so billing matches exactly what you asked for. Group by `md5` to dedup across queries yourself.

#### Fields

| Field | Description |
|---|---|
| `query` | The search term that returned this image, your class label in dataset work |
| `image_url` | The full-size image on the source site, not a Bing thumbnail |
| `page_url` | The webpage hosting the image |
| `thumbnail_url` | Bing's CDN thumbnail, fast to display and virtually never blocked |
| `title`, `desc` | Image title and description, when Bing provides them |
| `md5` | Bing's content hash. The dedup key |
| `mid`, `cid` | Bing's internal image and content IDs |
| `regions`, `markets`, `proxy_countries` | Where this image was surfaced |
| `provenance` | Full `(market, region, proxy_country)` tuples, for debugging surprising results |

### 🧠 Build an ML image dataset

The old fast.ai-style dataset loop died with the Bing API in August 2025. This is the same loop without the Azure key: one query per class label, run, then download from the URL list.

```python
import pathlib
from curl_cffi import requests

for item in dataset_items:
    folder = pathlib.Path("dataset") / item["query"].replace(" ", "_")
    folder.mkdir(parents=True, exist_ok=True)
    try:
        r = requests.get(item["image_url"], impersonate="chrome", timeout=10)
        (folder / f"{item['md5']}.jpg").write_bytes(r.content)
    except requests.RequestException:
        pass  # dead source links happen; skip and keep the dataset clean
```

The folder-per-label layout drops straight into PyTorch's `ImageFolder`, Keras' `image_dataset_from_directory`, or fast.ai's `ImageDataLoaders`.

> 💡 **Tip:** the download uses [curl\_cffi](https://github.com/lexiforest/curl_cffi) instead of plain `requests` because some hosts refuse requests whose TLS fingerprint doesn't look like a browser. If a host still refuses, fall back to `thumbnail_url`, served from Bing's own CDN.

### ⚙️ Use it as a Bing Image Search API

Every run is an HTTP endpoint, so this doubles as a Bing Images API: POST the same JSON as the form and the images come back in the response body.

#### Bing Image Search API in Python

```python
import requests

resp = requests.post(
    "https://api.apify.com/v2/acts/thodor~bing-images/run-sync-get-dataset-items",
    params={"token": "YOUR_APIFY_TOKEN"},
    json={"queries": ["red running shoes"]},
)

for item in resp.json():
    print(item["image_url"], item["page_url"])
```

#### Node.js

```javascript
import axios from "axios";

const { data } = await axios.post(
  "https://api.apify.com/v2/acts/thodor~bing-images/run-sync-get-dataset-items",
  { queries: ["red running shoes"] },
  { params: { token: process.env.APIFY_TOKEN } }
);

console.log(data.length, data[0].image_url);
```

#### curl

```bash
curl -X POST "https://api.apify.com/v2/acts/thodor~bing-images/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"queries":["red running shoes"]}'
```

Swap `run-sync-get-dataset-items` for `runs` to fire async with a webhook on big keyword lists. The `apify-client` SDK works too, in Python and JavaScript, and the n8n, Make, and Zapier integrations take the same input.

> 💡 **Tip:** no need to write the JSON by hand. Fill in the form on the Input tab, switch the editor from **Form** to **JSON**, and copy the result into your code.

### 💰 How much does it cost to scrape Bing images?

Billing is per result, at the rate on the price card on this page. No compute charges, no subscription, no minimum spend. A default run returns roughly 200 to 350 images per query and the Asia toggle adds about 50 more, so the region toggles are also your cost control: disable what you don't need.

### ❓ FAQ

**Is the Bing Image Search API still available?**
No. Microsoft retired the Bing Search APIs in August 2025, and the replacement inside Azure AI Foundry requires an Azure subscription and restricts how you store results. This actor is the working alternative.

**How do I get a Bing Image Search API key?**
You can't anymore; existing v7 keys return `HTTP 410 Gone`. If a tutorial or course asks for one, this actor is the drop-in replacement with no key at all.

**Is there a free Bing Image Search API?**
Not from Microsoft anymore. This one is free to try: registering on Apify comes with $5 of free platform credit every month, no credit card needed, enough for real test batches.

**Why do some images look like duplicates?**
Bing's regional indexes rank overlapping images differently. Rows are deduplicated by `md5` within each query, so lookalikes in the output are genuinely different files: cropped, resized, or hosted elsewhere.

**Does this do reverse image search?**
Not yet, keyword search only. For finding where an image appears online, use the [Reverse Image Search API](https://apify.com/thodor/google-lens-exact-matches). If you need Bing Visual Search specifically, open a ticket and I'll prioritize it.

**Will Bing block me?**
Not under normal use. Requests go through residential proxies with browser TLS impersonation, and Bing is far more permissive than Google: no rate limits or captchas seen across thousands of test queries.

**Can I use the images commercially?**
The actor returns URLs and metadata, not licences. Check terms per source via `page_url`. Nothing here grants rights to the underlying files.

### 🛟 Support

Something not working, or missing a feature like Bing Visual Search or a specific region? Message me in the Issues tab and I'll look into it quickly. I'm a solo dev, so don't hesitate.

Scraping Google instead? The [Google Images Scraper - up to 100K per Keyword](https://apify.com/thodor/google-image-scraper) pulls up to 100,000 of full-size images per keyword.

- Thodor

# Actor input Schema

## `queries` (type: `array`):

One or more Bing image search terms (one per line). Each runs independently; you get ~200–350 unique full-size image URLs per query.

## `scanEU` (type: `boolean`):

Include Bing's European markets. Recommended for any Western subject.

## `scanUS` (type: `boolean`):

Include Bing's US market. Recommended for any non-niche subject.

## `scanAsia` (type: `boolean`):

Include Bing's Asian markets. Enable for subjects with Asian presence (J-pop, anime, Asian sports, etc.). Adds ~25% to the result count.

## `marketOverride` (type: `string`):

OPTIONAL. A single Bing market code (e.g. pt-BR, ar-SA, ko-KR). If set, the region toggles above are ignored and only this market is queried. Use this for niche/non-Western coverage.

## `safeSearch` (type: `boolean`):

Turn Bing's adult-content filter on. Default is OFF (more coverage; recommended for ML training datasets and bulk image collection). Enable if you want Bing's default moderate filtering.

## Actor input object example

```json
{
  "queries": [
    "bart de wever"
  ],
  "scanEU": true,
  "scanUS": true,
  "scanAsia": false,
  "safeSearch": false
}
```

# Actor output Schema

## `results` (type: `string`):

No description

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "queries": [
        "bart de wever"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("thodor/bing-images").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = { "queries": ["bart de wever"] }

# Run the Actor and wait for it to finish
run = client.actor("thodor/bing-images").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "queries": [
    "bart de wever"
  ]
}' |
apify call thodor/bing-images --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,thodor/bing-images"
        }
    }
}

```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/RvMgliW9z4wynu75t/builds/R5IKlm2rNVaz7q37t/openapi.json
