Bing Search API is retired: how to get raw web and news results as JSON again
On 11 August 2025 Microsoft retired the Bing Search APIs. Every existing Bing Web Search, News Search and Custom Search resource was switched off, and new sign-ups closed. If your app, scraper replacement, research tool
On 11 August 2025 Microsoft retired the Bing Search APIs. Every existing Bing Web Search, News Search and Custom Search resource was switched off, and new sign-ups closed. If your app, scraper replacement, research tool or AI agent called api.bing.microsoft.com/v7.0/search, it stopped working that day.
This guide explains what Microsoft offers instead, why it does not fit many projects, and how to move your web search, news search and page reading to the NestDaddy API with a few lines of code.
What Microsoft offers instead
Microsoft's retirement notice points customers to Grounding with Bing Search, a tool inside Azure AI Agents. It lets a language model running in Azure use web results while it writes an answer.
That works if all you want is a chatbot answer inside Azure. It does not work if you need what the old API gave you:
- Raw results as JSON: titles, URLs, snippets and dates you can store, rank, filter and show in your own UI.
- Search outside Azure: from your own backend, a cron job, a data pipeline or any agent framework.
- News search you can query by topic and country.
If that is your situation, you need a search API that returns plain results.
Map your Bing calls to NestDaddy
NestDaddy is an independent search engine with its own web index and its own news collection from 45+ countries. Its REST API returns plain JSON.
| You used | Use now | Notes |
|---|---|---|
Bing Web Search /v7.0/search?q=
|
GET /api/v1/search?q= |
Results from NestDaddy's own index |
Bing News Search /v7.0/news/search?q=
|
GET /api/v1/news/search?q= |
Key words across 45+ countries, last 120 days |
News by market (mkt=en-MY) |
country=MY on /api/v1/news/search or /api/v1/news/local
|
Two-letter country codes |
| Trending or category news |
GET /api/v1/news/global, /tech, /financial
|
Latest headlines with summaries |
| Fetching the page behind a result | GET /api/v1/extract?url= |
Readable text of the page, without menus or ads |
| Bing Custom Search | No direct equivalent | NestDaddy searches its whole index, not a list of your sites |
Authentication is one header: X-API-Key: YOUR_KEY (Bing used Ocp-Apim-Subscription-Key).
Before and after: web search
The old Bing call:
import requests
r = requests.get(
"https://api.bing.microsoft.com/v7.0/search",
headers={"Ocp-Apim-Subscription-Key": BING_KEY},
params={"q": "python asyncio guide", "count": 10},
)
for item in r.json()["webPages"]["value"]:
print(item["name"], item["url"], item["snippet"])
The same search on NestDaddy:
import requests
r = requests.get(
"https://nestdaddy.com/api/v1/search",
headers={"X-API-Key": NESTDADDY_KEY},
params={"q": "python asyncio guide", "limit": 10},
)
for item in r.json()["results"]:
print(item["title"], item["url"], item["snippet"])
Three things change: the URL, the key header, and the field names (name becomes title, and the list is results instead of webPages.value).
Before and after: news search
Bing News Search returned value items with name, url, description, datePublished and provider. NestDaddy news search returns results with title, url, description, published_timestamp and source_domain:
r = requests.get(
"https://nestdaddy.com/api/v1/news/search",
headers={"X-API-Key": NESTDADDY_KEY},
params={"q": "interest rate", "country": "MY", "days": 7, "limit": 10},
)
data = r.json()
print(data["total"], "articles")
for a in data["results"]:
print(a["published_timestamp"], a["title"], a["source_domain"], a["url"])
country takes a two-letter code (MY, SG, ID, US, GB and more), topic can be global, tech, financial or local, and days goes back up to 120.
Keep your old code: a small adapter
If many parts of your code expect Bing's response shape, wrap the new API once and keep the rest untouched:
import requests
NESTDADDY = "https://nestdaddy.com/api/v1"
def bing_like_web_search(query, count=10, key=None):
"""Return a dict shaped like Bing's /v7.0/search response, using NestDaddy."""
r = requests.get(f"{NESTDADDY}/search", headers={"X-API-Key": key},
params={"q": query, "limit": count}, timeout=30)
r.raise_for_status()
return {"webPages": {"value": [
{"name": x["title"], "url": x["url"], "snippet": x.get("snippet", "")}
for x in r.json().get("results", [])
]}}
def bing_like_news_search(query, count=10, key=None, country=None):
"""Return a dict shaped like Bing's /v7.0/news/search response, using NestDaddy."""
r = requests.get(f"{NESTDADDY}/news/search", headers={"X-API-Key": key},
params={"q": query, "limit": count, "country": country}, timeout=30)
r.raise_for_status()
return {"value": [
{"name": a["title"], "url": a["url"], "description": a.get("description", ""),
"datePublished": a.get("published_timestamp"),
"provider": [{"name": a.get("source_domain", "")}]}
for a in r.json().get("results", [])
]}
Swap your old function for these and most callers will not notice.
For AI agents: use the MCP server instead
If your Bing integration fed an AI agent, there is a simpler route. NestDaddy runs a remote MCP server at https://mcp.nestdaddy.com/mcp. Claude, Cursor, VS Code, n8n and any MCP client can connect to it, and the model calls web search, news search and page reading by itself. Setup takes one line or one config block: see How to give Claude live web search and news with one MCP server.
Test before you switch everything
Every search engine has a different index, and NestDaddy's is its own, not Bing's. Results for the same query will differ. Before you move production traffic:
- Run your 20 to 50 most common real queries through both your old logs and NestDaddy.
- Check that the results your users click are there.
- Move the queries that work, and keep an eye on the rest.
Each response includes a quota object (used, limit, remaining), so you can track usage from your own code.
Pricing and a free trial
One All-in-One key covers web search, news, page reading, research papers and the MCP server. Plans start at $9.99 a month for 10,000 calls, and there is a free 7-day trial with 5,000 calls. Details are on the NestDaddy MCP page and in the API docs.
Working examples in Python, JavaScript and curl are on GitHub: nestdaddy/nestdaddy-examples.
Originally published on the NestDaddy blog. NestDaddy is an independent search engine with its own index: nestdaddy.com.
Originally published by Dev.to WebDev. Aggregated on AIWithGhost for educational purposes β full credit and traffic to the original publisher.