SEO & ads intelligence
Bing Search API Replacement Scraper
Bing SERP scraper and Bing Search API alternative — returns organic results (title, URL, displayed URL, snippet, position) for any query, export to JSON or CSV. A drop-in replacement for the deprecated Bing Search API for SEO, brand monitoring, and AI agents.
Free Apify credit covers a first run. No credit card to try.
What this Actor scrapes
Bing's public www.bing.com/search SERP — the same page any browser renders for a typed query. Per query the Actor:
1. Issues GET https://www.bing.com/search?q=<query>&cc=<country>&setlang=<language>&count=10&first=<offset> via curl-cffi with rotating browser fingerprints. 2. Parses every <li class="b_algo"> block with parsel to extract title, snippet, displayed URL, and the redirect-wrapped href. 3. Decodes the Bing redirect: bing.com/ck/a?...&u=a1<base64url> → canonical destination URL. No Bing redirect wrappers ever reach your dataset. 4. Paginates via &first=0,10,20,... until maxResultsPerQuery rows are emitted or the page returns zero organic blocks.
What we handle for you
- Drop-in Bing Search API replacement — same shape (query → list of organic results), no Microsoft API key required.
- Locale-aware —
cc=/setlang=flow straight through to Bing; one Actor covers every market from US to JP to DE. - URL decoded — Bing redirect wrappers (
bing.com/ck/a?...) are always decoded to the canonical destination URL. Your dataset joins cleanly against any URL-keyed dataset. - We rotate browser fingerprints —
curl-cffiimpersonates Chrome 131, Chrome 124, and Firefox 147 TLS+H2 fingerprints per page. Bing sees real-browser handshakes, not Python. - We rotate residential proxies — Apify Proxy is on by default. Bing weights residential exits strongly over datacenter IPs, especially for paginated bursts. On every block we rotate session_id and exit IP.
- We retry with exponential backoff — 429 / 503 responses trigger a 2 s → 4 s → 8 s → 16 s → 30 s retry ladder, honouring
Retry-Afterheaders, up to 5 attempts per page. - Per-query isolation — one query failing (zero results, network hiccup) does not abort the run. Remaining queries continue and the run surfaces a partial-success status message.
- Early-stop on empty page — we stop paginating when Bing stops returning organic blocks, instead of hammering empty pages.
- Pydantic v2 validation — input and every output row are model-validated. Invalid input fails fast with a clear message before any network call.
Use cases
- Bing Search API migration — Microsoft retired the official endpoint on August 11, 2025. This Actor is the drop-in replacement for client reports, AI search agents, and competitive intelligence pipelines that depended on it.
- SEO rank tracking — schedule weekly runs across your target queries, write to a named dataset, and chart
positionover time per keyword and locale. - Brand monitoring — watch the top 30 organic results for branded queries (your brand, competitors, key product names) and alert on new entrants.
- AI search agents and RAG pipelines — feed live SERP context into LLM agents. Bing diversifies your retrieval from Google: more forums, more long-tail, more long-form blogs.
- Multi-locale SERP comparison — pass the same query with different
cc=/setlang=values to compare what Bing shows in the US vs UK vs DE vs JP. - Content-gap analysis — pull the top 30 results for queries you want to rank for and reverse-engineer what content Bing rewards.
- Quality-assurance for Bing Webmaster Tools data — cross-check the impressions and positions Bing reports against what the live SERP actually shows.
- Bing SERP data for LangChain and LlamaIndex agents — replaces the now-dead
BingSearchAPIWrapperandBingToolSpecintegrations that called the retired API.
Input
Paste this into the Apify Console, or send it as the run input over the API. Proxy settings are on by default; you rarely need to touch them.
| Field | Type | Required | What it does |
|---|---|---|---|
queries | array | yes | List of search queries. One dataset row is emitted per (query × organic result). At least one query is required. |
country | string | no | ISO-3166-1 alpha-2 country code passed to Bing as cc= (e.g. US, GB, DE, JP). |
language | string | no | ISO-639-1 language code passed to Bing as setlang= (e.g. en, de, fr, ja). |
maxResultsPerQuery | integer | no | Upper bound on organic results returned per query. Bing serves 10 organic results per page; the scraper paginates via &first=0,10,20... until this limit is reached or a page returns zero results. |
useProxy | boolean | no | Route requests through Apify Proxy (BUYPROXIES94952, a static US datacenter pack). Recommended ON. Note that Bing weights residential exits more favourably than datacenter IPs, so select a RESIDENTIAL group here if… |
{
"queries": [
"apify web scraping"
],
"country": "US",
"language": "en",
"maxResultsPerQuery": 30,
"useProxy": true
} Output
One row per result, schema-validated before it is written. Export JSON, CSV, Excel or XML from the run, or read it over the API.
querypositiontitleurldisplayed_urlsnippetcountrylanguagescraped_at
{
"query": "bing search api replacement",
"position": 1,
"title": "DevilScrapes \u2014 Bing Search Scraper",
"url": "https://apify.com/DevilScrapes/bing-search-scraper",
"displayed_url": "https://apify.com \u203a DevilScrapes \u203a bing-search-scraper",
"snippet": "Drop-in replacement for the retired Bing Search API. Organic results for any query, locale-aware, residential-proxy-backed.",
"country": "US",
"language": "en",
"scraped_at": "2026-05-16T13:40:00.000Z"
} Pricing
| Event | Price | When |
|---|---|---|
| Actor start | $0.20 | Once per run, covers warm-up and proxy session setup. |
| SERP result row | $0.0010 | Per result written to the dataset. |
You pay only for results that land. Cap any run with maxTotalChargeUsd. See pricing & billing for worked examples.
Limitations
- Organic web results only — People-Also-Ask boxes, Related Searches, news, images, videos, maps, and Bing's local pack are out of scope for v1.
- Featured snippets are not extracted as a separate field — when Bing's featured snippet sits inside a
<li class="b_algo">block it appears as a regular row. Nois_featuredflag in v1. - Up to 100 results per query —
maxResultsPerQueryis capped at 100. Past page 10 Bing's organic results become unreliable. - No JavaScript rendering — we hit server-rendered HTML directly. If Bing migrates to a fully client-rendered SERP, a Camoufox path would be needed.
- Country / language are passed to Bing, not validated —
cc=/setlang=are interpolated raw into the URL. An unrecognized value will silently return default-locale results. Use standard ISO codes. - No historical tracking built in — every run is a fresh snapshot. Schedule runs and export to your own storage (BigQuery, S3, named Apify dataset) to build a time series. Apify default run-scoped storage is purged after 7 days on the free plan.
FAQ
Why does this exist? Isn't there an official Bing Search API?
What does "bing search api replacement" mean in practice?
{position, title, url, snippet, ...} rows out. Migration means swapping an API call for an Apify Actor run. The output schema is stable across versions.Is this allowed?
Why does the Actor rotate browser fingerprints?
curl-cffi impersonates real browser TLS+H2 fingerprints. Rotating across Chrome 131, Chrome 124, and Firefox 147 per page reduces correlation between consecutive requests — which lowers the chance Bing flags a paginated burst as automated traffic. We handle the blocks so you don't have to.Why is `position` 1-indexed?
Why are URLs decoded? Can I get the raw `bing.com/ck/a` redirect?
Does this work for non-English locales?
setlang=de / setlang=ja / setlang=fr all flow through to Bing. The parser is structural (li.b_algo blocks); it does not depend on English text patterns.What about People-Also-Ask (PAA) boxes?
extractPaa: true input field that adds a separate kind: "paa" row per question.Ready to run it?
Open the listing on Apify, paste the input above, and watch rows land. If it ever breaks, it is our problem before it is yours.
Related Actors