Bing Search API

Get search results, news and suggestions as JSON

The Bing Search API returns web, news and video search results as clean JSON.

no credit card1,000 free credits · instant API key · live in 10 seconds
Missing a Bing Search endpoint, or need a source we don't have yet?Contact us real people · same-day reply.
B
/bing/v1

4 active endpoints. Every call is 1 credit.

  • POST/bing/v1/search
  • POST/bing/v1/news
  • POST/bing/v1/videos
  • POST/bing/v1/autocomplete

What Bing Search endpoints does ReefAPI ship?

4 live read endpoints. Read-only data API: no writes, no account actions, no dashboard access on the target site.

4 endpoints

search

1 cr

Bing web search results.

required
q
optional
engine, depth, mkt, gl, hl, count, page, first, safe, freshness, device

news

1 cr

Bing News results for a keyword.

required
q
optional
mkt, gl, hl, count, freshness

videos

1 cr

Bing video search results.

required
q
optional
mkt, gl, hl, page, first, safe

autocomplete

1 cr

Bing search autocomplete.

required
q
optional
mkt, gl, hl

Every parameter, every allowed value →

Bing Search API

3 of 4 endpoints, ready to run

View docs ↗

Ranked organic results with title, URL, a displayed breadcrumb, the snippet, the SERP position and a publish date where one is exposed — plus related searches and an answer box when there is one.

1 credit1 required · 4 optional
POST/bing/v1/search
idle
// Press "Try it" and this pane shows exactly what the
// live site returned this second — including an empty
// result, if that is the truth. No key, no account.

How the Bing Search API works

Bing Search is a normal ReefAPI surface — the same four rules that hold for every other engine on the key.

01
Authenticate
x-api-key header

No OAuth app, no request signing, no per-site account. One key covers all 185 engines.

02
Call
POST /bing/v1/…

Every route is a POST with a JSON body. Parameters are validated against the published schema before anything is charged.

03
Pay
1 credit per call

Credits, not seats. Failed and blocked calls are never charged, and cache hits cost nothing.

04
Read
{ ok, data, meta, error }

One envelope everywhere. meta carries latency_ms, record_count and the endpoint that answered.

Read data.engine before you read the results

The first field in the response says which index answered. On the default setting that is not always the one on the label, and the difference is not cosmetic — measured, the two indexes agreed on two URLs out of twenty.

01search
POST/bing/v1/search
{"q": "web scraping api", "count": 10}

Read data.engine. On auto this returned a different index than the endpoint name, and twenty rows deep instead of ten.

02search
POST/bing/v1/search
{"q": "web scraping api", "engine": "bing", "count": 10}

Pin the index when you are tracking rank over time, so week two is comparable with week one — then verify, because pinning it does not make it stable (next row).

03Key on url, never on position
POSTKey on url, never on position

Positions come back with gaps in them, because non-organic blocks are removed and their slots are not renumbered. position is the SERP rank, not an array index.

One credit per query. News, videos and autocomplete are separate actions on the same key and, unlike search, all three answered from the named index in every run.

request
curl -X POST https://api.reefapi.com/bing/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"q":"best laptop 2026","engine":"bing","gl":"us"}'
response envelope
{
  "ok": true,
  "data": { … },
  "meta": {
    "api": "bing",
    "endpoint": "search",
    "mode": "live",
    "latency_ms": …,
    "record_count": …
  },
  "error": null
}

What each action returns, and how locale and paging actually behave

The search action can be answered by more than one index, and the index decides which fields exist on a row, so code written against one backend breaks on the other. This table records what live calls returned on 2026-08-27: the field set per action, how mkt is derived and validated, and how page_offset maps to the position numbers you get back.

Action or parameterWhat comes backMeasured detail
search, engine=auto (the default)results[] with position, title, url, displayed_url, snippet, published_date, date_availabledata.engine came back "brave". One call for "best laptop 2026" returned 19 rows and 17 of them carried a published_date; there is no domain or favicon field on this shape.
search, engine=bingresults[] with position, title, url, displayed_url, domain, favicon, snippetExactly 10 rows, positions 1-10, no published_date. count=30 still returned 10, because Bing serves one page of ten organic results.
videosvideos[] with position, title, url, duration, platform, thumbnail_url, plus publisher, views, published and description26 rows per page. On a live "how to make pizza" call the last four fields were null on 25 of 26 rows; views is a string like "1,000+ views" and duration is "MM:SS".
autocompletesuggestions[], an ordered list of plain strings25 suggestions for "best lap" (en-US) but 12 for "beste lap" (de-DE), so the count is not fixed. Fastest action measured: 357 ms against 1.0-2.9 s for search.
mkt / gl / hldata.mkt echoes the market that was usedmkt is taken verbatim and not validated: mkt=xx-ZZ was accepted, echoed back as "xx-ZZ" and still returned results. gl and hl are only read to build mkt when mkt is absent.
page / firstdata.page_offset is the 1-based index of the first row on the pagefirst=11 on search returned positions 11-20. page=2 on videos returned page_offset 31 and positions 31-56, so a videos page is 30 items wide.

total_estimate is Bing's own "about N results" headline, not a number you can paginate against. Two calls for the same phrase minutes apart reported 369,000 and 813,000, and a deliberately nonsense query still reported 180,000.

Which index answered, and how stable is the ranking

Measured on 2026-08-28 by running the same query through all five index settings and three markets within a few minutes, and by counting duplicates and field fill on news and videos.

Against us: on auto, a different index answers

The default setting returned data.engine naming an index other than the one on the endpoint. That is documented behaviour and it is the better result — but it is not what the endpoint name implies, and it decides your data. Pin the engine parameter for anything you will compare over time.

The indexes genuinely disagree

One query, five settings, minutes apart. Overlap in URLs: 2 of 20 between the two general web indexes, 4 between one of them and a third, and 0 against the news index. Depth differs too — for the same requested count of 10 we got 20 rows, one clean page of 10 numbered 1 to 10, another 10, and 100. There is no single 'the results'; there is the index you chose.

Against us: even the same index moves between calls

Two calls to the SAME index, same query, minutes apart, shared 8 URLs out of 20. Rank tracking on a single sample will read as movement that is not there. Take several samples or track presence rather than exact position.

Positions have gaps and that is correct

Rows came back at positions 2, 3, 6, 7, 8, 9, 10, 12. The missing numbers are ad and feature blocks that are stripped out; the surviving numbers are the true SERP rank. Never index an array by position.

Against us: the market parameter did nothing on the default path

Three different markets returned identical top-three URLs and the same twenty rows. Locale is a parameter of the named index, not of the one that answers by default. If you need per-country results, pin the index that supports them and verify the result actually changed.

Against us: news duplicates every row, videos are thinly filled

A news call returned 20 rows containing 10 unique URLs — every article exactly twice. Dedupe on url yourself. The source label also has the article's age glued onto it, and 8 of 20 rows carried no publisher name at all. On videos, the watch URL, title, thumbnail, duration and platform were on all 26 rows, but the publisher, view count and publish date were filled on 1 of 26, and the platform label came back in two different formats.

What people build with Bing Search

The jobs this data is most often used for.

4

endpoints

1

credit per call

01

SEO tools call search to track Bing rankings for target keywords.

02

Research products use news and videos for broader coverage.

03

AI pipelines use search as a retrieval source for grounding.

What Bing Search data costs

The cheapest call here is 1 credit, so $15/mo (Pro) buys 10,000 of them — $1.50 per 1,000 credits. Credits roll over and never expire, and failed or blocked calls are not charged.

Full pricing →
$0.67–$1.50 / 1,000 credits
  • 1,000 free credits on signup, no card
  • One key, all 185 APIs, one credit pool
  • Failed and blocked calls are never charged
  • Credits roll over and never expire

Call it in two lines

Sign up, get 1,000 credits and one key that works on every engine. Then this is the whole protocol.

curl
curl -X POST https://api.reefapi.com/bing/v1/search \
  -H "x-api-key: $REEF_KEY" \
  -H "content-type: application/json" \
  -d '{"q":"best laptop 2026","engine":"bing","gl":"us"}'
python
import requests

r = requests.post(
    "https://api.reefapi.com/bing/v1/search",
    headers={"x-api-key": REEF_KEY},
    json={
  "q": "best laptop 2026",
  "engine": "bing",
  "gl": "us"
},
)
print(r.json()["data"])
FAQ

Have a question? We got answers.

The questions people actually ask before wiring up Bing Search.

Get a free key →
Which index answers a search call, and should I change it?

The engine parameter defaults to auto, and on a live call data.engine came back as "brave". Setting engine=bing switches to Bing's own index and changes the row shape: you gain domain and favicon, you lose published_date. In our own measurements the bing backend was also unstable on relevance, with two identical de-DE calls for "kaffeemaschine test" returning German coffee-machine retailers once and a page of New York hotel listings the other time. Leave engine on auto unless you specifically need Bing's index, and check that your terms appear in the rows you get.

Why do positions skip numbers on the default backend?

Because position is the slot the result occupied on the results page, not its index in the array. A 19-row response came back numbered 2, 3, 7, 8, 9, 10, 12, 13 and on up to 24, with the missing numbers taken by non-organic blocks that are not returned. Iterate the array; never assume results[0].position is 1 or that positions are contiguous.

What does a query with no real matches return?

On the search action, not an empty list. The query "zxqwvlp qqwerzz nonexistentterm12345" came back ok:true with 10 rows about Sacramento, California and a total_estimate of 180,000. There is no zero-result signal on that path, so validate relevance yourself. The one backend that does say no is gnews: engine=gnews on a quoted phrase with no coverage returned ok:false with error code NOT_FOUND.

Why does count=30 only give me 10 results?

The parameter is accepted and clamped into the 1-30 range, but Bing serves ten organic results per page regardless. A live search with count=30 returned record_count 10. To go deeper, page instead: pass first=11 (or page=2) and read data.page_offset to confirm where the page actually started.

How reliable is search pagination?

Best-effort, and the response tells you which mode you got. meta.pagination_note came back "page1" on a first-page call and "offset-best-effort" when first=11 was passed. On that call the offset held and positions 11 through 20 came back, but bare offset paging on this surface is session-sensitive and can repeat page one, so compare data.page_offset and the URLs before assuming you advanced.

Which video fields can I depend on?

position, title, url, duration and platform were populated on all 26 rows of a live call. publisher, views, published and description were null on 25 of those 26. platform is also not a clean taxonomy: the same 26 rows carried "www.youtube.com" 18 times, "www.tiktok.com" 7 times and "YouTube" once, so normalize it before grouping.

Does mkt have to be a valid market code?

It is not validated. mkt=xx-ZZ was accepted, echoed back unchanged in both data.mkt and meta.mkt, and results still came back, in that case German pages, because an unrecognized market falls through to whatever locale the request resolved to. If locale matters, send a real lang-COUNTRY pair such as en-US, en-GB or de-DE and verify data.mkt on the way out.

What is the Bing Search API?

Bing Search API is a ReefAPI endpoint group for bing search It returns live JSON through POST requests under /bing/v1.

Is the Bing Search API free to try?

Yes. ReefAPI starts with 1,000 free credits, no card required. Bing Search calls use the same shared credit balance as every other ReefAPI engine.

Do I need a Bing Search login or account?

No login to Bing Search is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.

How fresh is the Bing Search data?

The page example is captured from a live search call, and production requests fetch live data through ReefAPI rather than a static sample.

How many credits does the Bing Search API use?

Bing Search actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.

Can I call Bing Search from an AI assistant or MCP client?

Yes. Connect ReefAPI once through MCP and your assistant can call bing actions with the same key, credit pool and JSON envelope used by normal REST requests.

Is the Bing Search API a Bing Search scraper?

It is the managed alternative to a DIY Bing Search scraper. Instead of building and maintaining your own scraper — proxies, headless browsers, captcha and constant breakage — you call one ReefAPI endpoint and get the same bing search back as clean JSON.

2 Search & SEO APIs on the same key

One key, one credit pool, one response envelope. If you are pulling Bing Search, you are one call away from the rest of the category — no second contract, no second integration.

Need something this API does not do?

Name the endpoint, the field, or a source we do not carry yet. We ship new APIs every week and you would be first to get the key. Real people read every message and reply the same day.

0/4000

No account needed · we reply from [email protected]

Try it on your own data before you pay anything

The call above is the real endpoint, not a recording. A free key gives you 1,000 credits, the other 184 APIs, and the same envelope everywhere.

Endpoints, parameters and credit costs on this page are read from the live catalog and cannot drift from what the API accepts. Field notes were captured on 2026-08-28.