# Bing Search Scraper — Web, News & Image Results (SERP) (`tortuga/bing-search-scraper`) Actor

Scrape Bing search results for any keyword and country: organic results with position, URL, snippet, date and sitelinks, plus ads, related searches, People also ask, news, images and videos.

- **URL**: https://apify.com/tortuga/bing-search-scraper.md
- **Developed by:** [Trevor Ortega](https://apify.com/tortuga) (community)
- **Categories:** SEO tools
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.50 / 1,000 search results

This Actor is paid per event and usage. You are charged both the fixed price for specific events and for Apify platform usage.

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

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
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.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

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

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Bing Search Scraper — Web, News & Image Results (SERP)

Scrape **Bing search results** for any keyword, country and language. For every search term you get the organic
results with their **position**, title, URL, displayed URL, snippet, date and **sitelinks**, plus an optional
summary row with Bing's total results estimate, **related searches**, the **knowledge panel** and **People also ask**
(when Bing shows them), optional **text ads**, and, if you want them, **Bing News**, **Bing Images** (full-size
image URLs) and **Bing Videos** results for the same terms.

Use it for SEO rank tracking on Bing (whose index also feeds Yahoo and DuckDuckGo results), brand and
competitor monitoring, building keyword and URL lists, collecting news mentions, or feeding search results to an AI
agent. No Bing API key, no browser, no login.

### What data does it extract?

Every row has a `type`, the `searchTerm`, `country`, `language` and `scrapedAt`.

| Field | Types | Description |
|---|---|---|
| `type` | all | `organic`, `ad`, `serp` (one summary row per search term), `news`, `image` or `video` |
| `position` | organic, ad, news, image, video | Rank within the term (organic ranks continue across pages; ads have their own counter) |
| `page` | all but serp | Bing result page the row came from |
| `title` | organic, ad, news, image, video | Result title |
| `url` | organic, ad, news, video, serp | Target URL (Bing's click-tracking redirect is removed). For `serp`: the Bing search URL |
| `displayedUrl` | organic, ad | The green URL / breadcrumb Bing shows |
| `siteName` | organic, ad | Site name Bing shows above the result (or the advertiser) |
| `description` | organic, ad, news | Snippet text |
| `date` | organic | Date Bing shows in front of the snippet ("Mar 20, 2026", "3 days ago") |
| `siteLinks` | organic, ad | Sitelinks / deep links: `[{title, url, description}]` |
| `emphasizedKeywords` | organic | Words Bing printed in bold |
| `iconUrl` | organic | Site favicon |
| `adPlacement` | ad | `top`, `middle`, `bottom` or `sidebar` |
| `totalResults`, `totalResultsText` | serp | Bing's estimate, e.g. 18900 / "About 18,900 results" |
| `relatedSearches` | serp | `[{query, url}]` ("Related searches", "People also search for") |
| `peopleAlsoAsk` | serp | `[{question, answer, url, title}]` when Bing shows the box |
| `knowledgePanel` | serp | `{title, subtitle, description, url, facts: [{label, value}]}` |
| `answerBox`, `aiAnswer` | serp | Direct answer / AI answer text when Bing renders it in the page (usually empty, see Limits) |
| `organicResultsCount`, `adsCount`, `serpMode` | serp | What page 1 contained; `serpMode` is `full` or `lite` (see FAQ) |
| `source`, `publishedAt`, `dateText`, `thumbnailUrl` | news | Publisher, approximate publish time (from "9 hours ago"), raw age, image |
| `imageUrl`, `imageWidth`, `imageHeight`, `thumbnailUrl`, `sourceUrl`, `sourceDomain`, `imageId` | image | Full-size image URL and size, Bing thumbnail, page the image is on |
| `duration`, `viewCount`, `viewsText`, `platform`, `channel`, `publishedAt`, `dateText`, `thumbnailUrl` | video | Video length, views, YouTube/Vimeo/..., channel, age |
| `changeType` | all (monitoring) | `new` when **Only new or changed items** is on |

#### Example output

An organic result:

```json
{
  "type": "organic",
  "position": 1,
  "title": "Why Is the Sky Blue? | NASA Space Place – NASA Science for Kids",
  "url": "https://spaceplace.nasa.gov/blue-sky/en/",
  "displayedUrl": "https://spaceplace.nasa.gov › blue-sky › en",
  "siteName": "NASA Space Place",
  "description": "Learn how sunlight is scattered by the gases and particles in Earth's atmosphere, making the sky blue most of the …",
  "date": "Jul 31, 2026",
  "siteLinks": [
    {"title": "How Does GPS Work", "url": "https://spaceplace.nasa.gov/gps-pizza/en/", "description": "It’s Friday night and you want some pizza. Fast. But …"}
  ],
  "emphasizedKeywords": [],
  "iconUrl": "https://th.bing.com/th/id/ODF.Vgj0uCBawiqXt9jGG_nmSg?w=32&h=32&qlt=90&pcl=fffffa&o=6&pid=1.2",
  "searchTerm": "why is the sky blue",
  "page": 1,
  "country": "US",
  "language": "en",
  "scrapedAt": "2026-10-12T00:17:59Z"
}
```

The SERP summary row of the same search (shortened):

```json
{
  "type": "serp",
  "url": "https://www.bing.com/search?q=why+is+the+sky+blue&cc=US&setlang=en",
  "totalResults": 11900,
  "totalResultsText": "About 11,900 results",
  "organicResultsCount": 10,
  "adsCount": 0,
  "relatedSearches": [
    {"query": "sky blue color explanation", "url": "https://www.bing.com/search?q=sky+blue+color+explanation"},
    {"query": "why sunsets turn red", "url": "https://www.bing.com/search?q=why+sunsets+turn+red"}
  ],
  "peopleAlsoAsk": [],
  "knowledgePanel": null,
  "answerBox": null,
  "aiAnswer": null,
  "serpMode": "full",
  "searchTerm": "why is the sky blue",
  "country": "US",
  "language": "en"
}
```

A knowledge panel (search "eiffel tower") looks like
`{"title": "Eiffel Tower", "subtitle": "https://www.toureiffel.paris › fr", "description": "The Eiffel Tower is a lattice tower on the Champ de Mars in Paris, France. …", "url": "https://www.toureiffel.paris/fr", "facts": [{"label": "Architect", "value": "Stephen Sauvestre"}, …]}`.

A news row: `{"type": "news", "position": 2, "title": "Could better price transparency boost MA’s electric vehicle fleet?", "url": "https://www.msn.com/en-us/autos/…", "source": "Public News Service on MSN", "publishedAt": "2026-10-11T23:16:00Z", "dateText": "50 minutes ago", "description": "Environmental groups in Massachusetts are urging…", "thumbnailUrl": "https://th.bing.com/th?id=ONUT.…"}`.

An image row: `{"type": "image", "position": 1, "title": "Golden Retriever Dog Breed Health and Care | PetMD", "imageUrl": "https://image.petmd.com/files/inline-images/golden-retriever-2.jpg?…", "imageWidth": 5000, "imageHeight": 3337, "thumbnailUrl": "https://ts2.mm.bing.net/th?id=OIP.…", "sourceUrl": "https://www.petmd.com/dog/breeds/golden-retriever", "sourceDomain": "www.petmd.com"}`.

### How to scrape Bing search results

1. Add your **Search terms** (one per line). Bing operators work: `site:example.com`, `"exact phrase"`, `-word`, `intitle:`.
2. Pick **What to scrape**: Web results (default), News, Images, Videos — any combination.
3. Set **Country** and **Language** (Bing's `cc` and `setlang`), and optionally **Freshness** and **SafeSearch**.
4. Set **Max pages per search term** (1 = the first page) and **Max results** (caps the cost).
5. Run, then export the dataset as JSON, CSV, Excel or HTML, or read it via the Apify API. The dataset has ready
   views for Web results, the SERP summary, News, Images and Videos.

Example input:

```json
{
  "queries": ["best project management software", "asana alternatives"],
  "searchTypes": ["web", "news"],
  "country": "US",
  "language": "en",
  "maxPagesPerQuery": 2,
  "includeAds": true,
  "maxItems": 200
}
```

You can also paste Bing URLs into **Bing URLs**, e.g. `https://www.bing.com/search?q=coffee&cc=GB&setlang=en-gb`
or `https://www.bing.com/news/search?q=coffee`; the term, country, language and market are taken from the URL.

### How many results per page does Bing return?

- **Web**: Bing shows up to 10 organic results on page 1 and about 6-10 on later pages. For shopping-type queries
  ("best coffee maker", "home insurance quotes") Bing fills page 1 with shopping and text ads and shows only 2-4
  organic results there; that is Bing's real layout, and the actor reports exactly what Bing shows. Bing stops
  after a few dozen pages for most terms.
- **News**: about 10 articles per page. **Images**: about 35 per page. **Videos**: about 30 per page.

Organic `position` counts organic results only (ads and answer boxes are not counted), continuing across pages.

### How much does it cost?

You pay per row saved: **$0.50 per 1,000 results** (organic results, ads, SERP summary rows, news articles,
videos) and **$2 per 1,000 images**, plus Apify platform usage (compute and proxy), which is small: about
$0.02-0.03 per 1,000 rows on datacenter proxy (measured). A typical rank-tracking run of 100 keywords × 1 page
with the SERP summary row is about 600-1,100 rows, so roughly $0.30-0.55 plus usage. Ads and the SERP summary row
are optional. If a search needs the residential fallback (mostly non-US countries), Apify bills that proxy
traffic per GB: about $0.0003 per basic results page and up to ~$0.0025 per full page with ads and panels
(measured: 6 residential pages = 0.56 MB = $0.0045).

### Can I scrape Bing in other countries and languages?

Yes. **Country** sets Bing's market (`cc`, e.g. GB, DE, FR, JP) and **Language** the interface language
(`setlang`, e.g. en-gb, de, fr). Bing then ranks results for that country. You can also pass a `mkt` market
code through a Bing URL. Bing often answers non-US markets requested from US datacenter IPs with off-topic
results; the actor detects that and, with **Residential fallback** on (default), retries the search through Apify
residential proxy in that country (tested: UK searches that failed 4 times on datacenter IPs worked at once on UK
residential IPs). For big non-US jobs you can also select residential proxy with the right country directly in
**Proxy**.

### Does it get Bing ads, People also ask and the knowledge panel?

Turn on **Include ads** to get text ads (top, middle, bottom and sidebar) with title, advertiser, landing URL,
displayed URL and description. **SERP summary row** (on by default) adds one `serp` row per term with related
searches, the knowledge panel (entity title, description, website, facts), People also ask and the answer box —
each filled only when Bing shows that block for the query. Shopping product carousels are not extracted.

### Monitor changes on a schedule

Turn on **Only new or changed items** and save the input as a task with a Schedule (e.g. daily). The actor
remembers which result URLs earlier runs of the same watch returned for each term, country and language, and
outputs only **URLs that are new** — a new page ranking for your keyword, a competitor appearing, a new article
mentioning your brand. Results seen before are not saved and not charged. New rows get `changeType: "new"` and
keep their current `position`, so you see where the newcomer entered. The SERP summary row is not output in this
mode. Use **Monitoring key** to keep several schedules on the same terms separate.

### Does it need a Bing API key, a login or a browser?

No. Microsoft retired the Bing Search API in 2025; this actor reads the public bing.com result pages over plain
HTTPS with a Chrome-like client and Apify's datacenter proxy. No account or API key is needed.

### Is it legal to scrape Bing?

The actor collects publicly visible search results that Bing shows to anyone without logging in (titles, links,
snippets, public news and image metadata). It does not log in, does not download images or pages, and does not
collect personal data beyond what result titles and snippets publicly show. Check Bing's terms and the laws that
apply to your use case before you use the data.

### Limits

- **Deeper pages are best-effort.** Bing only pages forward for visitors it trusts; from datacenter IPs it
  sometimes answers "page 2" with page 1 again. The actor then retries on another IP; if Bing refuses again it
  keeps page 1 and stops that term (`stoppedBecause: "pagingRefused"` in the run's SUMMARY record).
- **Off-topic answers.** Bing answers some automated requests with results for a different query (or a fake "no
  results" page). The actor checks every page against the query and retries such answers on a new IP (up to 5
  tries per term, the last 3 on residential proxy when the fallback is on); a term that never gets a real answer
  is reported in SUMMARY `errors`.
- `serpMode: "lite"` means Bing served its basic page 1 (10 organic results, no ads or panels) and the full page
  was not reachable for that term; organic results are still correct.
- Copilot / AI answers are loaded by JavaScript after the page, so `aiAnswer` is normally empty.
- Shopping carousels, maps/local packs and image/video carousels inside the web page are not extracted (use the
  News / Images / Videos options instead).

# Actor input Schema

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

One Bing search per term, as you would type it on Bing, e.g. "best coffee maker", "site:example.com pricing", ""your brand" reviews". Bing operators (site:, intitle:, quotes, -word) work.

## `searchTypes` (type: `array`):

Bing verticals to search for every term: Web (organic results, optional ads and the SERP summary), News, Images, Videos. Each picked vertical runs its own search per term.

## `maxPagesPerQuery` (type: `integer`):

How many Bing result pages to read per term and vertical. Web: page 1 has 10 organic results, later pages 6-10 (Bing's own layout). News: ~10 per page. Images: ~35 per page. Videos: ~30 per page. The actor stops earlier when Bing has no more results.

## `maxItems` (type: `integer`):

Stop after this many results in total (all terms and verticals together). You pay per result saved, so this caps the cost.

## `country` (type: `string`):

Which country's Bing results you get (Bing's cc parameter).

## `language` (type: `string`):

Bing interface language code, e.g. en, de, fr, es, pt-br. It affects snippets, dates and which results Bing ranks first.

## `timePeriod` (type: `string`):

Only results Bing dates within this period (Bing's date filter). News supports past 24 hours / week / month; 'Past year' applies to web, images and videos.

## `safeSearch` (type: `string`):

Bing SafeSearch level (adlt). Moderate is Bing's default.

## `includeSerpFeatures` (type: `boolean`):

Web only: add one row per search term (type 'serp') with Bing's total results estimate, related searches, People also ask questions with answers, the knowledge panel (entity title, description, facts) and answer box, when Bing shows them. Charged as one result. Not output in monitoring mode.

## `includeAds` (type: `boolean`):

Web only: also output Bing's text ads (type 'ad', with placement top/bottom/middle/sidebar, title, advertiser, landing URL, description). Each ad is charged as one result.

## `newsSortByDate` (type: `boolean`):

News only: sort articles by date instead of Bing's relevance order.

## `startUrls` (type: `array`):

Optional: Bing search URLs such as https://www.bing.com/search?q=coffee\&cc=GB or https://www.bing.com/news/search?q=coffee. The term (q), country (cc), language (setlang) and market (mkt) are taken from the URL; /news, /images and /videos URLs run that vertical.

## `onlyNewOrChanged` (type: `boolean`):

Remember what earlier runs of this search returned and output only new items or items whose price/status changed. Use with a Schedule; unchanged items are not charged. For Bing: only result URLs that earlier runs of this watch did not return for the same term, country and language (a new page ranking for your keyword, a new article mentioning your brand). The SERP summary row is not output in this mode.

## `monitoringKey` (type: `string`):

Name for this watch, so several schedules on the same search stay separate; defaults to a key derived from the search input

## `residentialFallback` (type: `boolean`):

When Bing keeps answering datacenter IPs with off-topic results for a search (common for countries other than the US), retry that search through Apify residential proxy in the search's country. Used only after 2 failed datacenter tries. Residential traffic is billed by Apify per GB: about $0.0003 per basic results page, up to ~$0.0025 for a full page with ads and panels. Turn off to use datacenter proxy only.

## `proxyConfiguration` (type: `object`):

Apify datacenter proxy (the default) works well for US Bing; each search keeps one IP and cookie jar for all its pages. Searches datacenter IPs cannot get are retried on residential proxy when 'Residential fallback' is on. You can also pick residential proxy (with a country) here for every request.

## Actor input object example

```json
{
  "queries": [
    "best coffee maker"
  ],
  "searchTypes": [
    "web"
  ],
  "maxPagesPerQuery": 1,
  "maxItems": 100,
  "country": "US",
  "language": "en",
  "timePeriod": "any",
  "safeSearch": "moderate",
  "includeSerpFeatures": true,
  "includeAds": false,
  "newsSortByDate": false,
  "onlyNewOrChanged": false,
  "residentialFallback": true,
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}
```

# 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": [
        "best coffee maker"
    ],
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("tortuga/bing-search-scraper").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": ["best coffee maker"],
    "proxyConfiguration": { "useApifyProxy": True },
}

# Run the Actor and wait for it to finish
run = client.actor("tortuga/bing-search-scraper").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": [
    "best coffee maker"
  ],
  "proxyConfiguration": {
    "useApifyProxy": true
  }
}' |
apify call tortuga/bing-search-scraper --silent --output-dataset

```

## MCP server setup

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

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/Thhk9dMeOvkxQbFWT/builds/grmrL1J8iM2TerZlR/openapi.json
