DEV Community

Cover image for Bing Rank Tracking: How to Monitor Your Positions in 2026 (Python, MCP, No-Code)
Truffle Pig Data
Truffle Pig Data

Posted on

Bing Rank Tracking: How to Monitor Your Positions in 2026 (Python, MCP, No-Code)

Checking where a site ranks on Bing sounds like a five-minute job until you try to automate it. Microsoft retired its official search APIs in 2025, every result link on the page is wrapped in a tracking redirect, and what Bing shows you depends on where it thinks you are. I'll walk through the DIY route and where it breaks, then the shortcut: the Bing Search API on Apify, which turns a query into JSON rows you can store and diff a week later.

Disclosure: the Apify links in this post are affiliate links. If you run the Actor, I may earn a referral commission at no extra cost to you.

Does Bing still have a search API?

It did. Microsoft announced in May 2025 that the Bing Search APIs would shut down that August and pointed developers to Grounding with Bing Search inside Azure's agent tooling. Grounding feeds an LLM; there is no endpoint that hands back a ranked list of URLs with positions you can store. So in 2026 a Bing search API in the practical sense means a scraper you consume like an API: send a query, get the SERP back as structured rows.

What the Bing Search API returns

The Bing Search API returns the organic results for a query as structured JSON: page, position, title, snippet, the real destination URL, the displayed URL, and a date when Bing shows one.

Field Example Notes
position 3 Rank within the organic results
page 1 Which SERP page the row came from
title 10 Best Web Scraping Tools in 2026 The blue link text
snippet A comparison of the most popular... The description under the title
url https://example.com/scraping-tools The real destination, already unwrapped from Bing's redirect
displayedUrl example.com › blog The URL as Bing renders it

One row per result. Ad rows are opt-in through include_ads and arrive on the same page at no extra page cost, which is how you keep a record of who bids on your keywords.

Who this is for

SEO consultants who report Bing positions next to Google ones, brand and PPC teams who want the ads on their keywords on file, and developers feeding a live SERP into an agent or a dataset pipeline.

The manual way, and where it breaks

The DIY version: request bing.com/search?q=..., parse the b_algo blocks, follow the pagination. Bing tolerates plain HTTP better than Google does, so the prototype comes together fast; mine took an afternoon. Then the cracks show. Every href is a bing.com/ck/a redirect with the destination buried in an encoded parameter, so you decode each one or your dataset fills up with tracking URLs. The markup drifts and your selectors rot. Worst for rank tracking: results shift with the requesting IP, market, and device, so positions collected from your laptop rarely match what your client in Denver sees. Fixing that means proxies, retries, and a maintenance rota for what was supposed to be a side feature.

The faster way: run the Bing Search API

Documented JSON in, documented JSON out, nothing to keep alive.

Apify Console

  1. Open the Bing Search API and click Try for free.
  2. Enter a query, set max_pages, and optionally a location, market, or device.
  3. Run it and export the rows as JSON, CSV, or Excel.

REST

curl -X POST "https://api.apify.com/v2/acts/johnvc~bing-search-api/runs?token=YOUR_APIFY_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{ "query": "web scraping tools", "max_pages": 1 }'
Enter fullscreen mode Exit fullscreen mode

You pay per SERP page fetched, so max_pages doubles as your budget cap. Run endpoint reference: the Apify API docs.

Scrape Bing search results in Python

Call the Actor with apify-client; each dataset item is one result row:

from apify_client import ApifyClient

client = ApifyClient("YOUR_APIFY_TOKEN")

run = client.actor("johnvc/bing-search-api").call(
    run_input={
        "query": "web scraping tools",
        "max_pages": 2,
        "location": "Boston",
        "device": "desktop",
    }
)

for row in client.dataset(run["defaultDatasetId"]).iterate_items():
    print(row["page"], row["position"], row["title"], row["url"])
Enter fullscreen mode Exit fullscreen mode

The published task Scrape Bing search results carries a runnable version of this setup.

Check where one keyword ranks

Filter the rows for your domain and position is the answer. The task Bing keyword rank checker is preconfigured for exactly that: one keyword in, a ranked list out, no code involved.

Turn repeat runs into Bing rank tracking

A single run is a snapshot. Run the same query again tomorrow and next week, and the sequence of position values becomes a trend line you own rather than a chart you rent. The task Bing rank tracking is the starting configuration for that loop.

Pull the full Bing SERP as JSON

For SERP analysis you want the whole page instead of one domain's rank: every organic row plus the ads. The task Bing SERP API shows that setup with include_ads switched on.

Check Bing rankings for Chinese keywords

Bing serves the Chinese market too, and the rows come back with the same fields for Chinese-language queries. The task Biying paiming chaxun (必应排名查询, Bing rank checking) is the Chinese-market version of the rank checker.

Run Bing searches from Chinese-language projects

Its sibling task Biying sousuo api (必应搜索 API) frames the same Actor for Chinese-speaking developers: query in, identical JSON out.

Use it from Claude and other MCP clients

Apify exposes the Actor over the Model Context Protocol, so Claude, Claude Code, and Cursor can run a Bing search mid-conversation and cite real URLs instead of guessing. The task Bing search in Claude via MCP has the config, and you can read more about Claude Code at claude.ai.

Working example on GitHub

The quick-start repo has a runnable Python client plus MCP install walkthroughs for Claude, Cursor and ChatGPT.

GitHub logo johnisanerd / Apify-Bing-Search-API

bing rank tracking: Python + MCP quick-start for the Bing Search API on Apify. Call it from Python (uv) or as an MCP tool in Claude and Cursor. Returns structured JSON for bing rank tracking.

📊 Bing Search API: Bing rank tracking and SERP data as JSON

Actor: johnvc/bing-search-api · Input schema

This repo shows two ways to use the Bing Search API on Apify: a Python quick start and MCP installs for five AI clients. Query Bing, get organic results with real destination URLs, optionally the ads, and track where a domain ranks by city and device. If you were about to scrape Bing search results yourself, this is the page as JSON with the redirect wrappers already unwound.

Video Walkthrough

Watch the walkthrough

Text walkthrough

The bing search api takes a query plus max_pages, which is also the billing unit: you pay per page of results, whatever that page holds, because the engine controls its own depth. Each organic row carries position, page, title, snippet, the real url rather than an expiring tracking link, displayedUrl and date. Set location to a city and device to desktop…




FAQ about scraping Bing

Is the Bing scraper free, and what does a run cost?

Runs bill per SERP page fetched, not per result. Bing gives you no control over how many organic rows a page carries, so the page is the honest unit: a thin page never costs more than it is worth, and max_pages caps spend before the run starts. New Apify accounts include free platform credit, so early experiments usually cost nothing out of pocket.

Why did the Bing scraper return only a few rows for my keyword?

Because Bing sent only a few. Organic depth varies a lot by query, roughly 2 to 10 rows per page in my measurements, and no input changes that because Bing exposes no page-size control. That variability is exactly why billing is per page rather than per row.

Does the Bing scraper work from Node.js?

Yes. The run endpoint is plain REST, so fetch works fine, and Apify publishes apify-client for JavaScript on npm with the same call-then-read-dataset flow as the Python example above.

Can Claude run the Bing scraper over MCP?

Yes. Connect the Apify MCP server and the Actor appears as a callable tool: Claude fills in the query, runs the search, and reads the rows back into the conversation. The MCP task above holds the exact config.

Can I schedule the Bing scraper to track rankings automatically?

Yes, and that is the main reason to run it. Save your query as a task, attach an Apify schedule, and each run appends a fresh set of positions; the accumulated runs are the ranking history a rank tracker would sell back to you. Start from the Bing Search API.

Should I point my scraper at DuckDuckGo instead of Bing?

For a DIY build, maybe: DuckDuckGo's HTML is simpler to parse. But DuckDuckGo has long leaned on Bing's index for its traditional links, so if you care about where rankings originate, Bing is the engine to measure. If you want DuckDuckGo itself, there is a separate DuckDuckGo Scraper for that.

More from Truffle Pig Data

The same page-in, JSON-out pattern covers the other engines we run: the Baidu Search Scraper if the Chinese-market tasks above are your actual market, the Yandex Search Scraper for Russian-language SERPs, and the Naver Search API for Korea.

Wrapping up

Bing's official API is gone, and its replacement was never meant for rank data. The Bing Search API gets you the same SERP as clean JSON in one call: point it at a keyword you care about today and diff the positions next week.

Top comments (0)