# Bing Search API is retired: how to get raw web and news results as JSON again

> Source: <https://nestdaddy.com/blog/bing-search-api-alternative>
> Published: 2026-11-11 00:00:00+00:00

# Bing Search API is retired: how to get raw web and news results as JSON again

Microsoft shut down the Bing Search APIs on 11 August 2025. Its suggested replacement gives AI answers inside Azure agents, not raw results. Here is how to move web search, news search and page reading to NestDaddy, with code.

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](https://learn.microsoft.com/en-us/lifecycle/announcements/bing-search-api-retirement) 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 real-time news collection from around the world. 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, worldwide news, 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:

``` python
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:

``` python
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:

``` python
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](https://nestdaddy.com/blog/add-live-web-search-to-claude-mcp).

## 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:

1. Run your 20 to 50 most common real queries through both your old logs and NestDaddy.
2. Check that the results your users click are there.
3. 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](https://nestdaddy.com/mcp) and in the [API docs](https://nestdaddy.com/apis).

Working examples in Python, JavaScript and curl are on GitHub: [nestdaddy/nestdaddy-examples](https://github.com/nestdaddy/nestdaddy-examples).
