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
- Open the Bing Search API and click Try for free.
- Enter a
query, setmax_pages, and optionally alocation,market, ordevice. - 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 }'
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"])
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.
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
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)