Apinoa Docs

Response Schema

ResultsPage, Suggestions, Place, App, Trends and the rest: every type the SERP API returns, field by field.

View raw .mdx

Each engine returns one shared set of types. A field means the same thing on every engine.

Optional fields are genuinely optional: absent means the page did not say. A missing rating means no stars were shown; it does not mean zero stars. Times are ISO 8601 in UTC. Every object may carry ext, which holds facts only that engine has, under the engine's own names.

OperationReturns
searchResultsPage (app stores: AppsPage)
suggestionsSuggestions
places · place · reviewsPlacesPage · Place · PlaceReviewsPage
app · reviews (app stores)App · AppReviewsPage
explore · trending (Google Trends)TrendsExplore · TrendingPage

Google Shopping returns the marketplace types SearchResult, Product and ReviewPage, described in the Marketplace Response Schema.

ResultsPage

One results page, holding every block in the order the page showed it.

FieldTypeNotes
enginestringgoogle bing yahoo duckduckgo yandex baidu naver yahoo-japan seznam daum sogou
querystringthe query as asked; for a reverse-image search, what the engine named the image
typestringweb news images videos image
outcomestringresults, or noResults when the engine said it found nothing. A blocked or unreadable page is an error, never noResults
country lang device timeRange safestring?the inputs that framed the search, echoed back
imagestring?the image a reverse-image search ran on
correctedQuerystring?what the engine actually searched, when it rewrote the query ("Showing results for …")
totalResultsinteger?only when the page states it ("About 1,230,000 results")
pageinteger1 for the first page
itemsItem[]every block, in page order. See below
cursorstring?the next page. Pass it alone as cursor
fetchedAtstringwhen the page was read

Every item has type, rank (its 1-based place among all items on the page) and ext. The rest depends on type:

typeFields
organicposition (among organic results only, counting on across pages), url, title, snippet?, site?, displayUrl?, date?, sitelinks?, thumbnail?, image?, imageWidth?, imageHeight?, images?, durationSec?, lang?, favicon?, badges?, facts?, rating?, ratingScale?, reviewCount?
adblock? (top bottom side), url, title, snippet?, advertiser?, displayUrl?, sitelinks?, thumbnail?, phone?, extensions?, favicon?, badges?, rating?, reviewCount?, promotion?
newsurl, title, snippet?, source?, sourceUrl?, sourceLogo?, date?, thumbnail?, favicon?
imageimageUrl, thumbnail?, width?, height?, title?, url? (the page it is on), source?, date?, format?, favicon?
videourl, title, snippet?, source?, channel?, channelUrl?, avatar?, date?, durationSec?, views?, viewsText?, thumbnail?, embedUrl?, preview?, favicon?
topStories videoCarousel imagePack shopping twitter discussionstitle?, items (the block's entries), sponsored?, moreUrl?, total?
peopleAlsoAsktitle?, questions: {question, answer?, url?, title?}[]
relatedSearchestitle?, queries: string[]
knowledgePaneltitle, subtitle?, description?, source?, facts?, images?, website?, links?
localPackplaces: Place[], moreUrl?, total?
aiOverviewanswer: the Answer type of the AI Answers API, unchanged
otherkind (the engine's own name for the block), title?, text?, links?

sitelinks and links are {url, title?, snippet?}[]. facts are {label, value}[], kept in the order shown. badges are the labels the page puts on a result, copied word for word. rating uses the page's own scale. ratingScale gives the top of that scale when the page states it (8.1/10 → 10). A block the schema has no shape for yet comes back as other. It is never dropped.

Suggestions

FieldTypeNotes
enginestring
querystringwhat was typed
country langstring?echoed when set
suggestionsarray{text, type?}: the engine's suggestions, in its order. type is the engine's own kind (query, entity…) where it states one

Place

A business or point of interest.

FieldTypeNotes
idstringthe engine's stable place id; pass it to place and reviews
namestring
urlstring?the place's page on the engine
addressobject?{full?, street?, city?, region?, postalCode?, country?}
lotAddressstring?Korea's lot-number address, shown beside the road address
coordinatesobject?{lat, lng}
categoriesstring[]?
rating reviewCountnumber?stars out of 5, and the count beside them
priceLevelstring?as shown: $$, ₩₩
phone websitestring?
hoursarray?{day, hours}, one per day listed, times as shown
statusstring?open closed temporarilyClosed permanentlyClosed
statusTextstring?the open-now line as worded ("Closed · Opens 7 AM")
photosstring[]?the photos the page carried; photoCount is how many the place has in all
attributesarray?{group?, label, value?}: amenities, service options, payment
description neighborhood logostring?
verifiedOwnerboolean?the owner claimed the listing
reviewsUrlstring?the page with the place's reviews
langstring?echoed

PlacesPage

FieldTypeNotes
engine querystring
outcomestringresults or noResults
typestring?maps (the map's list) or local (Google's local results)
location near country langstring?echoed
placesPlace[]
pageobject{index, size, total?}. total appears only when the engine states a count
cursorstring?the next page
fetchedAtstring

PlaceReviewsPage

FieldTypeNotes
engine placeIdstring
summaryobject?{average, count?, distribution?}
starCountsobject?star → number of reviews, as stated ({"5": 2409, …})
sortstring?
pageobject{index, size, total?}
reviewsarraysee below
cursorstring?
fetchedAtstring

A review has the same fields as a marketplace product review: id?, author?, authorAvatarUrl?, rating?, title?, body?, date?, helpfulCount?, language?, images, reply? ({body, date?, author?}, the owner's answer). Places add authorId?, authorUrl? and pinned?. A place review may have no stars (Naver visitors often leave keywords instead), and then rating is absent, never 0.

AppsPage

The search result of Google Play and the App Store.

FieldTypeNotes
enginestringgoogle-play app-store
querystring
outcomestringresults or noResults
country langstring?echoed
appsarrayeach one an App as a list shows it, plus rank
pageobject{index, size, total?}
cursorstring?
fetchedAtstring

App

FieldTypeNotes
idstringPlay's package name (com.strava), Apple's numeric id (426826309)
namestring
url icon videostring?
developerobject?{id?, name, url?, website?, email?, address?}
summarystring?the one line under the name
description whatsNewstring?
screenshotsstring[]?
categoriesstring[]?the main one first
ratingobject?{average, count?}
starCountsobject?star → number of ratings
editorsChoiceboolean?
priceobject?{currency, amount}; a free app is amount: 0
inAppPurchasesboolean?
contentRating version requiresstring?as shown ("Teen", "12+", "Requires iOS 16.0 or later")
releasedAt updatedAtstring?
country langstring?echoed
related moreByDeveloperApp[]?the apps the page lists beside it, as a list shows them (app only)
privacyPolicyUrlstring?app only
chartobject?{name, position}: the app's place in a store chart (app only)

AppReviewsPage

FieldTypeNotes
engine appIdstring
sort country langstring?echoed
pageobject{index, size, total?}
reviewsarrayid?, author?, rating, title?, body?, date?, helpfulCount?, images, reply? (the developer's answer)
cursorstring?
fetchedAtstring

TrendsExplore

What Google Trends shows for up to five terms. Trends reports relative interest from 0 to 100, measured against the busiest point of the request. A 0 is a value Trends stated, so it is returned as 0.

FieldTypeNotes
termsstring[]as asked, in order
country subregion timeRange category property langthe inputs, echoed. No country means worldwide
interestOverTimeobject?{points, averages?}. A point is {date, values, partial?, noData?}, with one value per term
interestByRegionobject?{resolution?, measure?, regions}. A region is {code?, name, values, noData?, coordinates?}. measure is interest for one term; with several terms it is share, each term's share of the region's searches
relatedarray?{term, topics?, queries?}, each with top and rising lists of {title, kind?, id?, value?, growth?, growthValue?, url?}
fetchedAtstring

TrendingPage

What is trending now in a country.

FieldTypeNotes
country subregion window category langechoed
itemsarray{rank, query, volume?, minVolume?, growth?, startedAt?, endedAt?, active?, categories?, related?, articles?}
fetchedAtstring

volume is the search count as shown (200K+) and minVolume its lower bound. articles are {title, url, source?, date?, image?}; with include=articles, every article Trends holds for each trend is returned.

On this page