Bing Search Scraper – SERP Results
Pricing
$0.60 / 1,000 organic results
Bing Search Scraper – SERP Results
Scrape Bing organic search results for any keyword. Get rank, URLs, domains, snippets, dates, sitelinks and SERP features across 50 countries with pagination.
Pricing
$0.60 / 1,000 organic results
Rating
0.0
(0)
Developer
DataScraperES
Maintained by CommunityActor stats
0
Bookmarked
2
Total users
1
Monthly active users
3 days ago
Last modified
Categories
Share
Bing Search Scraper
Get structured Bing organic web-search results for one or many keywords. The Actor returns each result as a separate dataset row with its rank, title, destination URL, domain, snippet, date (when Bing shows one), sitelinks, rich facts and optional SERP features.
It is intended for Bing web search research: it does not scrape Bing Images, News, Maps, Copilot chats or logged-in/private content.
Who is it for?
- SEO teams tracking Bing rankings by keyword and country.
- Competitor researchers comparing domains and result-page visibility.
- Content and topic researchers discovering related searches, questions and answer cards.
- Analysts and developers building reproducible SERP datasets for reporting or downstream workflows.
- Lead-research teams finding public websites that match targeted commercial searches.
What the Actor does
- Runs from 1 to 1,000 unique search queries in one run.
- Localizes results to one of 50 countries. You select a country code; the Actor selects the matching Bing market automatically.
- Retrieves 1–20 Bing pages per query, subject to a maximum of 50 unique organic results per query.
- Decodes Bing redirect links where possible, so
urlcontains the destination instead of a Bing tracking link. - Removes duplicate organic URLs between pages.
- Optionally extracts query-level SERP modules: result-count text, related searches, People Also Ask links, answer cards, knowledge-panel summary and ads.
- Writes progress incrementally and a
SUMMARYrecord at the end of the run.
Quick start
- Open Bing Search Scraper on Apify.
- Enter one or more terms in Search queries.
- Select the Search country where you want Bing results localized.
- Set the desired number of pages and maximum results per query.
- Click Start. When the run finishes, open the Dataset tab to export JSON, CSV, Excel, JSONL, XML or RSS.
Example input:
{"queries": ["best project management software","web scraping tools"],"country": "US","pagesPerQuery": 2,"maxResultsPerQuery": 20,"safeSearch": "Moderate","includeSerpFeatures": true,"includeAds": false}
Input reference
| Field | Type | Required | Default | Accepted values | Description |
|---|---|---|---|---|---|
queries | string[] | Yes | — | 1–1,000 items; each query up to 500 characters | Search terms to run. Blank entries and duplicate terms are discarded before processing. |
country | string | No | US | One of the 50 country codes listed below | Country used to localize Bing results and interface. |
pagesPerQuery | integer | No | 1 | 1–20 | Maximum Bing result pages to retrieve for each query. Retrieval can finish earlier; see Pagination. |
maxResultsPerQuery | integer | No | 10 | 1–50 | Maximum number of unique organic results returned for each query across all pages. |
safeSearch | string | No | Moderate | Strict, Moderate, Off | Bing SafeSearch setting. |
includeSerpFeatures | boolean | No | true | true or false | Adds optional query-level SERP modules from the first fetched page. |
includeAds | boolean | No | false | true or false | Adds ads to serpFeatures.ads. Ads never appear as organic-result rows. Only relevant when includeSerpFeatures is enabled. |
Supported countries
| Code | Country | Code | Country | Code | Country | Code | Country |
|---|---|---|---|---|---|---|---|
US | United States | ES | Spain | GB | United Kingdom | DE | Germany |
FR | France | IT | Italy | CA | Canada | MX | Mexico |
BR | Brazil | AU | Australia | JP | Japan | IN | India |
NL | Netherlands | PL | Poland | TR | Turkey | KR | South Korea |
ID | Indonesia | AR | Argentina | CO | Colombia | SE | Sweden |
CH | Switzerland | AT | Austria | BE | Belgium | DK | Denmark |
FI | Finland | NO | Norway | IE | Ireland | PT | Portugal |
CZ | Czechia | RO | Romania | HU | Hungary | GR | Greece |
IL | Israel | SA | Saudi Arabia | AE | United Arab Emirates | ZA | South Africa |
NZ | New Zealand | SG | Singapore | MY | Malaysia | TH | Thailand |
VN | Vietnam | PH | Philippines | TW | Taiwan | HK | Hong Kong |
CN | China | CL | Chile | PE | Peru | UY | Uruguay |
EC | Ecuador | VE | Venezuela |
Pagination and result limits
pagesPerQuery controls how far the Actor may paginate. maxResultsPerQuery controls how many unique organic rows it can return. For example, setting 10 pages and 20 results lets the Actor inspect pages until it has 20 unique results, but never returns more than 20.
Pagination stops early when any of these conditions is reached:
- The requested maximum result count has been reached.
- A page contains no new organic URLs after de-duplication.
- Bing returns a request error.
- The query time budget is reached.
- The configured number of pages has been processed.
The stop reason is exposed as paginationStoppedReason in every output row for that query.
Output
The default dataset contains two record types.
1. Organic result rows
Every delivered organic result is one row with type: "organicResult". These are the rows used for billing and export.
{"type": "organicResult","query": "web scraping tools","queryId": "a stable query identifier","country": "US","market": "en-US","pagesRequested": 2,"pagesFetched": 2,"paginationStoppedReason": "max_results_reached","organicResultsFound": 20,"page": 1,"position": 1,"title": "Example search-result title","url": "https://example.com/page","sourceDomain": "example.com","displayUrl": "https://example.com/page","description": "Snippet text shown by Bing.","date": null,"sitelinks": [{"title": "Example subpage", "url": "https://example.com/subpage"}],"richFacts": ["Optional fact shown by Bing"],"serpFeatures": {"estimatedResultsText": "About 1,000 results","relatedSearches": [],"peopleAlsoAsk": [],"answerCards": [],"knowledgePanel": {"title": null, "description": null}},"fetchedAt": "2026-07-13T12:00:00+00:00"}
| Field | Description |
|---|---|
query / queryId | Original normalized query and its stable identifier within the run. |
country / market | Selected country and Bing locale used, for example US and en-US. |
page / position | Bing page number and 1-based organic position on that page. |
title, url, sourceDomain, displayUrl, description, date | Metadata displayed by Bing. date may be null when Bing does not show one. |
sitelinks / richFacts | Optional extensions that Bing shows below an organic result. |
serpFeatures | Optional query-level modules from the first page. The same value is attached to each organic row for convenient exports. |
pagesRequested, pagesFetched, paginationStoppedReason, organicResultsFound | Query-level pagination diagnostics. |
fetchedAt | UTC timestamp when the query was processed. |
2. Query-status rows
If a query produces no chargeable organic results, the Actor writes one free row with type: "queryStatus". It includes resultCount: 0, page diagnostics in pages, the stop reason and a structured error object when one exists. These rows make empty results and request failures visible without mixing them into the organic export.
SERP features
When includeSerpFeatures is true, serpFeatures can contain the following optional fields. They depend on what Bing renders, so an empty list or null is normal.
| Field | Content |
|---|---|
estimatedResultsText | Text of Bing's displayed result estimate. |
relatedSearches | Related-search links, with title and url. |
peopleAlsoAsk | Links found in Bing's People Also Ask area, with title and url. |
answerCards | Answer-card title, description and URL when available. |
knowledgePanel | Knowledge-panel title and description when available. |
ads | Sponsored-result title, URL and description. Included only when includeAds is true. |
Run summary
The default Key-Value Store keeps a SUMMARY record, linked from the Actor output. It contains counters for requested, started, succeeded, failed, empty, organic_results_found, organic_results_delivered, organic_results_charged, skipped_by_budget, persistence_failures and stop_requested, plus chargedEventName and updatedAt.
Pricing
$1 per 1,000 organic results delivered ($0.001 each).
One delivered organicResult dataset row is one billable event. Run starts, result pages, retries, empty queries, failed queries and queryStatus rows are not charged separately. The Actor checks the Apify spending limit before starting additional paid work; it may leave remaining queries pending when the configured budget cannot cover another result.
Use through the Apify API
Use the Actor identifier datascraperes/bing-search-scraper in SDKs, or datascraperes~bing-search-scraper in REST endpoints. Replace YOUR_APIFY_TOKEN with an Apify API token and keep it private.
cURL
The synchronous endpoint waits for the run, then returns default-dataset items:
curl --request POST \"https://api.apify.com/v2/acts/datascraperes~bing-search-scraper/run-sync-get-dataset-items?token=YOUR_APIFY_TOKEN" \--header "Content-Type: application/json" \--data '{"queries": ["best crm software"],"country": "GB","pagesPerQuery": 2,"maxResultsPerQuery": 20}'
Python
from apify_client import ApifyClientclient = ApifyClient("YOUR_APIFY_TOKEN")run = client.actor("datascraperes/bing-search-scraper").call(run_input={"queries": ["best crm software"],"country": "GB","pagesPerQuery": 2,"maxResultsPerQuery": 20,})for item in client.dataset(run["defaultDatasetId"]).iterate_items():print(item)
JavaScript
import { ApifyClient } from 'apify-client';const client = new ApifyClient({ token: 'YOUR_APIFY_TOKEN' });const run = await client.actor('datascraperes/bing-search-scraper').call({queries: ['best crm software'],country: 'GB',pagesPerQuery: 2,maxResultsPerQuery: 20,});const { items } = await client.dataset(run.defaultDatasetId).listItems();console.log(items);
Reliability, data quality and responsible use
- Transient request failures are retried up to three times with exponential backoff and jitter.
- A query has a bounded processing time, so one slow Bing response cannot hold a run indefinitely.
- Completed query data is persisted incrementally and the Actor handles Apify migration events gracefully.
- Bing controls the result layout and content. Titles, snippets, dates, SERP modules and ranks can differ between runs and some optional fields can be empty.
- The Actor does not solve CAPTCHAs, bypass access controls or access private content.
- You are responsible for using exported data lawfully and in accordance with Bing's applicable terms, policies and data-protection obligations.
Troubleshooting
| Situation | What to check |
|---|---|
| Fewer results than requested | Bing may have fewer unique results, duplicate URLs may have been removed, or pagination may have stopped early. Check paginationStoppedReason and pagesFetched. |
| No date, sitelinks or SERP modules | These fields are only available when Bing displays them for that query and market. |
A query has queryStatus instead of results | Inspect its pages and error fields. The row is diagnostic and is not an organic, billable result. |
| The run stops before all queries | Review the run's spending limit and the SUMMARY record, particularly skipped_by_budget. |
| Different results than a browser session | Results can vary by time, country, Bing experiment and SafeSearch setting. Use the same input values for comparable runs. |
Local development
The published Actor is intended to be run from Apify. For contributors, the project requires Python 3.11+ and a BING_PROXY_URL environment variable configured with an HTTP proxy URL.
python -m venv .venv.venv\Scripts\Activate.ps1pip install -r requirements.txt$env:BING_PROXY_URL = "http://user:password@host:port"python -m pytest -q
Support
For questions or support, contact the Actor developer through the Apify Actor page.