Bing API endpoint
Returns Bing web search results for a query string, including organic results, optional context panel data, related queries, people-also-ask questions, news modules, video modules, and page-based pagination. Empty optional blocks are omitted from the JSON response. Locale defaults to country=us and lang=en-us. Returns 503 on a genuine transport failure or challenge page. Bing occasionally serves a well-formed page whose results share no significant term with the query; when every attempt hits this, the response is still returned as 200 with data.low_confidence set to true (and the X-Low-Confidence header) instead of being withheld, so callers get Bing's real answer plus an honest signal to double-check it rather than nothing. Queries that use the site: operator (for example site:gov.hu) are not supported: Bing serves a bot-verification challenge for them, so they are rejected with 400 before any request is made. Use the DuckDuckGo (/api/v1/duckduckgo/search), Brave (/api/v1/brave/search), or Yahoo (/api/v1/yahoo-search/search) search endpoints for domain-restricted searches instead.
/bing/searchQuery parameters:
q: required. Search query. Example: openai.page: optional. 1-based page number; defaults to 1. Example: 1. Minimum: 1.count: optional. Results per page; defaults to 10, clamped to 1..50. Example: 10. Minimum: 1. Maximum: 50.country: optional. Two-letter country code; defaults to us. Example: us.lang: optional. Bing UI language; defaults to en-us. Example: en-us.Notable behavior:
site: operator is not supported. Bing serves a bot-verification challenge
for any query that uses it (for example site:gov.hu or budapest site:gov.hu),
so such queries are rejected with 400 before any request is made, with a
message explaining the limitation. This affects site: specifically; other
operators such as filetype: and intitle: are unaffected. For
domain-restricted searches, use the DuckDuckGo (/api/v1/duckduckgo/search),
Brave (/api/v1/brave/search), or Yahoo (/api/v1/yahoo-search/search)
search endpoints instead, all of which support site:.404, including Bing's
verified Chinese message for lang=zh-cn. Bing sometimes shows that message
for a query that does have results, so the endpoint repeats the request on
fresh connections and returns 404 only when every answer is the no-results
message; if a repeat returns results, those are the response, and if a repeat
fails the response is 503. An empty page without a recognized no-results
message returns 503 on page 1. Later pages can return 200 with an empty
results list, so status alone does not establish usable content.503.200 with the real (unfiltered) data from Bing plus data.low_confidence: true and an X-Low-Confidence: true response header, instead of withholding a response Bing actually gave. Treat low_confidence: true as a hint to double-check relevance or retry — not a guarantee the results are wrong. A response with low_confidence set is never cached, so a retry gets fresh data rather than the same suspect results. 503 still means "Bing gave us nothing at all" (a transport failure, a challenge page, or — rarely — a mix where at least one attempt failed for a reason other than relevance).| Field | Filled in, of 10 checked | Values in the sample |
|---|---|---|
| position | 10 | 1 to 10, median 5 |
| title | 10 | “OpenAI | Research & Deployment” and 9 other values |
| url | 10 | openai.com and 7 other hosts |
| description | 10 | median 124 characters |
| hostname | 10 | “openai.com” and 7 other values |
| display_url | 10 | openai.com and 2 other hosts |
| favicon | 10 | th.bing.com |
| age | 2 | “Dec 29, 2025” and 1 other value |
| age_timestamp | 2 | 2022-11-30 to 2025-12-29 |
| Parameter | Type | Required | Default | Description | Example |
|---|---|---|---|---|---|
| q | string | Yes | Search query | openai | |
| page | integer | No | 1 | 1-based page number; defaults to 1 Minimum: 1. | 1 |
| count | integer | No | 10 | Results per page; defaults to 10, clamped to 1..50 Minimum: 1. Maximum: 50. | 10 |
| country | string | No | us | Two-letter country code; defaults to us | us |
| lang | string | No | en-us | Bing UI language; defaults to en-us | en-us |
| x-api-key (header) | string | Yes | API key required |
curl -X GET "https://api.crawlora.net/api/v1/bing/search?q=openai&page=1&count=10&country=us&lang=en" \ -H "x-api-key: $CRAWLORA_API_KEY"
{
"code": 200,
"msg": "OK",
"data": {
"results": [
{
"position": 1,
"title": "OpenAI - Reddit",
"url": "https://www.reddit.com/r/OpenAI/",
"description": "OpenAI is an AI research and deployment company. OpenAI's mission is to ensure that artificial general intelligence benefits all of humanity...",
"hostname": "www.reddit.com",
"display_url": "https://www.reddit.com › OpenAI",
"favicon": "https://th.bing.com/th/id/ODLS.A2450BEC-5595-40BA-9F13-D9EC6AB74B9F..."
}
],
"pagination": {
"page": 1,
"count": 10,
"next_page": 2
}
}
}Request schema
No body schema
Response schema
#/definitions/bing.searchResponseDoc
| Field | Type | Required | Enum | Bounds | Example | Description |
|---|---|---|---|---|---|---|
| code | integer | No | 200 | |||
| data | bing.SearchResponse | No | ||||
| data.context | object | No | Knowledge panel Bing shows for the query. Omitted when there is none. | |||
| data.context.attributes | array | No | Key facts Bing lists in the knowledge panel. | |||
| data.context.attributes[].label | string | No | Founded | Name of the fact, for example `Founded`. | ||
| data.context.attributes[].value | string | No | 2015 | Value of the fact, for example `2015`. | ||
| data.context.description | string | No | OpenAI is an AI research and deployment company. | Description text shown in the knowledge panel. | ||
| data.context.image | string | No | https://example.com/openai.jpg | URL of the knowledge panel image. | ||
| data.context.subtitle | string | No | Artificial intelligence research organization | Short descriptor shown under the knowledge panel title. | ||
| data.context.title | string | No | OpenAI | Name of the entity in the knowledge panel. | ||
| data.context.url | string | No | https://openai.com/ | URL of the entity's main website or source page. | ||
| data.low_confidence | boolean | No | false | LowConfidence is true when Bing returned a well-formed page whose organic results share no significant term with the query -- a known upstream anomaly where Bing serves an unrelated SERP for certain multi-word queries instead of a challenge page or an error. The fields above are exactly what Bing returned; nothing is fabricated, reordered, or filtered. Treat a true value as a hint to double-check relevance (or retry) before trusting the results, not as a guarantee they are wrong -- some low-confidence responses are still perfectly good, they just didn't literally repeat a distinctive word from the query. Omitted (false) on every ordinary response. | ||
| data.news | array | No | News results Bing shows for the query. Omitted when there are none. | |||
| data.news[].age | string | No | 2 hours ago | How long ago the article was published, as Bing shows it. | ||
| data.news[].age_timestamp | integer | No | 1713513600 | Publication time of the article as Unix seconds in UTC. Omitted when it cannot be worked out from `age`. | ||
| data.news[].description | string | No | OpenAI announced a new model release. | Article snippet as shown on the Bing results page. | ||
| data.news[].position | integer | No | 1 | Rank of the article in the news block, starting at 1. | ||
| data.news[].related_count | integer | No | 30 | Number of additional relevant news articles Bing groups with this story. | ||
| data.news[].source | string | No | Reuters | Name of the publication, for example `Reuters`. | ||
| data.news[].thumbnail | string | No | https://example.com/openai-news.jpg | URL of the article thumbnail. | ||
| data.news[].title | string | No | OpenAI announces new model | Article headline as shown on the Bing results page. | ||
| data.news[].url | string | No | https://example.com/openai-news | URL of the news article. | ||
| data.pagination | object | No | Paging information for this response. | |||
| data.pagination.count | integer | No | 10 | Number of results requested per page. | ||
| data.pagination.next_page | integer | No | 2 | Page number of the next page. Omitted when there is no next page. | ||
| data.pagination.page | integer | No | 1 | Page number of this response, starting at 1. | ||
| data.pagination.previous_page | integer | No | 1 | Page number of the previous page. Omitted on the first page. | ||
| data.people_also_ask | array | No | Questions from Bing's People also ask block. | |||
| data.related_queries | array | No | Related searches Bing suggests for the query. | |||
| data.results | array | No | Organic web results in Bing's order. | |||
| data.results[].age | string | No | Apr 19, 2023 | Date or age shown on the result, as Bing shows it. Omitted when Bing shows none. | ||
| data.results[].age_timestamp | integer | No | 1713484800 | Time from `age` as Unix seconds in UTC. Omitted when it cannot be worked out. | ||
| data.results[].description | string | No | OpenAI is an AI research and deployment company. | Result snippet as shown on the Bing results page. | ||
| data.results[].display_url | string | No | https://www.reddit.com > OpenAI | URL as displayed under the result title on Bing. | ||
| data.results[].favicon | string | No | https://th.bing.com/th/id/ODLS.example?w=32&h=32 | URL of the site's favicon as Bing serves it. | ||
| data.results[].hostname | string | No | www.reddit.com | Host name of the result URL. | ||
| data.results[].position | integer | No | 1 | Rank of the result across all pages for the query, starting at 1. | ||
| data.results[].title | string | No | OpenAI - Reddit | Result title as shown on the Bing results page. | ||
| data.results[].url | string | No | https://www.reddit.com/r/OpenAI/ | URL of the result page. | ||
| data.videos | array | No | Video results Bing shows for the query. Omitted when there are none. | |||
| data.videos[].age | string | No | Nov 6, 2023 | When the video was published, as Bing shows it. | ||
| data.videos[].age_timestamp | integer | No | 1699228800 | Time from `age` as Unix seconds in UTC. Omitted when it cannot be worked out. | ||
| data.videos[].creator | string | No | OpenAI | Channel or creator that published the video. | ||
| data.videos[].duration | string | No | 45:12 | Video length as Bing shows it, for example `45:12`. | ||
| data.videos[].platform | string | No | YouTube | Platform hosting the video, for example `YouTube`. | ||
| data.videos[].position | integer | No | 1 | Rank of the video in the videos block, starting at 1. | ||
| data.videos[].thumbnail | string | No | https://example.com/openai-video.jpg | URL of the video thumbnail. | ||
| data.videos[].title | string | No | OpenAI DevDay keynote - YouTube | Video title as shown on the Bing results page. | ||
| data.videos[].url | string | No | https://www.youtube.com/watch?v=openai-devday | URL of the video page. | ||
| data.videos[].views | string | No | 1.2M views | View count as Bing shows it, for example `1.2M views`. | ||
| msg | string | No | OK |
| Status | Description | Schema |
|---|---|---|
| 400 | Missing or invalid query parameters | #/definitions/app.Response |
| 404 | No results found | #/definitions/app.Response |
| 429 | Rate limit exceeded | #/definitions/app.Response |
| 500 | Internal server error | #/definitions/app.Response |
| 503 | Bing upstream request failed (transport failure, challenge page, or every hedge attempt rejected -- see data.low_confidence for the case where Bing did answer but every attempt looked unrelated to the query) | #/definitions/app.Response |
Use environment variables for secrets and keep Crawlora API keys server-side.
curl -X GET "https://api.crawlora.net/api/v1/bing/search?q=openai&page=1&count=10&country=us&lang=en" \
-H "x-api-key: $CRAWLORA_API_KEY"