Bing Maps Results API
Search places matching a query.
What is this API?
Serqo’s Bing Maps Results API returns local results shown for a Bing Maps query as structured JSON. Use engine: "bing" and type: "maps"; this endpoint returns search-result data and does not render an interactive map.
Common use cases
- Review local businesses shown for location-based Bing queries.
- Compare map-result visibility across query and market settings.
- Collect local-result links and details for research or monitoring.
Request example
POST https://api.serqo.io/v1/search
| Field | Value |
|---|---|
| engine | bing |
| type | maps |
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": "museums in berlin",
"engine": "bing",
"type": "maps",
"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": "museums in berlin","engine":"bing","type":"maps"}),
});
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": "museums in berlin","engine":"bing","type":"maps"}
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 maps 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_31bddf4b-a549-4f99-b039-3a163848c7c5",
"data": {
"engine": "bing",
"type": "maps",
"query": {
"q": "museums in berlin",
"gl": "us",
"hl": "en"
},
"searchInformation": {
"totalResults": null,
"timeTakenMs": null,
"displayed": null
},
"results": [
{
"position": 1,
"type": "local",
"title": "DDR Museum",
"url": "https://www.ddr-museum.de/de",
"displayedUrl": "Karl-Liebknecht Str 1 · 10178 Berlin",
"domain": "www.ddr-museum.de",
"source": "Museum",
"date": null,
"snippet": "Karl-Liebknecht Str 1 · 10178 Berlin",
"thumbnail": "https://www.bing.com/th?id=OLC.m0DkxmgxRMdmxg480x360&pid=Local",
"favicon": null,
"duration": null,
"price": null,
"rating": 4,
"sitelinks": [],
"extensions": {
"entityId": "ypid:YNF62631FD424ACBD5",
"category": "Museum",
"categoryPath": "30000.35623.30134",
"address": "Karl-Liebknecht Str 1 · 10178 Berlin",
"phone": "030 847123730",
"website": "https://www.ddr-museum.de/de",
"latitude": 52.51934814453125,
"longitude": 13.402313232421875,
"reviewCount": 6648,
"reviewSource": "Tripadvisor",
"openStatus": "Closed",
"openHoursText": "Closed now, opens at 9 AM",
"reviewsText": "reviews",
"bingCardId": "YNF62631FD424ACBD5"
}
},
{
"position": 2,
"type": "local",
"title": "Neues Museum",
"url": "https://www.smb.museum/museen-einrichtungen/neues-museum/home/",
"displayedUrl": "Bodestraße 3 · 10178 Berlin",
"domain": "www.smb.museum",
"source": "Museum",
"date": null,
"snippet": "Bodestraße 3 · 10178 Berlin",
"thumbnail": "https://www.bing.com/th?id=OLC.k/cnFmrvEXSMAA480x360&pid=Local",
"favicon": null,
"duration": null,
"price": null,
"rating": 4.4,
"sitelinks": [],
"extensions": {
"entityId": "ypid:YN21F040F27F774BE4",
"category": "Museum",
"categoryPath": "30000.35623.30134",
"address": "Bodestraße 3 · 10178 Berlin",
"phone": "030 266424242",
"website": "https://www.smb.museum/museen-einrichtungen/neues-museum/home/",
"latitude": 52.520118713378906,
"longitude": 13.397655487060547,
"reviewCount": 6044,
"reviewSource": "Tripadvisor",
"openStatus": "Closed",
"openHoursText": "Closed now, opens at 10 AM",
"reviewsText": "reviews",
"bingCardId": "YN21F040F27F774BE4"
}
},
{
"position": 3,
"type": "local",
"title": "Altes Museum",
"url": "https://www.smb.museum/museen-einrichtungen/altes-museum/home/",
"displayedUrl": "Bodestraße 3 · 10178 Berlin",
"domain": "www.smb.museum",
"source": "History museum",
"date": null,
"snippet": "Bodestraße 3 · 10178 Berlin",
"thumbnail": "https://www.bing.com/th?id=OLC.y8XLHFLt2yN28Q480x360&pid=Local",
"favicon": null,
"duration": null,
"price": null,
"rating": 4.2,
"sitelinks": [],
"extensions": {
"entityId": "ypid:YN7AC928A12C7E0E4C",
"category": "History museum",
"categoryPath": "30000.35623.30134.34166",
"address": "Bodestraße 3 · 10178 Berlin",
"phone": "030 266424242",
"website": "https://www.smb.museum/museen-einrichtungen/altes-museum/home/",
"latitude": 52.51946258544922,
"longitude": 13.398736953735352,
"reviewCount": 299,
"reviewSource": "Tripadvisor",
"openStatus": "Closed",
"openHoursText": "Closed now, opens at 10 AM",
"reviewsText": "reviews",
"bingCardId": "YN7AC928A12C7E0E4C"
}
}
],
"features": {},
"pagination": {
"pageSize": 20,
"page": 1,
"start": 0,
"hasNext": true,
"nextStart": 20
},
"meta": {
"elapsedMs": 1194
}
},
"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. |
Coordinates, place IDs, opening hours and complete addresses are not guaranteed by the current response.
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
Can I paginate Bing Maps results?
The Bing Maps API page documents the supported start parameter. Continue only when the response indicates another page and use the returned nextStart; do not assume web-search limits are identical.
How are Bing Maps 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.