To scrape Bing search results, send your queries to a scraper that loads Bing's public results pages in the market you pick and returns each page as structured data: organic results with their positions, titles, URLs, snippets and dates, plus related searches, People Also Ask and the top news story. The quickest way is the Bing Search Scraper on Scrape.ly. It costs $0.01 per 1,000 results pages plus platform usage, and it needs no Bing account, API key or proxy of your own.
This guide shows the fields you get, the no-code steps, the API (curl, Python, Node.js and MCP for AI agents), what a run costs and what to watch for. Everything comes from a real run on 23 October 2026: the German Bing market, one query, 10 results, 11 seconds.
What data you can get from Bing
Each dataset item is one Bing results page, not one result. The organic results sit in a list inside that item, next to the page's other modules. A query with 10 results can span two or three pages, so it can produce two or three items.
| Field | What it holds |
|---|---|
searchQuery.term, searchQuery.page | The query and the results page number |
searchQuery.marketCode, searchQuery.languageCode | The Bing market (setmkt) and language (setlang) used |
searchQuery.url | The Bing URL that was fetched |
organicResults[].position | Rank within the query; it counts on across pages |
organicResults[].title, url, displayedUrl | Result title, destination and the breadcrumb Bing shows |
organicResults[].siteName | The site name Bing prints above the title |
organicResults[].description, date | The snippet, and the date Bing shows when there is one |
organicResults[].sitelinks | Sitelinks, when Bing shows them |
relatedSearches[] | Related searches, each with its text and Bing URL |
peopleAlsoAsk[] | People Also Ask questions with the source URL |
news[] | The top news story: title, URL, source, age and description |
resultsTotal, correctedQuery, hasNextPage | Bing's result count estimate, its spelling correction, and whether another page exists |
Related searches, People Also Ask and news are filled when Include extras (includeExtras) is on and Bing shows them for the query. Empty values are left out, so date or sitelinks only appear on results that have them.
How to scrape Bing search results without code
- Open the Bing Search Scraper in the Scrape.ly Store and sign in.
- Pick a ready-made input. We ran the preset German Bing results on electric cars, 10 results. "Try this input" opens it in the console.
- Check the input. This is the exact JSON of our run:
{
"queries": ["elektroauto test"],
"maxResultsPerQuery": 10,
"marketCode": "de-DE",
"includeExtras": true
}- Click Start. Our run finished in 11 seconds.
- Open the Organic results view for one row per result, or the views for related searches, People Also Ask and news, and export as JSON, CSV, Excel or XML.
The fields that matter most:
queries(required): one search term per line, or a full Bing URL. A URL'sq,setmkt,setlangandccare used for that line, so you can paste a search you built in the browser.maxResultsPerQuery: organic results per query (default 10). The Actor fetches as many pages as it needs and stops early when Bing runs out. The preset Python tutorial search, 30 results shows deep pagination.marketCodeandlanguageCode: which Bing edition to search. 38 markets are available, fromen-USanden-GBtode-DE,ja-JPandpt-BR.countryCodeadds an optional country bias.- Operators:
fileTypes,exactMatch,wordsInTitleandwordsInUrladdfiletype:, quotes,intitle:andinurl:to every query.freshnesslimits results to the past day, week or month.
How to scrape Bing search results with the API
Create an API token under Settings → API & Integrations and export it as SCRAPELY_TOKEN. The Actors API docs list every endpoint.
curl. A query of a few pages takes seconds, well inside the 45-second limit of the synchronous endpoint. This call returns the results pages as a JSON array (add ?format=csv for CSV):
curl -X POST "https://api.scrape.ly/v2/actors/querystone~bing-search-scraper/run-sync-get-dataset-items" \
-H "Authorization: Bearer $SCRAPELY_TOKEN" \
-H "Content-Type: application/json" \
-d '{"queries": ["elektroauto test"], "maxResultsPerQuery": 10, "marketCode": "de-DE", "includeExtras": true}'Python (pip install scrapely-client-python). call() waits however long the run takes, which matters once you send hundreds of keywords. This example is a small rank check: it prints every result and the best position of one domain.
import os
from scrapely_client import ScrapelyClient
client = ScrapelyClient(os.environ["SCRAPELY_TOKEN"], api_url="https://api.scrape.ly")
run = client.actor("querystone/bing-search-scraper").call(
run_input={"queries": ["elektroauto test"], "maxResultsPerQuery": 10, "marketCode": "de-DE", "includeExtras": True}
)
print(run.status) # SUCCEEDED, FAILED, ABORTED or TIMED-OUT
best = None
for page in client.dataset(run.default_dataset_id).iterate_items():
for result in page["organicResults"]:
print(result["position"], result.get("siteName"), result["url"])
if "adac.de" in result["url"] and best is None:
best = result["position"]
print("adac.de best position:", best)The outer loop walks results pages (dataset items); the inner loop walks the organic results on each page.
Node.js (npm install scrapely-client):
import { ScrapelyClient } from 'scrapely-client';
const client = new ScrapelyClient({ token: process.env.SCRAPELY_TOKEN, baseUrl: 'https://api.scrape.ly' });
const run = await client.actor('querystone/bing-search-scraper').call({
queries: ['elektroauto test'],
maxResultsPerQuery: 10,
marketCode: 'de-DE',
includeExtras: true,
});
const { items } = await client.dataset(run.defaultDatasetId).listItems();
const results = items.flatMap((page) => page.organicResults);
console.log(results.map((r) => [r.position, r.siteName, r.url]));
console.log(items[0].relatedSearches?.map((s) => s.text));AI agents (MCP). Add the hosted Scrape.ly MCP server. In Cursor, put this in ~/.cursor/mcp.json:
{
"mcpServers": {
"scrapely": {
"url": "https://api.scrape.ly/mcp",
"headers": { "Authorization": "Bearer YOUR_TOKEN" }
}
}
}In Claude Code, run claude mcp add --transport http scrapely https://api.scrape.ly/mcp and sign in with /mcp. Then ask: "Use scrapely to run querystone/bing-search-scraper for 'best crm software' in en-US with 20 results, and give me a table of position, site and URL." The agent finds the Actor with search-actors, reads its input with fetch-actor-details, runs it with call-actor and reads the pages with get-actor-output. The Bing Search API page shows the same Actor as an API product.
A real run: German Bing results for "elektroauto test"
We ran the preset on 23 October 2026. It saved 3 results pages holding exactly 10 organic results in 11 seconds of run time, and it was charged $0.0016 in total. The first five results:
| Page | Position | Title | Site | Date shown |
|---|---|---|---|---|
| 1 | 1 | ADAC Test 2026: Die besten Elektroautos aller Fahrzeugklassen | ADAC |
|
| 1 | 2 | Rankings: Die besten E-Autos 2026 im Test & Vergleich … | AUTOBILD.DE | – |
| 1 | 3 | Die besten E-Autos 2026: Modelle, Preise | mobile.de | – |
| 2 | 4 | E-Auto 2026: Testsieger, Reichweite & Zuverlässigkeit | AutoScout24 |
|
| 2 | 5 | E-Auto-Angebote: E-Auto-Leasing-Testsieger 2026 – CHIP | CHIP | – |
What the full run shows:
- Page 1 held only three blue links. With extras on, Bing's full layout gave page 1 a news card and related searches but just three organic results, so the Actor took three pages to reach 10 and trimmed the last page to the cap. You still pay per page, which at $0.00001 a page is a rounding error.
- Two publishers own four of the ten spots. ADAC ranks at 1 and 6, AUTO BILD at 2 and 10.
- Freshness is mixed. Six results carry a date. The newest is from 13 October 2026, the oldest from 27 August 2014, still at position 7.
- Keyword ideas come along. Page 1 carried 10 related searches (such as "elektroauto testsieger" and "die besten e autos adac"), and the top news story came from BILD.de, two days old. Bing showed no People Also Ask box for this query.
- Bing's estimate: about 68,600 results on page 1.
The log, without the platform's start-up lines:
2026-10-23T03:02:28.323Z [Scrapely] Container started (setup 5.7 s)
2026-10-23T03:02:29.748Z [scrapely.actor] INFO Started: 1 queries, up to 10 results each, residential proxy (market country)
2026-10-23T03:02:32.837Z [scrapely.actor] INFO Done: 3 pages, 10 results from 1 queries in 3s. traffic=2.3 MB wire=0.69 MB (p1 432 KB/2, later 261 KB/2) conns=2 early=0 retries=0 decoy=0 hedged=0 ajax=2 seeded=0 boot=0.3s
2026-10-23T03:02:33.068Z [scrapely.actor] INFO [Status message]: Done: 3 pages, 10 results from 1 queries in 3s.
2026-10-23T03:02:33.562Z [Scrapely] Container state: status=exited exitCode=0 oomKilled=falseThe scraping itself took 3 seconds; the rest was container start-up. decoy=0 and retries=0 mean every page Bing sent matched the query and the requested page number, so nothing had to be fetched again. The Actor used a residential exit in Germany, the market's country, without any proxy setting from us.
What it costs
The Actor charges one event: $0.00001 per results page, which is $0.01 per 1,000 pages. A page holds about 10 organic results. Empty pages, errors and retries are free. Platform usage (compute and proxy traffic) is billed on top.
For our run: 3 pages × $0.00001 = $0.00003 in page fees. The run was charged $0.0016 in total: $0.0013 of residential proxy traffic, $0.00018 of compute and $0.00007 of storage writes. Proxy traffic is most of the bill, so cost scales with pages fetched. The Actor's README puts the total at roughly $0.0004–0.0005 per page on default settings, so 1,000 pages land between $0.40 and $0.50 all in. A datacenter proxy is cheaper if you only need first pages.
What to watch out for when scraping Bing
- Decoy pages. Bing can answer automated requests with results for a different query. The Actor checks every page against your query, retries on a fresh IP and saves nothing (and charges nothing) when Bing keeps sending decoys. Such queries are listed under
failedInputsin the run'sOUTPUTrecord. - Later pages on datacenter IPs. On datacenter proxies Bing sometimes answers every page request with page 1 again. Residential proxies, the default, paginate reliably, so keep the default for rank tracking beyond the top 10.
- Fewer blue links per page. Maps, shopping, video and news blocks replace organic results on some queries. Count
organicResultsinstead of assuming 10 per page. - Organic results, not ads. Bing loads ads with a script after the page, so the output holds the organic rankings. Bing also ignores
site:for this kind of request; usewordsInUrl(inurl:),filetype:,intitle:or quotes instead, which all work. - Results move. Bing varies results by location and between requests. For trends, run the same queries on a schedule and compare positions over time rather than trusting one snapshot.
Is it legal to scrape Bing search results?
Bing results pages are public: the Actor reads what any visitor sees, without logging in. Bing's own rules for automated access are worth knowing, though. Its robots.txt disallows /search for all user agents, and Microsoft's terms of use apply to how you use Bing, so read the current versions before you build a product on Bing data.
The results themselves are mostly titles, URLs and snippets of public web pages. Snippets belong to the sites that wrote them, so treat them as references, not content to republish. Results rarely contain personal data, but some name people; if you store those, privacy laws such as the GDPR and the CCPA apply. For rank tracking and market research on public results at a reasonable volume, those are the rules to follow. This is general information, not legal advice: for commercial use, ask a lawyer about your case.
Why Scrape.ly for Bing data
- The official API is gone. Microsoft retired the Bing Search APIs on August 11, 2025. It points customers to Grounding with Bing Search in Azure AI Agents, a way for LLM agents to use web data in their answers, not a results export with positions.
- Rows instead of selectors. Typical Python tutorials parse
li.b_algowith requests and BeautifulSoup, one page at a time with a generic user agent. The Actor handles pagination, 38 markets, decoy checks and residential exits, and returns positions, dates, related searches and news as fields. - The cheapest line on your bill. $0.01 per 1,000 results pages, and the whole 10-result run above cost $0.0016. Set a maximum charge per run if you want a hard cap.
- Built for tracking. Schedule the same keyword list daily, send results to Google Sheets or a webhook, and run the same keywords on Google with the Google Search Scraper to compare both engines. Our guide to scraping Google search results covers the Google side.
FAQ
Can you scrape Bing search results with Python?
Yes. The Python example above starts a run, waits for it and prints position, site and URL for each result. The Actor fetches and parses the pages, so your code only reads JSON. Install scrapely-client-python and pass your token.
Can I still get Bing results from Microsoft's official API?
No. Microsoft retired the Bing Search APIs on August 11, 2025 and decommissioned existing instances. Its recommended replacement, Grounding with Bing Search, is part of Azure AI Agents and feeds web data into model answers rather than returning ranked result lists.
How do I scrape Bing results for another country?
Set marketCode, for example en-GB, de-DE or ja-JP. The language follows the market unless you set languageCode, and the Actor uses a residential exit in the market's country by default. Our German run used a German exit without extra settings.
How many Bing results can I get per query?
As many as Bing serves. Set maxResultsPerQuery and the Actor walks the pages until it has that many or Bing runs out. Each page is one dataset item and one $0.00001 event.
Can I scrape Bing's related searches and People Also Ask?
Yes. Turn on includeExtras. Each page item then carries relatedSearches, peopleAlsoAsk (questions and source links) and the top news story whenever Bing shows them. Our run returned 10 related searches on page 1.




