Zenserp MCP by usefulapi
Search Google, images, news, maps, shopping, YouTube, jobs, hotels, flights and trends with Zenserp.
Should I use this
Quality & Safety
Based on automated analysis of tool definitions and protocol compliance.
Context Cost
This is the approximate number of tokens consumed each time the server's tools are loaded into a model's context. Higher counts reduce the attention available for other tasks.
Install
One-Click Install
Add this to your `claude_desktop_config.json` file:
{
"mcpServers": {
"zenserp": {
"url": "https://zenserp.usefulapi.io/mcp"
}
}
}Remote endpoints
https://zenserp.usefulapi.io/mcpstreamable-httpWhat it can do
Tool inventory
Tools (19)
🟢zenserp_get_status
The number of search requests left on this Zenserp key's plan (remaining_requests). Free: it spends no quota. GET /v2/status.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴zenserp_search(q, search_engine, hl, gl, lr, ...)
Live search-engine result page as JSON: organic results, ads (paid_results), featured snippets, related questions and searches, knowledge graph. Google by default; set search_engine for Bing, Yandex or DuckDuckGo. SPENDS 1 request of the monthly quota per successful call (failed calls are not charged); do not repeat a call needlessly. ai_overview=true also returns Google's AI Overview and costs 3 requests when one is returned (Small plan or higher). GET /v2/search.
Input Schema
{
"type": "object",
"properties": {
"q": {
"type": "string",
"minLength": 1,
"maxLength": 2000,
"description": "The query; search operators such as site: and intitle: work."
},
"search_engine": {
"type": "string",
"pattern": "^(?:[a-z0-9-]+\\.)+[a-z]{2,24}$",
"description": "Search engine host, e.g. google.com (default), google.de, bing.com, yandex.com, duckduckgo.com. zenserp_list_search_engines lists them."
},
"hl": {
"type": "string",
"pattern": "^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})?$",
"description": "Interface language (hl), e.g. en, de, pt-BR. zenserp_list_languages lists the supported codes."
},
"gl": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "Country (gl), two letters, e.g. us, de, gb. zenserp_list_countries lists the supported codes. Default: United States."
},
"lr": {
"type": "string",
"pattern": "^lang_[A-Za-z]{2,3}(-[A-Za-z]{2,4})?(\\|lang_[A-Za-z]{2,3}(-[A-Za-z]{2,4})?){0,9}$",
"description": "Limit results to these languages (lr), prefixed with lang_ and joined by |, e.g. lang_fr."
},
"location": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "Geolocation of the search, in Google's canonical form, e.g. 'Manhattan,New York,United States' (see zenserp_search_locations). Set it when the result depends on place, especially ads."
},
"device": {
"type": "string",
"enum": [
"desktop",
"mobile"
],
"description": "Device to emulate."
},
"start": {
"type": "integer",
"minimum": 0,
"maximum": 990,
"description": "Result offset: 0 (default) first page, 10 second page, 20 third page ... Google serves about 300 results per query."
},
"tbs": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "Google 'tbs' filter string for what the query field cannot express, e.g. qdr:w (past week)."
},
"ai_overview": {
"description": "true = also extract Google's AI Overview (3 requests when returned, otherwise 1; slower; Google only; Small plan or higher).",
"type": "boolean"
},
"cache": {
"type": "boolean",
"description": "true = serve a stored copy when one exists (kept 24 h, NOT charged) and store the reply when not. Default false: every call is fetched live and charged."
},
"fields": {
"minItems": 1,
"maxItems": 30,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"description": "Only return these top-level keys of the reply (for example organic, paid_results, related_searches). Saves context; the call is charged the same."
}
},
"required": [
"q"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴zenserp_image_search(q, hl, gl, lr, location, ...)
Google image results (thumbnails, source pages, sizes). SPENDS 1 request of the monthly quota per successful call (failed calls are not charged); do not repeat a call needlessly. Each page holds 100 images. GET /v2/search (tbm=isch).
Input Schema
{
"type": "object",
"properties": {
"q": {
"type": "string",
"minLength": 1,
"maxLength": 2000,
"description": "The query."
},
"hl": {
"type": "string",
"pattern": "^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})?$",
"description": "Interface language (hl), e.g. en, de, pt-BR. zenserp_list_languages lists the supported codes."
},
"gl": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "Country (gl), two letters, e.g. us, de, gb. zenserp_list_countries lists the supported codes. Default: United States."
},
"lr": {
"type": "string",
"pattern": "^lang_[A-Za-z]{2,3}(-[A-Za-z]{2,4})?(\\|lang_[A-Za-z]{2,3}(-[A-Za-z]{2,4})?){0,9}$",
"description": "Limit results to these languages (lr), prefixed with lang_ and joined by |, e.g. lang_fr."
},
"location": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "Geolocation of the search, in Google's canonical form, e.g. 'Manhattan,New York,United States' (see zenserp_search_locations). Set it when the result depends on place, especially ads."
},
"device": {
"type": "string",
"enum": [
"desktop",
"mobile"
],
"description": "Device to emulate."
},
"start": {
"type": "integer",
"minimum": 0,
"maximum": 990,
"description": "Result offset: 0 (default) first page, 10 second page, 20 third page ... Google serves about 300 results per query."
},
"tbs": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "Google 'tbs' filter string for what the query field cannot express, e.g. qdr:w (past week)."
},
"ijn": {
"description": "Image page number, 100 images per page; per the docs, images 101-200 = ijn 2. Omit for the first page.",
"type": "integer",
"minimum": 0,
"maximum": 30
},
"cache": {
"type": "boolean",
"description": "true = serve a stored copy when one exists (kept 24 h, NOT charged) and store the reply when not. Default false: every call is fetched live and charged."
},
"fields": {
"minItems": 1,
"maxItems": 30,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"description": "Only return these top-level keys of the reply (for example organic, paid_results, related_searches). Saves context; the call is charged the same."
}
},
"required": [
"q"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴zenserp_news_search(q, hl, gl, lr, location, ...)
Google News results for a query: title, source, date, snippet. SPENDS 1 request of the monthly quota per successful call (failed calls are not charged); do not repeat a call needlessly. GET /v2/search (tbm=nws).
Input Schema
{
"type": "object",
"properties": {
"q": {
"type": "string",
"minLength": 1,
"maxLength": 2000,
"description": "The query."
},
"hl": {
"type": "string",
"pattern": "^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})?$",
"description": "Interface language (hl), e.g. en, de, pt-BR. zenserp_list_languages lists the supported codes."
},
"gl": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "Country (gl), two letters, e.g. us, de, gb. zenserp_list_countries lists the supported codes. Default: United States."
},
"lr": {
"type": "string",
"pattern": "^lang_[A-Za-z]{2,3}(-[A-Za-z]{2,4})?(\\|lang_[A-Za-z]{2,3}(-[A-Za-z]{2,4})?){0,9}$",
"description": "Limit results to these languages (lr), prefixed with lang_ and joined by |, e.g. lang_fr."
},
"location": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "Geolocation of the search, in Google's canonical form, e.g. 'Manhattan,New York,United States' (see zenserp_search_locations). Set it when the result depends on place, especially ads."
},
"device": {
"type": "string",
"enum": [
"desktop",
"mobile"
],
"description": "Device to emulate."
},
"start": {
"type": "integer",
"minimum": 0,
"maximum": 990,
"description": "Result offset: 0 (default) first page, 10 second page, 20 third page ... Google serves about 300 results per query."
},
"tbs": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "Google 'tbs' filter string for what the query field cannot express, e.g. qdr:w (past week)."
},
"cache": {
"type": "boolean",
"description": "true = serve a stored copy when one exists (kept 24 h, NOT charged) and store the reply when not. Default false: every call is fetched live and charged."
},
"fields": {
"minItems": 1,
"maxItems": 30,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"description": "Only return these top-level keys of the reply (for example organic, paid_results, related_searches). Saves context; the call is charged the same."
}
},
"required": [
"q"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴zenserp_video_search(q, hl, gl, lr, location, ...)
Google video results for a query (title, channel, length, link). SPENDS 1 request of the monthly quota per successful call (failed calls are not charged); do not repeat a call needlessly. GET /v2/search (tbm=vid).
Input Schema
{
"type": "object",
"properties": {
"q": {
"type": "string",
"minLength": 1,
"maxLength": 2000,
"description": "The query."
},
"hl": {
"type": "string",
"pattern": "^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})?$",
"description": "Interface language (hl), e.g. en, de, pt-BR. zenserp_list_languages lists the supported codes."
},
"gl": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "Country (gl), two letters, e.g. us, de, gb. zenserp_list_countries lists the supported codes. Default: United States."
},
"lr": {
"type": "string",
"pattern": "^lang_[A-Za-z]{2,3}(-[A-Za-z]{2,4})?(\\|lang_[A-Za-z]{2,3}(-[A-Za-z]{2,4})?){0,9}$",
"description": "Limit results to these languages (lr), prefixed with lang_ and joined by |, e.g. lang_fr."
},
"location": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "Geolocation of the search, in Google's canonical form, e.g. 'Manhattan,New York,United States' (see zenserp_search_locations). Set it when the result depends on place, especially ads."
},
"device": {
"type": "string",
"enum": [
"desktop",
"mobile"
],
"description": "Device to emulate."
},
"start": {
"type": "integer",
"minimum": 0,
"maximum": 990,
"description": "Result offset: 0 (default) first page, 10 second page, 20 third page ... Google serves about 300 results per query."
},
"tbs": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "Google 'tbs' filter string for what the query field cannot express, e.g. qdr:w (past week)."
},
"cache": {
"type": "boolean",
"description": "true = serve a stored copy when one exists (kept 24 h, NOT charged) and store the reply when not. Default false: every call is fetched live and charged."
},
"fields": {
"minItems": 1,
"maxItems": 30,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"description": "Only return these top-level keys of the reply (for example organic, paid_results, related_searches). Saves context; the call is charged the same."
}
},
"required": [
"q"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴zenserp_maps_search(q, hl, gl, lr, location, ...)
Google local/maps results: shops, cafes and other businesses with address, rating, phone and coordinates. Set location for accurate results. SPENDS 1 request of the monthly quota per successful call (failed calls are not charged); do not repeat a call needlessly. GET /v2/search (tbm=lcl).
Input Schema
{
"type": "object",
"properties": {
"q": {
"type": "string",
"minLength": 1,
"maxLength": 2000,
"description": "The query."
},
"hl": {
"type": "string",
"pattern": "^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})?$",
"description": "Interface language (hl), e.g. en, de, pt-BR. zenserp_list_languages lists the supported codes."
},
"gl": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "Country (gl), two letters, e.g. us, de, gb. zenserp_list_countries lists the supported codes. Default: United States."
},
"lr": {
"type": "string",
"pattern": "^lang_[A-Za-z]{2,3}(-[A-Za-z]{2,4})?(\\|lang_[A-Za-z]{2,3}(-[A-Za-z]{2,4})?){0,9}$",
"description": "Limit results to these languages (lr), prefixed with lang_ and joined by |, e.g. lang_fr."
},
"location": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "Geolocation of the search, in Google's canonical form, e.g. 'Manhattan,New York,United States' (see zenserp_search_locations). Set it when the result depends on place, especially ads."
},
"device": {
"type": "string",
"enum": [
"desktop",
"mobile"
],
"description": "Device to emulate."
},
"start": {
"type": "integer",
"minimum": 0,
"maximum": 990,
"description": "Result offset: 0 (default) first page, 10 second page, 20 third page ... Google serves about 300 results per query."
},
"tbs": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "Google 'tbs' filter string for what the query field cannot express, e.g. qdr:w (past week)."
},
"cache": {
"type": "boolean",
"description": "true = serve a stored copy when one exists (kept 24 h, NOT charged) and store the reply when not. Default false: every call is fetched live and charged."
},
"fields": {
"minItems": 1,
"maxItems": 30,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"description": "Only return these top-level keys of the reply (for example organic, paid_results, related_searches). Saves context; the call is charged the same."
}
},
"required": [
"q"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴zenserp_shopping_search(q, hl, gl, lr, location, ...)
Google Shopping listings for a query: product, price, merchant, rating, and the product_id for zenserp_shopping_product. SPENDS 1 request of the monthly quota per successful call (failed calls are not charged); do not repeat a call needlessly. GET /v2/search (tbm=shop).
Input Schema
{
"type": "object",
"properties": {
"q": {
"type": "string",
"minLength": 1,
"maxLength": 2000,
"description": "The query."
},
"hl": {
"type": "string",
"pattern": "^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})?$",
"description": "Interface language (hl), e.g. en, de, pt-BR. zenserp_list_languages lists the supported codes."
},
"gl": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "Country (gl), two letters, e.g. us, de, gb. zenserp_list_countries lists the supported codes. Default: United States."
},
"lr": {
"type": "string",
"pattern": "^lang_[A-Za-z]{2,3}(-[A-Za-z]{2,4})?(\\|lang_[A-Za-z]{2,3}(-[A-Za-z]{2,4})?){0,9}$",
"description": "Limit results to these languages (lr), prefixed with lang_ and joined by |, e.g. lang_fr."
},
"location": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "Geolocation of the search, in Google's canonical form, e.g. 'Manhattan,New York,United States' (see zenserp_search_locations). Set it when the result depends on place, especially ads."
},
"device": {
"type": "string",
"enum": [
"desktop",
"mobile"
],
"description": "Device to emulate."
},
"start": {
"type": "integer",
"minimum": 0,
"maximum": 990,
"description": "Result offset: 0 (default) first page, 10 second page, 20 third page ... Google serves about 300 results per query."
},
"tbs": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "Google 'tbs' filter string for what the query field cannot express, e.g. qdr:w (past week)."
},
"cache": {
"type": "boolean",
"description": "true = serve a stored copy when one exists (kept 24 h, NOT charged) and store the reply when not. Default false: every call is fetched live and charged."
},
"fields": {
"minItems": 1,
"maxItems": 30,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"description": "Only return these top-level keys of the reply (for example organic, paid_results, related_searches). Saves context; the call is charged the same."
}
},
"required": [
"q"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴zenserp_youtube_search(q, hl, gl, location, sp, ...)
YouTube search results (videos, channels, ads) for a query, optionally by location. SPENDS 1 request of the monthly quota per successful call (failed calls are not charged); do not repeat a call needlessly. GET /v2/search (search_engine=youtube.com).
Input Schema
{
"type": "object",
"properties": {
"q": {
"type": "string",
"minLength": 1,
"maxLength": 2000,
"description": "The query."
},
"hl": {
"type": "string",
"pattern": "^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})?$",
"description": "Interface language (hl), e.g. en, de, pt-BR. zenserp_list_languages lists the supported codes."
},
"gl": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "Country (gl), two letters, e.g. us, de, gb. zenserp_list_countries lists the supported codes. Default: United States."
},
"location": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "Geolocation of the search, in Google's canonical form, e.g. 'Manhattan,New York,United States' (see zenserp_search_locations). Set it when the result depends on place, especially ads."
},
"sp": {
"description": "YouTube 'sp' filter or pagination token, as used on youtube.com.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"cache": {
"type": "boolean",
"description": "true = serve a stored copy when one exists (kept 24 h, NOT charged) and store the reply when not. Default false: every call is fetched live and charged."
},
"fields": {
"minItems": 1,
"maxItems": 30,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"description": "Only return these top-level keys of the reply (for example organic, paid_results, related_searches). Saves context; the call is charged the same."
}
},
"required": [
"q"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴zenserp_reverse_image_search(image_url, hl, gl, cache, fields)
Pages and sources that contain a given image (Google reverse image search). SPENDS 1 request of the monthly quota per successful call (failed calls are not charged); do not repeat a call needlessly. GET /v2/search (image_url).
Input Schema
{
"type": "object",
"properties": {
"image_url": {
"type": "string",
"maxLength": 2000,
"pattern": "^https?:\\/\\/",
"description": "Public URL of the image."
},
"hl": {
"type": "string",
"pattern": "^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})?$",
"description": "Interface language (hl), e.g. en, de, pt-BR. zenserp_list_languages lists the supported codes."
},
"gl": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "Country (gl), two letters, e.g. us, de, gb. zenserp_list_countries lists the supported codes. Default: United States."
},
"cache": {
"type": "boolean",
"description": "true = serve a stored copy when one exists (kept 24 h, NOT charged) and store the reply when not. Default false: every call is fetched live and charged."
},
"fields": {
"minItems": 1,
"maxItems": 30,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"description": "Only return these top-level keys of the reply (for example organic, paid_results, related_searches). Saves context; the call is charged the same."
}
},
"required": [
"image_url"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴zenserp_jobs_search(q, hl, gl, location, cache, ...)
Google Jobs listings for a query (jobs_results: title, company, location, source, apply url). Google returns one page; there is no paging. SPENDS 1 request of the monthly quota per successful call (failed calls are not charged); do not repeat a call needlessly. GET /v2/search (ibp=htl;jobs).
Input Schema
{
"type": "object",
"properties": {
"q": {
"type": "string",
"minLength": 1,
"maxLength": 2000,
"description": "The job query, e.g. 'php developer'."
},
"hl": {
"type": "string",
"pattern": "^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})?$",
"description": "Interface language (hl), e.g. en, de, pt-BR. zenserp_list_languages lists the supported codes."
},
"gl": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "Country (gl), two letters, e.g. us, de, gb. zenserp_list_countries lists the supported codes. Default: United States."
},
"location": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "Geolocation of the search, in Google's canonical form, e.g. 'Manhattan,New York,United States' (see zenserp_search_locations). Set it when the result depends on place, especially ads."
},
"cache": {
"type": "boolean",
"description": "true = serve a stored copy when one exists (kept 24 h, NOT charged) and store the reply when not. Default false: every call is fetched live and charged."
},
"fields": {
"minItems": 1,
"maxItems": 30,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"description": "Only return these top-level keys of the reply (for example organic, paid_results, related_searches). Saves context; the call is charged the same."
}
},
"required": [
"q"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴zenserp_shopping_product(product_id, gpc_id, location, cache, fields)
Product page data from Google Shopping: description, merchant offers, variations. product_id comes from zenserp_shopping_search. With gpc_id (from the same result) it returns the whole product cluster across merchants. SPENDS 1 request of the monthly quota per successful call (failed calls are not charged); do not repeat a call needlessly. GET /v1/shopping.
Input Schema
{
"type": "object",
"properties": {
"product_id": {
"type": "string",
"minLength": 1,
"maxLength": 100,
"description": "The product id (PID) from a Google Shopping search result."
},
"gpc_id": {
"description": "The Google Product Cluster id from the same search result (only valid together with its product_id).",
"type": "string",
"minLength": 1,
"maxLength": 100
},
"location": {
"type": "string",
"minLength": 1,
"maxLength": 300,
"description": "Geolocation of the search, in Google's canonical form, e.g. 'Manhattan,New York,United States' (see zenserp_search_locations). Set it when the result depends on place, especially ads."
},
"cache": {
"type": "boolean",
"description": "true = serve a stored copy when one exists (kept 24 h, NOT charged) and store the reply when not. Default false: every call is fetched live and charged."
},
"fields": {
"minItems": 1,
"maxItems": 30,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"description": "Only return these top-level keys of the reply (for example organic, paid_results, related_searches). Saves context; the call is charged the same."
}
},
"required": [
"product_id"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴zenserp_hotels(q, check_in, check_out, adults, children, ...)
Google Hotels offers for a hotel or place. Send check_in and check_out together, or Google falls back to today's rates. SPENDS 1 request of the monthly quota per successful call (failed calls are not charged); do not repeat a call needlessly. GET /v1/hotels.
Input Schema
{
"type": "object",
"properties": {
"q": {
"type": "string",
"minLength": 1,
"maxLength": 2000,
"description": "Hotel name or place, e.g. 'hilton midtown new york'."
},
"check_in": {
"description": "Check-in date, yyyy-mm-dd. Needs check_out.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"check_out": {
"description": "Check-out date, yyyy-mm-dd; later than check_in.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"adults": {
"description": "Number of adults.",
"type": "integer",
"minimum": 1,
"maximum": 20
},
"children": {
"description": "Ages of the children, comma separated, e.g. 4,9 (Google prices by age).",
"type": "string",
"pattern": "^\\d{1,2}(,\\d{1,2}){0,9}$"
},
"currency": {
"description": "3-letter currency code for the prices, e.g. EUR.",
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"accommodation_type": {
"description": "Restrict to hotels or vacation rentals.",
"type": "string",
"enum": [
"hotels",
"vacation_rentals"
]
},
"free_cancellation": {
"description": "true = only properties with free cancellation.",
"type": "boolean"
},
"hl": {
"type": "string",
"pattern": "^[A-Za-z]{2,3}(-[A-Za-z0-9]{2,8})?$",
"description": "Interface language (hl), e.g. en, de, pt-BR. zenserp_list_languages lists the supported codes."
},
"gl": {
"type": "string",
"pattern": "^[A-Za-z]{2}$",
"description": "Country (gl), two letters, e.g. us, de, gb. zenserp_list_countries lists the supported codes. Default: United States."
},
"cache": {
"type": "boolean",
"description": "true = serve a stored copy when one exists (kept 24 h, NOT charged) and store the reply when not. Default false: every call is fetched live and charged."
},
"fields": {
"minItems": 1,
"maxItems": 30,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"description": "Only return these top-level keys of the reply (for example organic, paid_results, related_searches). Saves context; the call is charged the same."
}
},
"required": [
"q"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴zenserp_flights(origin, destination, departure_date, return_date, curr, ...)
Google Flights options. Best: origin and destination as 3-letter airport codes plus departure_date (dates and curr are honoured only then). A free-text q or a tfs string from a Google Flights URL also works. SPENDS 1 request of the monthly quota per successful call (failed calls are not charged); do not repeat a call needlessly. GET /v1/flights.
Input Schema
{
"type": "object",
"properties": {
"origin": {
"description": "Departure airport code, e.g. JFK. Name one airport, not a city.",
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"destination": {
"description": "Arrival airport code, e.g. LHR.",
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"departure_date": {
"description": "Departure date, yyyy-mm-dd. Needs origin and destination.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"return_date": {
"description": "Return date, yyyy-mm-dd. Omit for one-way.",
"type": "string",
"pattern": "^(\\d{4})-(\\d{2})-(\\d{2})$"
},
"curr": {
"description": "3-letter currency code for the prices, e.g. USD.",
"type": "string",
"pattern": "^[A-Za-z]{3}$"
},
"q": {
"description": "Free-text flight query, used when no airport codes are given (no dates, no curr).",
"type": "string",
"minLength": 1,
"maxLength": 2000
},
"tfs": {
"description": "Google Flights search string copied from a Google Flights URL (full filters).",
"type": "string",
"minLength": 1,
"maxLength": 2000
},
"cache": {
"type": "boolean",
"description": "true = serve a stored copy when one exists (kept 24 h, NOT charged) and store the reply when not. Default false: every call is fetched live and charged."
},
"fields": {
"minItems": 1,
"maxItems": 30,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"description": "Only return these top-level keys of the reply (for example organic, paid_results, related_searches). Saves context; the call is charged the same."
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴zenserp_trends(geo, keyword, cat, timeframe, cache, ...)
Trending searches from Google Trends for a country, optionally narrowed to given keywords or a category. Trending data covers at most the past 7 days. SPENDS 1 request of the monthly quota per successful call (failed calls are not charged); do not repeat a call needlessly. GET /v1/trends.
Input Schema
{
"type": "object",
"properties": {
"geo": {
"description": "Country code, e.g. US.",
"type": "string",
"pattern": "^[A-Za-z]{2}(-[A-Za-z0-9]{1,3})?$"
},
"keyword": {
"description": "Only trends matching these terms (and their related queries). A term that is not trending returns no rows.",
"minItems": 1,
"maxItems": 20,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 200
}
},
"cat": {
"description": "Google Trends category id, e.g. 16 News, 7 Finance, 18 Shopping, 20 Sports, 5 Computers & Electronics, 45 Health.",
"type": "integer",
"minimum": 0,
"maximum": 2000
},
"timeframe": {
"description": "Window; longer ones all return the same 7-day window for trending searches.",
"type": "string",
"enum": [
"now 1-H",
"now 4-H",
"now 1-d",
"now 7-d",
"today 1-m",
"today 3-m",
"today 12-m",
"today 5-y"
]
},
"cache": {
"type": "boolean",
"description": "true = serve a stored copy when one exists (kept 24 h, NOT charged) and store the reply when not. Default false: every call is fetched live and charged."
},
"fields": {
"minItems": 1,
"maxItems": 30,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"description": "Only return these top-level keys of the reply (for example organic, paid_results, related_searches). Saves context; the call is charged the same."
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🔴zenserp_answer_engine(engine, prompt, additional_prompt, country, brand, ...)
Send a prompt to an AI answer engine (ChatGPT, Perplexity, Gemini or Copilot) and get its answer_text with citations; with brand it also reports whether and where that brand was cited. SPENDS quota at Zenserp's premium per-answer rate (see Zenserp pricing), is slow (seconds to a minute), and must not be repeated needlessly. Plan gate: Medium unlocks ChatGPT, Large adds Perplexity, Premium adds Gemini, Enterprise adds Copilot. GET /v1/answer-engine.
Input Schema
{
"type": "object",
"properties": {
"engine": {
"type": "string",
"enum": [
"chatgpt",
"perplexity",
"gemini",
"copilot"
],
"description": "The answer engine to ask."
},
"prompt": {
"type": "string",
"minLength": 1,
"maxLength": 4096,
"description": "The question or prompt. prompt and additional_prompt together may hold at most 4,096 characters."
},
"additional_prompt": {
"description": "An optional follow-up prompt sent with the main one (counts toward the 4,096-character limit shared with prompt).",
"type": "string",
"minLength": 1,
"maxLength": 4096
},
"country": {
"description": "Two-letter country code to localise the answer, e.g. us.",
"type": "string",
"pattern": "^[A-Za-z]{2}$"
},
"brand": {
"description": "A brand name to track: the reply then has a brand_visibility object.",
"type": "string",
"minLength": 1,
"maxLength": 200
},
"fields": {
"minItems": 1,
"maxItems": 30,
"type": "array",
"items": {
"type": "string",
"minLength": 1,
"maxLength": 60
},
"description": "Only return these top-level keys of the reply (for example organic, paid_results, related_searches). Saves context; the call is charged the same."
}
},
"required": [
"engine",
"prompt"
],
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢zenserp_list_search_engines
The search engine hosts Zenserp supports (values for search_engine). GET /v2/search_engines. The docs do not say whether helper lists are charged; they are not searches.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢zenserp_list_languages
The supported interface language codes (values for hl). GET /v2/hl.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢zenserp_list_countries
The supported country codes (values for gl). GET /v2/gl.
Input Schema
{
"type": "object",
"properties": {},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}🟢zenserp_search_locations(query, limit)
The supported geo locations (values for location), as Google's canonical names. The list is long: pass query to keep only entries that contain it, and limit to cap the count. GET /v2/locations.
Input Schema
{
"type": "object",
"properties": {
"query": {
"description": "Keep only entries whose text contains this (case-insensitive), e.g. 'vienna'.",
"type": "string",
"minLength": 2,
"maxLength": 100
},
"limit": {
"description": "Most entries returned (default 50).",
"type": "integer",
"minimum": 1,
"maximum": 500
}
},
"$schema": "https://json-schema.org/draft/2020-12/schema"
}Community
Evidence