Home/API Documentation

API Documentation

Complete reference for all SERP Search API endpoints.

Quick Start

Get up and running in a few steps:

2

Generate an API key from your dashboard.

3

Make your first request:

# 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.

MethodURL
GEThttps://api.serpsearch.com/api/v1/search

Parameters

NameTypeRequiredDefaultDescription
querystringYes--The search query.
pageintegerNo1Results page number (1-based, 10 results per page).
latnumberNo--Latitude for geo-targeted results.
lngnumberNo--Longitude for geo-targeted results.
locationstringNo--Location string for geo-targeting (e.g. "New York, NY, US").
response_typestringNojsonResponse format: json, html, both, or correlated.
jsbooleanNofalseWhen true, keeps JavaScript in HTML response; when false, strips script tags.
glstringNo--Country code for geo-targeting results (ISO 3166-1 alpha-2, e.g. "us", "de", "gb").
hlstringNo--Interface language code (ISO 639-1, e.g. "en", "de", "ar").
google_domainstringNo--Google domain to query, without "www." (e.g. "google.de", "google.co.uk").
lrstringNo--Restrict results to a specific language (e.g. "lang_en", "lang_de").
crstringNo--Restrict results to a specific country (e.g. "countryUS", "countryDE").
safestringNo--Safe search filter: "active" or "off".
uulestringNo--Pre-encoded UULE string for precise geo-targeting.
json_restrictorstringNo--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/"
      }
    ]
  }
}

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"

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

FieldTypeRequiredDescription
search_infoSearchInfoNoGoogle's result count and reported search time.
organic_resultsOrganicResult[]NoRanked web results; omitted when no native organic results are present.
knowledge_graphKnowledgeGraphNoEntity or local knowledge panel with cleaned facts and media.
definition_resultDefinitionResultNoDictionary definition widget.
people_also_askPaaQuestion[]NoPeople also ask questions.
weather_resultWeatherResultNoWeather widget.
local_resultsLocalResultsNoStructured places list from a local-result module.
short_videosShortVideo[]NoShort-video carousel.
videosVideo[]NoVideo carousel.
recipesRecipe[]NoRecipe carousel.
filter_pillsFilterPill[]NoSearch refinement filters.
local_packLocalPackPlace[]NoDesktop local pack, including status, services, distance, and website.
site_sub_resultsSiteSubResultGroup[]NoPublisher-specific inline result groups.
places_sitesPlacesSite[]NoPlaces-site links.
things_to_knowThingsToKnowItem[]NoThings to know accordion items.
what_people_are_sayingWhatPeopleAreSayingNoDiscussion articles owned by the named section.
social_resultsSocialResult[]NoStandalone social-result cards.
standalone_videosStandaloneVideoResult[]NoStandalone video web results.
related_searchesRelatedSearch[]NoRelated queries, excluding pagination controls.
people_also_search_forPasfEntity[]NoRelated entity suggestions.
market_summaryMarketSummaryNoStock, index, or crypto market data; never fabricated for a plain fiat conversion.
currency_converterCurrencyConverterNoStandalone currency conversion, separate from market_summary.
top_storiesTopStoriesNoNews stories owned by an explicit Top stories section.
sponsored_resultsSponsoredResult[]NoSponsored web results.
calculator_resultCalculatorResultNoCalculator expression and exact displayed result.
translation_resultTranslationResultNoInline translation, language metadata, alternatives, or an explicit error.
flight_resultFlightResultNoFlight route, filters, and bookable options.
sports_resultSportsResultNoCompleted or scheduled sports event with teams and optional scoring.
jobsJobModuleNoGoogle Jobs module and job cards.
hotelsHotelModuleNoHotel search context and hotel cards.
productsProductModuleNoShopping product cards and commercial metadata.
image_packImagePackNoInline image pack with source and image dimensions.
ai_overviewAiOverviewNoAI Overview answer, steps, citations, and optional products.
moviesMovieModuleNoMovies, 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.

FieldTypeRequiredDescription
titlestringYesResult title.
urlURLYesAbsolute publisher URL.
websitestringYesPublisher/site label.
positionintegerYes1-based rank on the requested page.
descriptionstringNoVisible snippet text; never flattened card or UI text.
visible_urlstringNoBreadcrumb URL as displayed by Google.
answerstringNoInline answer shown with the result.
ratingnumberNoNormalized rating from 0 through 5.
reviewsstringNoReview-count label as displayed.
pricestringNoDisplayed price.
durationstringNoDisplayed media duration.
answer_countstringNoDisplayed answer/discussion count.
datestringNoDisplayed publication or update date.
thumbnailURLNoAbsolute HTTP(S) thumbnail URL.
faviconURLNoAbsolute HTTP(S) favicon URL.
sitelinksSitelink[]NoExpanded sitelinks, each with title, URL, and optional description.
Sitelink

An expanded link owned by its parent organic result.

FieldTypeRequiredDescription
titlestringYesSitelink title.
urlURLYesAbsolute publisher URL.
descriptionstringNoVisible sitelink description.
KgFact

A cleaned fact row from a knowledge panel.

FieldTypeRequiredDescription
keystringYesHuman-readable fact label.
valuestringYesFact value without duplicated label or UI text.
KnowledgeGraph

A cleaned entity panel. UI controls and duplicate thumbnail/gallery images are excluded.

FieldTypeRequiredDescription
titlestringYesEntity title.
subtitlestringNoEntity subtitle.
categorystringNoNormalized entity/category label.
ratingnumberNoNormalized rating from 0 through 5.
reviewsstringNoDisplayed review count.
descriptionstringNoClean panel description.
thumbnailURLNoPrimary absolute image URL.
source_namestringNoDescription source name.
source_linkURLNoDescription source URL.
imagesURL[]NoUnique absolute gallery image URLs.
facts{ key, value }[]NoClean human-readable fact rows.
LocalResults

A structured local-results collection.

FieldTypeRequiredDescription
placesLocalPlace[]YesRanked local places with optional numeric rating, reviews, price, category, and address.
LocalPlace

A ranked place from a structured local-results list.

FieldTypeRequiredDescription
positionintegerYes1-based position in the module.
titlestringYesPlace name.
ratingnumberNoNormalized rating from 0 through 5.
reviewsstringNoDisplayed review count.
pricestringNoDisplayed price/range.
categorystringNoPlace category.
addressstringNoDisplayed address.
LocalPackPlace

A place in the desktop local pack. Same-name businesses at different addresses remain distinct.

FieldTypeRequiredDescription
namestringYesBusiness name.
ratingnumberNoNormalized rating from 0 through 5.
reviewsstringNoDisplayed review count.
price_rangestringNoDisplayed price range.
typestringNoPlace category.
distancestringNoDistance from the requested location.
addressstringNoStreet or locality address.
phonestringNoDisplayed business phone number.
statusstringNoOpen/closed status and next transition.
descriptionstringNoShort place tagline.
servicesstring[]NoDisplayed service tags, such as In-store pickup, Dine-in, or Delivery.
websiteURLNoAbsolute business website URL.
CurrencyConverter

A standalone fiat or unit conversion. Plain converters do not create market_summary.

FieldTypeRequiredDescription
from_currencystringYesSource currency name/code.
to_currencystringYesTarget currency name/code.
from_amountstringNoDisplayed source amount.
to_amountstringNoDisplayed converted amount.
MarketSummary

A real stock, index, or crypto market widget. Its optional nested converter belongs to that market entity.

FieldTypeRequiredDescription
entitystringYesMarket entity name.
pricestringYesDisplayed market price.
currencystringYesDisplayed currency code.
change_amountstringNoDisplayed absolute change.
change_percentstringNoDisplayed percentage change.
timestampstringNoDisplayed quote timestamp.
periodsstring[]NoAvailable chart periods.
converterCurrencyConverterNoConverter attached to a crypto/market widget.
metricsFinancialMetricsNoOpen, high, low, valuation, and dividend metrics.
quarterly_financialsQuarterlyFinancialsNoDisplayed quarterly revenue summary.
earningsEarningsNoDisplayed earnings summary.
relatedRelatedCompany[]NoRelated market entities.
FinancialMetrics

Optional metrics inside a market summary.

FieldTypeRequiredDescription
openstringNoOpening price.
highstringNoSession high.
lowstringNoSession low.
mkt_capstringNoMarket capitalization.
pe_ratiostringNoPrice-to-earnings ratio.
high_52wkstringNo52-week high.
low_52wkstringNo52-week low.
dividend_yieldstringNoDividend yield.
qtrly_div_amtstringNoQuarterly dividend amount.
QuarterlyFinancials

Quarterly revenue shown in a market widget.

FieldTypeRequiredDescription
periodstringYesQuarter/period label.
revenuestringYesDisplayed revenue.
yoy_changestringNoYear-over-year change.
Earnings

Earnings summary shown in a market widget.

FieldTypeRequiredDescription
periodstringYesEarnings period.
eps_beatstringNoEPS beat/miss text.
revenue_beatstringNoRevenue beat/miss text.
RelatedCompany

A related market entity.

FieldTypeRequiredDescription
namestringYesCompany/entity name.
tickerstringNoTicker symbol.
pricestringYesDisplayed price.
currencystringNoCurrency code.
change_percentstringNoDisplayed percentage change.
CalculatorResult

Google's calculator output with both the visible and whitespace-normalized expression.

FieldTypeRequiredDescription
displayed_expressionstringYesExpression exactly as displayed.
normalized_expressionstringYesExpression with display spacing normalized.
resultstringYesExact displayed result.
modestringNoCalculator mode, for example Rad or Deg.
TranslationResult

Inline Google Translate state. An error is explicit and never inferred from hidden copy-status text.

FieldTypeRequiredDescription
statusstringYesTranslation status, normally translated or error.
source_textstringYesInput text.
translated_textstringNoTranslated text when available.
source_languageTranslationLanguageNoSource code and optional language name.
target_languageTranslationLanguageNoTarget code and optional language name.
detected_source_languagebooleanYesWhether Google detected the source language.
source_pronunciationstringNoSource pronunciation.
target_pronunciationstringNoTarget pronunciation.
alternativesTranslationAlternative[]NoAlternative translations, meanings, and part of speech.
errorstringNoVisible translation error.
TranslationLanguage

Language metadata attached to a translation.

FieldTypeRequiredDescription
codestringYesLanguage code from Google's widget.
namestringNoDisplayed language name.
TranslationAlternative

An alternative translation and its meanings.

FieldTypeRequiredDescription
part_of_speechstringNoDisplayed part of speech.
translationstringYesAlternative translated text.
meaningsstring[]NoDisplayed meanings/usages.
FlightResult

A Google Flights module.

FieldTypeRequiredDescription
originstringYesOrigin airport/city.
destinationstringYesDestination airport/city.
departure_datestringNoDisplayed departure date.
return_datestringNoDisplayed return date.
trip_typestringNoRound trip, one way, and so on.
cabin_classstringNoDisplayed cabin class.
filtersstring[]NoActive flight filters.
optionsFlightOption[]NoAirline, duration, stops, price, emissions, and absolute booking/search URL.
FlightOption

A bookable/searchable option in a flight module.

FieldTypeRequiredDescription
airlinestringYesAirline name.
durationstringYesDisplayed journey duration.
stopsstringYesStop count/label.
pricestringYesDisplayed formatted price.
price_valuenumberNoParsed non-negative numeric price.
currencystringNoCurrency code.
emissionsstringNoDisplayed emissions estimate.
urlURLYesAbsolute Google Flights URL.
SportsResult

A live, completed, or scheduled event. Scheduled events keep teams without inventing scores.

FieldTypeRequiredDescription
leaguestringNoLeague/competition.
statusstringYesEvent state such as Final or Scheduled.
datestringNoDisplayed event date.
teamsSportsTeam[]YesTeam name plus optional record and score.
scoring_headersstring[]NoPeriod/inning table headers.
scoring_rowsSportsScoringRow[]NoTeam and period/total values.
SportsTeam

A participant in a sports event.

FieldTypeRequiredDescription
namestringYesFull team/player name.
recordstringNoDisplayed season/event record.
scorestringNoDisplayed score; absent for scheduled events without a score.
SportsScoringRow

One row in a period/inning scoring table.

FieldTypeRequiredDescription
teamstringYesTeam name.
valuesstring[]YesValues aligned with scoring_headers.
JobModule

Google Jobs results.

FieldTypeRequiredDescription
titlestringYesModule title.
more_jobs_urlURLNoAbsolute URL for additional jobs.
jobsJobResult[]YesTitle, company, location, source, age, employment type, salary, benefits, tags, and URL.
JobResult

A card in Google Jobs.

FieldTypeRequiredDescription
titlestringYesJob title.
companystringYesEmployer.
locationstringNoDisplayed job location.
sourcestringNoListing provider.
agestringNoPlausible displayed posting age.
employment_typestringNoEmployment type.
salarystringNoDisplayed salary/range.
benefitsstring[]NoDisplayed benefits.
tagsstring[]NoAdditional tags such as Remote.
urlURLNoAbsolute listing URL.
HotelModule

Google Hotels cards and the search context they share.

FieldTypeRequiredDescription
titlestringYesModule title.
contextHotelContextYesLocation, check-in/out, guest count, and price-window context.
hotelsHotelResult[]YesName, pricing, rating, provider, amenities, terms, deal, sponsorship, URL, and thumbnail.
HotelContext

Search context shared by hotel cards.

FieldTypeRequiredDescription
locationstringNoSelected destination.
check_instringNoDisplayed check-in date.
check_outstringNoDisplayed check-out date.
guestsintegerNoPositive guest count.
price_windowstringNoDisplayed pricing-window summary.
HotelResult

A hotel card.

FieldTypeRequiredDescription
namestringYesHotel name.
pricestringNoDisplayed formatted price.
price_valuenumberNoParsed non-negative numeric price.
currencystringNoCurrency code.
ratingnumberNoNormalized rating from 0 through 5.
reviewsstringNoDisplayed review count.
categorystringNoHotel class/category.
providerstringNoBooking provider.
amenitiesstring[]NoDisplayed amenities.
availability_termsstring[]NoCancellation/payment terms.
dealstringNoDisplayed deal label.
descriptionstringNoHotel description.
sponsoredbooleanYesWhether Google marks the card sponsored.
urlURLNoAbsolute hotel/search URL.
thumbnailURLNoAbsolute thumbnail URL.
ProductModule

A shopping/product carousel.

FieldTypeRequiredDescription
titlestringYesModule title.
productsProductResult[]YesTitle, prices, merchant, rating, availability, delivery, variants, URL, and thumbnail.
ProductResult

A product card, including cards nested in an AI Overview.

FieldTypeRequiredDescription
titlestringYesProduct title.
pricestringYesDisplayed current price.
price_valuenumberNoParsed non-negative numeric price.
currencystringNoCurrency code.
previous_pricestringNoDisplayed previous price.
merchantstringNoMerchant/provider.
ratingnumberNoNormalized rating from 0 through 5.
reviewsstringNoDisplayed review count.
discountstringNoDisplayed discount.
availabilitystringNoStock/proximity text.
delivery_termsstring[]NoDelivery and pickup terms.
variantsstring[]NoDisplayed product variants.
urlURLNoAbsolute product/search URL.
thumbnailURLNoAbsolute thumbnail URL.
ImagePack

An inline image pack. Inline data: payloads are never returned as image URLs.

FieldTypeRequiredDescription
titlestringYesModule title.
imagesImageResult[]YesTitle, source, source/image/thumbnail URLs, width, and height.
ImageResult

An image in an inline image pack.

FieldTypeRequiredDescription
titlestringYesImage/result title.
sourcestringNoPublisher name.
source_urlURLNoAbsolute publisher page URL.
image_urlURLNoAbsolute full image URL.
thumbnailURLNoAbsolute thumbnail URL.
widthintegerNoPositive image width in pixels.
heightintegerNoPositive image height in pixels.
AiOverview

A native AI Overview; unavailable/placeholder widgets are omitted.

FieldTypeRequiredDescription
answerstringYesVisible overview answer.
stepsstring[]NoStructured answer steps.
citationsAiCitation[]NoCitation title and absolute publisher URL.
productsProductResult[]NoProducts shown inside the overview.
AiCitation

A source cited by an AI Overview.

FieldTypeRequiredDescription
titlestringYesCitation title.
urlURLYesAbsolute publisher URL.
MovieModule

Movies playing and their visible showtimes.

FieldTypeRequiredDescription
titlestringYesModule title.
datestringNoSelected date.
theaterstringNoSelected theater.
moviesMovieResult[]YesTitle, content rating, runtime, genres, URL, thumbnail, and showtimes.
MovieResult

A movie displayed in a showtimes module.

FieldTypeRequiredDescription
titlestringYesMovie title.
content_ratingstringNoContent rating such as PG-13.
runtimestringNoDisplayed runtime.
genresstring[]NoDisplayed genres.
urlURLNoAbsolute Google movie/search URL.
thumbnailURLNoAbsolute poster URL.
showtimesMovieShowtime[]NoVisible showtimes for this movie.
MovieShowtime

A visible movie showtime.

FieldTypeRequiredDescription
datestringNoDisplayed date.
timestringYesDisplayed time.
theaterstringYesTheater name.
formatstringNoScreening format.
timestampintegerNoGoogle-provided Unix timestamp.
urlURLNoAbsolute ticket URL.

Autocomplete

MethodURL
GEThttps://api.serpsearch.com/api/v1/autocomplete

Parameters

NameTypeRequiredDefaultDescription
querystringYes--The search query to get suggestions for.
latnumberNo--Latitude for geo-targeted suggestions.
lngnumberNo--Longitude for geo-targeted suggestions.
locationstringNo--Location string for geo-targeted suggestions.
glstringNo--Country code for geo-targeting results (ISO 3166-1 alpha-2, e.g. "us", "de", "gb").
hlstringNo--Interface language code (ISO 639-1, e.g. "en", "de", "ar").
google_domainstringNo--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

MethodURL
GEThttps://api.serpsearch.com/api/v1/translate

Parameters

NameTypeRequiredDefaultDescription
querystringYes--The text to translate.
langstringNoenTarget 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

MethodURL
GEThttps://api.serpsearch.com/api/v1/news

Parameters

NameTypeRequiredDefaultDescription
querystringYes--The news search query.
latnumberNo--Latitude for geo-targeted results.
lngnumberNo--Longitude for geo-targeted results.
locationstringNo--Location string for geo-targeted results.
glstringNo--Country code for geo-targeting results (ISO 3166-1 alpha-2, e.g. "us", "de", "gb").
hlstringNo--Interface language code (ISO 639-1, e.g. "en", "de", "ar").
google_domainstringNo--Google domain to query, without "www." (e.g. "google.de", "google.co.uk").
lrstringNo--Restrict results to a specific language (e.g. "lang_en", "lang_de").
crstringNo--Restrict results to a specific country (e.g. "countryUS", "countryDE").
safestringNo--Safe search filter: "active" or "off".
uulestringNo--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

MethodURL
GEThttps://api.serpsearch.com/api/v1/images

Parameters

NameTypeRequiredDefaultDescription
querystringYes--The image search query.
pageintegerNo1Results page number (20 results per page).
latnumberNo--Latitude for geo-targeted results.
lngnumberNo--Longitude for geo-targeted results.
locationstringNo--Location string for geo-targeted results.
glstringNo--Country code for geo-targeting results (ISO 3166-1 alpha-2, e.g. "us", "de", "gb").
hlstringNo--Interface language code (ISO 639-1, e.g. "en", "de", "ar").
google_domainstringNo--Google domain to query, without "www." (e.g. "google.de", "google.co.uk").
lrstringNo--Restrict results to a specific language (e.g. "lang_en", "lang_de").
crstringNo--Restrict results to a specific country (e.g. "countryUS", "countryDE").
safestringNo--Safe search filter: "active" or "off".
uulestringNo--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

MethodURL
GEThttps://api.serpsearch.com/api/v1/videos

Parameters

NameTypeRequiredDefaultDescription
querystringYes--The video search query.
pageintegerNo1Results page number (10 results per page).
latnumberNo--Latitude for geo-targeted results.
lngnumberNo--Longitude for geo-targeted results.
locationstringNo--Location string for geo-targeted results.
glstringNo--Country code for geo-targeting results (ISO 3166-1 alpha-2, e.g. "us", "de", "gb").
hlstringNo--Interface language code (ISO 639-1, e.g. "en", "de", "ar").
google_domainstringNo--Google domain to query, without "www." (e.g. "google.de", "google.co.uk").
lrstringNo--Restrict results to a specific language (e.g. "lang_en", "lang_de").
crstringNo--Restrict results to a specific country (e.g. "countryUS", "countryDE").
safestringNo--Safe search filter: "active" or "off".
uulestringNo--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

MethodURL
GEThttps://api.serpsearch.com/api/v1/maps

Parameters

NameTypeRequiredDefaultDescription
querystringYes--The maps search query (e.g. business name, category).
latnumberNo--Latitude for geo-targeted results.
lngnumberNo--Longitude for geo-targeted results.
locationstringNo--Location string for geo-targeted results.
glstringNo--Country code for geo-targeting results (ISO 3166-1 alpha-2, e.g. "us", "de", "gb").
hlstringNo--Interface language code (ISO 639-1, e.g. "en", "de", "ar").
uulestringNo--Pre-encoded UULE string for precise geo-targeting.
json_restrictorstringNo--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

MethodURL
GEThttps://api.serpsearch.com/api/v1/maps/place

Parameters

NameTypeRequiredDefaultDescription
feature_idstringNo--The feature_id from a maps search result. Provide either feature_id or place_id.
place_idstringNo--The Google place_id (e.g. ChIJ...). Provide either feature_id or place_id.
glstringNo--Country code for geo-targeting results (ISO 3166-1 alpha-2, e.g. "us", "de", "gb").
hlstringNo--Interface language code (ISO 639-1, e.g. "en", "de", "ar").
json_restrictorstringNo--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

MethodURL
GEThttps://api.serpsearch.com/api/v1/maps/distance

Parameters

NameTypeRequiredDefaultDescription
from_latnumberYes--Starting point latitude.
from_lngnumberYes--Starting point longitude.
to_latnumberYes--Destination latitude.
to_lngnumberYes--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

MethodURL
GEThttps://api.serpsearch.com/api/v1/reviews

Parameters

NameTypeRequiredDefaultDescription
place_idstringYes--The place identifier. Accepts either a feature_id (0x...:0x...) or a Google place_id (ChIJ...).
sort_bystringNorelevantSort order: relevant, newest, high_rating, or low_rating.
page_idstringNo--Pagination token from a previous response's next_page field.
searchstringNo--Filter reviews by keyword.
latnumberNo--Latitude for geo-targeting.
lngnumberNo--Longitude for geo-targeting.
locationstringNo--Location string for geo-targeting.
glstringNo--Country code for geo-targeting results (ISO 3166-1 alpha-2, e.g. "us", "de", "gb").
hlstringNo--Interface language code (ISO 639-1, e.g. "en", "de", "ar").
json_restrictorstringNo--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.

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.

Endpoints

MethodURLPurpose
POSThttps://api.serpsearch.com/api/v1/reviews/batchesCreate an asynchronous review export.
GEThttps://api.serpsearch.com/api/v1/reviews/batchesList your most recent export jobs.
GEThttps://api.serpsearch.com/api/v1/reviews/batches/{id}Get one export job and its progress.
DELETEhttps://api.serpsearch.com/api/v1/reviews/batches/{id}Request cancellation of a queued or running job.
GEThttps://api.serpsearch.com/api/v1/reviews/batches/{id}/downloadCreate 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.

HeaderRequiredDescription
AuthorizationYesBearer API key for the owning account.
Content-TypeYesMust be application/json.
Idempotency-KeyNoAn ASCII value from 1 to 128 bytes, unique to the intended job.

JSON body

NameTypeRequiredDefaultDescription
featureIdstringConditional--Google Maps feature ID in 0x...:0x... form. Supply featureId or placeId; featureId takes precedence when both are present.
placeIdstringConditional--Google Place ID in ChIJ... form. Supply placeId when featureId is not provided.
startAtRFC 3339 datetimeYes--Inclusive start of the review creation-time range. Must be UTC-compatible and use whole-second precision.
endAtRFC 3339 datetimeYes--Exclusive end of the review creation-time range. Must be later than startAt and use whole-second precision.
hlstringNoenGoogle interface language/locale used while loading reviews.
glstringNousGoogle country/locale used while loading reviews.
searchstringNo--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"
  }
}
FieldTypeDescription
idstringStable export job ID.
statusstringqueued, running, completed, failed, or cancelled.
featureIdstringResolved Google Maps feature ID.
startAt / endAtdatetimeRequested creation-time boundaries.
endExclusivebooleanAlways true; the export covers [startAt, endAt).
hl / gl / searchstringEffective locale and optional filter.
formatstringndjson. The downloaded artifact contains one review object per line.
contentType / contentEncodingstringapplication/x-ndjson and gzip.
progressobjectShard, page, matched-review, and exported-review counters.
requestsChargedintegerMonthly requests charged for this artifact. This remains 0 until successful delivery.
truncatedByQuotabooleanTrue when available monthly quota stopped the scrape and the completed artifact is partial.
attempts / maxAttemptsintegerCurrent worker attempt and the retry ceiling.
nextAttemptAt / cancelRequestedAtdatetimeQueue/retry timing and cancellation acknowledgement when applicable.
fileSizeBytes / fileNameinteger / stringCompressed artifact size and suggested download name.
errorstringTerminal failure reason when a job fails.
createdAt / startedAt / completedAtdatetimeJob lifecycle timestamps when applicable.
expiresAtdatetimeArtifact expiry. Completed exports are retained for seven days.
linksobjectRelative 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.

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.

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"
}
HTTPMeaning
400Invalid JSON, place identifier, date range, locale, search, or idempotency key.
403The subscription is inactive or does not include Pro+ batch exports.
404The owner-scoped job does not exist, or its export has expired.
409The export is not completed and cannot be downloaded yet.
429The 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.

{
  "mcpServers": {
    "serpsearch": {
      "type": "http",
      "url": "https://mcp.serpsearch.com/mcp"
    }
  }
}

Available tools

ToolReturns
google_searchOrganic results and rich SERP modules, including products and AI overviews
google_autocompleteGoogle query suggestions and entity details
google_translateGoogle Translate results
google_newsGrouped Google News results
google_imagesImage results, sources, and image metadata
google_videosGoogle video search results
google_maps_searchGoogle Maps places and local businesses
google_place_detailsRich details for a feature ID or Google Place ID
google_maps_distanceDriving distance and duration between coordinates
google_reviewsPaged reviews, ratings, owners, and cursors
review_batch_createCreate a Pro+ date-range review export
review_batch_listList recent review exports
review_batch_getRead export progress and quota reservation
review_batch_cancelCancel a queued or running export
review_batch_downloadGet 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."
  }
}
CodeHTTPDescription
INVALID_API_KEY401The API key is missing, malformed, or does not exist.
EXPIRED_API_KEY401The API key has passed its expiration date.
REVOKED_API_KEY401The API key has been manually revoked.
SUBSCRIPTION_REQUIRED403No active subscription found for this account.
SUBSCRIPTION_INACTIVE403The subscription exists but is not in ACTIVE state.
RATE_LIMIT_EXCEEDED429More than the allowed requests per second were sent. Slow down and retry.
QUOTA_EXCEEDED429Monthly request quota for the current billing period is exhausted.
INVALID_QUERY400The q / query parameter is missing, empty, or the request body is malformed JSON.
UPSTREAM_ERROR502The upstream search provider returned an error. Retry later.
INTERNAL_ERROR500An 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.
PlanMonthly requestsRequests / secondPrice
Starter80,00015$40 / mo
Pro800,00050$300 / mo
Business3,000,000150$1,000 / mo
EnterpriseCustomCustomContact 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:

HeaderDescription
X-RateLimit-LimitMaximum requests per second allowed for your plan.
X-RateLimit-RemainingRequests remaining in the current one-second window.
X-RateLimit-ResetUnix timestamp (seconds) when the rate limit window resets.
X-Quota-UsedTotal requests used in the current billing period.
X-Quota-ReservedRequests held by running review batches. Reserved requests reduce availability but are charged only if an artifact is delivered.
X-Quota-LimitTotal requests allowed in the current billing period.
X-Quota-RemainingRequests currently available after used and reserved requests are deducted.
X-Response-TimeEnd-to-end server processing time (e.g. 142ms). Only present on successful responses.
Retry-AfterSeconds 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.