# 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.
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.
Web Search
Method
URL
GET
https://api.serpsearch.com/api/v1/search
Parameters
Name
Type
Required
Default
Description
query
string
Yes
--
The search query.
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": {
"answer": "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/"
}
]
}
}
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 and reported search time.
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
AI Overview answer, steps, 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.
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.
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.
Date ranges are half-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.
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.
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.
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.
A completed full export has 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.
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 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.
An account may have at most three queued or running review exports at a time. Use requestsCharged and truncatedByQuota together when recording whether a completed download covers the full requested date range.
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.
MCP endpoint
https://mcp.serpsearch.com/mcp
Connect 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.
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.
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 a Retry-After: 1 header.
Monthly quota -- resets with your billing period. Exceeding it returns QUOTA_EXCEEDED (HTTP 429). Upgrade your plan to increase your limit.