Bing Videos API
Find videos matching a query.
What is this API?
Serqo’s Bing Videos API returns video results shown for a Bing query as structured JSON. Use engine: "bing" and type: "videos"; available fields can describe the title, source, duration, thumbnail and result link.
Common use cases
- Find video pages about a topic or product in Bing results.
- Compare video-result visibility across queries and search markets.
- Collect result metadata and links for content research.
Request example
POST https://api.serqo.io/v1/search
| Field | Value |
|---|---|
| engine | bing |
| type | videos |
Request headers
Create an API key and store it on your server. Send the API key in the x-api-key header.
| Header | Value | Description |
|---|---|---|
| Content-Type | application/json | JSON request body. |
| x-api-key | YOUR_API_KEY | API key used to authenticate the request. |
export SERP_API_KEY='YOUR_API_KEY'
curl https://api.serqo.io/v1/search \
-H "x-api-key: $SERP_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"q": "bread baking tutorial",
"engine": "bing",
"type": "videos",
"gl": "us",
"hl": "en"
}' Code examples
Use the same API key with a standard HTTP client. These examples require Node.js 22 or later, or Python 3.
const response = await fetch('https://api.serqo.io/v1/search', {
method: 'POST',
headers: { 'x-api-key': process.env.SERP_API_KEY, 'Content-Type': 'application/json' },
body: JSON.stringify({"q": "bread baking tutorial","engine":"bing","type":"videos"}),
});
const result = await response.json();
if (!response.ok) throw new Error(`${response.status}: ${result.error?.message ?? 'Search failed'}`);
console.log(result.data);import json
import os
from urllib.request import Request, urlopen
payload = {"q": "bread baking tutorial","engine":"bing","type":"videos"}
request = Request(
'https://api.serqo.io/v1/search',
data=json.dumps(payload).encode(),
headers={
'x-api-key': os.environ['SERP_API_KEY'],
'Content-Type': 'application/json',
},
)
with urlopen(request) as response:
result = json.load(response)
print(result['data'])Parameters
The number of results returned per request depends on the search engine and may vary.
| Field | Type | Required | Default | Description |
|---|---|---|---|---|
| q | string | Yes | — | Non-empty search query. |
| engine | string | No | Use bing for this API. | |
| type | string | No | web | Use videos for this API. |
| gl | string | No | — | Two-letter lowercase country code, for example us. |
| hl | string | No | — | Interface language code, for example en. |
| start | integer | No | — | Offset from 0 to 1000000. Use nextStart from the response. |
| safe | off | active | No | — | Explicit-content filter: off disables it, active enables it. |
| tbs | string | No | — | Not supported by Bing; omit it to avoid INVALID_PARAM. |
Only q is required by the API, but keep engine and type as shown for this search. A dash means the API does not assign a default. Unknown parameters return 422 INVALID_PARAM.
Response
HTTP 200. A real API response, trimmed to the first three results for readability. Field availability and result groups vary by the returned page; values can be null.
{
"success": true,
"requestId": "req_856d8a80-a757-44fe-91df-033c285b47ec",
"data": {
"engine": "bing",
"type": "videos",
"query": {
"q": "bread baking tutorial",
"gl": "us",
"hl": "en"
},
"searchInformation": {
"totalResults": null,
"timeTakenMs": null,
"displayed": null
},
"results": [
{
"position": 1,
"type": "video",
"title": "Ultra Soft Coconut Milk Bread Recipe (No Knead & Easy)",
"url": "https://www.tiktok.com/@cookwithhali/video/7695430221360549151",
"displayedUrl": "TikTok",
"domain": "tiktok.com",
"source": "TikTok",
"date": "1 week ago",
"snippet": null,
"thumbnail": "https://tse1.mm.bing.net/th/id/OVP.9Ylywvn0tYCAlREnFxaIngEkII?w=354&h=199&c=7&rs=1&qlt=70&r=0&o=7&pid=2.1&rm=3",
"favicon": null,
"duration": "0:37",
"price": null,
"rating": null,
"sitelinks": [],
"extensions": {
"views": "59.9K views",
"channel": "cookwithhali",
"platform": "TikTok",
"bingRedirectUrl": "https://www.bing.com/videos/riverview/relatedvideo?q=bread+baking+tutorial&&mid=7FA8BF9177274DC56F3A7FA8BF9177274DC56F3A&churl=https%3a%2f%2fwww.tiktok.com%2f%40cookwithhali&mmscn=stvo&FORM=VRDGAR",
"mid": "7FA8BF9177274DC56F3A7FA8BF9177274DC56F3A"
}
},
{
"position": 2,
"type": "video",
"title": "Crispy Baguette Recipe (No-Knead Bakery-Style)",
"url": "https://www.tiktok.com/@cookwithhali/video/7684390060862541087",
"displayedUrl": "TikTok",
"domain": "tiktok.com",
"source": "TikTok",
"date": "1 month ago",
"snippet": null,
"thumbnail": "https://tse1.mm.bing.net/th/id/OVP.9-ZThTQaXoJuiGSirmdLGQEkII?w=354&h=199&c=7&rs=1&qlt=70&r=0&o=7&pid=2.1&rm=3",
"favicon": null,
"duration": "1:02",
"price": null,
"rating": null,
"sitelinks": [],
"extensions": {
"views": "1.7M views",
"channel": "cookwithhali",
"platform": "TikTok",
"bingRedirectUrl": "https://www.bing.com/videos/riverview/relatedvideo?q=bread+baking+tutorial&&mid=E71C65EEBF1CA47EBF8DE71C65EEBF1CA47EBF8D&churl=https%3a%2f%2fwww.tiktok.com%2f%40cookwithhali&mmscn=stvo&FORM=VRDGAR",
"mid": "E71C65EEBF1CA47EBF8DE71C65EEBF1CA47EBF8D"
}
},
{
"position": 3,
"type": "video",
"title": "Farmhouse loaf recipe — beginner-friendly farmhouse loaf",
"url": "https://www.tiktok.com/@mostly_from_scratch/video/7689184828041743638",
"displayedUrl": "TikTok",
"domain": "tiktok.com",
"source": "TikTok",
"date": "4 weeks ago",
"snippet": null,
"thumbnail": "https://tse4.mm.bing.net/th/id/OVP.oIw2-8DLkwgTlLPQ9k6PywFlII?w=354&h=199&c=7&rs=1&qlt=70&r=0&o=7&pid=2.1&rm=3",
"favicon": null,
"duration": "3:38",
"price": null,
"rating": null,
"sitelinks": [],
"extensions": {
"views": "39.5K views",
"channel": "mostly_from_scratch",
"platform": "TikTok",
"bingRedirectUrl": "https://www.bing.com/videos/riverview/relatedvideo?q=bread+baking+tutorial&&mid=D7172E07A00AAE739AAAD7172E07A00AAE739AAA&churl=https%3a%2f%2fwww.tiktok.com%2f%40mostly_from_scratch&mmscn=stvo&FORM=VRDGAR",
"mid": "D7172E07A00AAE739AAAD7172E07A00AAE739AAA"
}
}
],
"features": {
"relatedSearches": [
{
"query": "All",
"url": "https://www.bing.com/search?q=bread+baking+tutorial&FORM=HDRSC1"
},
{
"query": "AI Mode",
"url": "https://www.bing.com/copilotsearch?q=bread+baking+tutorial&FORM=CSSCOP"
},
{
"query": "Images",
"url": "https://www.bing.com/images/search?q=bread+baking+tutorial&FORM=HDRSC2"
},
{
"query": "Shorts",
"url": "https://www.bing.com/videos/search?view=shortvideo&qft=+filterui:filterhint-shortvideo&q=bread+baking+tutorial&FORM=SVFBT"
},
{
"query": "Maps",
"url": "https://www.bing.com/maps?q=bread+baking+tutorial&FORM=HDRSC4"
},
{
"query": "News",
"url": "https://www.bing.com/news/search?q=bread+baking+tutorial&FORM=HDRSC6"
},
{
"query": "Shopping",
"url": "https://www.bing.com/shop/topics?q=bread+baking+tutorial&FORM=SHOPTB"
},
{
"query": "Flights",
"url": "https://www.bing.com/travel/search?q=bread+baking+tutorial&m=flights&FORM=FBSCOP"
},
{
"query": "Easter Cheese",
"url": "https://www.bing.com/videos/search?q=Easter+Cheese&&FORM=VRMHRS"
},
{
"query": "Artisan Bread Video",
"url": "https://www.bing.com/videos/search?q=Artisan+Bread+Video&&FORM=VRMHRS"
},
{
"query": "Bread Making Tips",
"url": "https://www.bing.com/videos/search?q=Bread+Making+Tips&&FORM=VRMHRS"
},
{
"query": "Paper Flower Making Tutorials",
"url": "https://www.bing.com/videos/search?q=Paper+Flower+Making+Tutorials&&FORM=VRMHRS"
}
]
},
"pagination": {
"pageSize": 60,
"page": 1,
"start": 0,
"hasNext": false,
"nextStart": null
},
"meta": {
"elapsedMs": 546
}
},
"meta": {
"cache": "miss"
}
}
Response fields
| Field | Type | Description |
|---|---|---|
| data.query | object | Search query passed to the engine. |
| data.searchInformation | object | Reported result count and search timing, when provided. |
| success | boolean | Whether the request succeeded. True in this example. |
| requestId | string | Request identifier to include when troubleshooting. |
| data.type | string | Search type used for this response. |
| data.engine | string | Engine that returned the results. |
| data.results | array | Main result list. Check feature groups as well when present. |
| data.features | object | Additional result groups; groups not returned by the engine may be absent. |
| data.pagination | object | Current offset and next-page availability. |
| data.meta.elapsedMs | number | Search duration in milliseconds, not a performance guarantee. |
| meta.cache | string | null | hit, miss, or null if cache status is unknown. |
Result fields
Read entries from data.results. Additional groups, when present, are in data.features.
| Field | Type | Description |
|---|---|---|
| data.results[].domain | string | null | Destination domain, when available. |
| data.results[].favicon | string | null | Site icon when provided. |
| data.results[].sitelinks | array | Additional links nested under the result. |
| data.results[].sitelinks[].title | string | Sitelink label. |
| data.results[].sitelinks[].url | string | null | Sitelink destination. |
| data.results[].extensions | object | Other result-specific properties. |
| data.results[].snippetHighlightedWords | string[], optional | Highlighted terms in the snippet, when provided. |
| data.results[].position | integer | Rank on this results page, starting at 1. |
| data.results[].type | string | Result category: organic, news, image, video, shopping, local, forum, book, patent or ad. This can differ from the request type. |
| data.results[].title | string | null | Title shown in the result. |
| data.results[].url | string | null | Destination URL when resolved; it may be null. |
| data.results[].displayedUrl | string | null | URL or domain displayed by the engine; not always a clickable link. |
| data.results[].source | string | null | Source name or displayed domain. |
| data.results[].date | string | null | Date text when extracted; not necessarily an ISO timestamp. |
| data.results[].snippet | string | null | Result summary. |
| data.results[].thumbnail | string | null | Thumbnail URL or inline data URL, when provided. |
| data.results[].duration | string | null | Video duration text when provided. |
| data.results[].price | string | null | Price text when provided. |
| data.results[].rating | number | null | Rating when provided. |
Video duration, thumbnails and playable streams are not guaranteed. A result link points to a page, not a downloadable video file.
Pagination
- Check
data.pagination.hasNext; stop when it is false. - Use
data.pagination.nextStartasstart. Keep the other search parameters unchanged. - Send the next request. Each page is a separate search request.
| Field | Type | Description |
|---|---|---|
| data.pagination.nextUrl | string | null | Search-engine URL for the next page, when available; use nextStart with this API. |
| data.pagination.requestedPage | integer | Page requested; may differ from the returned page if the engine does not provide it. |
| data.pagination.page | integer | Current page number. |
| data.pagination.start | integer | Current result offset. |
| data.pagination.hasNext | boolean | Whether another page is available. |
| data.pagination.nextStart | integer | null | Offset for the next request, or null when unavailable. |
Errors
{
"success": false,
"requestId": "req_example",
"error": {
"code": "INVALID_PARAM",
"message": "Unknown parameter \"page\"",
"retryable": false
}
} | Field | Type | Description |
|---|---|---|
| error.code | string | Machine-readable error code. |
| error.message | string | Reason the request failed. |
| error.retryable | boolean | Whether retrying is recommended. |
| error.retryAfterMs | number, optional | Minimum wait before retrying, in milliseconds. |
| HTTP status | Meaning | What to do |
|---|---|---|
| 400 | Invalid request or unsupported search type. | Check the query and engine/type combination. |
| 401 | Missing, invalid or revoked API key. | Check the authentication header and API key. |
| 402 | Insufficient credits. | Check your credit balance. |
| 403 | Permission or plan restriction. | Check account access and plan limits. |
| 422 | Invalid parameter. | Correct the parameter identified by error.message. |
| 429 | Request rate or queue limit. | Follow the retry rules below. |
| 5xx | Server or search service failure. | Keep the requestId; retry only if allowed. |
Retry rules
- Retry only when
error.retryableistrue. - If
error.retryAfterMsis present, wait at least that many milliseconds.
Pricing and limits
- Successful searches use credits at the applicable rate.
- Failed searches and timeouts are not charged.
- Cache hits are free at the default rate. Before searching, your available balance must cover the full request cost.
See plan pricing and rate-limit and credit details.
Frequently asked questions
Does the response include a playable video stream?
No. It describes a video result and may include a link or thumbnail when available; it does not provide or guarantee a playable media stream.
How are Bing Videos searches charged?
Successful searches use the applicable credit rate for the engine, type and country. Failed searches and timeouts release the reservation; cache hits are free at the default rate. See Pricing and limits below for the current rules.