Quick Start
Get up and running in a few steps:
# 1. Set your API key API_KEY="gt_live_xxxxxxxxxxxxxxxxxxxxxxxx" # 2. Make your first search curl -G https://api.serpsearch.com/api/v1/search \ -H "Authorization: Bearer $API_KEY" \ --data-urlencode "query=web scraping best practices" # 3. The response is JSON with organic_results, knowledge_graph, etc.
Authentication
All requests must include a valid API key as a Bearer token in the Authorization header.
Authorization: Bearer gt_live_xxxxxxxxxxxxxxxxxxxxxxxx
You can generate API keys from your dashboard. Keys are tied to your subscription and track usage against your monthly quota.
Important: Keep your API key secret. Do not expose it in client-side code or public repositories. If you suspect a key has been compromised, revoke it immediately from your dashboard and generate a new one.
Model Context Protocol (MCP)
Connect an AI client directly to SerpSearch's live Google data through the stateless MCP endpoint. The server implements MCP 2026-07-28. OAuth 2.1 with PKCE is discovered automatically, so you don't paste an API key into the client.
https://mcp.serpsearch.com/mcpConnect a client
Add the endpoint to any remote HTTP MCP client. The client opens a SerpSearch approval page, requests the scopes it needs, and stores a short-lived access token. Refresh tokens rotate when used.
{
"mcpServers": {
"serpsearch": {
"type": "http",
"url": "https://mcp.serpsearch.com/mcp"
}
}
}Available tools
| Tool | Returns |
|---|---|
| google_search | Organic results and rich SERP modules, including products and AI overviews |
| google_autocomplete | Google query suggestions and entity details |
| google_translate | Google Translate results |
| google_news | Grouped Google News results |
| google_images | Image results, sources, and image metadata |
| google_videos | Google video search results |
| google_maps_search | Google Maps places and local businesses |
| google_place_details | Rich details for a feature ID or Google Place ID |
| google_maps_distance | Driving distance and duration between coordinates |
| google_reviews | Paged reviews, ratings, owners, and cursors |
| review_batch_create | Create a Pro+ date-range review export |
| review_batch_list | List recent review exports |
| review_batch_get | Read export progress and quota reservation |
| review_batch_cancel | Cancel a queued or running export |
| review_batch_download | Get a signed URL for a completed export |
Authentication and permissions
Standard tools request the mcp:tools scope. Review batch tools also request mcp:batches. Consent requires a verified SerpSearch account. Access tokens are restricted to this MCP endpoint and can't be used against another resource.
SerpSearch accepts Client ID Metadata Documents and supports Dynamic Client Registration for compatible clients. Authorization code requests require S256 PKCE and exact redirect URI matching.
Usage and billing
A normal MCP Google tool call counts exactly like the matching REST API request. It uses the same plan rate limit, monthly quota, usage log, and auto top-up settings. Discovery, tool listing, OAuth, and review batch status checks don't consume requests.
Review batch exports keep their existing delivery-based billing. Page requests are reserved while the job runs and charged only when a full or quota-limited partial file is delivered. Failed or cancelled exports consume zero requests. Read thereview batch reference.
Safe retries
Tool schemas accept an optional idempotency_key. Reuse the same key when retrying an interrupted call to receive the stored result without consuming quota twice. Batch creation requires this key.
Web Search
| Method | URL |
|---|---|
| GET | https://api.serpsearch.com/api/v1/search |
Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
query | string | Yes | -- | The search query. |
exact_match | boolean | No | false | Request Google's verbatim search and suppress automatic spelling correction. Existing quotes and operators are preserved. Send lowercase true or false. |
page | integer | No | 1 | Results page number (1-based, 10 results per page). |
lat | number | No | -- | Latitude for geo-targeted results. |
lng | number | No | -- | Longitude for geo-targeted results. |
location | string | No | -- | Location string for geo-targeting (e.g. "New York, NY, US"). |
response_type | string | No | json | Response format: json, html, both, or correlated. |
js | boolean | No | false | When true, keeps JavaScript in HTML response; when false, strips script tags. |
gl | string | No | -- | Country code for geo-targeting results (ISO 3166-1 alpha-2, e.g. "us", "de", "gb"). |
hl | string | No | -- | Interface language code (ISO 639-1, e.g. "en", "de", "ar"). |
google_domain | string | No | -- | Google domain to query, without "www." (e.g. "google.de", "google.co.uk"). |
lr | string | No | -- | Restrict results to a specific language (e.g. "lang_en", "lang_de"). |
cr | string | No | -- | Restrict results to a specific country (e.g. "countryUS", "countryDE"). |
safe | string | No | -- | Safe search filter: "active" or "off". |
uule | string | No | -- | Pre-encoded UULE string for precise geo-targeting. |
json_restrictor | string | No | -- | Comma-separated list of response JSON fields to include (e.g. "local_pack,organic_results[0]"). |
Response
{
"search_info": {
"total_results": "About 21,600,000 results",
"time_taken": "0.29 seconds"
},
"organic_results": [
{
"title": "Beautiful Soup: Build a Web Scraper With Python",
"url": "https://realpython.com/beautiful-soup-web-scraper-python/",
"website": "Real Python",
"position": 1,
"description": "Learn how to scrape web pages and parse HTML with Beautiful Soup.",
"visible_url": "https://realpython.com › beautiful-soup-web-scraper-python",
"sitelinks": [
{
"title": "Parse HTML",
"url": "https://realpython.com/beautiful-soup-web-scraper-python/#parse-html",
"description": "Inspect and extract structured content."
}
]
}
],
"knowledge_graph": {
"title": "Beautiful Soup",
"category": "Python library",
"description": "A Python package for parsing HTML and XML documents.",
"source_name": "Wikipedia",
"source_link": "https://en.wikipedia.org/wiki/Beautiful_Soup_(HTML_parser)",
"facts": [
{
"key": "initial release",
"value": "2004"
}
]
},
"ai_overview": {
"text": "Beautiful Soup parses HTML into a tree that Python code can search and traverse.",
"citations": [
{
"title": "Beautiful Soup documentation",
"url": "https://www.crummy.com/software/BeautifulSoup/bs4/doc/"
}
]
}
}Example
curl -G "https://api.serpsearch.com/api/v1/search" \ -H "Authorization: Bearer YOUR_API_KEY" \ --data-urlencode "query=latest AI models" \ -d "page=1" -d "gl=us" -d "hl=en"
Exact Matches & Query Corrections
Set exact_match=true to request Google's verbatim search and suppress automatic spelling correction. The default is false. Your query is passed through unchanged, including existing quotes, Unicode, parentheses, and OR operators. Use parentheses to group alternatives when one term must match alongside any of several others.
curl -G "https://api.serpsearch.com/api/v1/search" \
-H "Authorization: Bearer YOUR_API_KEY" \
--data-urlencode 'query="example company" ("wages" OR "dispute")' \
-d 'exact_match=true' -d 'response_type=both'For Python Requests, add "exact_match": "true" to your params dictionary: HTTP query parameters use lowercase true or false. The google_search MCP tool accepts a JSON Boolean instead. Pagination, location, and language settings continue to work with exact mode.
Verbatim search controls how Google interprets your query. Matching terms may occur in indexed page content outside the returned title or snippet; the API does not independently inspect every destination page.
“Did you mean” and replacement notices
Read Google's visible notice from search_info.query_correction.text. For example, a search for openai chagpt can include this metadata:
{
"search_info": {
"query_correction": {
"text": "Did you mean: openai chatgpt",
"kind": "did_you_mean",
"suggested_query": "openai chatgpt"
}
}
}A did_you_mean notice is an unapplied suggestion and is allowed in exact mode. showing_results_for, including_results_for, and results_without_quotes indicate replacement or broadened results. unknown preserves a recognized notice whose wording cannot be classified, including unsupported localized wording.
The object is optional in json, both, and correlated responses, even when result counts and timing are absent. suggested_query is included when a suggestion link is available. HTML-only responses keep the notice in their HTML; json_restrictor can filter structured metadata out.
If Google returns a replacement, broadened results, or an unknown correction notice despite exact mode, the API returns HTTP 502 with an error and search_info.query_correction, without substituted results. This applies to every response format. A genuine no-results page remains a successful empty response. Omitting exact_match keeps the existing search behavior.
Search Response Schema
The default JSON response is sparse and follows the SERP Google actually rendered. A module is omitted when it was not present; optional fields are not emitted as placeholder null values.
Output guarantees
- URLs are absolute HTTP(S) URLs, and inline base64 image payloads are excluded.
- Ratings are JSON numbers from 0 through 5, normalized to one decimal place.
- Semantic section ownership prevents the same card from being emitted as multiple result types.
- Google navigation and pagination controls are not returned as results or related searches.
Top-level fields
| Field | Type | Required | Description |
|---|---|---|---|
search_info | SearchInfo | No | Google's result count, reported search time, and optional query correction notice. |
organic_results | OrganicResult[] | No | Ranked web results; omitted when no native organic results are present. |
knowledge_graph | KnowledgeGraph | No | Entity or local knowledge panel with cleaned facts and media. |
definition_result | DefinitionResult | No | Dictionary definition widget. |
people_also_ask | PaaQuestion[] | No | People also ask questions. |
weather_result | WeatherResult | No | Weather widget. |
local_results | LocalResults | No | Structured places list from a local-result module. |
short_videos | ShortVideo[] | No | Short-video carousel. |
videos | Video[] | No | Video carousel. |
recipes | Recipe[] | No | Recipe carousel. |
filter_pills | FilterPill[] | No | Search refinement filters. |
local_pack | LocalPackPlace[] | No | Desktop local pack, including status, services, distance, and website. |
site_sub_results | SiteSubResultGroup[] | No | Publisher-specific inline result groups. |
places_sites | PlacesSite[] | No | Places-site links. |
things_to_know | ThingsToKnowItem[] | No | Things to know accordion items. |
what_people_are_saying | WhatPeopleAreSaying | No | Discussion articles owned by the named section. |
social_results | SocialResult[] | No | Standalone social-result cards. |
standalone_videos | StandaloneVideoResult[] | No | Standalone video web results. |
related_searches | RelatedSearch[] | No | Related queries, excluding pagination controls. |
people_also_search_for | PasfEntity[] | No | Related entity suggestions. |
market_summary | MarketSummary | No | Stock, index, or crypto market data; never fabricated for a plain fiat conversion. |
currency_converter | CurrencyConverter | No | Standalone currency conversion, separate from market_summary. |
top_stories | TopStories | No | News stories owned by an explicit Top stories section. |
sponsored_results | SponsoredResult[] | No | Sponsored web results. |
calculator_result | CalculatorResult | No | Calculator expression and exact displayed result. |
translation_result | TranslationResult | No | Inline translation, language metadata, alternatives, or an explicit error. |
flight_result | FlightResult | No | Flight route, filters, and bookable options. |
sports_result | SportsResult | No | Completed or scheduled sports event with teams and optional scoring. |
jobs | JobModule | No | Google Jobs module and job cards. |
hotels | HotelModule | No | Hotel search context and hotel cards. |
products | ProductModule | No | Shopping product cards and commercial metadata. |
image_pack | ImagePack | No | Inline image pack with source and image dimensions. |
ai_overview | AiOverview | No | Complete unstructured AI Overview text, citations, and optional products. |
movies | MovieModule | No | Movies, theater context, and showtimes. |
Object schemas
These definitions cover every newly added result module and every existing object whose fields changed.
SearchInfo
Search metadata. A correction notice can be present even when Google omits result counts and timing.
| Field | Type | Required | Description |
|---|---|---|---|
total_results | string | No | Result-count text as displayed by Google. |
time_taken | string | No | Search-time text reported by Google. |
query_correction | QueryCorrection | No | Visible query correction notice; omitted when no recognized notice is present. |
QueryCorrection
Google's suggestion or query-replacement notice. Returned in json, both, and correlated responses, subject to json_restrictor. HTML-only responses retain the notice in the HTML.
| Field | Type | Required | Description |
|---|---|---|---|
text | string | Yes | Visible notice text, with HTML entities decoded and whitespace normalized. |
kind | string | Yes | did_you_mean (unapplied suggestion), showing_results_for (replacement), including_results_for (broadening), results_without_quotes (unquoted results), or unknown (recognized notice with unsupported wording, including localized wording). |
suggested_query | string | No | Suggested query decoded from Google's search link when available; the link back to the original query is excluded. |
OrganicResult
A ranked native web result. Rich metadata is included only when Google displays it on that result.
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Result title. |
url | URL | Yes | Absolute publisher URL. |
website | string | Yes | Publisher/site label. |
position | integer | Yes | 1-based rank on the requested page. |
description | string | No | Visible snippet text; never flattened card or UI text. |
visible_url | string | No | Breadcrumb URL as displayed by Google. |
answer | string | No | Inline answer shown with the result. |
rating | number | No | Normalized rating from 0 through 5. |
reviews | string | No | Review-count label as displayed. |
price | string | No | Displayed price. |
duration | string | No | Displayed media duration. |
answer_count | string | No | Displayed answer/discussion count. |
date | string | No | Displayed publication or update date. |
thumbnail | URL | No | Absolute HTTP(S) thumbnail URL. |
favicon | URL | No | Absolute HTTP(S) favicon URL. |
sitelinks | Sitelink[] | No | Expanded sitelinks, each with title, URL, and optional description. |
Sitelink
An expanded link owned by its parent organic result.
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Sitelink title. |
url | URL | Yes | Absolute publisher URL. |
description | string | No | Visible sitelink description. |
KgFact
A cleaned fact row from a knowledge panel.
| Field | Type | Required | Description |
|---|---|---|---|
key | string | Yes | Human-readable fact label. |
value | string | Yes | Fact value without duplicated label or UI text. |
KnowledgeGraph
A cleaned entity panel. UI controls and duplicate thumbnail/gallery images are excluded.
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Entity title. |
subtitle | string | No | Entity subtitle. |
category | string | No | Normalized entity/category label. |
rating | number | No | Normalized rating from 0 through 5. |
reviews | string | No | Displayed review count. |
description | string | No | Clean panel description. |
thumbnail | URL | No | Primary absolute image URL. |
source_name | string | No | Description source name. |
source_link | URL | No | Description source URL. |
images | URL[] | No | Unique absolute gallery image URLs. |
facts | { key, value }[] | No | Clean human-readable fact rows. |
LocalResults
A structured local-results collection.
| Field | Type | Required | Description |
|---|---|---|---|
places | LocalPlace[] | Yes | Ranked local places with optional numeric rating, reviews, price, category, and address. |
LocalPlace
A ranked place from a structured local-results list.
| Field | Type | Required | Description |
|---|---|---|---|
position | integer | Yes | 1-based position in the module. |
title | string | Yes | Place name. |
rating | number | No | Normalized rating from 0 through 5. |
reviews | string | No | Displayed review count. |
price | string | No | Displayed price/range. |
category | string | No | Place category. |
address | string | No | Displayed address. |
LocalPackPlace
A place in the desktop local pack. Same-name businesses at different addresses remain distinct.
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Business name. |
rating | number | No | Normalized rating from 0 through 5. |
reviews | string | No | Displayed review count. |
price_range | string | No | Displayed price range. |
type | string | No | Place category. |
distance | string | No | Distance from the requested location. |
address | string | No | Street or locality address. |
phone | string | No | Displayed business phone number. |
status | string | No | Open/closed status and next transition. |
description | string | No | Short place tagline. |
services | string[] | No | Displayed service tags, such as In-store pickup, Dine-in, or Delivery. |
website | URL | No | Absolute business website URL. |
CurrencyConverter
A standalone fiat or unit conversion. Plain converters do not create market_summary.
| Field | Type | Required | Description |
|---|---|---|---|
from_currency | string | Yes | Source currency name/code. |
to_currency | string | Yes | Target currency name/code. |
from_amount | string | No | Displayed source amount. |
to_amount | string | No | Displayed converted amount. |
MarketSummary
A real stock, index, or crypto market widget. Its optional nested converter belongs to that market entity.
| Field | Type | Required | Description |
|---|---|---|---|
entity | string | Yes | Market entity name. |
price | string | Yes | Displayed market price. |
currency | string | Yes | Displayed currency code. |
change_amount | string | No | Displayed absolute change. |
change_percent | string | No | Displayed percentage change. |
timestamp | string | No | Displayed quote timestamp. |
periods | string[] | No | Available chart periods. |
converter | CurrencyConverter | No | Converter attached to a crypto/market widget. |
metrics | FinancialMetrics | No | Open, high, low, valuation, and dividend metrics. |
quarterly_financials | QuarterlyFinancials | No | Displayed quarterly revenue summary. |
earnings | Earnings | No | Displayed earnings summary. |
related | RelatedCompany[] | No | Related market entities. |
FinancialMetrics
Optional metrics inside a market summary.
| Field | Type | Required | Description |
|---|---|---|---|
open | string | No | Opening price. |
high | string | No | Session high. |
low | string | No | Session low. |
mkt_cap | string | No | Market capitalization. |
pe_ratio | string | No | Price-to-earnings ratio. |
high_52wk | string | No | 52-week high. |
low_52wk | string | No | 52-week low. |
dividend_yield | string | No | Dividend yield. |
qtrly_div_amt | string | No | Quarterly dividend amount. |
QuarterlyFinancials
Quarterly revenue shown in a market widget.
| Field | Type | Required | Description |
|---|---|---|---|
period | string | Yes | Quarter/period label. |
revenue | string | Yes | Displayed revenue. |
yoy_change | string | No | Year-over-year change. |
Earnings
Earnings summary shown in a market widget.
| Field | Type | Required | Description |
|---|---|---|---|
period | string | Yes | Earnings period. |
eps_beat | string | No | EPS beat/miss text. |
revenue_beat | string | No | Revenue beat/miss text. |
RelatedCompany
A related market entity.
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Company/entity name. |
ticker | string | No | Ticker symbol. |
price | string | Yes | Displayed price. |
currency | string | No | Currency code. |
change_percent | string | No | Displayed percentage change. |
CalculatorResult
Google's calculator output with both the visible and whitespace-normalized expression.
| Field | Type | Required | Description |
|---|---|---|---|
displayed_expression | string | Yes | Expression exactly as displayed. |
normalized_expression | string | Yes | Expression with display spacing normalized. |
result | string | Yes | Exact displayed result. |
mode | string | No | Calculator mode, for example Rad or Deg. |
TranslationResult
Inline Google Translate state. An error is explicit and never inferred from hidden copy-status text.
| Field | Type | Required | Description |
|---|---|---|---|
status | string | Yes | Translation status, normally translated or error. |
source_text | string | Yes | Input text. |
translated_text | string | No | Translated text when available. |
source_language | TranslationLanguage | No | Source code and optional language name. |
target_language | TranslationLanguage | No | Target code and optional language name. |
detected_source_language | boolean | Yes | Whether Google detected the source language. |
source_pronunciation | string | No | Source pronunciation. |
target_pronunciation | string | No | Target pronunciation. |
alternatives | TranslationAlternative[] | No | Alternative translations, meanings, and part of speech. |
error | string | No | Visible translation error. |
TranslationLanguage
Language metadata attached to a translation.
| Field | Type | Required | Description |
|---|---|---|---|
code | string | Yes | Language code from Google's widget. |
name | string | No | Displayed language name. |
TranslationAlternative
An alternative translation and its meanings.
| Field | Type | Required | Description |
|---|---|---|---|
part_of_speech | string | No | Displayed part of speech. |
translation | string | Yes | Alternative translated text. |
meanings | string[] | No | Displayed meanings/usages. |
FlightResult
A Google Flights module.
| Field | Type | Required | Description |
|---|---|---|---|
origin | string | Yes | Origin airport/city. |
destination | string | Yes | Destination airport/city. |
departure_date | string | No | Displayed departure date. |
return_date | string | No | Displayed return date. |
trip_type | string | No | Round trip, one way, and so on. |
cabin_class | string | No | Displayed cabin class. |
filters | string[] | No | Active flight filters. |
options | FlightOption[] | No | Airline, duration, stops, price, emissions, and absolute booking/search URL. |
FlightOption
A bookable/searchable option in a flight module.
| Field | Type | Required | Description |
|---|---|---|---|
airline | string | Yes | Airline name. |
duration | string | Yes | Displayed journey duration. |
stops | string | Yes | Stop count/label. |
price | string | Yes | Displayed formatted price. |
price_value | number | No | Parsed non-negative numeric price. |
currency | string | No | Currency code. |
emissions | string | No | Displayed emissions estimate. |
url | URL | Yes | Absolute Google Flights URL. |
SportsResult
A live, completed, or scheduled event. Scheduled events keep teams without inventing scores.
| Field | Type | Required | Description |
|---|---|---|---|
league | string | No | League/competition. |
status | string | Yes | Event state such as Final or Scheduled. |
date | string | No | Displayed event date. |
teams | SportsTeam[] | Yes | Team name plus optional record and score. |
scoring_headers | string[] | No | Period/inning table headers. |
scoring_rows | SportsScoringRow[] | No | Team and period/total values. |
SportsTeam
A participant in a sports event.
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Full team/player name. |
record | string | No | Displayed season/event record. |
score | string | No | Displayed score; absent for scheduled events without a score. |
SportsScoringRow
One row in a period/inning scoring table.
| Field | Type | Required | Description |
|---|---|---|---|
team | string | Yes | Team name. |
values | string[] | Yes | Values aligned with scoring_headers. |
JobModule
Google Jobs results.
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Module title. |
more_jobs_url | URL | No | Absolute URL for additional jobs. |
jobs | JobResult[] | Yes | Title, company, location, source, age, employment type, salary, benefits, tags, and URL. |
JobResult
A card in Google Jobs.
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Job title. |
company | string | Yes | Employer. |
location | string | No | Displayed job location. |
source | string | No | Listing provider. |
age | string | No | Plausible displayed posting age. |
employment_type | string | No | Employment type. |
salary | string | No | Displayed salary/range. |
benefits | string[] | No | Displayed benefits. |
tags | string[] | No | Additional tags such as Remote. |
url | URL | No | Absolute listing URL. |
HotelModule
Google Hotels cards and the search context they share.
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Module title. |
context | HotelContext | Yes | Location, check-in/out, guest count, and price-window context. |
hotels | HotelResult[] | Yes | Name, pricing, rating, provider, amenities, terms, deal, sponsorship, URL, and thumbnail. |
HotelContext
Search context shared by hotel cards.
| Field | Type | Required | Description |
|---|---|---|---|
location | string | No | Selected destination. |
check_in | string | No | Displayed check-in date. |
check_out | string | No | Displayed check-out date. |
guests | integer | No | Positive guest count. |
price_window | string | No | Displayed pricing-window summary. |
HotelResult
A hotel card.
| Field | Type | Required | Description |
|---|---|---|---|
name | string | Yes | Hotel name. |
price | string | No | Displayed formatted price. |
price_value | number | No | Parsed non-negative numeric price. |
currency | string | No | Currency code. |
rating | number | No | Normalized rating from 0 through 5. |
reviews | string | No | Displayed review count. |
category | string | No | Hotel class/category. |
provider | string | No | Booking provider. |
amenities | string[] | No | Displayed amenities. |
availability_terms | string[] | No | Cancellation/payment terms. |
deal | string | No | Displayed deal label. |
description | string | No | Hotel description. |
sponsored | boolean | Yes | Whether Google marks the card sponsored. |
url | URL | No | Absolute hotel/search URL. |
thumbnail | URL | No | Absolute thumbnail URL. |
ProductModule
A shopping/product carousel.
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Module title. |
products | ProductResult[] | Yes | Title, prices, merchant, rating, availability, delivery, variants, URL, and thumbnail. |
ProductResult
A product card, including cards nested in an AI Overview.
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Product title. |
price | string | Yes | Displayed current price. |
price_value | number | No | Parsed non-negative numeric price. |
currency | string | No | Currency code. |
previous_price | string | No | Displayed previous price. |
merchant | string | No | Merchant/provider. |
rating | number | No | Normalized rating from 0 through 5. |
reviews | string | No | Displayed review count. |
discount | string | No | Displayed discount. |
availability | string | No | Stock/proximity text. |
delivery_terms | string[] | No | Delivery and pickup terms. |
variants | string[] | No | Displayed product variants. |
url | URL | No | Absolute product/search URL. |
thumbnail | URL | No | Absolute thumbnail URL. |
ImagePack
An inline image pack. Inline data: payloads are never returned as image URLs.
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Module title. |
images | ImageResult[] | Yes | Title, source, source/image/thumbnail URLs, width, and height. |
ImageResult
An image in an inline image pack.
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Image/result title. |
source | string | No | Publisher name. |
source_url | URL | No | Absolute publisher page URL. |
image_url | URL | No | Absolute full image URL. |
thumbnail | URL | No | Absolute thumbnail URL. |
width | integer | No | Positive image width in pixels. |
height | integer | No | Positive image height in pixels. |
AiOverview
A native AI Overview. Google-authored prose, headings, and lists remain in one unstructured text value; unavailable widgets are omitted.
| Field | Type | Required | Description |
|---|---|---|---|
text | string | Yes | Complete visible overview text without inferred sections. |
citations | AiCitation[] | No | Citation title and absolute publisher URL. |
products | ProductResult[] | No | Products shown inside the overview. |
AiCitation
A source cited by an AI Overview.
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Citation title. |
url | URL | Yes | Absolute publisher URL. |
MovieModule
Movies playing and their visible showtimes.
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Module title. |
date | string | No | Selected date. |
theater | string | No | Selected theater. |
movies | MovieResult[] | Yes | Title, content rating, runtime, genres, URL, thumbnail, and showtimes. |
MovieResult
A movie displayed in a showtimes module.
| Field | Type | Required | Description |
|---|---|---|---|
title | string | Yes | Movie title. |
content_rating | string | No | Content rating such as PG-13. |
runtime | string | No | Displayed runtime. |
genres | string[] | No | Displayed genres. |
url | URL | No | Absolute Google movie/search URL. |
thumbnail | URL | No | Absolute poster URL. |
showtimes | MovieShowtime[] | No | Visible showtimes for this movie. |
MovieShowtime
A visible movie showtime.
| Field | Type | Required | Description |
|---|---|---|---|
date | string | No | Displayed date. |
time | string | Yes | Displayed time. |
theater | string | Yes | Theater name. |
format | string | No | Screening format. |
timestamp | integer | No | Google-provided Unix timestamp. |
url | URL | No | Absolute ticket URL. |
Autocomplete
| Method | URL |
|---|---|
| GET | https://api.serpsearch.com/api/v1/autocomplete |
Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
query | string | Yes | -- | The search query to get suggestions for. |
lat | number | No | -- | Latitude for geo-targeted suggestions. |
lng | number | No | -- | Longitude for geo-targeted suggestions. |
location | string | No | -- | Location string for geo-targeted suggestions. |
gl | string | No | -- | Country code for geo-targeting results (ISO 3166-1 alpha-2, e.g. "us", "de", "gb"). |
hl | string | No | -- | Interface language code (ISO 639-1, e.g. "en", "de", "ar"). |
google_domain | string | No | -- | Google domain to query, without "www." (e.g. "google.de", "google.co.uk"). |
Response
[
{
"title": "python web scraping"
},
{
"title": "python web scraping library"
},
{
"title": "python web scraping cookbook",
"additional_info": {
"title": "Python Web Scraping Cookbook",
"description": "Book by Michael Heydt",
"image": "https://..."
}
}
]Example
curl -G "https://api.serpsearch.com/api/v1/autocomplete" \ -H "Authorization: Bearer YOUR_API_KEY" \ --data-urlencode "query=python web scraping"
Translation
| Method | URL |
|---|---|
| GET | https://api.serpsearch.com/api/v1/translate |
Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
query | string | Yes | -- | The text to translate. |
lang | string | No | en | Target language code (e.g. en, es, fr, de, ja). |
Response
{
"translation": "Hello world",
"sentences": [
{
"original": "Hola mundo",
"translation": "Hello world"
}
]
}Example
curl -G "https://api.serpsearch.com/api/v1/translate" \ -H "Authorization: Bearer YOUR_API_KEY" \ --data-urlencode "query=Hola mundo" \ -d "lang=en"
News
| Method | URL |
|---|---|
| GET | https://api.serpsearch.com/api/v1/news |
Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
query | string | Yes | -- | The news search query. |
lat | number | No | -- | Latitude for geo-targeted results. |
lng | number | No | -- | Longitude for geo-targeted results. |
location | string | No | -- | Location string for geo-targeted results. |
gl | string | No | -- | Country code for geo-targeting results (ISO 3166-1 alpha-2, e.g. "us", "de", "gb"). |
hl | string | No | -- | Interface language code (ISO 639-1, e.g. "en", "de", "ar"). |
google_domain | string | No | -- | Google domain to query, without "www." (e.g. "google.de", "google.co.uk"). |
lr | string | No | -- | Restrict results to a specific language (e.g. "lang_en", "lang_de"). |
cr | string | No | -- | Restrict results to a specific country (e.g. "countryUS", "countryDE"). |
safe | string | No | -- | Safe search filter: "active" or "off". |
uule | string | No | -- | Pre-encoded UULE string for precise geo-targeting. |
Response
[
{
"group_name": "Ungrouped",
"articles": [
{
"title": "February 2026 Google Discover Core Update Is Done Rolling Out",
"url": "https://www.seroundtable.com/february-2026-google-discover-core-update-done.html",
"created_at": 1772188980
},
{
"title": "Google's Discover Core Update Finishes Rolling Out",
"url": "https://www.searchenginejournal.com/googles-discover-core-update-finishes/568413/",
"created_at": 1772198715
}
]
}
]Example
curl -G "https://api.serpsearch.com/api/v1/news" \ -H "Authorization: Bearer YOUR_API_KEY" \ --data-urlencode "query=artificial intelligence"
Image Search
| Method | URL |
|---|---|
| GET | https://api.serpsearch.com/api/v1/images |
Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
query | string | Yes | -- | The image search query. |
page | integer | No | 1 | Results page number (20 results per page). |
lat | number | No | -- | Latitude for geo-targeted results. |
lng | number | No | -- | Longitude for geo-targeted results. |
location | string | No | -- | Location string for geo-targeted results. |
gl | string | No | -- | Country code for geo-targeting results (ISO 3166-1 alpha-2, e.g. "us", "de", "gb"). |
hl | string | No | -- | Interface language code (ISO 639-1, e.g. "en", "de", "ar"). |
google_domain | string | No | -- | Google domain to query, without "www." (e.g. "google.de", "google.co.uk"). |
lr | string | No | -- | Restrict results to a specific language (e.g. "lang_en", "lang_de"). |
cr | string | No | -- | Restrict results to a specific country (e.g. "countryUS", "countryDE"). |
safe | string | No | -- | Safe search filter: "active" or "off". |
uule | string | No | -- | Pre-encoded UULE string for precise geo-targeting. |
Response
[
{
"title": "AI Generated Art",
"url": "https://example.com/page",
"source": "example.com",
"alt": "AI generated artwork",
"is_licensable": false,
"preview": {
"url": "https://example.com/thumb.jpg",
"width": 300,
"height": 200
},
"full": {
"url": "https://example.com/full.jpg",
"width": 1920,
"height": 1080
}
}
]Example
curl -G "https://api.serpsearch.com/api/v1/images" \ -H "Authorization: Bearer YOUR_API_KEY" \ --data-urlencode "query=sunset photography" \ -d "page=1"
Video Search
| Method | URL |
|---|---|
| GET | https://api.serpsearch.com/api/v1/videos |
Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
query | string | Yes | -- | The video search query. |
page | integer | No | 1 | Results page number (10 results per page). |
lat | number | No | -- | Latitude for geo-targeted results. |
lng | number | No | -- | Longitude for geo-targeted results. |
location | string | No | -- | Location string for geo-targeted results. |
gl | string | No | -- | Country code for geo-targeting results (ISO 3166-1 alpha-2, e.g. "us", "de", "gb"). |
hl | string | No | -- | Interface language code (ISO 639-1, e.g. "en", "de", "ar"). |
google_domain | string | No | -- | Google domain to query, without "www." (e.g. "google.de", "google.co.uk"). |
lr | string | No | -- | Restrict results to a specific language (e.g. "lang_en", "lang_de"). |
cr | string | No | -- | Restrict results to a specific country (e.g. "countryUS", "countryDE"). |
safe | string | No | -- | Safe search filter: "active" or "off". |
uule | string | No | -- | Pre-encoded UULE string for precise geo-targeting. |
Response
[
{
"title": "Introduction to Machine Learning",
"url": "https://youtube.com/watch?v=...",
"description": "A beginner-friendly guide...",
"thumbnail": "https://i.ytimg.com/vi/.../default.jpg",
"duration": "12:34",
"website": "youtube.com",
"channel_name": "Tech Channel",
"upload_date": "2024-01-10"
}
]Example
curl -G "https://api.serpsearch.com/api/v1/videos" \ -H "Authorization: Bearer YOUR_API_KEY" \ --data-urlencode "query=machine learning tutorial" \ -d "page=1"
Maps Search
| Method | URL |
|---|---|
| GET | https://api.serpsearch.com/api/v1/maps |
Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
query | string | Yes | -- | The maps search query (e.g. business name, category). |
lat | number | No | -- | Latitude for geo-targeted results. |
lng | number | No | -- | Longitude for geo-targeted results. |
location | string | No | -- | Location string for geo-targeted results. |
gl | string | No | -- | Country code for geo-targeting results (ISO 3166-1 alpha-2, e.g. "us", "de", "gb"). |
hl | string | No | -- | Interface language code (ISO 639-1, e.g. "en", "de", "ar"). |
uule | string | No | -- | Pre-encoded UULE string for precise geo-targeting. |
json_restrictor | string | No | -- | Comma-separated list of response JSON fields to include (e.g. "results[0]"). |
Response
{
"results": [
{
"name": "Google France",
"address": "Google France, 8 Rue de Londres, 75009 Paris, France",
"rating": 4.1,
"place_id": "ChIJixLu7DBu5kcRQnIpA2tErS8",
"feature_id": "0x47e66e30ecee128b:0x2fad446b03297242",
"website": "http://google.com/",
"lat": 48.8775,
"lng": 2.3300,
"timezone": "Europe/Paris",
"country_code": "FR",
"categories": ["Corporate office", "Software company"],
"opening_hours": ["Friday: 9:30 am–7:30 pm"]
}
]
}Example
curl -G "https://api.serpsearch.com/api/v1/maps" \ -H "Authorization: Bearer YOUR_API_KEY" \ --data-urlencode "query=google offices in paris"
Place Details
| Method | URL |
|---|---|
| GET | https://api.serpsearch.com/api/v1/maps/place |
Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
feature_id | string | No | -- | The feature_id from a maps search result. Provide either feature_id or place_id. |
place_id | string | No | -- | The Google place_id (e.g. ChIJ...). Provide either feature_id or place_id. |
gl | string | No | -- | Country code for geo-targeting results (ISO 3166-1 alpha-2, e.g. "us", "de", "gb"). |
hl | string | No | -- | Interface language code (ISO 639-1, e.g. "en", "de", "ar"). |
json_restrictor | string | No | -- | Comma-separated list of response JSON fields to include (e.g. "name,address,rating"). |
Response
{
"name": "Auto Urgnano srl",
"address": "Auto Urgnano srl, Via Leon Battista Alberti, 18, 24059 Urgnano BG, Italy",
"rating": 4.4,
"review_count": 115,
"place_id": "ChIJE4BAyxZFgUcRrOjaYjiUOI4",
"feature_id": "0x47814516cb408013:0x8e38943862dae8ac",
"logo": "https://streetviewpixels-pa...",
"link": "https://www.google.com/maps/place/?q=place_id:ChIJE4BAyxZFgUcRrOjaYjiUOI4",
"lat": 45.5898,
"lng": 9.7016,
"timezone": "Europe/Rome",
"country_code": "IT",
"categories": ["Used car dealer"],
"opening_hours": ["Friday: 9 am–6:30 pm", "Saturday: 9 am–4 pm", "Sunday: Closed"],
"rating_distribution": { "5": 91, "4": 7, "3": 1, "2": 5, "1": 11 }
}Example
curl -G "https://api.serpsearch.com/api/v1/maps/place" \ -H "Authorization: Bearer YOUR_API_KEY" \ --data-urlencode "feature_id=0x47814516cb408013:0x8e38943862dae8ac"
Distance
| Method | URL |
|---|---|
| GET | https://api.serpsearch.com/api/v1/maps/distance |
Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
from_lat | number | Yes | -- | Starting point latitude. |
from_lng | number | Yes | -- | Starting point longitude. |
to_lat | number | Yes | -- | Destination latitude. |
to_lng | number | Yes | -- | Destination longitude. |
Response
{
"distance_text": "5.2 mi",
"duration_text": "15 mins",
"distance_meters": 8368
}Example
curl -G "https://api.serpsearch.com/api/v1/maps/distance" \ -H "Authorization: Bearer YOUR_API_KEY" \ -d "from_lat=40.758" -d "from_lng=-73.9855" \ -d "to_lat=40.7829" -d "to_lng=-73.9654"
Reviews
| Method | URL |
|---|---|
| GET | https://api.serpsearch.com/api/v1/reviews |
Parameters
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
place_id | string | Yes | -- | The place identifier. Accepts either a feature_id (0x...:0x...) or a Google place_id (ChIJ...). |
sort_by | string | No | relevant | Sort order: relevant, newest, high_rating, or low_rating. |
page_id | string | No | -- | Pagination token from a previous response's next_page field. |
search | string | No | -- | Filter reviews by keyword. |
lat | number | No | -- | Latitude for geo-targeting. |
lng | number | No | -- | Longitude for geo-targeting. |
location | string | No | -- | Location string for geo-targeting. |
gl | string | No | -- | Country code for geo-targeting results (ISO 3166-1 alpha-2, e.g. "us", "de", "gb"). |
hl | string | No | -- | Interface language code (ISO 639-1, e.g. "en", "de", "ar"). |
json_restrictor | string | No | -- | Comma-separated list of response JSON fields to include (e.g. "reviews[0],next_page"). |
Response
{
"reviews": [
{
"review": {
"id": "abc123",
"rating": 5,
"text": "Amazing place, highly recommend!",
"translated_text": null,
"lang": "en",
"created_at": 1704873600,
"updated_at": null,
"link": "https://..."
},
"user": {
"id": "1234567890",
"name": "John D.",
"image_url": "https://...",
"review_count": 42,
"profile_url": "https://..."
},
"response": {
"text": "Thank you for your kind words!",
"translated_text": null,
"lang": "en",
"created_at": 1704960000
}
}
],
"next_page": "eyJwYWdlIjoyf..."
}Example
curl -G "https://api.serpsearch.com/api/v1/reviews" \ -H "Authorization: Bearer YOUR_API_KEY" \ -d "place_id=0x47814516cb408013:0x8e38943862dae8ac" \ -d "sort_by=newest"
Review Batch Exports (Pro+)
Export Google Maps reviews asynchronously across a specific creation date range. This API is available to active Pro, Business, and Enterprise subscriptions. It is designed for jobs that may span many review pages and returns a private, gzipped NDJSON file instead of holding a long-running HTTP connection open.
startAt is included and endAt is excluded. The worker divides longer ranges into up to 10 parallel date shards, with a minimum of one day per shard. Review IDs are de-duplicated before the export is uploaded.Endpoints
| Method | URL | Purpose |
|---|---|---|
| POST | https://api.serpsearch.com/api/v1/reviews/batches | Create an asynchronous review export. |
| GET | https://api.serpsearch.com/api/v1/reviews/batches | List your most recent export jobs. |
| GET | https://api.serpsearch.com/api/v1/reviews/batches/{id} | Get one export job and its progress. |
| DELETE | https://api.serpsearch.com/api/v1/reviews/batches/{id} | Request cancellation of a queued or running job. |
| GET | https://api.serpsearch.com/api/v1/reviews/batches/{id}/download | Create a temporary download URL for a completed export. |
Create an export
Send a JSON body to POST https://api.serpsearch.com/api/v1/reviews/batches. A new job returns 202 Accepted. Reusing the same Idempotency-Key for the account returns the original job with 200 OK, so retrying a timed-out create request does not enqueue a duplicate.
| Header | Required | Description |
|---|---|---|
Authorization | Yes | Bearer API key for the owning account. |
Content-Type | Yes | Must be application/json. |
Idempotency-Key | No | An ASCII value from 1 to 128 bytes, unique to the intended job. |
JSON body
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
featureId | string | Conditional | -- | Google Maps feature ID in 0x...:0x... form. Supply featureId or placeId; featureId takes precedence when both are present. |
placeId | string | Conditional | -- | Google Place ID in ChIJ... form. Supply placeId when featureId is not provided. |
startAt | RFC 3339 datetime | Yes | -- | Inclusive start of the review creation-time range. Must be UTC-compatible and use whole-second precision. |
endAt | RFC 3339 datetime | Yes | -- | Exclusive end of the review creation-time range. Must be later than startAt and use whole-second precision. |
hl | string | No | en | Google interface language/locale used while loading reviews. |
gl | string | No | us | Google country/locale used while loading reviews. |
search | string | No | -- | Optional review-text filter, up to 500 bytes. Omit it to export every review Google returns in the range. |
Creation example
curl -X POST "https://api.serpsearch.com/api/v1/reviews/batches" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: apple-reviews-2026-08" \
--data '{
"featureId": "0x808fbb38fa3f36f9:0xf5692002b984147",
"startAt": "2026-08-01T00:00:00Z",
"endAt": "2026-08-20T00:00:00Z",
"hl": "en",
"gl": "us"
}'Job response
{
"id": "cmexamplebatch123",
"status": "queued",
"featureId": "0x808fbb38fa3f36f9:0xf5692002b984147",
"startAt": "2026-08-01T00:00:00Z",
"endAt": "2026-08-20T00:00:00Z",
"endExclusive": true,
"hl": "en",
"gl": "us",
"format": "ndjson",
"contentType": "application/x-ndjson",
"contentEncoding": "gzip",
"progress": {
"completedShards": 0,
"shardCount": 10,
"pagesFetched": 0,
"reviewsMatched": 0,
"reviewsExported": 0
},
"requestsCharged": 0,
"truncatedByQuota": false,
"attempts": 0,
"maxAttempts": 3,
"nextAttemptAt": "2026-08-20T14:00:00Z",
"fileSizeBytes": 0,
"fileName": "google-reviews-cmexamplebatch123.ndjson.gz",
"createdAt": "2026-08-20T14:00:00Z",
"links": {
"self": "/api/v1/reviews/batches/cmexamplebatch123"
}
}| Field | Type | Description |
|---|---|---|
id | string | Stable export job ID. |
status | string | queued, running, completed, failed, or cancelled. |
featureId | string | Resolved Google Maps feature ID. |
startAt / endAt | datetime | Requested creation-time boundaries. |
endExclusive | boolean | Always true; the export covers [startAt, endAt). |
hl / gl / search | string | Effective locale and optional filter. |
format | string | ndjson. The downloaded artifact contains one review object per line. |
contentType / contentEncoding | string | application/x-ndjson and gzip. |
progress | object | Shard, page, matched-review, and exported-review counters. |
requestsCharged | integer | Monthly requests charged for this artifact. This remains 0 until successful delivery. |
truncatedByQuota | boolean | True when available monthly quota stopped the scrape and the completed artifact is partial. |
attempts / maxAttempts | integer | Current worker attempt and the retry ceiling. |
nextAttemptAt / cancelRequestedAt | datetime | Queue/retry timing and cancellation acknowledgement when applicable. |
fileSizeBytes / fileName | integer / string | Compressed artifact size and suggested download name. |
error | string | Terminal failure reason when a job fails. |
createdAt / startedAt / completedAt | datetime | Job lifecycle timestamps when applicable. |
expiresAt | datetime | Artifact expiry. Completed exports are retained for seven days. |
links | object | Relative self link and, while available, the download endpoint link. |
Lifecycle fields that do not apply yet are omitted from the JSON rather than returned as null.
List, poll, and cancel jobs
List responses have the shape {"jobs": [ReviewBatchJob, ...]}. The optional limit query parameter defaults to 20 and is clamped to 1–100. Job IDs are owner-scoped: another account cannot inspect, cancel, or download your export.
# List recent jobs curl "https://api.serpsearch.com/api/v1/reviews/batches?limit=20" \ -H "Authorization: Bearer YOUR_API_KEY" # Poll one job curl "https://api.serpsearch.com/api/v1/reviews/batches/cmexamplebatch123" \ -H "Authorization: Bearer YOUR_API_KEY" # Request cancellation curl -X DELETE "https://api.serpsearch.com/api/v1/reviews/batches/cmexamplebatch123" \ -H "Authorization: Bearer YOUR_API_KEY"
Cancellation returns 202 Accepted. Queued jobs are cancelled immediately; running jobs stop cooperatively and may report progress before reaching cancelled.
Quota, charging, and partial delivery
Each Google review page requested by the workers counts as one monthly API request, regardless of how many reviews that page contains. While a job is running, those requests are reserved: they reduce your available quota but are not added to consumed usage. The final page total is charged once, in the same database transaction that marks the uploaded artifact available for download.
truncatedByQuota: false. If the workers reach the account's exact remaining quota first, they stop across all shards, publish the reviews collected so far, and complete the job with truncatedByQuota: true. For example, an account with 900 requests remaining receives a partial artifact after at most 900 page requests, requestsCharged: 900, and zero remaining requests.Cancelled jobs, terminally failed jobs, and failed retry attempts do not consume their reservations. Job creation, listing, polling, cancellation, and download-link requests are still subject to the requests-per-second limit, but do not deduct monthly request quota.
Download a completed export
Once the job is completed, request its download resource. The API returns a signed URL valid for 15 minutes. The private export itself remains available for seven days after completion, so you can request another signed URL until expiresAt.
curl "https://api.serpsearch.com/api/v1/reviews/batches/cmexamplebatch123/download" \
-H "Authorization: Bearer YOUR_API_KEY"
{
"url": "https://review-export-bucket.s3.amazonaws.com/...",
"expiresAt": "2026-08-20T14:20:00Z",
"contentType": "application/x-ndjson",
"contentEncoding": "gzip",
"fileName": "google-reviews-cmexamplebatch123.ndjson.gz"
}NDJSON review schema
After gzip decompression, each line is one JSON review entry using the same review schema as GET https://api.serpsearch.com/api/v1/reviews. Optional fields, including an owner response, are omitted when Google does not provide them.
{"review":{"id":"abc123","rating":5,"text":"Amazing place!","lang":"en","created_at":1786032000,"link":"https://..."},"user":{"id":"1234567890","name":"John D.","image_url":"https://...","review_count":42,"profile_url":"https://..."},"response":{"text":"Thank you!","lang":"en","created_at":1786118400}}Batch error responses
Review batch endpoints return errors as a JSON object containing a human-readable error string:
{
"error": "review export is not ready for download"
}| HTTP | Meaning |
|---|---|
| 400 | Invalid JSON, place identifier, date range, locale, search, or idempotency key. |
| 403 | The subscription is inactive or does not include Pro+ batch exports. |
| 404 | The owner-scoped job does not exist, or its export has expired. |
| 409 | The export is not completed and cannot be downloaded yet. |
| 429 | The per-second rate limit or three-active-job limit was reached. |
requestsCharged and truncatedByQuota together when recording whether a completed download covers the full requested date range.Error Codes
All errors follow the same envelope shape:
{
"error": {
"code": "RATE_LIMIT_EXCEEDED",
"message": "Rate limit exceeded. Please slow down your requests."
}
}| Code | HTTP | Description |
|---|---|---|
INVALID_API_KEY | 401 | The API key is missing, malformed, or does not exist. |
EXPIRED_API_KEY | 401 | The API key has passed its expiration date. |
REVOKED_API_KEY | 401 | The API key has been manually revoked. |
SUBSCRIPTION_REQUIRED | 403 | No active subscription found for this account. |
SUBSCRIPTION_INACTIVE | 403 | The subscription exists but is not in ACTIVE state. |
RATE_LIMIT_EXCEEDED | 429 | More than the allowed requests per second were sent. Slow down and retry. |
QUOTA_EXCEEDED | 429 | Monthly request quota for the current billing period is exhausted. |
INVALID_QUERY | 400 | The q / query parameter is missing, empty, or the request body is malformed JSON. |
UPSTREAM_ERROR | 502 | The upstream search provider returned an error. Retry later. |
INTERNAL_ERROR | 500 | An unexpected server-side error occurred. |
Rate Limits & Quotas
Two separate limits apply to every request:
- Per-second rate limit -- enforced with a sliding window. Exceeding it returns
RATE_LIMIT_EXCEEDED(HTTP 429) with aRetry-After: 1header. - Monthly quota -- resets with your billing period. Exceeding it returns
QUOTA_EXCEEDED(HTTP 429). Upgrade your plan to increase your limit.
| Plan | Monthly requests | Requests / second | Price |
|---|---|---|---|
| Starter | 80,000 | 15 | $40 / mo |
| Pro | 800,000 | 50 | $300 / mo |
| Business | 3,000,000 | 150 | $1,000 / mo |
| Enterprise | Custom | Custom | Contact us |
You can monitor your current usage from the usage dashboard. Need higher limits? View all plans or contact us for Enterprise pricing.
Response Headers
Every response (including errors) includes the following headers to help you track your usage and rate limits:
| Header | Description |
|---|---|
X-RateLimit-Limit | Maximum requests per second allowed for your plan. |
X-RateLimit-Remaining | Requests remaining in the current one-second window. |
X-RateLimit-Reset | Unix timestamp (seconds) when the rate limit window resets. |
X-Quota-Used | Total requests used in the current billing period. |
X-Quota-Reserved | Requests held by running review batches. Reserved requests reduce availability but are charged only if an artifact is delivered. |
X-Quota-Limit | Total requests allowed in the current billing period. |
X-Quota-Remaining | Requests currently available after used and reserved requests are deducted. |
X-Response-Time | End-to-end server processing time (e.g. 142ms). Only present on successful responses. |
Retry-After | Seconds to wait before retrying. Present only on RATE_LIMIT_EXCEEDED responses. |
Ready to get started?
Create a free account, pick a plan, and generate your API key in minutes.