# Bing Search Scraper (`dami_studio/bing-search-scraper`) Actor

Bing's organic web results for your search terms, one row per result: position, title, link, snippet and the date Bing shows, page after page, in 32 countries. A page that answers some other query is never kept or charged, and a query Bing won't answer comes back as a free row saying so.

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

## Pricing

from $0.41 / 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?

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

**Type your search terms and get Bing's organic web results back, one row per result**: the position, title, link, snippet and the date Bing shows, page after page, in the country and language you pick. Every page is checked before anything on it is kept. When Bing answers a query with results for something else, nothing from that page is delivered or charged, and if no page answers it the query comes back as a free row that says so.

| | |
|---|---|
| **Input** | Search terms, as you would type them into Bing, one per line |
| **Output** | One row per organic result: position, title, link, snippet, date shown, address shown |
| **Ceiling** | 200 results per query, 500 queries per run |
| **Speed** | About 20 results per query every 15 seconds (measured on US searches) |
| **Account needed** | None from you |
| **Price** | $0.42 per 1,000 results, flat on every plan. The free plan's $5 a month covers about 11,900 |

### 🔍 What Bing Search Scraper does

It searches Bing the way a person in the country you choose would, reads each results page, and keeps the organic results in Bing's own order. Ads, answer boxes, image strips and "people also ask" panels are left out. Then it moves to the next page through Bing's own pager, until it has the number of results you asked for or Bing's list ends.

Before a page counts, three things are checked: it is a real results page, Bing served it in the market you asked for, and its results carry the words of your query. Only pages that pass end up in your dataset, and only those results are charged.

### 📋 What data you get from each Bing result

| What you would call it | Field |
|---|---|
| Rank for the query | `position`, and the results page it was on as `page` |
| The result itself | `title`, `url`, `snippet` |
| What Bing printed above the title | `siteName`, `displayedUrl` |
| The date in front of the snippet, when Bing shows one | `date`, as Bing printed it |
| What was asked | `query`, `country`, `language`, `safeSearch`, `freshness` |
| The market Bing served | `market`, as the results page reported it |

### ▶️ How to scrape Bing search results

1. Open Bing Search Scraper on Apify and click **Try for free**.
2. Type your terms into **Search queries**, one per line.
3. Set **Results per query**, then pick a **Country** and, if you need it, a **Language**.
4. Change **Safe search** or **Published within** if you want to, and click **Start**.
5. Download the dataset as JSON, CSV or Excel, or read it from the Apify API.

Run it with no queries at all and you get one free sample row showing the shape of the output.

### 💰 How much does it cost to scrape Bing search results?

**$0.42 per 1,000 results**, flat on every Apify plan. The free plan's $5 of monthly credit covers about 11,900 results.

You pay for results delivered and nothing else. The sample row, diagnostic rows, and any page that was not an answer to your query are free. **Results per query** and the run's maximum charge are the two limits on what one run can spend.

### 📥 What you give it

| Field | Default | What it is |
|---|---|---|
| `queries` | none (the form starts with two examples) | Up to 500 search terms. Quotes around a phrase work. A query with an operator such as `site:` or `intitle:` is skipped with a free row (see below). A repeat is searched once. |
| `maxResultsPerQuery` | `10` | Organic results to collect per query, 1 to 200. |
| `country` | `US` | One of 32 countries Bing serves its own results for. China and Russia are not offered. |
| `language` | the country's own | Only Belgium (`nl`, `fr`), Canada (`en`, `fr`), Switzerland (`de`, `fr`) and the United States (`en`, `es`) have a choice. Any other pair stops the run before it searches. |
| `safeSearch` | `moderate` | `moderate` is Bing's default, `strict` drops adult pages, `off` keeps them. |
| `freshness` | `any` | `day`, `week`, `month` or `year`: only pages Bing dates within that window. |

```json
{
  "queries": ["best running shoes for flat feet", "crm software for small business"],
  "maxResultsPerQuery": 30,
  "country": "US",
  "safeSearch": "moderate",
  "freshness": "any"
}
```

### 📤 What you get back

A real row from a run on 3 October 2026:

```json
{
  "recordType": "result",
  "query": "crm software for small business",
  "position": 1,
  "page": 1,
  "title": "The Best Small Business CRM Software for 2026 - PCMag",
  "url": "https://www.pcmag.com/picks/the-best-small-business-crm-software",
  "displayedUrl": "https://www.pcmag.com › picks › the-best-small-business-crm-software",
  "siteName": "PCMag",
  "snippet": "Customer relationship management (CRM) doesn't have to be costly or complicated. We've evaluated and compared all …",
  "date": "Jul 22, 2026",
  "market": "en-US",
  "country": "US",
  "language": "en",
  "safeSearch": "moderate",
  "freshness": "any",
  "scrapedAt": "2026-10-03T16:13:36.632Z"
}
```

| Field | What to know |
|---|---|
| `position` | Counts organic results only, across pages, starting at 1. Ads are not counted. |
| `url` | The page's own address, not Bing's click-through link. |
| `snippet` | `null` when Bing showed no text under the title. |
| `date` | Only when Bing printed one, and as printed: "Sep 8, 2026", "3 hours ago". `null` otherwise. |
| `page` | Bing's results page the row came from. Bing fits anywhere from 2 to 14 organic results on a page. |

### 🧾 Reading the output

| Row | How to spot it | Charged |
|---|---|---|
| A result | `recordType` is `result` | yes |
| The sample | `recordType` is `sample`, with `_sample: true`. Only when no queries were given | no |
| A diagnostic | `recordType` is `diagnostic`, with `_diagnostic: true` and an `errorCode` | no |

Keep the rows whose `recordType` is `result` to get the results alone.

| Code | What it means |
|---|---|
| `BAD_INPUT` | A setting the actor can't use, such as a country and language Bing has no market for, and then nothing was searched. Or one query that was skipped, such as a `site:` search, while the others went ahead. |
| `NOT_ANSWERED` | Bing answered this query with results for something else. Run it again later. |
| `NO_RESULTS` | Bing has nothing for the query with these settings. Common with `strict` safe search or a short date window. |
| `PARTIAL` | A later page could not be read. The results before it are in the dataset. |
| `NOT_SEARCHED` | The run stopped before reaching this query: the time limit or the maximum charge. |
| `MAX_CHARGE_TOO_LOW` | The run's maximum charge does not cover a single result, so nothing was searched. |

The run report (`RUN_REPORT` in the key-value store) lists every query with its outcome, the results returned and the pages read.

### 💡 What people use it for

- Tracking where a site ranks on Bing for a list of keywords, week after week, by filtering `url` on your domain and reading `position`.
- Comparing Bing against Google for the same terms, to see which pages win on one and not the other.
- Collecting fresh pages on a topic with **Published within** set to a day or a week.
- Building a list of sites that rank for a niche, as a starting point for outreach.

One recipe: send your keywords to this actor, keep the rows where `url` contains your domain, then run the same keywords through Google Search Results Scraper, which takes one query a run, and set this actor's `position` beside its `rank`.

### 🚧 What it does not do

- **Organic results only.** No ads, no "people also ask", no answer boxes, images, videos or news panels.
- **No total result count** in the rows. Bing's "About 524,000 results" line is an estimate and moves between pages.
- **Positions are Bing's for that moment.** Bing reorders results between visits and between pages, so the same query can differ a little from one run to the next.
- **Some queries stop short of what you asked.** Bing's list for a narrow query, a strict filter or a short date window can end after a few pages.
- **Long lists need a longer timeout.** At 20 results a query, an hour covers roughly 250 queries. Queries the run did not reach come back as free `NOT_SEARCHED` rows.
- **No `site:`, `intitle:` or other operators.** In our checks Bing answered every `site:` search with results for one word of the query, so these queries are skipped with a free `BAD_INPUT` row instead of being searched.
- **Place-based searches use a place Bing picks.** "Weather tomorrow" or "pizza near me" is answered for a location inside the country you chose, not yours. Put the city in the query.
- **China and Russia are not offered.** Bing claimed to serve those markets but returned results for unrelated queries.
- **Bing's keyword suggestions are not here.** Those come from Keyword Autocomplete Scraper.

### 🧭 Which search scraper do you need?

| If you want | Use |
|---|---|
| Bing's web results for your search terms | [This one](https://apify.com/dami_studio/bing-search-scraper) |
| What Bing and Google suggest as people type | [Keyword Autocomplete Scraper](https://apify.com/dami_studio/keyword-autocomplete-scraper) |
| Google's web results for the same terms | [Google Search Results Scraper](https://apify.com/dami_studio/google-search-results-scraper) |
| Yandex results, for Russia, Turkey and nearby markets | [Yandex Search Engine Scraper](https://apify.com/dami_studio/yandex-search-engine-scraper) |
| News articles on a topic | [Google News Scraper](https://apify.com/dami_studio/google-news-scraper) |

### ❓ Questions people ask

#### Do I need a Bing account or an API key to scrape Bing results?

No. It reads the public results pages, the same ones anyone sees without signing in.

#### Why are my results different from what I see on Bing?

Bing tailors results to your location, your history and whether you are signed in. To compare like with like, open Bing in a private window with the same country set. Bing also reorders some results from one visit to the next.

#### Why did a query come back as NOT_ANSWERED?

Bing returned results for a different query, so none of them were kept or charged. It is usually temporary. Run the query again later.

#### Can I call it from my own code or an AI assistant?

Yes. The API tab on the actor page has ready-made calls in several languages. For AI assistants that speak MCP, add `https://mcp.apify.com/?actors=dami_studio/bing-search-scraper` as a server.

#### How many results can I get for one query?

Up to 200. A narrow query can run out sooner, and the run report marks a query that reached the end of Bing's list.

#### Is it legal to scrape Bing search results?

The results pages are public. What you may do with the data depends on where you are and what you do with it. Apify's [write-up on web scraping and the law](https://blog.apify.com/is-web-scraping-legal/) is a good start, and we are not lawyers.

### 🆘 If something breaks

Open the **Issues** tab on the actor page and send the run ID with the queries and settings you used. The `errorCode` on a diagnostic row usually names the problem on its own.

# Actor input Schema

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

What you would type into Bing, one per line. Bing's own operators work, such as <code>site:</code>, quotes and a minus sign. Up to 500 queries a run; a repeat is searched once.

## `maxResultsPerQuery` (type: `integer`):

How many organic results to collect for each query, page after page, up to 200. Bing puts anywhere from 2 to 14 organic results on a page, so 30 results takes several pages. Fewer come back when Bing's list ends sooner.

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

Whose Bing to search: results are the ones Bing shows people in that country.

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

Leave empty for the country's own language. Four countries have a second one: Belgium (<code>nl</code> or <code>fr</code>), Canada (<code>en</code> or <code>fr</code>), Switzerland (<code>de</code> or <code>fr</code>) and the United States (<code>en</code> or <code>es</code>). Any other pair stops the run before it searches.

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

<code>moderate</code> is Bing's own default. <code>strict</code> drops adult pages from the results. <code>off</code> keeps everything.

## `freshness` (type: `string`):

Keep only pages Bing dates within the past day, week, month or year, the same filter as Bing's own date menu. A short window returns far fewer results.

## Actor input object example

```json
{
  "queries": [
    "best running shoes for flat feet",
    "how to clean a stainless steel sink"
  ],
  "maxResultsPerQuery": 10,
  "country": "US",
  "safeSearch": "moderate",
  "freshness": "any"
}
```

# Actor output Schema

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

One row per organic result, query by query, in Bing's order. Free rows marked \_diagnostic say when a query had no results, was answered with results for something else, or was not searched.

## `report` (type: `string`):

Each query with its outcome, results returned and pages read, the settings used, and why the run stopped.

# 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 running shoes for flat feet",
        "how to clean a stainless steel sink"
    ]
};

// Run the Actor and wait for it to finish
const run = await client.actor("dami_studio/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 running shoes for flat feet",
        "how to clean a stainless steel sink",
    ] }

# Run the Actor and wait for it to finish
run = client.actor("dami_studio/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 running shoes for flat feet",
    "how to clean a stainless steel sink"
  ]
}' |
apify call dami_studio/bing-search-scraper --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,dami_studio/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/MfdVmikzKTMONwGUI/builds/NRrIwzqvHac1EmAiO/openapi.json
