# Bing Search Results Scraper (SERP) (`axery/bing-search-scraper`) Actor

Scrape Bing organic search results - title, real destination URL, snippet, domain and absolute rank across pages. No API key.

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

## Pricing

from $1.00 / 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

## Bing Search Results Scraper (SERP)

Scrapes Bing organic search results — title, **real destination URL**, snippet, domain and absolute rank. No API key, no Azure subscription, no cognitive-services quota.

Useful for SEO rank tracking, competitor visibility monitoring, lead and prospect discovery, content research, and building link lists at scale.

### What makes this different

**Every URL is the real destination.** Bing wraps every result link in a `bing.com/ck/a?...` redirect tracker. Scrapers that skip the decoding step return a dataset where every single row points at bing.com — technically 200 rows, practically zero. This Actor decodes the wrapper, so `url` is the site Bing actually found and `domain` is ready to group or filter on.

**Pagination that actually paginates.** Requesting page 2 on a cold session does not return page 2 — Bing serves page 1 again, with HTTP 200 and no error at all. A scraper missing the session warm-up looks like it works and quietly returns the same ten results over and over. This Actor warms the session first, then verifies each page contains genuinely new URLs and stops the moment it doesn't, so you are never charged for repeats.

**Absolute rank, not per-page rank.** `rank` counts across pages — result 1 of page 3 is rank 21. Non-organic cards are dropped *before* ranking, so ranks stay contiguous and are directly usable for SEO position tracking.

**Video carousels don't pollute the dataset.** Bing mixes video cards into the same result list as organic results, and they decode to internal Bing paths rather than external sites. They're excluded rather than emitted as rows pointing back at Bing.

**Snippet and date are separated.** Bing prefixes many snippets with a publication date (`Aug 3, 2026 · In this section…`). Left alone, that corrupts the snippet text. Here `published_date` carries the date and `snippet` is the clean description.

**`total_results_estimate` on every row** — Bing's own match estimate for the query, useful as a keyword-volume proxy without a second request.

### Input

| Field | Type | Notes |
|---|---|---|
| `queries` | array | One or more queries; each row records which produced it. |
| `maxItems` | integer | Results per query. Pages 10 at a time, stops early on repeats. |
| `proxyConfiguration` | object | Recommended. Also how you target a region — see below. |

#### Region targeting, and why there's no "market" input

Bing accepts `mkt` / `setlang` / `cc` parameters, and **they silently corrupt multi-word queries**: with a market parameter set, `best crm software` returns results for `best` (Best Buy, a dictionary entry) and `python web scraping tutorial` returns results for `python`. Worse, the setting persists into the session cookie, so every later query on that session stays broken even after the parameter is removed.

An Actor exposing a "market" dropdown built on those parameters would return confidently wrong data for most real queries. So this Actor does not use them. **Region targeting is done by proxy country instead** — Bing localises results by IP, which works correctly — so pick the country in `proxyConfiguration` and you get that country's results with the query intact.

### Output

```json
{
  "rank": 1,
  "query": "best crm software",
  "page": 1,
  "title": "The Best CRM Software We've Tested for 2026 | PCMag",
  "url": "https://www.pcmag.com/picks/the-best-crm-software",
  "domain": "pcmag.com",
  "display_url": "https://www.pcmag.com › picks",
  "snippet": "We've tested the top CRM platforms to help you find the right one...",
  "published_date": "Aug 3, 2026",
  "total_results_estimate": 21400
}
```

Each run also writes a `RUN_COVERAGE` record to the key-value store with what was requested, what came back, and any per-query failures — so a partial run is visible rather than silent.

### Notes on depth

Bing serves 10 organic results per page and ignores any larger `count`, so depth comes from paging. Real usable depth varies by query: broad commercial queries page freely, while narrow ones start repeating after a few pages. The Actor detects the repeat and stops there rather than billing you for duplicates.

If Bing serves a challenge page during a long run, that query fails with a clear message rather than returning partial garbage. Enabling a proxy and running fewer queries per run resolves it.

### Local development

```bash
pip install -r requirements.txt
python test_local.py "best crm software" --max 25 --out sample_output.json
python test_local.py "python web scraping tutorial" "best crm software" --max 25
```

`sample_output.json` is real output from a live two-query run.

# Actor input Schema

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

One or more search queries. Each is run independently into the same dataset, and each row records which query produced it.

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

How many organic results to return per query. The Actor pages 10 at a time and stops early if Bing stops producing new results, so you are never charged for repeats.

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

Apify Proxy settings. Defaults to Residential - Bing already showed session/IP sensitivity during testing (see the README), and Apify's own container IP range is a plausible target for the same defense.

## Actor input object example

```json
{
  "queries": [
    "best crm software"
  ],
  "maxItems": 30,
  "proxyConfiguration": {
    "useApifyProxy": true,
    "apifyProxyGroups": [
      "RESIDENTIAL"
    ]
  }
}
```

# Actor output Schema

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

One row per organic result: rank, title, destination URL, domain, snippet and publication date where Bing shows one.

# 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 crm software"
    ],
    "maxItems": 30
};

// Run the Actor and wait for it to finish
const run = await client.actor("axery/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 crm software"],
    "maxItems": 30,
}

# Run the Actor and wait for it to finish
run = client.actor("axery/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 crm software"
  ],
  "maxItems": 30
}' |
apify call axery/bing-search-scraper --silent --output-dataset

```

## MCP server setup

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