# Bing Search API | SERP, Rank Tracking and Ads Data (`johnvc/bing-search-api`) Actor

Bing Search API for SERP data and Bing rank tracking. Returns organic results with titles, snippets, real URLs and dates, plus ad placements for competitor monitoring. Works as a Bing scraper billed per page rather than per result, so a thin page never costs more than it is worth. MCP ready.

- **URL**: https://apify.com/johnvc/bing-search-api.md
- **Developed by:** [John](https://apify.com/johnvc) (community)
- **Categories:** SEO tools, Business, MCP servers
- **Stats:** 3 total users, 2 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

from $0.01 / 1,000 dataset item storeds

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/platform/actors/running/actors-in-store#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 API

The Bing Search API returns Bing's organic results as clean, structured JSON: titles, snippets, real destination URLs, displayed domains and dates, plus the paid placements if you want them.

Bing is the largest search engine outside Google, and it is where a meaningful share of desktop and enterprise search still happens. If you track rankings, monitor competitors, or feed a research agent, the Google-only picture is an incomplete one.

Most people arrive here wanting Bing rank tracking: the same query run on a schedule so you can watch a position move. That works, and so does one-off SERP extraction.

### Use cases

- **Bing rank tracking.** Run a query on a schedule and store `position` with `page` for an absolute rank over time. Set a location and device to track the market and form factor you actually care about.
- **Competitor ad monitoring.** Switch on ad placements and see who is buying against your terms. On commercial queries there are often more ads than organic results.
- **SEO research.** Pull titles, snippets and real destination URLs for a keyword set to see how [Bing](https://www.bing.com) frames a topic differently from Google.
- **Local rank tracking.** Set a city and compare what a local searcher sees against the national picture.
- **Content gap analysis.** Export page one for a topic cluster and find what is being answered and what is not.
- **Feeding an AI agent.** Give an assistant live non-Google search results so its research is not built on a single index.

### Input parameters

| Parameter | Type | Required | Default | Description |
|---|---|---|---|---|
| `query` | string | yes | `web scraping tools` | Search term. Bing operators pass straight through, so `site:`, `filetype:`, `OR` and `NOT` all work. |
| `max_pages` | integer | no | `1` | Pages to fetch, 1 to 20. This is the billing unit. |
| `include_ads` | boolean | no | `false` | Also return paid placements, marked `resultType: "ad"`. They are on the page you already paid for, so this costs nothing extra. |
| `country` | string | no | none | Two letter country code. Cannot be combined with Market. |
| `market` | string | no | none | Language and country pair such as `en-US`. More precise than Country and takes precedence if both are set. |
| `location` | string | no | none | City to search from, such as `Seattle, Washington`. Use city level for realistic local results. |
| `safe_search` | string | no | `Moderate` | `Moderate`, `Strict` or `Off`. |
| `device` | string | no | `desktop` | `desktop`, `mobile` or `tablet`. Rankings differ between them. |

#### Common values for country, market and location

The ten most used values for each targeting field. Any ISO country code, Microsoft market code or city works; these cover the common cases.

| `country` | Market it targets |
|---|---|
| `us` | United States |
| `gb` | United Kingdom |
| `ca` | Canada |
| `au` | Australia |
| `de` | Germany |
| `fr` | France |
| `es` | Spain |
| `it` | Italy |
| `br` | Brazil |
| `jp` | Japan |

| `market` | Language and country |
|---|---|
| `en-US` | English, United States |
| `en-GB` | English, United Kingdom |
| `en-CA` | English, Canada |
| `en-AU` | English, Australia |
| `de-DE` | German, Germany |
| `fr-FR` | French, France |
| `es-ES` | Spanish, Spain |
| `it-IT` | Italian, Italy |
| `pt-BR` | Portuguese, Brazil |
| `ja-JP` | Japanese, Japan |

| `location` example | Use for |
|---|---|
| `New York, New York` | Local rank tracking in NYC |
| `Los Angeles, California` | LA local results |
| `Chicago, Illinois` | Chicago local results |
| `Houston, Texas` | Houston local results |
| `Phoenix, Arizona` | Phoenix local results |
| `Philadelphia, Pennsylvania` | Philadelphia local results |
| `San Antonio, Texas` | San Antonio local results |
| `San Diego, California` | San Diego local results |
| `Dallas, Texas` | Dallas local results |
| `Seattle, Washington` | Seattle local results |

Remember `country` and `market` are mutually exclusive; if both are set, `market` wins.

### Example output

```json
{
  "resultType": "organic",
  "query": "project management software",
  "page": 1,
  "position": 1,
  "title": "Best Project Management Software Compared For 2026",
  "snippet": "A side by side comparison of the leading project management platforms.",
  "url": "https://example.com/blog/project-management-software/",
  "displayedUrl": "https://example.com",
  "date": "Apr 13, 2026"
}
```

`url` is the real destination. Bing wraps outbound links in a redirect that is opaque and expires, so that wrapper is discarded rather than stored. Combine `page` and `position` for an absolute rank. Failures arrive as one `resultType: "error"` row rather than a crash.

### Billed per page, and here is why

Most APIs in this portfolio charge per result. This one charges per page, deliberately, and it is worth understanding before you run it.

Bing gives no way to request a page size, and its organic depth swings hard depending on the query. Measured on the same day:

| Query | Organic results | Ads |
|---|---|---|
| web scraping tools | 10, then 3 on a repeat | 4 |
| best crm software | 2 | 7 |
| project management software | 2 | 13 |

Commercial-intent queries, the ones with buyers behind them, are exactly where Bing fills the page with ads and leaves the fewest organic results. Every one of those requests costs the same to serve.

Charging per result would mean the queries you most want to run are the ones priced worst, and it would push us to quietly inflate the unit price to cover the thin pages. Charging per page means you know the cost before you run, a thin page never costs more than it is worth, and there is no incentive to pad. You get every result on the page you paid for.

### What the Bing rank tracking API returns

| Field | Description |
|---|---|
| `title` | Result headline |
| `snippet` | Description text Bing shows |
| `url` | The real destination URL |
| `displayedUrl` | The domain as displayed |
| `date` | Publication date, where Bing reports one |
| `position` | Rank within the page |
| `page` | Which page it came from |
| `cachedPageUrl` | Bing's cached copy, where one exists |
| `thumbnail` | Preview image, where supplied |

Bing wraps every result link in a redirect. Those wrappers are opaque and they expire, so they are discarded and `url` carries the real destination. That is the link worth storing.

### Ads come free with the page

Switch on ad placements and paid results come back too, marked `resultType: "ad"`. They were already on the page you paid for, so including them costs nothing extra. On commercial queries there are often more ads than organic results, which makes this a practical competitor ad monitor.

### How to get started

1. Enter a search query. Bing operators like `site:`, `filetype:`, `OR` and `NOT` all work.
2. Choose how many pages to fetch. One page is usually enough to answer a ranking question.
3. Optionally set a location or device for local and mobile rank tracking, then run.

[View on Apify Store](https://apify.com/johnvc/bing-search-api?fpr=9n7kx3)

Prefer to start from working code? The [example repo](https://github.com/johnisanerd/Apify-Bing-Search-API) has a Python quick start plus MCP install walkthroughs for Claude, Cursor and ChatGPT.

### Pricing

| Event | When it is charged |
|---|---|
| Page of results returned | Once per page fetched, whatever that page holds |

No per-run setup fee. The current per-page price is on the Actor's Store card and in the Console before you run.

### 🔌 Use this API from Claude (MCP)

Add this Actor as a tool in [Claude Code](https://claude.ai/referral/uIlpa7nPLg) (free trial), [Claude Cowork](https://claude.ai/referral/uIlpa7nPLg) (free trial), or any other MCP client, via the hosted Apify MCP server. Use this Actor-specific URL:

https://mcp.apify.com/?tools=actors,docs,johnvc/bing-search-api

Setup walkthrough:

https://www.youtube.com/watch?v=jREWahDGhJM

Apify MCP integration docs: https://docs.apify.com/platform/integrations/mcp

### 💸 Pay per run with crypto (x402)

The Bing Search API supports agentic payments via the [x402 protocol](https://docs.apify.com/platform/integrations/x402).
AI agents and MCP clients can pay for runs in USDC (on Base) with no Apify account or API token needed:
point your agent at the [Apify MCP server](https://mcp.apify.com/?tools=actors,docs,johnvc/bing-search-api) and it can
discover, pay for, and run this Actor autonomously. Read the
[Apify x402 announcement](https://apify.com/change-log/pay-for-apify-actors-with-x402?fpr=9n7kx3) for details.

### 🔌 Integrations: put Bing rank tracking on a schedule

**Tasks and Schedules first.** Save a query as a Task and attach a Schedule. A daily run on your target keywords is what turns a single SERP snapshot into a rank history, and it needs no code.

**n8n, Make and Zapier.** Trigger the Actor and route rows onward: a ranking drop into Slack, a new competitor on page one into a tracker, or ad rows into a competitive spend sheet.

**Storage.** Write into Supabase, Postgres or Google Sheets through the Apify integrations tab so rank history accumulates rather than being overwritten.

**MCP.** Point an AI assistant at the Actor and let it check live rankings mid-conversation. Server URL is in the MCP section above.

**Webhooks.** Fire an HTTP callback when a run finishes so your service can collect the dataset without polling.

### 🔗 Related Tools

Search coverage beyond Google, and the answer engines that sit on top of it:

- [Yandex Search API](https://apify.com/johnvc/Scrape-Yandex?fpr=9n7kx3) for the largest Russian-language engine
- [Baidu Search API](https://apify.com/johnvc/Baidu-Search-Scraper?fpr=9n7kx3) for China
- [DuckDuckGo Search API](https://apify.com/johnvc/DuckDuckGo-Search-Scraper?fpr=9n7kx3) for privacy-focused search
- [Naver Search API](https://apify.com/johnvc/naver-search-api?fpr=9n7kx3) for South Korea
- [Bing Copilot API](https://apify.com/johnvc/bing-copilot-api?fpr=9n7kx3) for Microsoft's generative answer rather than the blue links

Cheaper-looking alternatives such as [data\_api/bing-search-scraper-cheap](https://apify.com/data_api/bing-search-scraper-cheap?fpr=9n7kx3) exist, but it sits at around 2 users with no published rating. This API is actively maintained, returns the real destination URL rather than an expiring redirect wrapper, and states its billing model and its reliability limits openly.

### FAQ

#### Why did my search return only two results?

Because that is what Bing showed for that query. Commercial queries get filled with ads, leaving very few organic results. Turn on ad placements to see what took the space. This is also the reason the Actor bills per page instead of per result: you are never charged more for a page that happened to come back thin.

#### Can I track rankings over time?

Yes. Run the same query on a schedule and store `position` together with `page`. For an absolute rank across multiple pages, combine the two. Set a location and device to track the specific market and form factor you care about, since rankings genuinely differ between desktop and mobile.

#### How do I do local rank tracking?

Set the Location field to a city, such as "Seattle, Washington". Give it at city level; broader values produce results that are not representative of what a local searcher sees.

#### Can I use Bing search operators?

Yes, they pass straight through. `site:example.com`, `filetype:pdf`, `OR` and `NOT` all work as they do in the Bing web interface.

#### Why is the URL different from what I see on the Bing results page?

Bing wraps outbound links in a tracking redirect. Those wrappers are long, opaque and expire, so this Actor discards them and returns the real destination URL instead. That is the value you want in a database.

#### Is this a Bing API or a web scraper?

You use it as an API: a query in, structured JSON out, with a documented schema. It reads public [Bing](https://www.bing.com) results, so it is not an official Microsoft product and is not affiliated with, endorsed by, or connected to Microsoft.

#### Can I use it as a bulk Bing scraper?

Yes, up to 20 pages per run. Because billing is per page you know the cost before you start. For large keyword sets, drive it from a Task plus a Schedule or from a workflow tool as described in the Integrations section.

#### How do I call this from an AI agent using MCP?

Point any [Model Context Protocol](https://modelcontextprotocol.io) client at the server URL in the MCP section above. The agent reads the input schema itself and can check a live SERP during a conversation.

#### What other tools work well alongside this one?

See Related Tools above. Running this beside the Yandex, Baidu, DuckDuckGo and Naver Actors gives you a view of the search landscape that no single engine provides.

#### Should I expect the same reliability as the Google Actors?

Be honest with yourself here: Bing is a harder target. The source applies bot protection more aggressively on complex queries, so expect a somewhat lower success rate than the Google-family Actors, particularly on long or heavily filtered searches. Straightforward keyword queries are reliable.

### Agent Skills

Ready-made skills for [Claude Code](https://claude.ai/referral/uIlpa7nPLg) (free trial) and other agents that drive this Actor. Install with `npx skills add johnisanerd/<name>`.

- [claude-skill-bing-scraper](https://github.com/johnisanerd/claude-skill-bing-scraper): Bing SERP results as structured JSON
- [claude-skill-bing-rank-tracking](https://github.com/johnisanerd/claude-skill-bing-rank-tracking): Bing rank tracking by city and device

### n8n integration

Available as an n8n community node, **[n8n-nodes-bing-search-api](https://www.npmjs.com/package/n8n-nodes-bing-search-api)**. In n8n: Settings, Community Nodes, install `n8n-nodes-bing-search-api`, then use it in any workflow (it also works as an AI Agent tool).

### Featured Tasks

Ready-to-run examples on the Apify Store.

- [Bing Rank Tracking on a Schedule](https://apify.com/johnvc/bing-search-api/examples/bing-rank-tracking?fpr=9n7kx3)
- [Bing SERP API With Real Result URLs](https://apify.com/johnvc/bing-search-api/examples/bing-serp-api?fpr=9n7kx3)
- [Scrape Bing Search Results to JSON](https://apify.com/johnvc/bing-search-api/examples/scrape-bing-search-results?fpr=9n7kx3)
- [Bing Keyword Rank Checker via API](https://apify.com/johnvc/bing-search-api/examples/bing-keyword-rank-checker-api?fpr=9n7kx3)
- [Bing Search From Claude via MCP](https://apify.com/johnvc/bing-search-api/examples/bing-search-claude-mcp?fpr=9n7kx3)
- [必应搜索结果API：SERP数据抓取](https://apify.com/johnvc/bing-search-api/examples/biying-sousuo-api?fpr=9n7kx3)
- [必应关键词排名查询API](https://apify.com/johnvc/bing-search-api/examples/biying-paiming-chaxun?fpr=9n7kx3)

***

### 🌐 About Alpha OSINT

This Actor is part of [Alpha OSINT](https://www.alphaosint.com), toolset of financial and operations data sources and APIs.
For support or requests for this actor, please start a ticket [directly on our support page](https://apify.com/johnvc/bing-search-api/issues/open?fpr=9n7kx3).

Last Updated: 2026.08.08

# Actor input Schema

## `query` (type: `string`):

REQUIRED. The term to search Bing for. Supports Bing operators such as site:, filetype:, OR and NOT, so 'site:example.com pricing' works as you would expect.

## `max_pages` (type: `integer`):

How many pages of results to fetch. This is the billing unit: you are charged once per page, whatever that page happens to contain. Bing typically returns about 10 organic results per page, but commercial queries return far fewer because ads take the space.

## `include_ads` (type: `boolean`):

Also return the paid placements on each page, marked with resultType 'ad'. Useful for competitor ad monitoring. Ads are already on the page you paid for, so switching this on costs nothing extra.

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

Optional two letter country code such as us, gb or de. Cannot be combined with Market; if you set both, Market wins.

## `market` (type: `string`):

Optional language and country pair such as en-US or de-DE. More precise than Country because it sets the result language too. Cannot be combined with Country.

## `location` (type: `string`):

Optional city to search from, such as 'Seattle, Washington'. Use it for local rank tracking. Give it at city level for realistic results.

## `safe_search` (type: `string`):

Optional adult content filter. Moderate filters adult text only, Strict removes adult content entirely, Off applies no filter.

## `device` (type: `string`):

Optional device to emulate. Rankings differ between desktop and mobile, so pick the one you actually want to track.

## Actor input object example

```json
{
  "query": "web scraping tools",
  "max_pages": 1,
  "include_ads": false,
  "safe_search": "Moderate",
  "device": "desktop"
}
```

# Actor output Schema

## `allResults` (type: `string`):

Every row from this run, organic and ads together.

## `overview` (type: `string`):

Ranked results with title, snippet and URL in a scannable table.

# 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 = {
    "query": "web scraping tools"
};

// Run the Actor and wait for it to finish
const run = await client.actor("johnvc/bing-search-api").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 = { "query": "web scraping tools" }

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

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

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

```

## CLI example

```bash
echo '{
  "query": "web scraping tools"
}' |
apify call johnvc/bing-search-api --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "command": "npx",
            "args": [
                "mcp-remote",
                "https://mcp.apify.com/?tools=johnvc/bing-search-api",
                "--header",
                "Authorization: Bearer <YOUR_API_TOKEN>"
            ]
        }
    }
}

```

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/kY6DGaNpuDThd1fsi/builds/91saaLWHmxqc6m25l/openapi.json
