# Bing Search Scraper - SERP, Ads, PAA, News, Images & Videos (`topapi/bing-search-scraper`) Actor

Scrape Bing search results for any keyword or Bing URL: organic rank, title, URL, snippet, date and sitelinks, plus ads, People Also Ask, related searches, news, images and videos. DuckDuckGo too. Any market, rank tracking, monitor mode. $0.80 per 1,000 results, no start fee.

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

## Pricing

from $0.80 / 1,000 search results

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

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

### What does Bing Search Scraper do?

**Bing Search Scraper** extracts Bing search results (SERP) for any keyword or Bing URL and turns them into structured rows: one row per result with its position, title, URL, snippet and date, plus ads, People Also Ask, related searches, news, images and videos when you ask for them. Built for SEO teams, marketers and AI / RAG builders who need Bing rankings by market without copying results by hand. DuckDuckGo results come from the same actor.

Bing SERP scraper - Bing search results API - Bing rank tracker - DuckDuckGo scraper

<a href="https://console.apify.com/actors/jEuMqgbIaiA90uRJw"><img src="https://api.apify.com/v2/key-value-stores/qNQ9zP0xaj2yxGeMY/records/bing-search-scraper-source.png" alt="Bing search results page that Bing Search Scraper turns into rows" style="width:70%"></a>

- **Organic results with rank:** position across pages, title, URL, displayed URL, domain, snippet, date, bold keywords, site name, icon, sitelinks and rich facts (e.g. review counts)
- **Ads, People Also Ask, related searches, local pack:** sponsored results with landing URL and advertiser; PAA questions with Bing's answer and source; related searches; local businesses with address and phone
- **News, Images and Videos tabs:** one row per article, image (full-size URL, width, height) or video (duration, channel, views)
- **38 Bing markets and 50 interface languages:** results the way searchers in Germany, Japan or the UK see them
- **Rank tracking and monitor mode:** flag your domains, get each domain's best position, and on a schedule receive only results that are new or moved
- **Two row shapes:** one row per result (flat table) or one row per results page with `organicResults`, `paidResults`, `peopleAlsoAsk` and `relatedQueries` arrays
- **No login, cookies or Bing API key:** you paste search terms or Bing URLs, nothing else
- **Export anywhere:** JSON, CSV, Excel, XML; schedules, webhooks, Make, Zapier, n8n, Google Sheets; API and MCP for AI agents

### What data can you get from Bing?

<table>
<tr>
<td>🔢 Position on Bing (<code>position</code>)</td>
<td>📝 Title</td>
<td>🔗 URL and displayed URL</td>
</tr>
<tr>
<td>🌐 Domain</td>
<td>💬 Snippet (<code>description</code>)</td>
<td>📅 Date Bing shows</td>
</tr>
<tr>
<td>🏷️ Site name and icon</td>
<td>🧭 Sitelinks (<code>siteLinks</code>)</td>
<td>⭐ Rich facts (<code>richSnippet</code>)</td>
</tr>
<tr>
<td>📣 Ads: advertiser, landing URL, top / bottom / side</td>
<td>❓ People Also Ask: question, answer, source</td>
<td>🔍 Related searches</td>
</tr>
<tr>
<td>📍 Local pack: name, category, address, phone, website</td>
<td>📰 News: source, publish time, image</td>
<td>🖼️ Images: full-size URL, size, page</td>
</tr>
<tr>
<td>🎬 Videos: duration, channel, views</td>
<td>📊 Bing's result count (<code>resultsTotal</code>)</td>
<td>🎯 Tracked-domain flag and positions</td>
</tr>
</table>

On our 100-result test runs (10 searches, 10 results each) title, URL, displayed URL, domain, snippet and site name were filled on 100% of organic rows, the site icon on 90-100%, a date on 37-50% (Bing prints one only on some results) and Bing's result count on 84-100%.

### How to scrape Bing with Bing Search Scraper

1. [Create a free Apify account](https://console.apify.com/sign-up) - $5 of monthly credit, no card needed.
2. Open [Bing Search Scraper](https://apify.com/topapi/bing-search-scraper) and click **Try for free**.
3. Type your search terms (one per line) into **Search terms or URLs**, pick a **Market**, and set **Results per search**.
4. Click **Start**. Results stream into the dataset as each search finishes.
5. Open the **Storage** tab and **Export** as JSON, CSV or Excel - or put the run on a schedule.

### ⬇️ Input

| Parameter | Type | Description |
|---|---|---|
| **🔍 What to scrape** | | |
| `queries` | List | **Required.** Search terms (`best crm software`, `plumber austin tx`) or Bing / DuckDuckGo results URLs (`https://www.bing.com/search?q=crm&mkt=en-GB`). A Bing URL (web, news, images or videos) keeps its own market, page and filters. A DuckDuckGo URL keeps its region (`kl`), time (`df`) and SafeSearch (`kp`) and starts at page 1 (web results); its rows carry that region in `region` and its market in `marketCode` (`kl=uk-en` → `en-GB`). |
| `engine` | Select | `bing` (default), `duckduckgo`, or `both` |
| `verticals` | Multi-select | Bing tabs: `web` (default), `news`, `images`, `videos` |
| `outputMode` | Select | `results` (one row per result, default) or `pages` (one row per results page) |
| **🎯 Filters** (applied by Bing) | | |
| `marketCode` | Select | Bing market, e.g. `en-US` (default), `en-GB`, `de-DE`, `ja-JP`. A two-letter country code also works (`"gb"`; through the API also as `country: "gb"`). Norway is `nb-NO`: Bing ignores `no-NO`, so the actor sends `nb-NO` for it |
| `languageCode` | Select | Interface language (`setlang`). Default: the market's language |
| `safeSearch` | Select | `moderate` (default), `strict`, `off`. Applies to Bing web, images and videos and to DuckDuckGo; Bing News results are not affected by it |
| `timeRange` | Select | Any time (default), past 24 hours, week, month, year. Past year does not apply to news: Bing News has no such filter |
| `dateFrom` / `dateTo` | Date | Custom date range for Bing web and DuckDuckGo results (news, images and videos are not date-filtered). Overrides Time range |
| **✂️ Refine results** | | |
| `excludeDomains` | List | Drop results from these sites (subdomains included) |
| `requireQueryMatch` | Boolean | Keep only organic web and news results that mention a word of the search term (ads, images and videos are not filtered). Default: `false` |
| **➕ Extra data** | | |
| `includeAds` | Boolean | Add sponsored results as `ad` rows (not in monitor mode). Default: `false` |
| `includeSerpFeatures` | Boolean | Add People Also Ask (with answers), related searches and local businesses as free rows (not in monitor mode). Default: `false` |
| **🔁 Monitoring** | | |
| `trackDomains` | List | Your domains and competitors. Rows get `isTracked`; the run summary and page rows get each domain's best position |
| `monitorMode` | Boolean | Return only results that are new for the search or moved since the last run; ad, People Also Ask, related and local rows are not returned in this mode. Only delivered results are remembered: one that Exclude domains or Only results that mention the query removed comes as new once a run delivers it. Pair with a daily schedule |
| `monitorStoreName` | Text | Store that remembers positions. Default: `bing-search-monitor` |
| `monitorMinPositionChange` | Integer | A result counts as moved when its position changed by at least this many places. Default: `3` |
| **📦 Output** | | |
| `maxResultsPerQuery` | Integer | Results per search term. Empty = 10 (with page rows, or with Max pages set: Max pages, default 1 page); `0` = as many as Max pages allows |
| `maxPagesPerQuery` | Integer | Upper bound on results pages per term (1-50). Set alone, it means "this many pages" |
| `maxItems` | Integer | Stop after this many billed rows in the whole run (rows charged before a platform restart of the run count too). Empty = no cap |
| `maxRunSeconds` | Integer | Stop starting new searches and new pages after this many seconds from the run's start; a page that arrives after that is dropped and not charged. Rows already delivered are kept. Empty = no limit |
| `compact` | Boolean | Fewer fields, sized for AI agents and MCP. Result rows keep `type`, `query`, `engine`, `page`, `position`, `title`, `url`, `domain`, `description`, `date`, `isTracked` and `scrapedAt` (plus a news row's `publishedAt` and `imageUrl`, an image's `imageUrl`, a video's `duration`, a People Also Ask row's `question` and `answer`, a local row's `category`, `address`, `phone` and `website`, and in monitor mode `monitorStatus` and `previousPosition`). Page rows keep `searchQuery`, `resultsTotal`, `trackedPositions` and their arrays, each result trimmed the same way |
| `saveHtml` / `saveHtmlSnapshotUrls` | Boolean | Keep the raw results-page HTML. `saveHtml` with one row per results page puts it in the row (`html`); `saveHtmlSnapshotUrls` (or `saveHtml` with one row per result) saves each page in the run's key-value store and gives rows its link (`htmlSnapshotUrl`) |
| **⚙️ Advanced** | | |
| `proxyConfiguration` | Proxy | Default: Apify Proxy in auto mode. Each search's first visit goes out direct from the run's own IP; so does the first try of every news, image and video page, and Bing web's first two fresh visitors for deeper pages. DuckDuckGo's later pages reuse the visitor that got page 1. Every other fresh visitor gets an Apify Proxy datacenter IP, and if direct visits keep getting off-topic answers the run switches to the proxy only. A proxy group or your own proxy URLs = proxy only |
| `maxConcurrency` | Integer | Search terms in parallel. Default: `8`, capped at memory / 32 MB (8 at the default 256 MB) |
| `maxSessionsPerQuery` | Integer | Bing web: fresh visitor sessions (IP + cookies) a term may use when Bing answers off-topic or empty, or will not page: this many, plus 2 for every further page the search may read, at most 3× this number (Results per search 10 = up to 3 pages = up to 9 sessions). Default: `5`. News, images and videos try up to 3 visitors per page; DuckDuckGo up to 3 for page 1 and 1 more for each later page |

#### Input JSON

```json
{
  "queries": ["best crm software", "plumber austin tx"],
  "marketCode": "en-US",
  "maxResultsPerQuery": 30,
  "includeAds": true,
  "trackDomains": ["hubspot.com", "salesforce.com"]
}
```

#### Pick the row shape before anything else

**One row per result** is a flat table: easy to sort by `position`, filter by `domain` or load into a spreadsheet. **One row per results page** keeps Bing's page together - organic results, ads, People Also Ask and related searches of one page in one row - the shape the most-used Bing actors return.

#### Ask for results, not pages

Bing shows 2-14 organic results per page: when it renders ads, answers and videos the first page may carry only 2-6. `maxResultsPerQuery: 30` asks Bing for further pages until 30 organic results are in, as long as Bing pages for the run's visitors (see **How deep** below); `maxPagesPerQuery` alone reads up to that many pages, however many results they hold.

#### Put the market in the input, or in the URL

`marketCode: "de-DE"` gives German results on German sites (in our runs: check24.de, verivox.de, finanztip.de for `autoversicherung vergleich`). A pasted URL such as `https://www.bing.com/search?q=car+insurance+quotes&mkt=en-GB` keeps its own market, so one run can cover several countries.

A URL of a later page (`first=21` in the address) starts at that page. Bing shows a new visitor page 1 whatever `first=` says, so the actor reaches the page through Bing's own Next links; the pages before it are read but not returned or charged, and `position` still counts from Bing's top result. When Bing will not page that far for the actor's visitors at the time, that search returns no rows and costs nothing (`RUN_SUMMARY` gives the reason, e.g. `bingStoppedPaging`).

### ⬆️ Output

Every result becomes one dataset item. Here is the table view of a real run (10 searches, 10 results each):

<a href="https://console.apify.com/actors/jEuMqgbIaiA90uRJw"><img src="https://api.apify.com/v2/key-value-stores/qNQ9zP0xaj2yxGeMY/records/bing-search-scraper-output.png" alt="Bing Search Scraper output table with positions, titles, URLs and snippets" style="width:70%"></a>

One organic row as JSON:

```json
{
  "type": "organic",
  "query": "best crm software",
  "engine": "bing",
  "marketCode": "en-US",
  "page": 1,
  "position": 1,
  "title": "10 Best CRM Software Of 2026 – Forbes Advisor",
  "url": "https://www.forbes.com/advisor/business/software/best-crm-software/",
  "displayedUrl": "https://www.forbes.com › advisor › business › software › best-crm-software",
  "domain": "forbes.com",
  "description": "Forbes Advisor reviewed dozen of CRM software options on the market to help you find the best possible solution for your business.",
  "sourceName": "Forbes",
  "isTracked": false,
  "layout": "full",
  "resultsTotal": 8730
}
```

A People Also Ask row (`includeSerpFeatures`):

```json
{
  "type": "paa",
  "query": "how does a crm work",
  "question": "What is CRM & how does it work?",
  "answer": "CRM stands for customer relationship management. It’s an AI-powered technology that helps companies stay connected to customers, …",
  "title": "What Is CRM (Customer Relationship Management)? | Salesforce",
  "url": "https://www.salesforce.com/crm/what-is-crm/"
}
```

#### Fields

| Field | Type | What it is | Fill on organic rows (test runs) |
|---|---|---|---|
| `type` | string | `organic`, `ad`, `news`, `image`, `video`, `paa`, `related`, `local` | 100% (every row) |
| `position` | integer | Rank among the search's organic results across pages (ads: order on the page) | 100% |
| `page` | integer | Bing results page the row came from | 100% |
| `title`, `url`, `domain` | string | Result title, URL (Bing's click link decoded), host | 100% |
| `displayedUrl` | string | The URL line Bing prints under the title | 100% |
| `description` | string | Snippet | 100% |
| `date` | string | Date Bing shows on the result (ISO) | 37-50% |
| `emphasizedKeywords` | array | Words Bing printed in bold | 58-100% |
| `sourceName`, `iconUrl` | string | Site name and icon above the result | 100%, 90-100% |
| `siteLinks` | array | Deep links under the result | 0-3% |
| `richSnippet` | object | Fact row, e.g. `{"Reviews": "5.1K"}` | 4-10% |
| `resultsTotal` | integer | Bing's "About 9,110 results" count | 84-100% |
| `layout` | string | Bing web rows: `full` (ads / answers / related rendered) or `light` (results only); DuckDuckGo rows: `ddg` | 100% (also ad rows) |
| `region` | string | DuckDuckGo rows: the region (`kl`) searched, e.g. `us-en` | 100% of DuckDuckGo rows |
| `isTracked` | boolean | Domain is in Track domains | 100% (also ad, news, image and video rows) |
| `adPosition`, `advertiser` | string | Ads: top / bottom / side, advertiser | 100% of ad rows |
| `question`, `answer` | string | People Also Ask | 100% of PAA rows |
| `publishedAt`, `imageUrl` | string | News: publish time, article image | 100%, 60% |
| `imageUrl`, `thumbnailUrl`, `width`, `height` | string / integer | Images | 100% of image rows |
| `duration`, `channel`, `viewCount`, `published` | string / integer | Videos | 99-100% of video rows |
| `monitorStatus`, `previousPosition` | string / integer | Monitor mode: `new` / `moved` and the position the result had when it was last delivered (that can be several runs ago) | monitor runs |

Other row types carry the fields that fit them: news, image and video rows have no `displayedUrl` and no `layout`; People Also Ask, related-search and local rows have no `layout` and no `isTracked`; related-search rows have no `domain`; local rows have no `url` or `domain` (their link is `website`).

Page rows (`outputMode: "pages"`) carry `searchQuery`, `resultsTotal`, `layout`, `organicResults`, `paidResults`, `peopleAlsoAsk`, `relatedQueries`, `localResults`, `newsResults`, `imageResults`, `videoResults`, `trackedPositions` and `pagination`.

### How can I use Bing search data?

- 🔎 **SEO teams** - track where your pages rank on Bing for your keywords, per market, and get only the moves on a daily schedule
- 🥊 **Competitive research** - see which competitors hold the top 10 and which advertisers bid on your terms (`includeAds`)
- 💬 **Content teams** - collect People Also Ask questions and related searches to plan articles that answer them
- 🤖 **AI and RAG builders** - feed fresh Bing results (titles, URLs, snippets, news) to an agent or a retrieval pipeline; `compact` keeps rows small
- 📰 **PR and brand monitoring** - pull Bing News articles about a brand with source and publish time
- 🧭 **Lead and link building** - build URL lists of sites ranking for niche terms, filtered with `excludeDomains`

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

Bing Search Scraper is pay-per-result: **$0.80 per 1,000 results** ($0.0008 per result row), no start fee. With **One row per results page**, each page row costs **$0.00095**. People Also Ask, related-search and local-pack rows added by `includeSerpFeatures` are free.

| Results | Cost |
|---:|---:|
| 10 | $0.008 |
| 100 | $0.08 |
| 1,000 | $0.80 |
| 10,000 | $8.00 |

There is nothing else to pay: Apify platform usage is included in these prices. A 100-result run (10 searches) took 5-20 seconds on 256 MB in our tests.

### Integrations, API, scheduling & MCP

- **Schedules:** run Bing Search Scraper daily or weekly from the **Schedules** tab; with `monitorMode` each run returns only new or moved results.
- **Webhooks:** call a URL when a run finishes - push rankings to a sheet, a database or Slack.
- **No-code:** Make, Zapier, n8n, Google Sheets, Airtable and Slack via [Apify integrations](https://docs.apify.com/integrations).
- **API:** start runs and read results from Node.js or Python with `apify-client` - code on the [API tab](https://apify.com/topapi/bing-search-scraper/api/python) and in the [Apify API reference](https://docs.apify.com/api/v2).
- **MCP / AI agents:** connect Claude, Cursor or any MCP client through the [MCP tab](https://apify.com/topapi/bing-search-scraper/api/mcp) and ask for Bing results in plain language.

### More scrapers from TopApi

<table>
<tr>
<td>🕸️ <a href="https://apify.com/topapi/website-content-crawler">Website Content Crawler</a> - crawl the pages behind your results</td>
<td>📈 <a href="https://apify.com/topapi/similarweb-scraper">SimilarWeb Scraper</a> - traffic of the sites that rank</td>
<td>📍 <a href="https://apify.com/topapi/apple-maps-scraper">Apple Maps Scraper</a> - local businesses with phones</td>
</tr>
<tr>
<td>⭐ <a href="https://apify.com/topapi/google-maps-reviews-scraper">Google Maps Reviews Scraper</a></td>
<td>💼 <a href="https://apify.com/topapi/linkedin-ad-library-scraper">LinkedIn Ad Library Scraper</a></td>
<td>🎵 <a href="https://apify.com/topapi/tiktok-ads-library-scraper">TikTok Ads Library Scraper</a></td>
</tr>
<tr>
<td>🛡️ <a href="https://apify.com/topapi/trustpilot-reviews-scraper">Trustpilot Reviews Scraper</a></td>
<td>🔎 <a href="https://apify.com/topapi/facebook-search-posts-scraper">Facebook Search Posts Scraper</a></td>
<td>▶️ <a href="https://apify.com/topapi/youtube-shorts-scraper">YouTube Shorts Scraper</a></td>
</tr>
<tr>
<td>🐦 <a href="https://apify.com/topapi/x-profile-scraper">Twitter (X) Profile Scraper</a></td>
<td>🧭 <a href="https://apify.com/topapi">All TopApi actors</a></td>
<td></td>
</tr>
</table>

### Limits & empty runs

- **How deep:** page 1 gives about 10 organic results. Results past it come only when Bing serves one of the run's visitors its full page layout, and Bing decides that per visit. On 2026-10-08 around 12:40 UTC, 23 of 25 terms reached the 40 results asked for. From about 17:45 UTC that day and on 2026-10-09, Bing paged none of the platform's visitors: in our 4 deep test runs since, no search got past page 1 (18 searches). When that happens the status message says "N search(es) stopped early: Bing would not page for the run's visitors" and `RUN_SUMMARY` gives `bingStoppedPaging` for those searches. Bing also lists a limited number of results per term even when it says "About 900,000 results". DuckDuckGo gave 25-40 results per term.
- **Speed:** a 100-result run (10 searches × 10 results) took 5-20 seconds. Asking for more than page 1 holds adds time while the actor looks for a visitor Bing will page for (deep paging is sequential per term): 3 searches asking for 20-40 results each took 70-107 seconds and stopped at page 1.
- **Page layouts:** Bing decides per visit whether a page carries ads, People Also Ask, related searches and videos (`layout: "full"`) or results only (`light`). Those blocks are returned when Bing shows them; the `layout` field tells you which page you got.
- **Order varies a little:** two visits a minute apart can swap neighbouring results or rotate the last places of the top 10. Monitor mode reports a move only when it is at least `monitorMinPositionChange` places.
- **Restarts:** when Apify migrates or restarts a run, it carries on: finished searches are skipped, rows delivered before the restart are not delivered or charged again, and Max items and your spending limit count the whole run.
- **Empty dataset:** Bing has no results for the term (the run summary says `noResults`), SafeSearch `strict` hid them, or the filters removed every row. Bing also answers some platform visitors in non-US markets with a false "There are no results" page, so the actor believes it only when visitors on two different proxy IPs get it, or when every visitor the search may use does; `RUN_SUMMARY` gives each such search's `emptyAnswers` and a note on how many visitors and proxy IPs agreed. `RUN_SUMMARY` in the key-value store lists each search's status and why paging stopped.
- **Not in this version:** Bing Copilot answers, Bing shopping results and the Bing Web Search API (no API key is used).

#### Soft blocking

Like other Bing scrapers, this actor meets Bing's soft blocking: a page about something else (results for only the first word of your term, Microsoft support pages, pages in a script your search does not use such as Chinese forum threads for a Norwegian search), a "There are no results" page for a term that has results, results for another country than the market asked for, or page 1 served again instead of page 2. The actor checks every Bing web results page against your search term (a page of 5 or more results where one word of your term appears in at most 1 in 10 of them, and the results carry less than 60% of your term's words on average, counts as answering only part of it), against the region Bing says it applied, and against Bing's page marker, and asks again as a fresh visitor when it sees one, so rows from such pages are not returned. News, image, video and DuckDuckGo results are returned as served: they get no relevance check (only an empty first news, image or video page is asked again from a fresh visitor).

One exception: when two visitors on different IP addresses get the same results that do not mention your term (at least half the same URLs), that is Bing's real answer for it and it is returned. Pages where half or more of the results are Microsoft, MSN or WhatsApp links or in a script your search does not use, pages that answer only part of your term and pages for another region are never accepted this way, and neither are two answers from the same IP (with the proxy turned off, every visitor uses the same IP). A search that never gets an on-topic answer ends as `softBlocked` in `RUN_SUMMARY` (`softBlockReasons` counts each kind), with nothing charged for it; when every answer was for another region, its `paginationStoppedReason` is `marketNotApplied`.

### FAQ

#### How many results can Bing Search Scraper get per search term?

Set **Results per search** (`maxResultsPerQuery`). Page 1 gives about 10. Further pages come only when Bing serves one of the run's visitors its full layout, which Bing decides per visit: on 2026-10-08 around 12:40 UTC, 23 of 25 terms reached the 40 results asked for; on our runs from about 17:45 UTC that day and on 2026-10-09, no search got past page 1. The status message says how many searches stopped early because Bing would not page. For more rows, split a broad term into several narrower ones or run several markets.

#### How much does Bing Search Scraper cost?

$0.80 per 1,000 result rows, or $0.00095 per results page with page rows. There is no start fee; People Also Ask, related-search and local rows are free. See the cost table above.

#### Can I track my rankings on Bing with Bing Search Scraper?

Yes. Add your domains to **Track domains**: rows get `isTracked`, and the run summary (and page rows) list each domain's best position, `null` when it is not in the results read. With **Monitor mode** on a daily schedule you receive only results that are new or moved.

#### Can I scrape Bing for another country or language?

Yes. Pick one of 38 markets in **Market** (country + language) and, if you like, an interface language. You can also paste Bing URLs with their own `mkt=` parameter to mix countries in one run.

#### Does Bing Search Scraper return ads and People Also Ask?

Yes, when Bing shows them on the page: turn on **Include ads** and **Include People Also Ask, related searches and local pack**. The `layout` field shows whether the page carried those blocks. Monitor mode is the exception: it returns only new or moved results, without ad, People Also Ask, related or local rows (ads change on every visit, so they are no rank signal).

#### Can I scrape DuckDuckGo with Bing Search Scraper?

Yes. Set **Search engine** to DuckDuckGo, or to Both to get Bing and DuckDuckGo rows for the same terms (each row says which engine it came from).

#### Can I use Bing Search Scraper with the Apify API?

Yes. Start runs, fetch datasets and manage schedules through the API with `apify-client` for [Node.js](https://apify.com/topapi/bing-search-scraper/api/javascript) or [Python](https://apify.com/topapi/bing-search-scraper/api/python).

#### Can I use Bing Search Scraper through an MCP server?

Yes. Open the [MCP tab](https://apify.com/topapi/bing-search-scraper/api/mcp), connect your MCP client and ask for Bing results in plain language; turn on `compact` for short rows.

#### Do I need a Bing account, cookies or an API key?

No. You pass search terms or Bing URLs; the actor reads the results pages any visitor sees.

#### Why did my run return no results?

Most often Bing has no results for the term, SafeSearch strict filtered them, or Exclude domains / Only results that mention the query removed every row. In some non-US markets Bing also tells platform visitors "There are no results" for terms that have them; the actor asks visitors on two different proxy IPs before it believes that. Each search's status is in `RUN_SUMMARY`.

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

Scraping publicly available data is generally legal, but respect personal data and intellectual property rules, and Bing's terms. If you are unsure whether your use is legitimate, consult a lawyer. See Apify's post on [whether web scraping is legal](https://blog.apify.com/is-web-scraping-legal/).

#### Your feedback

We keep improving Bing Search Scraper. Found a bug or missing a field? Open an issue on the [Issues tab](https://apify.com/topapi/bing-search-scraper/issues/open).

# Actor input Schema

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

One per line: a search term ("best crm software") or a results URL. A Bing URL keeps its market, page and filters; a DuckDuckGo URL keeps region (kl), time (df) and SafeSearch (kp), from page 1.

## `engine` (type: `string`):

Bing, DuckDuckGo, or both for the same terms. DuckDuckGo is read for web results only (DuckDuckGo lists about 25-40 results per query).

## `verticals` (type: `array`):

Which Bing result tabs to read for every term. Web is the normal results page; News, Images and Videos give one row per article, image or video.

## `outputMode` (type: `string`):

Flat rows are billed per result; page rows (the shape of the most-used Bing actor) are billed per results page.

## `marketCode` (type: `string`):

The Bing market the results are for: country + language. A two-letter country code also works, e.g. "gb" (in the API also as country: "gb").

## `languageCode` (type: `string`):

Bing's interface language (setlang). Empty = the market's own language.

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

SafeSearch level for Bing web, images and videos and for DuckDuckGo. Bing News results are not affected by it.

## `timeRange` (type: `string`):

Only results Bing dates within this window (web, news, images, videos, DuckDuckGo). Past year does not apply to news: Bing News has no such filter. Ignored when Date from / to are set.

## `dateFrom` (type: `string`):

Bing web and DuckDuckGo results from this date, e.g. 2026-01-01 (news, images and videos are not date-filtered). Combine with Date to; empty = no lower bound.

## `dateTo` (type: `string`):

Bing web and DuckDuckGo results up to this date (news, images and videos are not date-filtered). Empty = today.

## `excludeDomains` (type: `array`):

Drop results from these sites (subdomains included), e.g. "pinterest.com", "youtube.com". Positions still count them.

## `requireQueryMatch` (type: `boolean`):

Keep only organic web and news results whose title, description or URL contains at least one word of the search term. Ads, images and videos are not filtered.

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

Also return Bing's sponsored results (title, landing URL, advertiser, top / bottom / side) as rows with type "ad", billed as results. Not in monitor mode.

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

Adds People Also Ask (question, answer, source), related searches and local businesses as free rows whenever Bing shows them on the page. Not in monitor mode.

## `trackDomains` (type: `array`):

Your site and competitors, e.g. "hubspot.com". Rows get isTracked; RUN_SUMMARY and page rows get each domain's best position (null = not found).

## `monitorMode` (type: `boolean`):

Return only results that are new for the search or moved since the previous run (store below); no ad, PAA, related or local rows. Page rows: only pages whose results changed.

## `monitorStoreName` (type: `string`):

Named key-value store that remembers the last positions. Use one name per project.

## `monitorMinPositionChange` (type: `integer`):

Monitor mode: a result counts as moved when its position changed by at least this many places since it was last delivered. 1 = every move.

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

Organic results (or news / images / videos) per search term. Empty = 10 (with page rows or Max pages set: Max pages, default 1 page); 0 = as many as Max pages allows.

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

Upper bound on result pages per term (Bing shows 2-14 results a page). Set alone, it means "this many pages". Empty = what Results per search needs.

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

Stop after this many billed rows across all searches, counting rows charged before a platform restart of the run. Empty or 0 = no cap.

## `compact` (type: `boolean`):

Fewer fields for AI / MCP: type, query, engine, page, position, title, url, domain, description, date, isTracked (+ news, image, video, PAA, local essentials). Page rows keep arrays, results trimmed.

## `saveHtml` (type: `boolean`):

Page rows carry the raw results-page HTML; result rows get htmlSnapshotUrl (a copy in the run's key-value store).

## `saveHtmlSnapshotUrls` (type: `boolean`):

Store each results page in the run's key-value store and add its link as htmlSnapshotUrl.

## `maxRunSeconds` (type: `integer`):

Stop starting new searches and pages after this many seconds; a page that arrives later is dropped, not charged. Rows already delivered are kept. Empty or 0 = no limit.

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

Default Apify Proxy (auto): a search's first visit goes direct (news/images/videos: each page's first try; Bing web: also 2 visitors for deeper pages); others use the proxy. A group = proxy only.

## `maxConcurrency` (type: `integer`):

How many search terms run at once, capped at memory / 32 MB (8 at the default 256 MB).

## `maxSessionsPerQuery` (type: `integer`):

Bing web: fresh visitor sessions (IP + cookies) a term may use when Bing answers off-topic, empty or won't page, plus 2 per further page it may read (at most 3x). News / images / videos: 3 per page.

## Actor input object example

```json
{
  "queries": [
    "best crm software"
  ],
  "engine": "bing",
  "verticals": [
    "web"
  ],
  "outputMode": "results",
  "marketCode": "en-US",
  "languageCode": "",
  "safeSearch": "moderate",
  "timeRange": "",
  "requireQueryMatch": false,
  "includeAds": false,
  "includeSerpFeatures": false,
  "monitorMode": false,
  "monitorStoreName": "bing-search-monitor",
  "monitorMinPositionChange": 3,
  "maxResultsPerQuery": 10,
  "compact": false,
  "saveHtml": false,
  "saveHtmlSnapshotUrls": false,
  "proxyConfiguration": {
    "useApifyProxy": true
  },
  "maxConcurrency": 8,
  "maxSessionsPerQuery": 5
}
```

# Actor output Schema

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

The dataset: one item per Bing / DuckDuckGo result (or per results page in page mode).

## `summary` (type: `string`):

Per search: status, pages read, sessions used, why paging stopped, tracked-domain positions; transport and billing totals.

# 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"
    ],
    "maxResultsPerQuery": 10,
    "proxyConfiguration": {
        "useApifyProxy": true
    }
};

// Run the Actor and wait for it to finish
const run = await client.actor("topapi/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"],
    "maxResultsPerQuery": 10,
    "proxyConfiguration": { "useApifyProxy": True },
}

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

```

## MCP server setup

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