# Apinoa SERP API > The SERP API: results pages from Google, Bing, Naver and 13 more search engines, plus maps, app stores and Google Trends, as normalized JSON. Every page of its documentation, in one file. Requests go to https://gateway.apinoa.com with the API key in an `x-api-key` header. A JSON answer is `{"success": true, "data": ...}`; an error is `{"success": false, "error": {"code", "message"}, "requestId"}`, and a request that fails is not billed. More: [Getting Started](https://apinoa.com/en/docs-raw/getting-started), [Authentication](https://apinoa.com/en/docs-raw/authentication), [Errors](https://apinoa.com/en/docs-raw/errors), [SDKs and MCP](https://apinoa.com/en/docs-raw/sdks); every operation as OpenAPI 3.1: https://apinoa.com/openapi.json. The other API families: https://apinoa.com/llms.txt. ## Contents - [SERP API](https://apinoa.com/en/docs-raw/api-reference/serp): Google, Bing, Naver, Baidu, Yandex and eleven more search engines, maps, app stores and Google Trends, through one set of operations and one schema. - [Response Schema](https://apinoa.com/en/docs-raw/api-reference/serp/response-schema): ResultsPage, Suggestions, Place, App, Trends and the rest: every type the SERP API returns, field by field. - [Google](https://apinoa.com/en/docs-raw/api-reference/google): Google web, news, image and video search, reverse-image search, suggestions, and places on Google Maps. - [Search](https://apinoa.com/en/docs-raw/api-reference/google/search): Get one Google results page, with every block in page order. - [Suggestions](https://apinoa.com/en/docs-raw/api-reference/google/suggestions): Get what Google's search box suggests for a query. - [Places](https://apinoa.com/en/docs-raw/api-reference/google/places): Find places on Google's map. - [Place](https://apinoa.com/en/docs-raw/api-reference/google/place): Get one place's details from Google. - [Bing](https://apinoa.com/en/docs-raw/api-reference/bing): Bing web, news, image and video search, reverse-image search, and suggestions. - [Search](https://apinoa.com/en/docs-raw/api-reference/bing/search): Get one Bing results page, with every block in page order. - [Suggestions](https://apinoa.com/en/docs-raw/api-reference/bing/suggestions): Get what Bing's search box suggests for a query. - [Yahoo](https://apinoa.com/en/docs-raw/api-reference/yahoo): Yahoo web, news, image and video search, and suggestions. - [Search](https://apinoa.com/en/docs-raw/api-reference/yahoo/search): Get one Yahoo results page, with every block in page order. - [Suggestions](https://apinoa.com/en/docs-raw/api-reference/yahoo/suggestions): Get what Yahoo's search box suggests for a query. - [DuckDuckGo](https://apinoa.com/en/docs-raw/api-reference/duckduckgo): DuckDuckGo web, news, image and video search, and suggestions. - [Search](https://apinoa.com/en/docs-raw/api-reference/duckduckgo/search): Get one DuckDuckGo results page, with every block in page order. - [Suggestions](https://apinoa.com/en/docs-raw/api-reference/duckduckgo/suggestions): Get what DuckDuckGo's search box suggests for a query. - [Yandex](https://apinoa.com/en/docs-raw/api-reference/yandex): Yandex news, image and video search, reverse-image search, suggestions, and places on Yandex Maps with their reviews. - [Search](https://apinoa.com/en/docs-raw/api-reference/yandex/search): Get one Yandex results page, with every block in page order. - [Suggestions](https://apinoa.com/en/docs-raw/api-reference/yandex/suggestions): Get what Yandex's search box suggests for a query. - [Places](https://apinoa.com/en/docs-raw/api-reference/yandex/places): Find places on Yandex's map. - [Place](https://apinoa.com/en/docs-raw/api-reference/yandex/place): Get one place's details from Yandex. - [Reviews](https://apinoa.com/en/docs-raw/api-reference/yandex/reviews): Get a place's reviews from Yandex. - [Naver](https://apinoa.com/en/docs-raw/api-reference/naver): Naver web, news, image and video search, suggestions, and places on Naver Map with their reviews. - [Search](https://apinoa.com/en/docs-raw/api-reference/naver/search): Get one Naver results page, with every block in page order. - [Suggestions](https://apinoa.com/en/docs-raw/api-reference/naver/suggestions): Get what Naver's search box suggests for a query. - [Places](https://apinoa.com/en/docs-raw/api-reference/naver/places): Find places on Naver's map. - [Place](https://apinoa.com/en/docs-raw/api-reference/naver/place): Get one place's details from Naver. - [Reviews](https://apinoa.com/en/docs-raw/api-reference/naver/reviews): Get a place's reviews from Naver. - [Daum](https://apinoa.com/en/docs-raw/api-reference/daum): Daum web, news, image and video search, and suggestions. - [Search](https://apinoa.com/en/docs-raw/api-reference/daum/search): Get one Daum results page, with every block in page order. - [Suggestions](https://apinoa.com/en/docs-raw/api-reference/daum/suggestions): Get what Daum's search box suggests for a query. - [Baidu](https://apinoa.com/en/docs-raw/api-reference/baidu): Baidu web, news, image and video search, reverse-image search, and suggestions. - [Search](https://apinoa.com/en/docs-raw/api-reference/baidu/search): Get one Baidu results page, with every block in page order. - [Suggestions](https://apinoa.com/en/docs-raw/api-reference/baidu/suggestions): Get what Baidu's search box suggests for a query. - [Sogou](https://apinoa.com/en/docs-raw/api-reference/sogou): Sogou web, news, image and video search, and suggestions. - [Search](https://apinoa.com/en/docs-raw/api-reference/sogou/search): Get one Sogou results page, with every block in page order. - [Suggestions](https://apinoa.com/en/docs-raw/api-reference/sogou/suggestions): Get what Sogou's search box suggests for a query. - [Yahoo! JAPAN](https://apinoa.com/en/docs-raw/api-reference/yahoo-japan): Yahoo! JAPAN web, news, image and video search, and suggestions. - [Search](https://apinoa.com/en/docs-raw/api-reference/yahoo-japan/search): Get one Yahoo! JAPAN results page, with every block in page order. - [Suggestions](https://apinoa.com/en/docs-raw/api-reference/yahoo-japan/suggestions): Get what Yahoo! JAPAN's search box suggests for a query. - [Seznam](https://apinoa.com/en/docs-raw/api-reference/seznam): Seznam web, news, image and video search, and suggestions. - [Search](https://apinoa.com/en/docs-raw/api-reference/seznam/search): Get one Seznam results page, with every block in page order. - [Suggestions](https://apinoa.com/en/docs-raw/api-reference/seznam/suggestions): Get what Seznam's search box suggests for a query. - [Tripadvisor](https://apinoa.com/en/docs-raw/api-reference/tripadvisor): Restaurants, hotels, attractions and more on Tripadvisor, with their details and reviews. - [Places](https://apinoa.com/en/docs-raw/api-reference/tripadvisor/places): Find places on Tripadvisor. - [Place](https://apinoa.com/en/docs-raw/api-reference/tripadvisor/place): Get one place's details from Tripadvisor. - [Reviews](https://apinoa.com/en/docs-raw/api-reference/tripadvisor/reviews): Get a place's reviews from Tripadvisor. - [Google Shopping](https://apinoa.com/en/docs-raw/api-reference/google-shopping): Products on Google Shopping, with their merchants and reviews. Google Shopping returns the marketplace types, so it reads like the Marketplace API. - [Search](https://apinoa.com/en/docs-raw/api-reference/google-shopping/search): Search Google Shopping for products, with each one's price, merchant and rating. - [Product](https://apinoa.com/en/docs-raw/api-reference/google-shopping/product): Get a product's page from Google Shopping: its details, specs and the merchants selling it. - [Reviews](https://apinoa.com/en/docs-raw/api-reference/google-shopping/reviews): Get a product's reviews from Google Shopping. - [Google Play](https://apinoa.com/en/docs-raw/api-reference/google-play): Apps on Google Play: search, each app's page, and its reviews. - [Search](https://apinoa.com/en/docs-raw/api-reference/google-play/search): Search Google Play for apps. - [App](https://apinoa.com/en/docs-raw/api-reference/google-play/app): Get an app's page from Google Play. - [Reviews](https://apinoa.com/en/docs-raw/api-reference/google-play/reviews): Get an app's reviews from Google Play. - [App Store](https://apinoa.com/en/docs-raw/api-reference/app-store): Apps on Apple's App Store: search, each app's page, and its reviews. - [Search](https://apinoa.com/en/docs-raw/api-reference/app-store/search): Search the App Store for apps. - [App](https://apinoa.com/en/docs-raw/api-reference/app-store/app): Get an app's page from the App Store. - [Reviews](https://apinoa.com/en/docs-raw/api-reference/app-store/reviews): Get an app's reviews from the App Store. - [Google Trends](https://apinoa.com/en/docs-raw/api-reference/google-trends): Google Trends: interest over time and by region for up to five terms, related topics and queries, and what is trending now. - [Explore](https://apinoa.com/en/docs-raw/api-reference/google-trends/explore): Compare up to five search terms on Google Trends: interest over time and by region, and related topics and queries. - [Trending](https://apinoa.com/en/docs-raw/api-reference/google-trends/trending): Get what is trending on Google in a country right now. --- # SERP API > Google, Bing, Naver, Baidu, Yandex and eleven more search engines, maps, app stores and Google Trends, through one set of operations and one schema. Source: https://apinoa.com/en/docs-raw/api-reference/serp The SERP API reads search engines the way a person sees them. A results page comes back in the order it was shown: organic results, ads, news, images, videos, "People also ask", knowledge panels, local packs and AI Overviews. One schema covers every engine, so the code that reads Google also reads Naver. ```bash curl "https://gateway.apinoa.com/v1/google/search?q=best+running+shoes&country=US" -H "x-api-key: $APINOA_API_KEY" curl "https://gateway.apinoa.com/v1/naver/places?q=강남역+카페" -H "x-api-key: $APINOA_API_KEY" curl "https://gateway.apinoa.com/v1/google-trends/explore?terms=chatgpt,gemini&country=US" -H "x-api-key: $APINOA_API_KEY" ``` ## Operations | Operation | Returns | What It Reads | |---|---|---| | `search` | `ResultsPage` | One results page: web (the default), `news`, `images` or `videos`, chosen with `type`. Some engines also take `type=image` with an `image` URL for a reverse-image search | | `suggestions` | `Suggestions` | What the search box suggests for `q` | | `places` | `PlacesPage` | Places on the map for `q`, around `near` (a place name) or `location` (`lat,lng`) | | `place` | `Place` | One place: `id` from `places`, or its map link as `url` | | `reviews` | `PlaceReviewsPage` | A place's reviews: `place` | The app stores and Google Trends use the same names: `search`, `app` and `reviews` for apps, and `explore` and `trending` for Trends. ## Which Engine Has Which | | search | suggestions | places | place | reviews | Markets | |---|:-:|:-:|:-:|:-:|:-:|---| | [Google](/docs/api-reference/google) | ✓ | ✓ | ✓ | ✓ | | 10 | | [Bing](/docs/api-reference/bing) | ✓ | ✓ | | | | 10 | | [Yahoo](/docs/api-reference/yahoo) | ✓ | ✓ | | | | 13 | | [DuckDuckGo](/docs/api-reference/duckduckgo) | ✓ | ✓ | | | | 14 | | [Yandex](/docs/api-reference/yandex) | ✓ | ✓ | ✓ | ✓ | ✓ | 10 | | [Naver](/docs/api-reference/naver) | ✓ | ✓ | ✓ | ✓ | ✓ | KR | | [Daum](/docs/api-reference/daum) | ✓ | ✓ | | | | KR | | [Baidu](/docs/api-reference/baidu) | ✓ | ✓ | | | | CN | | [Sogou](/docs/api-reference/sogou) | ✓ | ✓ | | | | CN | | [Yahoo! JAPAN](/docs/api-reference/yahoo-japan) | ✓ | ✓ | | | | JP | | [Seznam](/docs/api-reference/seznam) | ✓ | ✓ | | | | CZ | | [Tripadvisor](/docs/api-reference/tripadvisor) | | | ✓ | ✓ | ✓ | 15 | | | Operations | |---|---| | [Google Shopping](/docs/api-reference/google-shopping) | `search` `product` `reviews`, returning the marketplace types | | [Google Play](/docs/api-reference/google-play) · [App Store](/docs/api-reference/app-store) | `search` `app` `reviews` | | [Google Trends](/docs/api-reference/google-trends) | `explore` `trending` | Each engine's page lists the inputs every operation takes there. ## Inputs One name means one thing on every engine: | Input | Meaning | |---|---| | `q` | the query, search operators included | | `type` | what to search: `web`, `news`, `images`, `videos` (each engine takes its own subset) | | `country` | the market, as an ISO 3166 code | | `lang` | the interface language (`en`, `pt-BR`) | | `device` | read the `desktop` page (the default) or the `mobile` one | | `timeRange` | only results from the past `hour`, `day`, `week`, `month` or `year` | | `safe` | safe search, `on` or `off` | | `near` · `location` | for `places`: a place name, or a `lat,lng` point | | `id` · `place` | the place (or app) to read; `id` also takes its link as `url` | | `sort` | review order | | `limit` | results wanted. More than one page is charged per page | | `cursor` | the next page | An input an engine does not take is refused with `400 INVALID_PARAMS`, not ignored. You are never charged for a page that did not do what you asked. ## What Is the Same Everywhere - **Shapes.** Every operation returns one of the types in the [Response Schema](/docs/api-reference/serp/response-schema). Facts that only one engine has are in `ext`. - **Nothing is dropped.** Every block on the page is returned, in page order, with its `rank`. A block that has no shared shape yet comes back as `type: "other"`. - **Paging.** A list returns an opaque `cursor`. For the next page, call the same operation with `cursor` alone. No `cursor` means there is no next page. - **Absent is not zero.** A count or rating the page does not show is left out, never reported as `0`. Times are ISO 8601 in UTC. - **No results is an answer.** `outcome: "noResults"` means the engine said it found nothing. A page that could not be read is an error, and errors are not billed. - **Price.** $0.0012 per unit. Most calls are one unit. `limit` above one page costs one unit per page, and each operation's page lists its range. ## Errors The SERP API uses the same envelope and codes as the rest of the API. See [Errors](/docs/errors). A place or app that does not exist returns `404 NOT_FOUND`, and a product `404 PRODUCT_NOT_FOUND`; the message names the id. A Google Shopping product from a single store has no reviews: `404 REVIEWS_NOT_FOUND`. ## Reference - [Response Schema](/docs/api-reference/serp/response-schema): every field of every type - [AI Answers API](/docs/api-reference/answers): ChatGPT, Gemini, Google AI Mode and more, through one answer type - [Errors](/docs/errors): every error code --- # Response Schema > ResultsPage, Suggestions, Place, App, Trends and the rest: every type the SERP API returns, field by field. Source: https://apinoa.com/en/docs-raw/api-reference/serp/response-schema 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. | Operation | Returns | |---|---| | `search` | [`ResultsPage`](#resultspage) (app stores: [`AppsPage`](#appspage)) | | `suggestions` | [`Suggestions`](#suggestions) | | `places` · `place` · `reviews` | [`PlacesPage`](#placespage) · [`Place`](#place) · [`PlaceReviewsPage`](#placereviewspage) | | `app` · `reviews` (app stores) | [`App`](#app) · [`AppReviewsPage`](#appreviewspage) | | `explore` · `trending` (Google Trends) | [`TrendsExplore`](#trendsexplore) · [`TrendingPage`](#trendingpage) | Google Shopping returns the marketplace types `SearchResult`, `Product` and `ReviewPage`, described in the [Marketplace Response Schema](/docs/api-reference/marketplaces/response-schema). ## ResultsPage One results page, holding every block in the order the page showed it. | Field | Type | Notes | |---|---|---| | `engine` | string | `google` `bing` `yahoo` `duckduckgo` `yandex` `baidu` `naver` `yahoo-japan` `seznam` `daum` `sogou` | | `query` | string | the query as asked; for a reverse-image search, what the engine named the image | | `type` | string | `web` `news` `images` `videos` `image` | | `outcome` | string | `results`, or `noResults` when the engine said it found nothing. A blocked or unreadable page is an error, never `noResults` | | `country` `lang` `device` `timeRange` `safe` | string? | the inputs that framed the search, echoed back | | `image` | string? | the image a reverse-image search ran on | | `correctedQuery` | string? | what the engine actually searched, when it rewrote the query ("Showing results for …") | | `totalResults` | integer? | only when the page states it ("About 1,230,000 results") | | `page` | integer | 1 for the first page | | `items` | Item[] | every block, in page order. See below | | `cursor` | string? | the next page. Pass it alone as `cursor` | | `fetchedAt` | string | when 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`: | `type` | Fields | |---|---| | `organic` | `position` (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?` | | `ad` | `block?` (`top` `bottom` `side`), `url`, `title`, `snippet?`, `advertiser?`, `displayUrl?`, `sitelinks?`, `thumbnail?`, `phone?`, `extensions?`, `favicon?`, `badges?`, `rating?`, `reviewCount?`, `promotion?` | | `news` | `url`, `title`, `snippet?`, `source?`, `sourceUrl?`, `sourceLogo?`, `date?`, `thumbnail?`, `favicon?` | | `image` | `imageUrl`, `thumbnail?`, `width?`, `height?`, `title?`, `url?` (the page it is on), `source?`, `date?`, `format?`, `favicon?` | | `video` | `url`, `title`, `snippet?`, `source?`, `channel?`, `channelUrl?`, `avatar?`, `date?`, `durationSec?`, `views?`, `viewsText?`, `thumbnail?`, `embedUrl?`, `preview?`, `favicon?` | | `topStories` `videoCarousel` `imagePack` `shopping` `twitter` `discussions` | `title?`, `items` (the block's entries), `sponsored?`, `moreUrl?`, `total?` | | `peopleAlsoAsk` | `title?`, `questions`: `{question, answer?, url?, title?}[]` | | `relatedSearches` | `title?`, `queries`: string[] | | `knowledgePanel` | `title`, `subtitle?`, `description?`, `source?`, `facts?`, `images?`, `website?`, `links?` | | `localPack` | `places`: [Place](#place)[], `moreUrl?`, `total?` | | `aiOverview` | `answer`: the [Answer](/docs/api-reference/answers/response-schema#answer) type of the AI Answers API, unchanged | | `other` | `kind` (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 | Field | Type | Notes | |---|---|---| | `engine` | string | | | `query` | string | what was typed | | `country` `lang` | string? | echoed when set | | `suggestions` | array | `{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. | Field | Type | Notes | |---|---|---| | `id` | string | the engine's stable place id; pass it to `place` and `reviews` | | `name` | string | | | `url` | string? | the place's page on the engine | | `address` | object? | `{full?, street?, city?, region?, postalCode?, country?}` | | `lotAddress` | string? | Korea's lot-number address, shown beside the road address | | `coordinates` | object? | `{lat, lng}` | | `categories` | string[]? | | | `rating` `reviewCount` | number? | stars out of 5, and the count beside them | | `priceLevel` | string? | as shown: `$$`, `₩₩` | | `phone` `website` | string? | | | `hours` | array? | `{day, hours}`, one per day listed, times as shown | | `status` | string? | `open` `closed` `temporarilyClosed` `permanentlyClosed` | | `statusText` | string? | the open-now line as worded ("Closed · Opens 7 AM") | | `photos` | string[]? | the photos the page carried; `photoCount` is how many the place has in all | | `attributes` | array? | `{group?, label, value?}`: amenities, service options, payment | | `description` `neighborhood` `logo` | string? | | | `verifiedOwner` | boolean? | the owner claimed the listing | | `reviewsUrl` | string? | the page with the place's reviews | | `lang` | string? | echoed | ## PlacesPage | Field | Type | Notes | |---|---|---| | `engine` `query` | string | | | `outcome` | string | `results` or `noResults` | | `type` | string? | `maps` (the map's list) or `local` (Google's local results) | | `location` `near` `country` `lang` | string? | echoed | | `places` | [Place](#place)[] | | | `page` | object | `{index, size, total?}`. `total` appears only when the engine states a count | | `cursor` | string? | the next page | | `fetchedAt` | string | | ## PlaceReviewsPage | Field | Type | Notes | |---|---|---| | `engine` `placeId` | string | | | `summary` | object? | `{average, count?, distribution?}` | | `starCounts` | object? | star → number of reviews, as stated (`{"5": 2409, …}`) | | `sort` | string? | | | `page` | object | `{index, size, total?}` | | `reviews` | array | see below | | `cursor` | string? | | | `fetchedAt` | string | | 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. | Field | Type | Notes | |---|---|---| | `engine` | string | `google-play` `app-store` | | `query` | string | | | `outcome` | string | `results` or `noResults` | | `country` `lang` | string? | echoed | | `apps` | array | each one an [App](#app) as a list shows it, plus `rank` | | `page` | object | `{index, size, total?}` | | `cursor` | string? | | | `fetchedAt` | string | | ## App | Field | Type | Notes | |---|---|---| | `id` | string | Play's package name (`com.strava`), Apple's numeric id (`426826309`) | | `name` | string | | | `url` `icon` `video` | string? | | | `developer` | object? | `{id?, name, url?, website?, email?, address?}` | | `summary` | string? | the one line under the name | | `description` `whatsNew` | string? | | | `screenshots` | string[]? | | | `categories` | string[]? | the main one first | | `rating` | object? | `{average, count?}` | | `starCounts` | object? | star → number of ratings | | `editorsChoice` | boolean? | | | `price` | object? | `{currency, amount}`; a free app is `amount: 0` | | `inAppPurchases` | boolean? | | | `contentRating` `version` `requires` | string? | as shown ("Teen", "12+", "Requires iOS 16.0 or later") | | `releasedAt` `updatedAt` | string? | | | `country` `lang` | string? | echoed | | `related` `moreByDeveloper` | App[]? | the apps the page lists beside it, as a list shows them (`app` only) | | `privacyPolicyUrl` | string? | `app` only | | `chart` | object? | `{name, position}`: the app's place in a store chart (`app` only) | ## AppReviewsPage | Field | Type | Notes | |---|---|---| | `engine` `appId` | string | | | `sort` `country` `lang` | string? | echoed | | `page` | object | `{index, size, total?}` | | `reviews` | array | `id?`, `author?`, `rating`, `title?`, `body?`, `date?`, `helpfulCount?`, `images`, `reply?` (the developer's answer) | | `cursor` | string? | | | `fetchedAt` | string | | ## 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`. | Field | Type | Notes | |---|---|---| | `terms` | string[] | as asked, in order | | `country` `subregion` `timeRange` `category` `property` `lang` | | the inputs, echoed. No `country` means worldwide | | `interestOverTime` | object? | `{points, averages?}`. A point is `{date, values, partial?, noData?}`, with one value per term | | `interestByRegion` | object? | `{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 | | `related` | array? | `{term, topics?, queries?}`, each with `top` and `rising` lists of `{title, kind?, id?, value?, growth?, growthValue?, url?}` | | `fetchedAt` | string | | ## TrendingPage What is trending now in a country. | Field | Type | Notes | |---|---|---| | `country` `subregion` `window` `category` `lang` | | echoed | | `items` | array | `{rank, query, volume?, minVolume?, growth?, startedAt?, endedAt?, active?, categories?, related?, articles?}` | | `fetchedAt` | string | | `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. --- # Google > Google web, news, image and video search, reverse-image search, suggestions, and places on Google Maps. Source: https://apinoa.com/en/docs-raw/api-reference/google Google web, news, image and video search, reverse-image search, suggestions, and places on Google Maps. **Markets:** `US` `GB` `CA` `AU` `DE` `FR` `IT` `AT` `JP` `KR` (the first is the default) ## Operations | Operation | Endpoint | Returns | Price | |---|---|---|---| | [Search](/docs/api-reference/google/search) | `GET \| POST /v1/google/search` | `ResultsPage` | $0.0012–$0.006 | | [Suggestions](/docs/api-reference/google/suggestions) | `GET \| POST /v1/google/suggestions` | `Suggestions` | $0.0012 | | [Places](/docs/api-reference/google/places) | `GET \| POST /v1/google/places` | `PlacesPage` | $0.0012–$0.0036 | | [Place](/docs/api-reference/google/place) | `GET \| POST /v1/google/place` | `Place` | $0.0012 | --- # Search > Get one Google results page, with every block in page order. Source: https://apinoa.com/en/docs-raw/api-reference/google/search ```http GET | POST /v1/google/search ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/google/search?q=best+running+shoes&country=US" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "best running shoes", country: "US" }); const res = await fetch(`https://gateway.apinoa.com/v1/google/search?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/google/search", params={"q": "best running shoes", "country": "US"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `country` | enum | | The market, as an ISO 3166 country code. `US` `GB` `CA` `AU` `DE` `FR` `IT` `AT` `JP` `KR` | | `cursor` | string | | The previous page's `cursor`. Pass it alone for the next page. | | `device` | enum | | Which page to read: the desktop (default) or the mobile one. `desktop` `mobile` | | `image` | string | | An image URL: a reverse-image search instead of `q` (`type=image`). | | `lang` | string | | Interface language. | | `limit` | integer 1–50 | | Results wanted (default 10, at most 50). More than one page is charged per page. | | `q` | string | | The query, search operators included. | | `safe` | enum | | Safe search. `on` `off` | | `timeRange` | enum | | Only results from this past period. `hour` `day` `week` `month` `year` | | `type` | enum | | What to search: web results (default), news, images, videos or `image` for a reverse-image search. `web` `news` `images` `videos` `image` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`ResultsPage`](/docs/api-reference/serp/response-schema#resultspage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "google", "query": "best running shoes", "type": "web", "outcome": "results", "country": "US", "lang": "en", "device": "desktop", "page": 1, "items": [ { "type": "organic", "url": "https://believeintherun.com/shoe-reviews/best-road-running-shoes-of-2025/", "title": "Best Road Running Shoes of 2025 | Best in Gear Awards", "snippet": "Puma is at the top of their game in 2025, New Balance SC Elite v5 $250. Endorphin Elite 2 is the best Saucony…", "site": "Believe in the Run", "displayUrl": "https://believeintherun.com › shoe-reviews › best-road-...", "date": "2025-11-26", "position": 1, "rank": 1, "favicon": "data:image/png;base64,iVBORw0KGgoAAAANSU…" }, { "type": "organic", "url": "https://www.reddit.com/r/runninglifestyle/comments/1kewifs/what_are_some_good_running_shoes/", "title": "What are some good running shoes. : r/runninglifestyle", "snippet": "I’m looking for good running shoes for training the one I got for training hurt my calf when running for long…", "site": "Reddit · r/runninglifestyle", "date": "2025-10-30", "ext": { "meta": "100+ comments · 1 year ago", "answers": "105 answers", "topAnswer": "As a lover of running and also a mailman as a full time job, I run and walk a lot. I think ..." }, "position": 2, "rank": 2, "favicon": "data:image/png;base64,iVBORw0KGgoAAAANSU…" }, { "type": "ad", "block": "bottom", "url": "https://www.vivobarefoot.com/", "title": "Run like nature intended | Barefoot Running Shoes", "snippet": "Vivobarefoot | Barefoot Running Shoes | Minimalist Footwear. Start your barefoot running journey...", "advertiser": "Vivobarefoot", "displayUrl": "https://www.vivobarefoot.com › barefoot › running", "sitelinks": [ { "url": "https://www.google.com/goto?url=CAEScgHrOzAVfvorgfPQaHxGHETTF2n_EjVLthnHv2LBWiwqWRLFkOn8KVE4ujEDC8dcllVsAnzpYB…", "title": "100 Day Trial." }, { "url": "https://www.google.com/aclk?sa=L&ai=DChsSEwiws-DexeCXAxVaWEcBHRwMNWsYACICCAIQBBoCcXU&co=1&ase=2&gclid=EAIaIQob…", "title": "It's time to run slow" } ], "ext": {"notes": ["1M+ visits in past month"]}, "rank": 5, "favicon": "data:image/png;base64,iVBORw0KGgoAAAANSU…" }, { "type": "shopping", "title": "Popular products", "items": [ { "title": "Men's Running Shoes Under Armour Velociti Distance", "price": "$90.28", "originalPrice": "$160", "merchant": "Under Armour", "moreStores": true, "rating": 4.9, "reviews": "53", "badge": "43% OFF", "delivery": "Free delivery", "thumbnail": "data:image/webp;base64,UklGRhgWAABXRUJQV…", "merchantIcon": "data:image/png;base64,iVBORw0KGgoAAAANSU…", "ids": { "cid": "17500536046254188743", "pid": "8929790825032956959", "gid": "18243703563634929685", "iid": "156849108901779669", "oid": "17925735183046230959" } }, { "title": "Nike Men's Structure 26", "price": "$115.99", "originalPrice": "$145", "merchant": "DICK'S Sporting Goods", "moreStores": true, "rating": 4.5, "reviews": "811", "badge": "20% OFF", "thumbnail": "data:image/webp;base64,UklGRmgGAABXRUJQV…", "merchantIcon": "data:image/png;base64,iVBORw0KGgoAAAANSU…", "ids": { "cid": "7761143186705950565", "pid": "9947796076762022400", "gid": "4433750102634774197", "iid": "12620312263696104752", "oid": "10698345940566205523" } } ], "rank": 6 }, { "type": "relatedSearches", "queries": ["Best running shoes 2024", "Best running shoes 2025 men"], "rank": 13 } ], "cursor": "S8w7EMQm4UtS8e0wFEps0p0dftmlh_7Qty-oISXNcMRP5-4x7b847hfRplS84UdBLtmel3vQ5d1CRIDI9xss64bXrUStYrI1VxX1KatMsAD8or…", "fetchedAt": "2026-10-30T01:03:05.291Z" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call, plus $0.0012 for each extra call it makes — at most 4 more, so $0.006 in total. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - `type=image` with an `image` URL instead of `q` runs a reverse-image search. - When Google shows an AI Overview, it is an `aiOverview` item holding the same [Answer](/docs/api-reference/answers/response-schema#answer) as the AI Answers API. - `limit` above one page reads further pages, one unit each. --- # Suggestions > Get what Google's search box suggests for a query. Source: https://apinoa.com/en/docs-raw/api-reference/google/suggestions ```http GET | POST /v1/google/suggestions ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/google/suggestions?q=running+shoes&country=US" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "running shoes", country: "US" }); const res = await fetch(`https://gateway.apinoa.com/v1/google/suggestions?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/google/suggestions", params={"q": "running shoes", "country": "US"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `q` | string | yes | The query, search operators included. | | `country` | enum | | The market, as an ISO 3166 country code. `US` `GB` `CA` `AU` `DE` `FR` `IT` `AT` `JP` `KR` | | `lang` | string | | Interface language. | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`Suggestions`](/docs/api-reference/serp/response-schema#suggestions) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "google", "query": "running shoes", "country": "US", "lang": "en", "suggestions": [ {"text": "running shoes", "ext": {"subtypes": [512]}}, {"text": "running shoes for women", "ext": {"subtypes": [512]}} ] } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. --- # Places > Find places on Google's map. Source: https://apinoa.com/en/docs-raw/api-reference/google/places ```http GET | POST /v1/google/places ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/google/places?q=coffee&near=Austin,+TX&country=US&limit=5" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "coffee", near: "Austin, TX", country: "US", limit: "5" }); const res = await fetch(`https://gateway.apinoa.com/v1/google/places?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/google/places", params={"q": "coffee", "near": "Austin, TX", "country": "US", "limit": "5"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `country` | enum | | The market, as an ISO 3166 country code. `US` `GB` `CA` `AU` `DE` `FR` `IT` `AT` `JP` `KR` | | `cursor` | string | | The previous page's `cursor`. Pass it alone for the next page. | | `lang` | string | | Interface language. | | `limit` | integer 1–60 | | Results wanted (default 20, at most 60). More than one page is charged per page. | | `location` | string | | Search as if from this point: `lat,lng`. | | `near` | string | | Search around this place name, or a `lat,lng` point. | | `q` | string | | The query, search operators included. | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`PlacesPage`](/docs/api-reference/serp/response-schema#placespage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "google", "query": "coffee", "outcome": "results", "type": "maps", "near": "Austin, TX", "country": "US", "lang": "en", "places": [ { "id": "0x8644ca6bc309e81b:0x1f1a903bbb66839", "name": "Epoch Coffee", "url": "https://www.google.com/maps/place/data=!4m2!3m1!1s0x8644ca6bc309e81b:0x1f1a903bbb66839", "address": { "full": "221 W N Loop Blvd, Austin, TX 78751", "street": "221 W N Loop Blvd", "city": "Austin", "region": "TX", "postalCode": "78751", "country": "US" }, "coordinates": {"lat": 30.318603699999997, "lng": -97.72454019999999}, "categories": ["Coffee shop"], "rating": 4.5, "reviewCount": 2534, "phone": "(512) 454-3762", "website": "http://www.epochcoffee.com/", "hours": [{"day": "Thursday", "hours": "Open 24 hours"}, {"day": "Friday", "hours": "Open 24 hours"}], "photos": [ "https://lh3.googleusercontent.com/grass-cs/AABkmLfAFGuJt7CdI-CWuV7SnfjNA86KhQMnioybPp9RFelnIsLJKhY30zSOUupXC0AsbQN8dJC6Z5Qoju7i9WXbkITWwEEw1E-et0lccw9ovMNFTQ7E8…", "https://lh3.googleusercontent.com/grass-cs/AABkmLfAFGuJt7CdI-CWuV7SnfjNA86KhQMnioybPp9RFelnIsLJKhY30zSOUupXC0AsbQN8dJC6Z5Qoju7i9WXbkITWwEEw1E-et0lccw9ovMNFTQ7E8…" ], "attributes": [ {"group": "Accessibility", "label": "Wheelchair accessible entrance"}, {"group": "Accessibility", "label": "Wheelchair accessible parking lot"} ], "status": "open", "description": "Cool, vibrant small-chain cafe featuring nibbles, tea & carefully brewed espresso drinks.", "ext": { "placeId": "ChIJG-gJw2vKRIYROWi2uwOp8QE", "kgmid": "/g/1v76_180", "timeZone": "America/Chicago", "summary": "Hip coffee shop with light bites", "areas": ["Americas"], "owner": { "name": "Epoch Coffee (Owner)", "image": "https://lh5.googleusercontent.com/-WzsTjK0vgDQ/AAAAAAAAAAI/AAAAAAAAAAA/uanMPnqDLak/s44-p-k-no-ns-nd/photo.jpg" } }, "photoCount": 838, "statusText": "Open 24 hours", "neighborhood": "North Loop", "reviewsUrl": "https://search.google.com/local/reviews?placeid=ChIJG-gJw2vKRIYROWi2uwOp8QE&q=coffee+near+Austin,+TX&hl=en&gl=US" }, { "id": "0x8644b5554461664d:0xbc4ff333ec9ad1ad", "name": "Mozart's Coffee Roasters", "url": "https://www.google.com/maps/place/data=!4m2!3m1!1s0x8644b5554461664d:0xbc4ff333ec9ad1ad", "address": { "full": "3825 Lake Austin Blvd, Austin, TX 78703", "street": "3825 Lake Austin Blvd", "city": "Austin", "region": "TX", "postalCode": "78703", "country": "US" }, "coordinates": {"lat": 30.295469599999997, "lng": -97.78395119999999}, "categories": ["Coffee shop", "Bakery"], "rating": 4.5, "reviewCount": 10987, "phone": "(512) 477-2900", "website": "https://mozartscoffee.com/", "hours": [{"day": "Thursday", "hours": "7 AM–12 AM"}, {"day": "Friday", "hours": "7 AM–12 AM"}], "photos": [ "https://lh3.googleusercontent.com/grass-cs/AABkmLf_c6cXdmPiP9ZYH3st9N7FqJbZI4VuqzeQCF5LcTx3ZJ2ByPLryWaZ8lCIIa1MlanBvALs0JRSUE10dd3mcUDaE36C2-rSGXiH-i8Wyhsd9YNQA…", "https://lh3.googleusercontent.com/grass-cs/AABkmLf_c6cXdmPiP9ZYH3st9N7FqJbZI4VuqzeQCF5LcTx3ZJ2ByPLryWaZ8lCIIa1MlanBvALs0JRSUE10dd3mcUDaE36C2-rSGXiH-i8Wyhsd9YNQA…" ], "attributes": [ {"group": "Accessibility", "label": "Wheelchair accessible entrance"}, {"group": "Accessibility", "label": "Wheelchair accessible parking lot"} ], "status": "open", "description": "Beans flame-roasted on-site, plus bakery goods, frequent live music & patio seating on Lake Austin.", "ext": { "placeId": "ChIJTWZhRFW1RIYRrdGa7DPzT7w", "kgmid": "/m/020z4hc", "timeZone": "America/Chicago", "summary": "Lakeside coffee & desserts", "areas": ["Americas"], "owner": { "name": "Mozart's Coffee Roasters (Owner)", "image": "https://lh3.googleusercontent.com/-88EjI7tZSV0/AAAAAAAAAAI/AAAAAAAAAAA/3-Wpwoe7iz0/s44-p-k-no-ns-nd/photo.jpg" } }, "photoCount": 17015, "statusText": "Open · Closes 12 AM", "neighborhood": "Westfield", "reviewsUrl": "https://search.google.com/local/reviews?placeid=ChIJTWZhRFW1RIYRrdGa7DPzT7w&q=coffee+near+Austin,+TX&hl=en&gl=US" } ], "page": {"index": 1, "size": 20}, "cursor": "SscpBRWdlu0MeCuvvWfumLp6ZHk-1P8xDBDrsmzZkWl5o3-lDXix1P_XUEvxpkqfyKI7tm1YhQWm7mOtUIJYrk4UBWGPY_uUHD2SxkjATHY3Ocs4DFVcnuMumeNNrTF0vXljq_zWiLqfV50YdIZM_TjGXr7uBsWh…", "fetchedAt": "2026-10-30T01:03:09.318Z" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call, plus $0.0012 for each extra call it makes — at most 2 more, so $0.0036 in total. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - Search around a place name with `near`, or a point with `location` (`lat,lng`). - `limit` above one page reads further pages, one unit each. --- # Place > Get one place's details from Google. Source: https://apinoa.com/en/docs-raw/api-reference/google/place ```http GET | POST /v1/google/place ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/google/place?id=0x8644ca6bc309e81b:0x1f1a903bbb66839" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ id: "0x8644ca6bc309e81b:0x1f1a903bbb66839" }); const res = await fetch(`https://gateway.apinoa.com/v1/google/place?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/google/place", params={"id": "0x8644ca6bc309e81b:0x1f1a903bbb66839"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `id` | string | | The place's id, as `places` returns it. | | `lang` | string | | Interface language. | | `url` | string | | A Google Maps place URL. | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`Place`](/docs/api-reference/serp/response-schema#place) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "id": "0x8644ca6bc309e81b:0x1f1a903bbb66839", "name": "Epoch Coffee", "url": "https://www.google.com/maps/preview/place/Epoch+Coffee,+221+W+N+Loop+Blvd,+Austin,+TX+78751/@30.3186037,-97.7245402,3444a,13.1y/data=!4m2!3m1!1s0x8644ca6bc309e8…", "address": { "full": "221 W N Loop Blvd, Austin, TX 78751", "street": "221 W N Loop Blvd", "city": "Austin", "region": "TX", "postalCode": "78751", "country": "US" }, "coordinates": {"lat": 30.318603699999997, "lng": -97.72454019999999}, "categories": ["Coffee shop"], "rating": 4.5, "reviewCount": 2534, "phone": "(512) 454-3762", "website": "http://www.epochcoffee.com/", "hours": [{"day": "Thursday", "hours": "Open 24 hours"}, {"day": "Friday", "hours": "Open 24 hours"}], "photos": [ "https://lh3.googleusercontent.com/grass-cs/AABkmLf8MEzqjutCui37zmqNvXY83Pca5LQ_lkwbIzVGenHSqnuLI_Ik30zwgz1Awup0_iDR4V9H7mtV_8aijxQ8AFP-Y-hD1_ht7ogdduCfc_WLN64AT…", "https://lh3.googleusercontent.com/grass-cs/AABkmLfLrOLlfLpkdnFppSN1k1TI7tV6OWF-xDiQkpFLqZnWhXweai7GzvrOlD-tnNT7WECPmHVyFhvMJ1F8Q-ZW_Pfb3drJVOHG_2vjuFcXtAqPD9L__…" ], "attributes": [ {"group": "Accessibility", "label": "Wheelchair accessible entrance"}, {"group": "Accessibility", "label": "Wheelchair accessible parking lot"} ], "status": "open", "description": "Cool, vibrant small-chain cafe featuring nibbles, tea & carefully brewed espresso drinks.", "ext": { "placeId": "ChIJG-gJw2vKRIYROWi2uwOp8QE", "kgmid": "/g/1v76_180", "timeZone": "America/Chicago", "summary": "Hip coffee shop with light bites", "plusCode": {"global": "8624879G+C5", "compound": "879G+C5 Austin, Texas"}, "areas": ["Americas", "Southern United States"], "owner": { "name": "Epoch Coffee (Owner)", "image": "https://lh5.googleusercontent.com/-WzsTjK0vgDQ/AAAAAAAAAAI/AAAAAAAAAAA/uanMPnqDLak/s44-p-k-no-ns-nd/photo.jpg" }, "ratingHistogram": {"1": 84, "2": 60, "3": 149, "4": 462, "5": 1779}, "reviewHighlights": [ { "text": "The atmosphere is homey with mix matched furniture and funky decor.", "authorUrl": "https://www.google.com/maps/contrib/102913306226507508797?hl=en-US", "authorImage": "https://lh3.googleusercontent.com/a/ACg8ocK5EThT9DL2VwXLsgfvtdMFUTBc3PuaIs7oflgrtRY-u1ICqNA=s40-k-cc-rp-mo", "reviewerId": "102913306226507508797", "reviewId": "Ci9DQUlRQUNvZENodHljRjlvT2pOYVN6aHVhblppV0hNdFltTjRZWEZoVFdkRE1GRRAB" }, { "text": "Classic Austin vibes with awesome prices and super friendly/ cool staff.", "authorUrl": "https://www.google.com/maps/contrib/100932097603579677275?hl=en-US", "authorImage": "https://lh3.googleusercontent.com/a/ACg8ocI598pfuVwBh_mkX_eCkPx1MjjrtWs16XS2FK2BaIB_yXZBAQ=s40-k-cc-rp-mo", "reviewerId": "100932097603579677275", "reviewId": "ChdDSUhNMG9nS0VJQ0FnSURBNkpmY3BRRRAB" } ], "topics": [{"label": "outdoor seating", "mentions": 71}, {"label": "study spot", "mentions": 20}], "reviews": [ { "id": "Ci9DQUlRQUNvZENodHljRjlvT2tSS1ZtOUdNMlZ6Wm05eVowWnFXa2RKVFdOdVNHYxAB", "author": "Naomi • Intentionally Crafted", "rating": 5, "body": "A friend recommended Epoch Coffee on North Loop, so yesterday morning I made it the destination for my walk from East Austin—and I’m so glad I did!\n\nNestled nea…", "date": "2026-08-11T15:58:45.622Z", "language": "en", "images": [ "https://lh3.googleusercontent.com/grass-cs/AABkmLerlYc1H21T5s0eRV7P6uroxN8CRED2zWk0KWFbIDxJx1Y7UjmKISAKFm-Y3QFcnINhD-nvGhkIq6zODbm4b1gs3I2jsgnGjkl1cvlTyGE3B7LCd…" ], "ext": { "dateText": "2 months ago", "source": "Google", "url": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sCi9DQUlRQUNvZENodHljRjlvT2tSS1ZtOUdNMlZ6Wm05eVowWnFXa2RKVFdOdVNHYxAB!2m1!1s0x0:0x1f1a903bbb66839!3m…", "authorUrl": "https://www.google.com/maps/contrib/104340167270615172538?hl=en-US", "authorImage": "https://lh3.googleusercontent.com/a-/ALV-UjVf_oseTFdaaXHxa7GWOkwHt9yWcYzESPE_-bMx2ojJbVdthaA=s120-c-rp-mo-ba12-br100", "reviewerId": "104340167270615172538", "authorReviewCount": 66, "authorPhotoCount": 395, "authorBadge": "Local Guide · 66 reviews", "answers": [{"question": "Order type", "answer": "Dine in"}] } }, { "id": "Ci9DQUlRQUNvZENodHljRjlvT2pOYVN6aHVhblppV0hNdFltTjRZWEZoVFdkRE1GRRAB", "author": "Briana N.", "rating": 5, "body": "First impression they have friendly and welcoming baristas. Great menu with variety. I got a lemonade with peach syrup and hibiscus tea (so delicious!). My part…", "date": "2026-06-27T22:49:37.010Z", "language": "en", "images": [ "https://lh3.googleusercontent.com/grass-cs/AABkmLdH5Ktkx_Dw3iqNRpafPbLYNIbb7mJq0M8v_sN2p2qAT7_46mhrvuKnB6SCeE_MZSuK0WFF9fhziGGxFhLcLZHGIV-4v79RXnjY8CsbDQk5Xp3R3…" ], "ext": { "dateText": "4 months ago", "source": "Google", "url": "https://www.google.com/maps/reviews/data=!4m8!14m7!1m6!2m5!1sCi9DQUlRQUNvZENodHljRjlvT2pOYVN6aHVhblppV0hNdFltTjRZWEZoVFdkRE1GRRAB!2m1!1s0x0:0x1f1a903bbb66839!3m…", "authorUrl": "https://www.google.com/maps/contrib/102913306226507508797?hl=en-US", "authorImage": "https://lh3.googleusercontent.com/a/ACg8ocK5EThT9DL2VwXLsgfvtdMFUTBc3PuaIs7oflgrtRY-u1ICqNA=s120-c-rp-mo-ba12-br100", "reviewerId": "102913306226507508797", "authorReviewCount": 81, "authorPhotoCount": 71, "authorBadge": "Local Guide · 81 reviews", "answers": [{"question": "Price per person", "answer": "$1–10"}] } } ] }, "lang": "en", "photoCount": 838, "statusText": "Open 24 hours", "neighborhood": "North Loop", "reviewsUrl": "https://search.google.com/local/reviews?placeid=ChIJG-gJw2vKRIYROWi2uwOp8QE&authuser=0&hl=en&gl=US" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 404 | `NOT_FOUND` | The place does not exist. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - Pass `id` from `places`, or the place's map link as `url`. --- # Bing > Bing web, news, image and video search, reverse-image search, and suggestions. Source: https://apinoa.com/en/docs-raw/api-reference/bing Bing web, news, image and video search, reverse-image search, and suggestions. **Markets:** `US` `GB` `CA` `AU` `DE` `FR` `IT` `AT` `JP` `KR` (the first is the default) ## Operations | Operation | Endpoint | Returns | Price | |---|---|---|---| | [Search](/docs/api-reference/bing/search) | `GET \| POST /v1/bing/search` | `ResultsPage` | $0.0012–$0.006 | | [Suggestions](/docs/api-reference/bing/suggestions) | `GET \| POST /v1/bing/suggestions` | `Suggestions` | $0.0012 | --- # Search > Get one Bing results page, with every block in page order. Source: https://apinoa.com/en/docs-raw/api-reference/bing/search ```http GET | POST /v1/bing/search ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/bing/search?q=best+running+shoes&country=US" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "best running shoes", country: "US" }); const res = await fetch(`https://gateway.apinoa.com/v1/bing/search?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/bing/search", params={"q": "best running shoes", "country": "US"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `country` | enum | | The market, as an ISO 3166 country code. `US` `GB` `CA` `AU` `DE` `FR` `IT` `AT` `JP` `KR` | | `cursor` | string | | The previous page's `cursor`. Pass it alone for the next page. | | `device` | enum | | Which page to read: the desktop (default) or the mobile one. `desktop` `mobile` | | `image` | string | | An image URL: a reverse-image search instead of `q` (`type=image`). | | `lang` | string | | Interface language. | | `limit` | integer 1–50 | | Results wanted (default 10, at most 50). More than one page is charged per page. | | `q` | string | | The query, search operators included. | | `safe` | enum | | Safe search. `on` `off` | | `timeRange` | enum | | Only results from this past period. `hour` `day` `week` `month` `year` | | `type` | enum | | What to search: web results (default), news, images, videos or `image` for a reverse-image search. `web` `news` `images` `videos` `image` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`ResultsPage`](/docs/api-reference/serp/response-schema#resultspage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "bing", "query": "best running shoes", "type": "web", "outcome": "results", "country": "US", "lang": "en", "device": "desktop", "totalResults": 24200, "page": 1, "items": [ { "type": "organic", "rank": 1, "position": 1, "url": "https://www.runnersworld.com/gear/a19663621/best-running-shoes/", "title": "The 15 Best Running Shoes of 2026, Tested by Runner’s World", "snippet": "Find the best running shoes of 2026, including Runner’s World–tested picks from Adidas, Brooks, New Balance, Nike, …", "site": "runnersworld.com", "displayUrl": "https://www.runnersworld.com › ... › best-running-shoes", "date": "2026-10-22" }, { "type": "organic", "rank": 2, "position": 2, "url": "https://www.outdoorgearlab.com/topics/shoes-and-boots/best-running-shoes", "title": "10 Best Running Shoes of 2026 | Tested & Ranked - GearLab", "snippet": "We run more than 50 miles in every pair of shoes we test, putting top models head to head to find the best from Nike, …", "site": "outdoorgearlab.com", "displayUrl": "https://www.outdoorgearlab.com › ... › best-running-shoes", "date": "2026-05-14" }, { "type": "organic", "rank": 3, "position": 3, "url": "https://runtothefinish.com/best-running-shoes/", "title": "Best Running Shoes Of 2026 - RunToTheFinish", "snippet": "The best running shoes right now after thousands of miles of testing from our team. We've got options for every need.", "site": "runtothefinish.com", "displayUrl": "https://runtothefinish.com › best-running-shoes", "date": "2026-08-21" }, { "type": "other", "rank": 8, "kind": "b_msg", "text": "Some results have been removed", "links": [{"url": "http://go.microsoft.com/fwlink/?LinkID=617350", "title": "Some results have been removed"}] }, { "type": "ad", "rank": 12, "block": "bottom", "url": "https://www.fitflop.com/us/en/shop/womens-sneakers-us?&@family=vitamin-ff&gclid=8d013d3d631a1163001657de889041cc&gclsrc=3p.ds&msclkid=8d013d3d631a1163001657de88…", "title": "Shop FitFlop ™ Sneakers | Shop Sneakers, Sandals & More", "snippet": "Discover the Difference Now. Shop Sneakers at the Official Store. Smart Engineering For Effortless Movement And Seamless Support", "advertiser": "FitFlop", "displayUrl": "https://www.fitflop.com › us › sneakers", "sitelinks": [ { "url": "https://www.fitflop.com/us/en/shop/water-resistant-shoes-us?gclid=3b0ba5d7da621ee2b7a5cf3431e87cbe&gclsrc=3p.ds&msclkid=3b0ba5d7da621ee2b7a5cf3431e87cbe&utm_sou…", "title": "Water Resistant Shoes" }, { "url": "https://www.fitflop.com/us/en/shop/womens-slippers-us?gclid=63759f35d8631399ca24f5d633e9b66d&gclsrc=3p.ds&msclkid=63759f35d8631399ca24f5d633e9b66d&utm_source=bi…", "title": "New Women's Slippers" } ], "ext": { "cta": "Shop Now", "adLibrary": { "advertiser": "FitFlop Ltd", "country": "GB", "payer": "FitFlop LTD", "url": "https://adlibrary.ads.microsoft.com/advertiser/165000085" } }, "favicon": "https://th.bing.com/th/id/ODF.hiRn35QxflKhhSBUsJl52w?w=32&h=32&o=6&pid=AdsPlus", "rating": 4.5, "reviewCount": 65, "extensions": [ {"text": "Styles: Sandals, Flip Flops, Trainers, Shoes, Ballerinas, Boots, High Top, Low Top"}, { "text": "\"These are the best welly boots ever!\" - from consumer review", "url": "https://www.trustpilot.com/review/fitflop.com" } ] }, { "type": "relatedSearches", "rank": 15, "queries": ["best running shoes for men", "best running shoes for women"] } ], "cursor": "kdchOqXs1C4Wf-slNuukPsr7eFzQ9oHz-d-cICT9lOAT31qO2NyNUibsLaeesVkC-QC2E0NokLgOTO7inqDdOpMlUeSZ2kUzIwNp0en7k7hAC9gRJQMJo67_k-XqvN5TaK8L8k7xjzvO1eH3JL2EVaUjUHz6Nmv0…", "fetchedAt": "2026-10-30T00:57:44.939Z" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call, plus $0.0012 for each extra call it makes — at most 4 more, so $0.006 in total. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - `type=image` with an `image` URL instead of `q` runs a reverse-image search. - `limit` above one page reads further pages, one unit each. --- # Suggestions > Get what Bing's search box suggests for a query. Source: https://apinoa.com/en/docs-raw/api-reference/bing/suggestions ```http GET | POST /v1/bing/suggestions ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/bing/suggestions?q=running+shoes&country=US" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "running shoes", country: "US" }); const res = await fetch(`https://gateway.apinoa.com/v1/bing/suggestions?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/bing/suggestions", params={"q": "running shoes", "country": "US"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `q` | string | yes | The query, search operators included. | | `country` | enum | | The market, as an ISO 3166 country code. `US` `GB` `CA` `AU` `DE` `FR` `IT` `AT` `JP` `KR` | | `lang` | string | | Interface language. | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`Suggestions`](/docs/api-reference/serp/response-schema#suggestions) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "bing", "query": "running shoes", "suggestions": [{"text": "running shoes near me", "type": "AS"}, {"text": "running shoes in elizabeth", "type": "LMSQ"}], "country": "US", "lang": "en" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. --- # Yahoo > Yahoo web, news, image and video search, and suggestions. Source: https://apinoa.com/en/docs-raw/api-reference/yahoo Yahoo web, news, image and video search, and suggestions. **Markets:** `US` `GB` `CA` `DE` `FR` `IT` `ES` `IN` `SG` `PH` `BR` `MX` `AR` (the first is the default) ## Operations | Operation | Endpoint | Returns | Price | |---|---|---|---| | [Search](/docs/api-reference/yahoo/search) | `GET \| POST /v1/yahoo/search` | `ResultsPage` | $0.0012–$0.0108 | | [Suggestions](/docs/api-reference/yahoo/suggestions) | `GET \| POST /v1/yahoo/suggestions` | `Suggestions` | $0.0012 | --- # Search > Get one Yahoo results page, with every block in page order. Source: https://apinoa.com/en/docs-raw/api-reference/yahoo/search ```http GET | POST /v1/yahoo/search ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/yahoo/search?q=best+running+shoes&country=US" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "best running shoes", country: "US" }); const res = await fetch(`https://gateway.apinoa.com/v1/yahoo/search?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/yahoo/search", params={"q": "best running shoes", "country": "US"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `country` | enum | | The market, as an ISO 3166 country code. `US` `GB` `CA` `DE` `FR` `IT` `ES` `IN` `SG` `PH` `BR` `MX` `AR` | | `cursor` | string | | The previous page's `cursor`. Pass it alone for the next page. | | `device` | enum | | Which page to read: the desktop (default) or the mobile one. `desktop` `mobile` | | `limit` | integer 1–60 | | Results wanted (default 7, at most 60). More than one page is charged per page. | | `q` | string | | The query, search operators included. | | `safe` | enum | | Safe search. `on` `off` | | `timeRange` | enum | | Only results from this past period. `hour` `day` `week` `month` `year` | | `type` | enum | | What to search: web results (default), news, images or videos. `web` `news` `images` `videos` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`ResultsPage`](/docs/api-reference/serp/response-schema#resultspage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "yahoo", "query": "best running shoes", "type": "web", "outcome": "results", "country": "US", "device": "desktop", "page": 1, "items": [ { "type": "topStories", "rank": 1, "title": "Top Stories", "items": [ { "url": "https://health.yahoo.com/wellness/fitness/article/best-weightlifting-shoes-143108986.html", "title": "Best shoes for lifting weights, according to a weightlifting coach and a podiatrist", "source": "Yahoo Life", "date": "2026-10-29T14:58:00.000Z", "thumbnail": "https://s.yimg.com/fz/api/res/1.2/pi5DctierhZS3W8V8xQSiw--~C/YXBwaWQ9c3JjaGRkO2ZpPXN0cmltO2g9NDQwO3E9ODA7dz02MDA-/https://d29szjachogqwa.cloudfront.net/images/u…" }, { "url": "https://shopping.yahoo.com/style/shoes/articles/8-best-slip-walking-shoes-193723689.html", "title": "The 8 Best Slip-On Walking Shoes, According to Our Editors", "source": "Men's Health via Yahoo", "date": "2026-10-28", "thumbnail": "https://s.yimg.com/fz/api/res/1.2/8uRmYIee9jSKpFqwJQ66zQ--~C/YXBwaWQ9c3JjaGRkO2ZpPXN0cmltO2g9MTYwO3E9ODA7c209MTt3PTE2MA--/https://media.zenfs.com/en/men_s_healt…" } ] }, { "type": "organic", "rank": 2, "position": 1, "url": "https://www.runnersworld.com/gear/a19663621/best-running-shoes/", "title": "The 15 Best Running Shoes of 2026, Tested by Runner’s World", "snippet": "Find the best running shoes of 2026, including Runner’s World–tested picks from Adidas, Brooks, New Balance, Nike, Hoka, Asics, and more.", "site": "Runner's World", "displayUrl": "https://www.runnersworld.com › best-running-shoes", "date": "2026-10-22", "favicon": "https://s.yimg.com/pv/static/search_favicon/images/40x40_9cce582be4ef04e7.png" }, { "type": "organic", "rank": 3, "position": 2, "url": "https://www.outdoorgearlab.com/topics/shoes-and-boots/best-running-shoes", "title": "10 Best Running Shoes of 2026 | Tested & Ranked - GearLab", "snippet": "10 Best Running Shoes of 2026 We run more than 50 miles in every pair of shoes we test, putting top models head to head to find the best from Nike, Hoka, Saucon…", "site": "GearLab", "displayUrl": "https://www.outdoorgearlab.com › best-running-shoes", "date": "2026-05-14", "favicon": "https://s.yimg.com/pv/static/search_favicon/images/32x32_d9bdf3c2ca847615.png", "facts": [{"label": "Brand", "value": "Asics"}, {"label": "Author", "value": "Nathaniel Bailey"}], "rating": 4.8 }, { "type": "peopleAlsoAsk", "rank": 4, "questions": [ { "question": "What are the best running shoes to buy?", "answer": "When selecting the best running shoes, consider factors like your foot type, running style, and the terrain you'll be covering. Popular options for 2026 include…" }, { "question": "Which running shoes have the best ratings?", "answer": "The best running shoes are evaluated based on various performance metrics, including comfort, durability, and support. Recent rankings highlight top models like…" } ] }, { "type": "other", "rank": 6, "kind": "LocalPc-listings", "title": "Running Shoes", "text": "Running Shoes Results near Sacramento, CA Use Precise Location Sacramento Running Company Shoe Store 5.0 ( 13 ) Yelp • 1.26 mi Open • Open until 7:00 PM Work Sh…", "links": [ { "url": "https://search.yahoo.com/local/s?p=best+running+shoes&selectedId=240220726", "title": "Sacramento Running Company Shoe Store 5.0 ( 13 ) Yelp • 1.26 mi Open • Open until 7:00 PM" }, { "url": "https://search.yahoo.com/local/s?p=best+running+shoes&selectedId=228362071", "title": "Work Shoes Plus Shoe Store 4.5 ( 29 ) Yelp • 4.73 mi Open • Open until 6:00 PM" } ] }, { "type": "relatedSearches", "rank": 11, "queries": ["best running shoes for women", "best running shoes for plantar fasciitis"] } ], "cursor": "UlITYMg95D_DebacC8SVNrpRv0EcAZ-oJq7T3lai56eOYPOcQvK7LiGvdN4an817QM6r3rjf5XGZebmDgaDSucdrgnxPHx9dQ8RLSmOucm0ujCEQGioo1SmX0YwCttrpp87tn0BT9EXo4ku_G2jRASOCjYKnyE_H…", "fetchedAt": "2026-10-30T00:58:01.645Z" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call, plus $0.0012 for each extra call it makes — at most 8 more, so $0.0108 in total. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. --- # Suggestions > Get what Yahoo's search box suggests for a query. Source: https://apinoa.com/en/docs-raw/api-reference/yahoo/suggestions ```http GET | POST /v1/yahoo/suggestions ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/yahoo/suggestions?q=running+shoes&country=US" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "running shoes", country: "US" }); const res = await fetch(`https://gateway.apinoa.com/v1/yahoo/suggestions?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/yahoo/suggestions", params={"q": "running shoes", "country": "US"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `q` | string | yes | The query, search operators included. | | `country` | enum | | The market, as an ISO 3166 country code. `US` `GB` `CA` `DE` `FR` `IT` `ES` `IN` `SG` `PH` `BR` `MX` `AR` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`Suggestions`](/docs/api-reference/serp/response-schema#suggestions) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "yahoo", "query": "running shoes", "suggestions": [{"text": "running shoes"}, {"text": "running shoes for men"}], "country": "US" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. --- # DuckDuckGo > DuckDuckGo web, news, image and video search, and suggestions. Source: https://apinoa.com/en/docs-raw/api-reference/duckduckgo DuckDuckGo web, news, image and video search, and suggestions. **Markets:** `US` `GB` `CA` `AU` `IN` `DE` `FR` `IT` `ES` `NL` `BR` `MX` `JP` `KR` (the first is the default) ## Operations | Operation | Endpoint | Returns | Price | |---|---|---|---| | [Search](/docs/api-reference/duckduckgo/search) | `GET \| POST /v1/duckduckgo/search` | `ResultsPage` | $0.0012–$0.012 | | [Suggestions](/docs/api-reference/duckduckgo/suggestions) | `GET \| POST /v1/duckduckgo/suggestions` | `Suggestions` | $0.0012 | --- # Search > Get one DuckDuckGo results page, with every block in page order. Source: https://apinoa.com/en/docs-raw/api-reference/duckduckgo/search ```http GET | POST /v1/duckduckgo/search ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/duckduckgo/search?q=best+running+shoes&country=US" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "best running shoes", country: "US" }); const res = await fetch(`https://gateway.apinoa.com/v1/duckduckgo/search?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/duckduckgo/search", params={"q": "best running shoes", "country": "US"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `country` | enum | | The market, as an ISO 3166 country code. `US` `GB` `CA` `AU` `IN` `DE` `FR` `IT` `ES` `NL` `BR` `MX` `JP` `KR` | | `cursor` | string | | The previous page's `cursor`. Pass it alone for the next page. | | `limit` | integer 1–100 | | Results wanted (default 10, at most 100). More than one page is charged per page. | | `q` | string | | The query, search operators included. | | `safe` | enum | | Safe search. `on` `off` | | `timeRange` | enum | | Only results from this past period. `hour` `day` `week` `month` `year` | | `type` | enum | | What to search: web results (default), news, images or videos. `web` `news` `images` `videos` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`ResultsPage`](/docs/api-reference/serp/response-schema#resultspage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "duckduckgo", "query": "best running shoes", "type": "web", "outcome": "results", "country": "US", "device": "desktop", "page": 1, "items": [ { "type": "shopping", "items": [ { "title": "On Men's Cloudboom Echo 3 Road Running Shoe In White/Flame, Size: 11.5", "url": "https://www.on.com/en-us/products/cloudboom-echo-3-0-3md1059/mens/white-flame-shoes-3MD10590256?variant=11.5&m…", "price": "$260.00", "lowPrice": "$130.00", "merchant": "On Running", "thumbnail": "https://www.bing.com/th?id=OPHS.JAt6Xy%2bZyO2cXA474C474&o=5&pid=21.1", "snippet": "A fusion of CloudTec® and Helion™ HF hyper foam for our fastest race-day shoe. Get ready to outrun your echo |…", "sponsored": true, "clickUrl": "https://duckduckgo.com/y.js?ad_domain=on.com&ad_provider=bing&ad_type=prad&click_metadata=YPxo%2D6r%2DBu%2Dx6n…" }, { "title": "On Men's Cloudmonster 3 Road Running Shoe In Eclipse/Ivory, Size: 11.5, Polyester", "url": "https://www.on.com/en-us/products/cloudmonster-3-m-3mg1005/mens/eclipse-ivory-shoes-3MG10053388?variant=11.5&m…", "price": "$190.00", "lowPrice": "$150.00", "merchant": "On Running", "thumbnail": "https://www.bing.com/th?id=OPHS.I93vHyie0KB%2fFg474C474&o=5&pid=21.1", "snippet": "We've levelled up the latest Cloudmonster, bringing back the forward-rolling ride you love. Now featuring a tr…", "sponsored": true, "clickUrl": "https://duckduckgo.com/y.js?ad_domain=on.com&ad_provider=bing&ad_type=prad&click_metadata=%2DyfPGA7EWq4tBoRb_K…" } ], "rank": 1, "sponsored": true }, { "type": "ad", "block": "top", "url": "https://ad.doubleclick.net/searchads/link/click?lid=43700081731586309&ds_s_kwgid=58700008871720321&ds_a_cid=68…", "title": "Built For Runners, By Runners - Supportive Running Shoes", "snippet": "Stay Supported On Every Run With Durable, High-Performance Running Shoes. Shop Brooks® Running Shoes & Apparel…", "advertiser": "Brooks Running", "displayUrl": "www.brooksrunning.com", "sitelinks": [ { "url": "https://ad.doubleclick.net/searchads/link/click?lid=43700081731586309&ds_s_kwgid=58700008871720321&ds_a_cid=68…", "title": "Adrenaline GTS 25" }, { "url": "https://ad.doubleclick.net/searchads/link/click?lid=43700081731586309&ds_s_kwgid=58700008871720321&ds_a_cid=68…", "title": "Try Our Shoe Finder" } ], "ext": { "clickUrl": "https://duckduckgo.com/y.js?ad_domain=brooksrunning.com&ad_provider=bingv7aa&ad_type=txad&click_metadata=fZ6OU…" }, "rank": 2, "favicon": "https://www.bing.com/th?id=OADD2.1242448182628032_1DRPH90YYKI2O5R&pid=21.2&h=32" }, { "type": "organic", "position": 1, "url": "https://www.runnersworld.com/gear/a19663621/best-running-shoes/", "title": "The 15 Best Running Shoes of 2026, Tested by Runner's World", "snippet": "Find the best running shoes of 2026, including Runner's World-tested picks from Adidas, Brooks, New Balance, N…", "site": "Runner's World", "displayUrl": "www.runnersworld.com/gear/a19663621/best-running-shoes/", "date": "2026-10-22", "sitelinks": [ { "url": "https://www.runnersworld.com/gear/a20865766/best-stability-running-shoes/", "title": "Stability", "snippet": "Through rigorous testing and a lifetime of runs, we've determined the best stability running shoes on the mark…" }, { "url": "https://www.runnersworld.com/gear/a26028922/running-shoes-for-men/", "title": "Men's Running Shoe Reviews", "snippet": "From freaky fast racers to rock-solid stability shoes, these are the highest-rated running shoes for men that…" } ], "rank": 5, "lang": "en" }, { "type": "topStories", "items": [ { "title": "Heads up: 2026's best running shoes are already marked down by as much as 45%", "url": "https://www.msn.com/en-us/lifestyle/other/heads-up-2026-s-best-running-shoes-are-already-marked-down-by-as-muc…", "source": "Outside Online", "date": "2026-10-25T09:22:46.000Z", "snippet": "Looking to upgrade your running shoes without paying full price? We rounded up four top-tested road trainers a…" }, { "title": "Hoka updated one of its best running shoes for pain-free walks and runs—now the cloud-like sneakers are on sal…", "url": "https://www.msn.com/en-us/news/other/hoka-updated-one-of-its-best-running-shoes-for-pain-free-walks-and-runs-n…", "source": "EatingWell", "date": "2026-10-21T10:00:00.000Z", "snippet": "A plush yet supportive design? We're in.", "thumbnail": "https://www.bing.com/th?id=ONUT.4Ma08_mymEhVGpW5Wj7ryg&pid=News" } ], "rank": 10 }, { "type": "relatedSearches", "queries": ["best running shoes for men", "best running shoes for women"], "rank": 17 } ], "cursor": "rhDukN2wfKxmHVjTS25-olD-Z_d_Rj_ivX3a4765VdFFfm17ma1zcpp495WtWkFT0nZiEO37qbSIQUFRDbYYe2Cgue7tkw_XBJhrSgAhiZ8iGL…", "fetchedAt": "2026-10-30T00:57:50.542Z" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call, plus $0.0012 for each extra call it makes — at most 9 more, so $0.012 in total. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. --- # Suggestions > Get what DuckDuckGo's search box suggests for a query. Source: https://apinoa.com/en/docs-raw/api-reference/duckduckgo/suggestions ```http GET | POST /v1/duckduckgo/suggestions ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/duckduckgo/suggestions?q=running+shoes&country=US" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "running shoes", country: "US" }); const res = await fetch(`https://gateway.apinoa.com/v1/duckduckgo/suggestions?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/duckduckgo/suggestions", params={"q": "running shoes", "country": "US"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `q` | string | yes | The query, search operators included. | | `country` | enum | | The market, as an ISO 3166 country code. `US` `GB` `CA` `AU` `IN` `DE` `FR` `IT` `ES` `NL` `BR` `MX` `JP` `KR` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`Suggestions`](/docs/api-reference/serp/response-schema#suggestions) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "duckduckgo", "query": "running shoes", "suggestions": [{"text": "running shoes"}, {"text": "running shoes for men"}], "country": "US" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. --- # Yandex > Yandex news, image and video search, reverse-image search, suggestions, and places on Yandex Maps with their reviews. Source: https://apinoa.com/en/docs-raw/api-reference/yandex Yandex news, image and video search, reverse-image search, suggestions, and places on Yandex Maps with their reviews. **Markets:** `US` `RU` `TR` `KZ` `BY` `UA` `UZ` `DE` `GB` `FR` (the first is the default) ## Operations | Operation | Endpoint | Returns | Price | |---|---|---|---| | [Search](/docs/api-reference/yandex/search) | `GET \| POST /v1/yandex/search` | `ResultsPage` | $0.0012–$0.006 | | [Suggestions](/docs/api-reference/yandex/suggestions) | `GET \| POST /v1/yandex/suggestions` | `Suggestions` | $0.0012 | | [Places](/docs/api-reference/yandex/places) | `GET \| POST /v1/yandex/places` | `PlacesPage` | $0.0012–$0.0048 | | [Place](/docs/api-reference/yandex/place) | `GET \| POST /v1/yandex/place` | `Place` | $0.0012 | | [Reviews](/docs/api-reference/yandex/reviews) | `GET \| POST /v1/yandex/reviews` | `PlaceReviewsPage` | $0.0012–$0.0048 | --- # Search > Get one Yandex results page, with every block in page order. Source: https://apinoa.com/en/docs-raw/api-reference/yandex/search ```http GET | POST /v1/yandex/search ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/yandex/search?q=moscow+kremlin&type=images" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "moscow kremlin", type: "images" }); const res = await fetch(`https://gateway.apinoa.com/v1/yandex/search?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/yandex/search", params={"q": "moscow kremlin", "type": "images"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `country` | enum | | The market, as an ISO 3166 country code. `US` `RU` `TR` `KZ` `BY` `UA` `UZ` `DE` `GB` `FR` | | `cursor` | string | | The previous page's `cursor`. Pass it alone for the next page. | | `device` | enum | | Which page to read: the desktop (default) or the mobile one. `desktop` `mobile` | | `image` | string | | An image URL: a reverse-image search instead of `q` (`type=image`). | | `lang` | enum | | Interface language: en (yandex.com, the default) or ru (yandex.ru). `en` `ru` | | `limit` | integer 1–100 | | Results wanted (default 20, at most 100). More than one page is charged per page. | | `q` | string | | The query, search operators included. | | `timeRange` | enum | | Only results from this past period. `hour` `day` `week` `month` `year` | | `type` | enum | | What to search: news, images, videos, or `image` for a reverse-image search. Yandex's web results are not offered. `news` `images` `videos` `image` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`ResultsPage`](/docs/api-reference/serp/response-schema#resultspage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "yandex", "query": "moscow kremlin", "type": "images", "outcome": "results", "country": "US", "lang": "en", "device": "desktop", "page": 1, "items": [ { "type": "image", "imageUrl": "https://upload.wikimedia.org/wikipedia/commons/thumb/c/c1/DSC07437-%D0%9C%D0%BE%D1%81%D0%BA%D0%BE%D0%B2%D1%81%D0%BA%D0%B8%D0%B9_%D0%9A%D1%80%D0%B5%D0%BC%D0%BB%D…", "thumbnail": "https://avatars.mds.yandex.net/i?id=0478d2b2c1e3bc635da290a7ec93ed7a8389541d-4568991-images-thumbs&n=13", "width": 1280, "height": 854, "title": "Кремль - Википедия", "url": "https://ru.wikipedia.org/wiki/%D0%9A%D1%80%D0%B5%D0%BC%D0%BD%D0%B8%D0%BA", "source": "ru.wikipedia.org", "ext": { "id": "c13a461cad3531a9d14e15d194b1f453", "snippet": "Кремль — Википедия", "copies": [ { "url": "https://day.ru/public/styles/1920x1080_16_9_watermark/public/image/2026-07/screenshot_8.jpg.webp?itok=tgB7-t6o", "width": 1920, "height": 1080, "bytes": 239798 }, { "url": "https://apostrophe.ua/uploads/image/a2d88e4418642f7271777de4cf54216f.jpg", "width": 1500, "height": 1001, "bytes": 1802215 } ] }, "rank": 1 }, { "type": "image", "imageUrl": "https://cdn.culture.ru/c/367836.jpg", "thumbnail": "https://avatars.mds.yandex.net/i?id=8b172529aea8e52da70a8539d9ee647e8646aea7-5338433-images-thumbs&n=13", "width": 1350, "height": 900, "title": "Музеи Московского Кремля: история основания, экспозиции, соборы на территории Кр", "url": "https://www.culture.ru/materials/94949/muzei-moskovskogo-kremlya-chto-i-gde?7", "source": "culture.ru", "ext": { "id": "e07ff0761619f4d6f544159823e1163d", "snippet": "Telegram.", "copies": [ {"url": "https://cdn.culture.ru/c/367836.jpg", "width": 1350, "height": 900, "bytes": 152243}, { "url": "https://moscowrussian.com/images/kremlin-church.jpg", "width": 1200, "height": 800, "bytes": 263551 } ] }, "rank": 2 }, { "type": "image", "imageUrl": "https://news.store.rambler.ru/img/b4d984f9a02f4f2f79bdc5a25fec1378?img-format=avif&img-1-resize=width:1280", "thumbnail": "https://avatars.mds.yandex.net/i?id=2a6a772473ef11a574759d3c2ef99700d60d3073-12935885-images-thumbs&n=13", "width": 1280, "height": 720, "title": "Что посмотреть в Московском Кремле: краткая история, достопримечательности и цен", "url": "https://weekend.rambler.ru/tourism/56962355-chto-posmotret-v-moskovskom-kremle-kratkaya-istoriya-dostoprimechatelnosti-i-tseny-na-ekskursii/", "source": "weekend.rambler.ru", "ext": { "id": "19300ddc2386aec2e7a879ec0a199c96", "snippet": "© yulenochekk/iStock.com", "copies": [ { "url": "https://www.his-j.com/oe/up_img/LED0097/Tr00100420201016215043586.jpg", "width": 4774, "height": 3106, "bytes": 5002584 }, { "url": "https://cdn1.img.spnfa.ir/img/03/76/037659_0:139:3147:1909_1920x0_80_0_0_8aabe5681b4393b85463dc85a65e816a.jpg", "width": 1920, "height": 1080, "bytes": 373184 } ] }, "rank": 3 } ], "fetchedAt": "2026-10-30T01:00:16.470Z" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call, plus $0.0012 for each extra call it makes — at most 4 more, so $0.006 in total. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - Pass `type`: Yandex's web results are not offered. News comes from Yandex's Russian news edition and takes no `country` or `lang`. - `type=image` with an `image` URL instead of `q` runs a reverse-image search. - `limit` above one page reads further pages, one unit each. --- # Suggestions > Get what Yandex's search box suggests for a query. Source: https://apinoa.com/en/docs-raw/api-reference/yandex/suggestions ```http GET | POST /v1/yandex/suggestions ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/yandex/suggestions?q=moscow" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "moscow" }); const res = await fetch(`https://gateway.apinoa.com/v1/yandex/suggestions?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/yandex/suggestions", params={"q": "moscow"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `q` | string | yes | The query, search operators included. | | `country` | enum | | The market, as an ISO 3166 country code. `US` `RU` `TR` `KZ` `BY` `UA` `UZ` `DE` `GB` `FR` | | `lang` | enum | | Interface language: en (yandex.com, the default) or ru (yandex.ru). `en` `ru` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`Suggestions`](/docs/api-reference/serp/response-schema#suggestions) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "yandex", "query": "moscow", "country": "US", "lang": "en", "suggestions": [{"text": "moscow", "type": "fulltext"}, {"text": "moscow time", "type": "fulltext"}] } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. --- # Places > Find places on Yandex's map. Source: https://apinoa.com/en/docs-raw/api-reference/yandex/places ```http GET | POST /v1/yandex/places ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl -G "https://gateway.apinoa.com/v1/yandex/places" \ --data-urlencode "q=кафе" \ --data-urlencode "near=Москва" \ --data-urlencode "limit=5" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "кафе", near: "Москва", limit: "5" }); const res = await fetch(`https://gateway.apinoa.com/v1/yandex/places?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/yandex/places", params={"q": "кафе", "near": "Москва", "limit": "5"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `cursor` | string | | The previous page's `cursor`. Pass it alone for the next page. | | `limit` | integer 1–100 | | Results wanted (default 20, at most 100). More than one page is charged per page. | | `location` | string | | Search as if from this point: `lat,lng`. | | `near` | string | | Search around this place name, or a `lat,lng` point. | | `q` | string | | The query, search operators included. | | `type` | enum | | The map's list of places (the only one Yandex has). `maps` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`PlacesPage`](/docs/api-reference/serp/response-schema#placespage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "yandex", "query": "кафе", "outcome": "results", "type": "maps", "near": "Москва", "lang": "en", "places": [ { "id": "19464848293", "name": "Ryba moya", "url": "https://yandex.com/maps/org/ryba_moya/19464848293/", "address": { "full": "Moscow, Slavyanskaya Square, 2", "street": "Slavyanskaya Square, 2", "city": "Moscow", "postalCode": "109012", "country": "Russian Federation" }, "coordinates": {"lat": 55.753391, "lng": 37.633956}, "categories": ["Restaurant"], "rating": 4.9, "reviewCount": 2744, "priceLevel": "Avg. bill: from 3000 ₽", "phone": "+7 (495) 784-68-58", "website": "https://rybamoya.ru/?yclid=1305595376695246847&utm_content=19214665871…", "hours": [{"day": "daily", "hours": "12:00 PM–12:00 AM"}], "photos": ["https://avatars.mds.yandex.net/get-altay/4080517/2a0000017a04e6c999ab1…"], "attributes": [{"group": "Prices", "label": "average bill", "value": "3000–3500 ₽"}], "status": "closed", "lang": "en", "ext": { "subtitle": "Moscow, Slavyanskaya Square, 2", "ratingCount": 6132, "openNow": "Closed until 12:00 PM", "metro": [{"name": "Kitay-Gorod", "distance": "35 m", "type": "metro", "color": "#8647b2"}], "stops": [{"name": "Метро Китай-город", "distance": "41 m", "type": "common"}], "ad": true, "socialLinks": [ { "type": "telegram", "href": "https://t.me/perelmanrestaurants", "readableHref": "@perelmanrestaurants" } ], "price": {"item": "Avg. bill", "from": 3000, "to": 3500, "currency": "₽"}, "aspects": [ { "text": "Meal", "count": 2275, "positive": 2002, "neutral": 58, "negative": 215, "photos": ["https://avatars.mds.yandex.net/get-altay/11244149/2a0000018c54982d3cc0…"] } ], "popularTimes": { "monday": [0], "tuesday": [0], "wednesday": [0], "thursday": [0], "friday": [0], "saturday": [0], "sunday": [0] }, "menu": { "items": [ { "title": "Сашими из лосося", "description": "Тонко нарезанное филе подаём с маринованным имбирём. Дополняем соевым…", "price": 1190, "currency": "₽", "volume": "85 g", "image": "https://avatars.mds.yandex.net/get-eda/17780111/9bed7a6d1dc748758ccd6b…", "url": "https://eda.yandex/restaurant/ryba_moya_slavyanskaya_ploshhad_2", "category": "popular" } ], "total": 49, "kind": "food", "source": "Yango Deli", "updated": "2026-10-04T09:23:14Z" }, "advert": { "advertiser": "ООО \"СЫТОСТЬ\"", "advertiserTin": "7702407463", "products": [ { "title": "Рулетики из форели", "price": "1 690 р.", "priceValue": 1690, "currency": "RUB", "image": "https://avatars.mds.yandex.net/get-tycoon/18984817/2a0000019eab71c29be…", "url": "https://rybamoya.ru/?utm_source=yandex_business&utm_medium=branding_pr…" } ] }, "additionalAddress": "Рыба моя, этаж -1", "utcOffset": "+03:00", "entrances": [{"lat": 55.75341237, "lng": 37.63391087, "azimuth": 307.640383403427}], "panorama": "https://static-pano.maps.yandex.ru/v1/?panoid=1298236030_673226614_23_…", "goodPlaceYear": 2026, "unusualHours": ["2026-11-04"], "sources": [{"name": "Яндекс", "url": "ya.ru"}] }, "photoCount": 500, "logo": "https://avatars.mds.yandex.net/get-altay/9720991/2a0000018853197f7fb60…", "verifiedOwner": true } ], "page": {"index": 1, "size": 24, "total": 74}, "cursor": "CpvAP5fXWcEmQCibvkYcjH1W7JJK2W95AxceqbJDcZK1WginWDqQzBbLG1lFMIy7xY2V4n…", "fetchedAt": "2026-10-30T01:02:33.501Z", "ext": { "others": [ { "type": "collection", "title": "Красивые кафе", "address": "Кафе с цепляющим глаз интерьером — для свидания, особого случая или пр…", "coordinates": [37.6167545], "image": "https://avatars.mds.yandex.net/get-discovery-int/1674621/2a00000186926…", "images": ["https://avatars.mds.yandex.net/get-altay/1899063/2a0000016bb3194290553…"] } ] } } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call, plus $0.0012 for each extra call it makes — at most 3 more, so $0.0048 in total. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - Search around a place name with `near`, or a point with `location` (`lat,lng`). - `limit` above one page reads further pages, one unit each. --- # Place > Get one place's details from Yandex. Source: https://apinoa.com/en/docs-raw/api-reference/yandex/place ```http GET | POST /v1/yandex/place ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/yandex/place?id=19464848293" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ id: "19464848293" }); const res = await fetch(`https://gateway.apinoa.com/v1/yandex/place?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/yandex/place", params={"id": "19464848293"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `id` | string | | The place's id, as `places` returns it. | | `url` | string | | A Yandex Maps organisation link. | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`Place`](/docs/api-reference/serp/response-schema#place) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "id": "19464848293", "name": "Ryba moya", "url": "https://yandex.com/maps/org/ryba_moya/19464848293/", "address": { "full": "Moscow, Slavyanskaya Square, 2", "street": "Slavyanskaya Square, 2", "city": "Moscow", "postalCode": "109012", "country": "Russian Federation" }, "coordinates": {"lat": 55.753391, "lng": 37.633956}, "categories": ["Restaurant"], "rating": 4.9, "reviewCount": 2744, "priceLevel": "Avg. bill: from 3000 ₽", "phone": "+7 (495) 784-68-58", "website": "https://rybamoya.ru/", "hours": [{"day": "daily", "hours": "12:00 PM–12:00 AM"}], "photos": ["https://avatars.mds.yandex.net/get-altay/5517598/2a0000017ebeb4da3c875…"], "attributes": [{"group": "Prices", "label": "average bill", "value": "3000–3500 ₽"}], "status": "closed", "lang": "en", "ext": { "subtitle": "Moscow, Slavyanskaya Square, 2", "ratingCount": 6132, "openNow": "Closed until 12:00 PM", "metro": [{"name": "Kitay-Gorod", "distance": "35 m", "type": "metro", "color": "#8647b2"}], "stops": [{"name": "Метро Китай-город", "distance": "41 m", "type": "common"}], "ad": true, "socialLinks": [ { "type": "telegram", "href": "https://t.me/perelmanrestaurants", "readableHref": "@perelmanrestaurants" } ], "price": {"item": "Avg. bill", "from": 3000, "to": 3500, "currency": "₽"}, "aspects": [ { "text": "Meal", "count": 2275, "positive": 2002, "neutral": 58, "negative": 215, "photos": ["https://avatars.mds.yandex.net/get-altay/11244149/2a0000018c54982d3cc0…"] } ], "popularTimes": { "monday": [0], "tuesday": [0], "wednesday": [0], "thursday": [0], "friday": [0], "saturday": [0], "sunday": [0] }, "menu": { "items": [ { "title": "Сашими из лосося", "description": "Тонко нарезанное филе подаём с маринованным имбирём. Дополняем соевым…", "price": 1190, "currency": "₽", "volume": "85 g", "image": "https://avatars.mds.yandex.net/get-eda/17780111/9bed7a6d1dc748758ccd6b…", "url": "https://eda.yandex/restaurant/ryba_moya_slavyanskaya_ploshhad_2", "category": "popular" } ], "total": 49, "kind": "food", "source": "Yango Deli", "updated": "2026-10-04T09:23:14Z" }, "advert": { "advertiser": "ООО \"СЫТОСТЬ\"", "advertiserTin": "7702407463", "products": [ { "title": "Рулетики из форели", "price": "1 690 р.", "priceValue": 1690, "currency": "RUB", "image": "https://avatars.mds.yandex.net/get-tycoon/18984817/2a0000019eab71c29be…", "url": "https://rybamoya.ru/?utm_source=yandex_business&utm_medium=branding_pr…" } ] }, "additionalAddress": "Рыба моя, этаж -1", "utcOffset": "+03:00", "entrances": [{"lat": 55.75341237, "lng": 37.63391087, "azimuth": 307.640383403427}], "panorama": "https://static-pano.maps.yandex.ru/v1/?panoid=1298236030_673226614_23_…", "goodPlaceYear": 2026, "unusualHours": ["2026-11-04"], "accessibilityPhotos": [ { "url": "https://avatars.mds.yandex.net/get-altay/4544819/2a00000178da7958d7963…", "tags": ["Entrance"], "width": 960, "height": 1280, "author": "Яндекс", "date": "2021-04-14T19:19:29Z" } ], "sources": [{"name": "Яндекс", "url": "ya.ru"}], "reviews": [ { "id": "BNGlcaXPdYB7jJ_dUUZoOqYNlJVzIy", "author": "mark hewstone", "authorId": "hq1p0pnw1zedpgb6jwvdazhgxg", "rating": 5, "body": "A chain of fish restaurants in Moscow. Don't let that put you off thou…", "date": "2025-01-22T19:06:20.329Z", "helpfulCount": 1, "images": ["https://avatars.mds.yandex.net/get-altay/13947802/2a000001948f68975ae7…"], "language": "en", "reply": {"body": "Благодарим за высокую оценку!", "date": "2025-01-27T13:11:08.395Z"}, "ext": { "authorLevel": "Level 12 Local Expert", "translations": { "ru": "Сеть рыбных ресторанов в Москве. Пусть это вас не смущает. Интересный…", "tr": "Moskova'da bir balık restoranları zinciri. Bunun seni ertelemesine izi…" } } } ] }, "photoCount": 499, "logo": "https://avatars.mds.yandex.net/get-altay/9720991/2a0000018853197f7fb60…", "verifiedOwner": true } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 404 | `NOT_FOUND` | The place does not exist. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - Pass `id` from `places`, or the place's map link as `url`. --- # Reviews > Get a place's reviews from Yandex. Source: https://apinoa.com/en/docs-raw/api-reference/yandex/reviews ```http GET | POST /v1/yandex/reviews ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/yandex/reviews?place=19464848293&limit=5" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ place: "19464848293", limit: "5" }); const res = await fetch(`https://gateway.apinoa.com/v1/yandex/reviews?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/yandex/reviews", params={"place": "19464848293", "limit": "5"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `cursor` | string | | The previous page's `cursor`. Pass it alone for the next page. | | `limit` | integer 1–200 | | Results wanted (default 50, at most 200). More than one page is charged per page. | | `place` | string | | The place's id, as `places` returns it. | | `sort` | enum | | Review order. `relevant` `newest` `highest` `lowest` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`PlaceReviewsPage`](/docs/api-reference/serp/response-schema#placereviewspage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "yandex", "placeId": "19464848293", "summary": {"average": 4.9, "count": 6132}, "sort": "relevant", "page": {"index": 1, "size": 50, "total": 2757}, "reviews": [ { "id": "BNGlcaXPdYB7jJ_dUUZoOqYNlJVzIy", "author": "mark hewstone", "authorId": "hq1p0pnw1zedpgb6jwvdazhgxg", "rating": 5, "body": "A chain of fish restaurants in Moscow. Don't let that put you off thou…", "date": "2025-01-22T19:06:20.329Z", "helpfulCount": 1, "images": ["https://avatars.mds.yandex.net/get-altay/13947802/2a000001948f68975ae7…"], "language": "en", "reply": {"body": "Благодарим за высокую оценку!", "date": "2025-01-27T13:11:08.395Z"}, "ext": { "authorLevel": "Level 12 Local Expert", "translations": { "ru": "Сеть рыбных ресторанов в Москве. Пусть это вас не смущает. Интересный…", "tr": "Moskova'da bir balık restoranları zinciri. Bunun seni ertelemesine izi…" } } } ], "cursor": "G5rcJ9qpiXbUoI3CB_hBjl9E0MXaTAbw_0wIeTRLSqR-AuuY0_8FgFyJ31bBOmDWWKTRkg…", "fetchedAt": "2026-10-30T01:02:41.286Z", "ext": { "aspects": [ { "text": "Meal", "count": 2275, "positive": 2002, "neutral": 58, "negative": 215, "photos": ["https://avatars.mds.yandex.net/get-altay/11244149/2a0000018c54982d3cc0…"] } ], "place": { "id": "19464848293", "name": "Ryba moya", "url": "https://yandex.com/maps/org/ryba_moya/19464848293/", "address": { "full": "Moscow, Slavyanskaya Square, 2", "street": "Slavyanskaya Square, 2", "city": "Moscow", "postalCode": "109012", "country": "Russian Federation" }, "coordinates": {"lat": 55.753391, "lng": 37.633956}, "categories": ["Restaurant"], "rating": 4.9, "reviewCount": 2744, "priceLevel": "Avg. bill: from 3000 ₽", "phone": "+7 (495) 784-68-58", "website": "https://rybamoya.ru/", "hours": [{"day": "daily", "hours": "12:00 PM–12:00 AM"}], "photos": ["https://avatars.mds.yandex.net/get-altay/5517598/2a0000017ebeb4da3c875…"], "attributes": [{"group": "Prices", "label": "average bill", "value": "3000–3500 ₽"}], "status": "closed", "lang": "en", "ext": { "subtitle": "Moscow, Slavyanskaya Square, 2", "ratingCount": 6132, "photoCount": 499, "openNow": "Closed until 12:00 PM", "metro": [{"name": "Kitay-Gorod", "distance": "35 m", "type": "metro", "color": "#8647b2"}], "stops": [{"name": "Метро Китай-город", "distance": "41 m", "type": "common"}], "ad": true, "verifiedOwner": true, "logo": "https://avatars.mds.yandex.net/get-altay/9720991/2a0000018853197f7fb60…", "socialLinks": [ { "type": "telegram", "href": "https://t.me/perelmanrestaurants", "readableHref": "@perelmanrestaurants" } ], "price": {"item": "Avg. bill", "from": 3000, "to": 3500, "currency": "₽"}, "popularTimes": { "monday": [0], "tuesday": [0], "wednesday": [0], "thursday": [0], "friday": [0], "saturday": [0], "sunday": [0] }, "menu": { "items": [ { "title": "Сашими из лосося", "description": "Тонко нарезанное филе подаём с маринованным имбирём. Дополняем соевым…", "price": 1190, "currency": "₽", "volume": "85 g", "image": "https://avatars.mds.yandex.net/get-eda/17780111/9bed7a6d1dc748758ccd6b…", "url": "https://eda.yandex/restaurant/ryba_moya_slavyanskaya_ploshhad_2", "category": "popular" } ], "total": 49, "kind": "food", "source": "Yango Deli", "updated": "2026-10-04T09:23:14Z" }, "advert": { "advertiser": "ООО \"СЫТОСТЬ\"", "advertiserTin": "7702407463", "products": [ { "title": "Рулетики из форели", "price": "1 690 р.", "priceValue": 1690, "currency": "RUB", "image": "https://avatars.mds.yandex.net/get-tycoon/18984817/2a0000019eab71c29be…", "url": "https://rybamoya.ru/?utm_source=yandex_business&utm_medium=branding_pr…" } ] }, "additionalAddress": "Рыба моя, этаж -1", "utcOffset": "+03:00", "entrances": [{"lat": 55.75341237, "lng": 37.63391087, "azimuth": 307.640383403427}], "panorama": "https://static-pano.maps.yandex.ru/v1/?panoid=1298236030_673226614_23_…", "goodPlaceYear": 2026, "unusualHours": ["2026-11-04"], "accessibilityPhotos": [ { "url": "https://avatars.mds.yandex.net/get-altay/4544819/2a00000178da7958d7963…", "tags": ["Entrance"], "width": 960, "height": 1280, "author": "Яндекс", "date": "2021-04-14T19:19:29Z" } ], "sources": [{"name": "Яндекс", "url": "ya.ru"}] } } } } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 404 | `NOT_FOUND` | The place does not exist. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call, plus $0.0012 for each extra call it makes — at most 3 more, so $0.0048 in total. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - Pass the place's `id` from `places` as `place`. --- # Naver > Naver web, news, image and video search, suggestions, and places on Naver Map with their reviews. Source: https://apinoa.com/en/docs-raw/api-reference/naver Naver web, news, image and video search, suggestions, and places on Naver Map with their reviews. **Markets:** `KR` ## Operations | Operation | Endpoint | Returns | Price | |---|---|---|---| | [Search](/docs/api-reference/naver/search) | `GET \| POST /v1/naver/search` | `ResultsPage` | $0.0012–$0.006 | | [Suggestions](/docs/api-reference/naver/suggestions) | `GET \| POST /v1/naver/suggestions` | `Suggestions` | $0.0012 | | [Places](/docs/api-reference/naver/places) | `GET \| POST /v1/naver/places` | `PlacesPage` | $0.0012 | | [Place](/docs/api-reference/naver/place) | `GET \| POST /v1/naver/place` | `Place` | $0.0012 | | [Reviews](/docs/api-reference/naver/reviews) | `GET \| POST /v1/naver/reviews` | `PlaceReviewsPage` | $0.0012–$0.012 | --- # Search > Get one Naver results page, with every block in page order. Source: https://apinoa.com/en/docs-raw/api-reference/naver/search ```http GET | POST /v1/naver/search ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl -G "https://gateway.apinoa.com/v1/naver/search" \ --data-urlencode "q=제주도 여행" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "제주도 여행" }); const res = await fetch(`https://gateway.apinoa.com/v1/naver/search?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/naver/search", params={"q": "제주도 여행"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `country` | enum | | The market, as an ISO 3166 country code. `KR` | | `cursor` | string | | The previous page's `cursor`. Pass it alone for the next page. | | `device` | enum | | Which page to read: the desktop (default) or the mobile one. `desktop` `mobile` | | `limit` | integer 1–100 | | Results wanted (default 10, at most 100). More than one page is charged per page. | | `q` | string | | The query, search operators included. | | `timeRange` | enum | | Only results from this past period. `hour` `day` `week` `month` `year` | | `type` | enum | | What to search: web results (default), news, images or videos. `web` `news` `images` `videos` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`ResultsPage`](/docs/api-reference/serp/response-schema#resultspage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "naver", "query": "제주도 여행", "type": "web", "outcome": "results", "country": "KR", "lang": "ko", "device": "desktop", "page": 1, "items": [ { "type": "ad", "block": "top", "url": "https://ader.naver.com/v1/DOP8VKF-E7rqPca3-poUhp4pweWQAlvUZZwUycnr9-2xt0UbNxa8IodbMJGVlZi9…", "title": "제주도여행 특가 티오 제주 제주도 패키지 할인 에어카텔 특가", "snippet": "조금더 알뜰한 제주도여행 , 주중/휴일 항공/숙소/렌트카 최대 90% 할인! 친절 상담, 재방문 & 만족도 100%", "advertiser": "티오제주", "displayUrl": "to-jeju.com", "sitelinks": [ { "url": "https://ader.naver.com/v1/uerU507GN-wSCmARZGbxsP3F2F-M9hqAaV2Ib8890xZxWQXM85HZzcAU9aK2WpB-…", "title": "할인 에어카텔 묶을수록 할인!" } ], "ext": {"website": "http://www.to-jeju.com"}, "rank": 1, "favicon": "https://search.pstatic.net/sunny?src=http%3A%2F%2Fwww.to-jeju.com%2Fimages%2Fsub%2F.ico&ty…", "thumbnail": "https://searchad-phinf.pstatic.net/MjAyNTA5MTFfMTM4/MDAxNzU3NTY5NjUwNTM1.blal_q1dejQFIGl3y…" }, { "type": "ad", "block": "top", "url": "https://ader.naver.com/v1/F7DJv8YXih9wRHC6FhzUzNyz1-d1S4by03DRrv-eqPQKAGworfoqKNKnemUSeHh0…", "title": "제주도여행 은 제주 바바 항공권부터 숙박, 렌트카까지", "snippet": "제주도여행 , 항공+숙박+렌터카를 묶어서 한번에 OK!, 인기상품 71%D/C 특급호텔 특가전, 렌트카 특가전, 에어카텔 특가전 진행중~", "advertiser": "제주바바", "displayUrl": "jejubaba.com", "sitelinks": [ { "url": "https://ader.naver.com/v1/3TGXu_rgID0OAciKBPdynQXwyu23cU1ndgubIwb6AW107JksMiIs2Rgwc3_YyekR…", "title": "톡톡 상담 제주여행문의하기" } ], "ext": {"website": "http://www.jejubaba.com", "services": ["네이버 톡톡"]}, "rank": 2, "favicon": "https://search.pstatic.net/sunny?src=https%3A%2F%2Fwww.jejubaba.com%2Ffavicon.ico&type=f30…", "thumbnail": "https://searchad-phinf.pstatic.net/MjAyNTExMDRfMTU3/MDAxNzYyMjIzMjQzMzAx.dCKVlNBV678yquqeK…" }, { "type": "other", "kind": "block", "title": "제주특별자치도", "text": "제주특별자치도 국내인기지역 icon Jeju 전체 여행콘텐츠 상품예약 코스추천 도시정보 더보기 더보기 섬 전체가 하나의 거대한 관광자원인 제주도. 에메랄드빛 물빛…", "links": [{"url": "https://travel.naver.com/domestic/14/summary", "title": "제주특별자치도"}], "rank": 11 }, { "type": "videoCarousel", "title": "네이버 클립", "items": [ { "url": "https://m.naver.com/shorts/?mediaType=VOD&recId=%7B%22query%22%3A%22%EC%A0%9C%EC%A3%BC%EB%…", "title": "26-1 제주갈치 충민정 #제주도 #제주도여행 #제주도맛집 #갈치구이...", "channel": "모든리뷰샵", "channelUrl": "https://clip.naver.com/@a11_mori", "date": "2026-10-28", "views": 133, "thumbnail": "https://search.pstatic.net/common/?src=https%3A%2F%2Fclip-service-phinf.pstatic.net%2FMjAy…", "video": "https://a02-g-smp-vod.akamaized.net/clip-home/c/read/v2/VOD_ALPHA/clip-home/81FA6BA6C0AA81…", "avatar": "https://search.pstatic.net/common/?src=https%3A%2F%2Fclip-service-phinf.pstatic.net%2FMjAy…", "certified": true, "badge": "clipGold" } ], "rank": 13 } ], "cursor": "2ghTTTaZIjcljKwKfuXUme91qVJQPyxJLxDjWRyTMP7iFkm-LMlIOTsFZYjkl8JaDZk0tKqHxE_ygoeSQSUrIl2mqn…", "fetchedAt": "2026-10-30T01:00:09.136Z" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call, plus $0.0012 for each extra call it makes — at most 4 more, so $0.006 in total. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. --- # Suggestions > Get what Naver's search box suggests for a query. Source: https://apinoa.com/en/docs-raw/api-reference/naver/suggestions ```http GET | POST /v1/naver/suggestions ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl -G "https://gateway.apinoa.com/v1/naver/suggestions" \ --data-urlencode "q=제주도" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "제주도" }); const res = await fetch(`https://gateway.apinoa.com/v1/naver/suggestions?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/naver/suggestions", params={"q": "제주도"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `q` | string | yes | The query, search operators included. | | `country` | enum | | The market, as an ISO 3166 country code. `KR` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`Suggestions`](/docs/api-reference/serp/response-schema#suggestions) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "naver", "query": "제주도", "country": "KR", "lang": "ko", "suggestions": [{"text": "제주도", "ext": {"codes": ["1"]}}, {"text": "제주도펜션"}], "ext": {"answers": [["24", "제주도"]]} } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. --- # Places > Find places on Naver's map. Source: https://apinoa.com/en/docs-raw/api-reference/naver/places ```http GET | POST /v1/naver/places ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl -G "https://gateway.apinoa.com/v1/naver/places" \ --data-urlencode "q=강남역 카페" \ --data-urlencode "limit=5" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "강남역 카페", limit: "5" }); const res = await fetch(`https://gateway.apinoa.com/v1/naver/places?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/naver/places", params={"q": "강남역 카페", "limit": "5"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `country` | enum | | The market, as an ISO 3166 country code. `KR` | | `cursor` | string | | The previous page's `cursor`. Pass it alone for the next page. | | `limit` | integer 1–100 | | Results wanted (default 20, at most 100). More than one page is charged per page. | | `location` | string | | Search as if from this point: `lat,lng`. | | `near` | string | | Search around this place name, or a `lat,lng` point. | | `q` | string | | The query, search operators included. | | `type` | enum | | The map's place list (the only one Naver has). `maps` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`PlacesPage`](/docs/api-reference/serp/response-schema#placespage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "naver", "query": "강남역 카페", "outcome": "results", "type": "maps", "country": "KR", "lang": "ko", "places": [ { "id": "1668757640", "name": "퍼스트커피랩 강남점", "url": "https://map.naver.com/p/entry/place/1668757640", "address": {"full": "서울특별시 강남구 역삼동 618-18 1층", "street": "봉은사로6길 39 1층", "city": "서울 강남구 역삼동"}, "coordinates": {"lat": 37.5026235, "lng": 127.0279481}, "categories": ["카페"], "rating": 4.93, "reviewCount": 3373, "phone": "0507-1315-7680", "photos": ["https://ldb-phinf.pstatic.net/20261002_202/1790915466684GML4H_JPEG/%C7%D2%B7%CE%C0%A9_%C4%…"], "attributes": [{"group": "편의", "label": "무선 인터넷"}], "ext": { "blogCafeReviewCount": 2137, "imageCount": 94, "businessCategory": "cafe", "reviewPhotos": ["https://pup-review-phinf.pstatic.net/MjAyNjEwMjZfMTE0/MDAxNzkyOTk4ODEzOTIy.n8na_ZsNgteAeDy…"], "microReview": "친절한 사장님과 함께하는 달콤한 시간", "hoursNote": "11:00에 영업 시작", "saves": "81,000+", "insights": [{"title": "주간 인기 많은 메뉴", "text": "아메리카노, 딸기 크로아상, 디카페인 아메리카노, 카페라떼, 딸기바스크"}], "coupons": [ { "title": "새벽1시종료 신입생20%할인 쿠폰", "type": "gift", "image": "https://ldb-phinf.pstatic.net/20260312_152/1773277281515vs5i0_JPEG/KakaoTalk_20260311_1707…" } ], "reviewSnippets": ["크로플, 크루아상, 휘낭시에, 마들렌 등 디저트메뉴가 다양해서 좋아요!"], "reviewPhotoAuthors": ["크리미2223"] }, "statusText": "영업 전" } ], "ext": { "ads": [ { "id": "1785877248", "name": "힉스커피", "url": "https://map.naver.com/p/entry/place/1785877248", "address": {"full": "강남대로110길 51 1층", "street": "강남대로110길 51 1층", "city": "서울 강남구 역삼동"}, "coordinates": {"lat": 37.5037312, "lng": 127.0291613}, "categories": ["카페"], "rating": 4.88, "reviewCount": 1515, "phone": "0507-1344-5290", "photos": ["https://searchad-phinf.pstatic.net/MjAyNjEwMjFfMjk2/MDAxNzkyNTUyODY0NDQ2.AsDZUIKK9k4BKet7r…"], "attributes": [{"group": "편의", "label": "포장"}], "ext": { "blogCafeReviewCount": 854, "imageCount": 9, "businessCategory": "cafe", "hasBooking": true, "hasNaverPay": true, "newOpening": false, "talktalkUrl": "http://talk.naver.com/wi0qzcz?frm=pnmb", "reviewPhotos": ["https://pup-review-phinf.pstatic.net/MjAyNjEwMDRfMTg0/MDAxNzkxMDgyMjU4Mjcy.Qsatj8LlE3aNz3H…"], "microReview": "행성 모양 무스케이크의 달콤한 유혹", "sponsored": true, "adDescription": "과학커뮤니케이터의 디저트 맛집", "adImages": ["https://searchad-phinf.pstatic.net/MjAyNjEwMjFfMjk2/MDAxNzkyNTUyODY0NDQ2.AsDZUIKK9k4BKet7r…"], "hoursNote": "11:00에 영업 시작", "saves": "29,000+", "wheelchairEntrance": true, "bookingUrl": "https://m.booking.naver.com/booking/6/bizes/1531167/search", "order": ["pickup"], "coupons": [ { "title": "고소한 아메리카노 1잔 쿠폰", "description": "알림받기한 고객님들께 드려요", "type": "gift", "image": "https://ldb-phinf.pstatic.net/20260926_146/1790407595573YnEoj_JPEG/%25C5%25B0%25BF%25C0%25…" } ], "reviewSnippets": ["무스케이크들 맛이 궁금해서왔다가 무한대소금빵 매력에 빠져서 재방문했어요! 커피와 잘어울려요"], "reviewPhotoAuthors": ["김보경9358"], "statusText": "영업 전" } } ] }, "page": {"index": 1, "size": 5, "total": 1686}, "cursor": "5mlNx2SbRdB5gDNIsQsjjXQvu2ynVsYwV21_uEGpID7vPRmDaiDsAvXFXIbpJmijFCfcPL4JJ8dPJb2fDlzPXmZDn2…", "fetchedAt": "2026-10-30T01:02:28.814Z" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - Search around a place name with `near`, or a point with `location` (`lat,lng`). --- # Place > Get one place's details from Naver. Source: https://apinoa.com/en/docs-raw/api-reference/naver/place ```http GET | POST /v1/naver/place ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/naver/place?id=1668757640" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ id: "1668757640" }); const res = await fetch(`https://gateway.apinoa.com/v1/naver/place?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/naver/place", params={"id": "1668757640"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `id` | string | | The place's id, as `places` returns it. | | `url` | string | | A Naver Map place URL. | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`Place`](/docs/api-reference/serp/response-schema#place) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "id": "1668757640", "name": "퍼스트커피랩 강남점", "url": "https://map.naver.com/p/entry/place/1668757640", "address": {"full": "서울 강남구 봉은사로6길 39 1층", "street": "서울 강남구 봉은사로6길 39 1층"}, "coordinates": {"lat": 37.5026235, "lng": 127.0279481}, "categories": ["카페"], "rating": 4.93, "reviewCount": 3373, "phone": "0507-1315-7680", "website": "https://www.instagram.com/firstcoffee_lab_gangnam", "hours": [{"day": "금", "hours": "11:00–01:00"}], "photos": ["https://ldb-phinf.pstatic.net/20261002_202/1790915466684GML4H_JPEG/%C7…"], "attributes": [{"group": "편의", "label": "무선 인터넷"}], "description": "미디어아트 카페 퍼스트커피랩 강남역점은 전문 바리스타 양성 기관인 [퍼스트 아카데미]에서 운영하는 특별한 카페로, 커피 애호가…", "lang": "ko", "ext": { "directions": "신논현역 6번 출구 도보 300m 입니다.\n주차구역은 따로 없으며\n가까운 주차장 ㅡ\n1. 강남 24시 주차장\n2. 벧엘 주차장…", "microReviews": ["친절한 사장님과 함께하는 달콤한 시간"], "blogCafeReviewCount": 2137, "textReviewCount": 3124, "menus": [{"name": "에스프레소", "price": {"priceType": "fixed", "displayText": "6,500원"}}], "subway": [ { "name": "신분당", "line": "신논현역 신분당선", "station": "신논현역", "exit": "6", "walkMinutes": 6, "walkMeters": 321, "coordinates": {"lat": 37.503932, "lng": 127.0247661}, "transfers": ["9호선"] } ], "reviewKeywords": [{"name": "디저트가 맛있어요", "count": 2812}], "reviewMenus": [{"name": "커피", "count": 770}], "reviewThemes": [{"name": "만족도", "count": 2307}], "reviewStats": { "ratedReviews": 197, "reviewers": 985, "photoReviews": 2890, "keywordVotes": 14201, "keywordVoters": 3146, "keywordReviews": 3351 }, "topPhotos": [ { "url": "https://ldb-phinf.pstatic.net/20261002_202/1790915466684GML4H_JPEG/%C7…", "category": "퍼스트커피랩 강남점", "format": "image", "source": "business", "width": 1254, "height": 1254 } ], "totalPhotos": 94, "phoneInfo": { "phone": "0507-1315-7680", "isVirtualPhone": true, "isPrivatePhone": false, "hasMobilePhoneNumber": false }, "houseBanners": [ { "id": "https://maps-service.pstatic.net/maps-cms/568f3214-4368-46cc-9ce1-61c1…", "slotIndex": 1, "imageUrl": "https://maps-service.pstatic.net/maps-cms/568f3214-4368-46cc-9ce1-61c1…", "linkUrl": "https://booking.map.naver.com/promotions/home", "bgColor": "#176CFF", "altText": "놓치면 아까운 혜택! 네이버지도에서 예약하세요. " } ], "accessor": {"hasAccessor": true}, "buttons": [{"key": "streetview", "name": "거리뷰"}], "badge": [{"key": "placePlus", "text": "place+"}], "menuImages": [{"imageUrl": "https://ldb-phinf.pstatic.net/20241111_227/1731306011538aSgKQ_PNG/2024…"}], "naverBooking": {"bookingDisplayName": "방문", "bookingButtonName": "예약", "hasSmartOrder": false}, "relatedLinks": [ { "name": "식신", "iconName": "siksin", "url": "https://www.siksinhot.com/P/1557066", "clickCode": "siksin" } ], "fsasReviews": { "total": 2139, "items": [ { "name": "뽀샤시 뽀샤시~~♥", "type": "blog", "typeName": "블로그", "url": "https://m.blog.naver.com/qhtitl1220/224444895153", "home": "https://m.blog.naver.com/qhtitl1220", "id": "blog_뽀샤시 뽀샤시~~♥_224444895153_강남역베이커리카페 퍼스트커피랩 강남점에서 데이트!", "title": "강남역베이커리카페 퍼스트커피랩 강남점에서 데이트!", "rank": "1", "contents": "베프랑 점심을 먹고 카페 데이트 하러 오랫만에 강남역 퍼스트커피랩에 들렀답니다. 카페 외관은 화이트 건물의 깔끔한 외관이랍니다…", "thumbnailUrl": "http://blogfiles.naver.net/MjAyNjEwMTdfMTU0/MDAxNzkyMjM3NjQ1MDE3.d_axC…", "thumbnailUrlList": ["http://blogfiles.naver.net/MjAyNjEwMTdfMTU0/MDAxNzkyMjM3NjQ1MDE3.d_axC…"], "thumbnailCount": "30", "date": "2026.10.17.", "isRepresentative": false, "profileImageUrl": "https://blogpfthumb-phinf.pstatic.net/MjAyMzAyMjVfNDIg/MDAxNjc3MzEyOTA…", "isVideoThumbnail": false, "reviewId": "224444895153", "authorName": "뽀샤시", "createdString": "10.17.토", "buyWithMyMoneyType": true } ] }, "busStations": [ { "id": "106166", "name": "신논현역6번출구", "displayCode": "23286", "lat": 37.5023804, "lng": 127.025829, "innerRoutes": {"routeType": [{"type": "12", "typeName": "지선"}]}, "walkTime": 5, "walkingDistance": 328 } ], "hasCoupon": {"count": 1}, "hasFeed": {"blogExist": false, "feedExist": true}, "shopWindow": { "total": 0, "homepages": { "repr": { "url": "https://www.instagram.com/firstcoffee_lab_gangnam", "landingUrl": "https://www.instagram.com/firstcoffee_lab_gangnam", "isDeadUrl": false, "type": "인스타그램", "order": 0 } } }, "restaurantInfoTabDetails": {"seat": [{"id": "301", "name": "룸", "description": "300명 이하"}]}, "businessTools": { "tools": [ { "type": "smartOrder", "title": "네이버 주문", "description": "매장 내 주문부터 포장주문까지 편하게", "link": "https://new.smartplace.naver.com/bizes/place/1668757640/solutions/orde…", "using": false } ], "hideAnnouncement": false }, "informationTab": {"facilities": [{"id": "7", "name": "무선 인터넷", "i18nName": "무선 인터넷"}], "keywordList": ["강남역디저트"]}, "festivalPerformance": {"festivalsTotal": 0, "performancesTotal": 0}, "POS": { "isPOS": true, "salesCount": 7007, "popularMenus": [{"name": "아메리카노", "count": 550, "orderShare": 21, "rankChange": "SAME"}], "averagePrice": {"morning": 16308, "lunch": 17716, "dinner": 17304, "night": 17133, "total": 17426}, "popularDay": "saturday", "weeklyPopularity": { "monday": {"popularity": [0], "popularTime": 14}, "tuesday": {"popularity": [0], "popularTime": 12}, "wednesday": {"popularity": [0], "popularTime": 20}, "thursday": {"popularity": [0], "popularTime": 20}, "friday": {"popularity": [0], "popularTime": 20}, "saturday": {"popularity": [0], "popularTime": 14}, "sunday": {"popularity": [0], "popularTime": 14} }, "today": "friday" }, "tabs": [{"tabId": "home", "name": "홈"}], "exp": {"total": 0}, "staticMapUrl": "https://simg.pstatic.net/static.map/v2/map/staticmap.bin?center=127.02…", "isRelaxRestaurant": false, "isStarbucks": false, "is100YearCertified": false, "is100YearSmallManufacturer": false, "isNFASafetyCertified": false, "isAntiqueStore": false, "newOpening": false, "visitorReviewMediasTotal": 8388, "isKoreaGrandSale": false, "hasAroundItems": false, "hasAiBriefing": true, "acceptsCultureDeductionCoupon": false, "topAnimatedPhotos": {"total": 0} }, "statusText": "11:00에 영업 시작", "lotAddress": "서울 강남구 역삼동 618-18" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 404 | `NOT_FOUND` | The place does not exist. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - Pass `id` from `places`, or the place's map link as `url`. --- # Reviews > Get a place's reviews from Naver. Source: https://apinoa.com/en/docs-raw/api-reference/naver/reviews ```http GET | POST /v1/naver/reviews ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/naver/reviews?place=1668757640&limit=5" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ place: "1668757640", limit: "5" }); const res = await fetch(`https://gateway.apinoa.com/v1/naver/reviews?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/naver/reviews", params={"place": "1668757640", "limit": "5"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `cursor` | string | | The previous page's `cursor`. Pass it alone for the next page. | | `limit` | integer 1–100 | | Results wanted (default 10, at most 100). More than one page is charged per page. | | `place` | string | | The place's id, as `places` returns it. | | `sort` | enum | | Review order: Naver's recommended order (default) or newest first. `relevant` `newest` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`PlaceReviewsPage`](/docs/api-reference/serp/response-schema#placereviewspage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "naver", "placeId": "1668757640", "summary": { "average": 4.93, "count": 3373, "distribution": { "1": 0.1, "2": 0.1, "3": 0.19, "4": 1.56, "5": 89.69, "0.5": 0.1, "1.5": 0, "2.5": 0.1, "3.5": 0, "4.5": 8.17 } }, "starCounts": {"1": 1, "2": 1, "3": 2, "4": 16, "5": 922, "0.5": 1, "1.5": 0, "2.5": 1, "3.5": 0, "4.5": 84}, "sort": "relevant", "page": {"index": 1, "size": 10, "total": 3196}, "reviews": [ { "id": "6ad5f2011ddd71d9033b9ecc", "rating": 5, "body": "강남역 최애 카페 퍼스트커피랩 🥹🤍🤍 메뉴 하나하나 다 너무 맛있고 진짜 사장님 너무 천사 같이 친절하셔서 갈 때마다 너무 행복해요☺️ 바스크치즈케이크 진짜 식감 맛 다 예술이고 블루웨이브 티라미수 비주얼 너무 이뻐요.. 공간도 넓고 사진 찍을 곳도 많고 대화하기도 좋아요 ㅎㅎ🤍🤤 마들…", "author": "1o24", "authorId": "~1~_kHuOa82G3PPNPObGoskVg", "authorUrl": "https://m.place.naver.com/my/5dff10568f87a842bc63ad7c/review?v=2", "date": "2026-10-19", "images": [ "https://pup-review-phinf.pstatic.net/MjAyNjEwMTlfMjcy/MDAxNzkyNDA2MDA4MDA3.J-TlhgD_PPK3cAAcuxSoIilWXIss8qdENpkTiYujJkIg.YTphIBdaNTCWWhQ-Qm4nHyLlK4wAne3FLQplAW3k…", "https://pup-review-phinf.pstatic.net/MjAyNjEwMTlfNTAg/MDAxNzkyNDA2MDA3NjIy.znvSZCXRXziK0ft3wMUcLfFP0dzOlms0vG66a0CxNrUg.scQ5nMui-K35WCdKgO4t36xninZu108CzLtFbWkP…" ], "reply": { "body": "안녕하세요! 퍼스트커피랩 강남점을 이렇게 사랑해주셔서 정말 감사드려요 💖 메뉴마다 칭찬해주시니 기쁘네요~ 바스크치즈케이크의 풍미와 블루웨이브 티라미수의 아름다움까지 알아봐주셔서 뿌듯해요 😊 마들렌과 디저트들도 좋아해주셔서 더 열심히 준비해야겠어요! 넓은 공간에서 편안히 머물러주셔서 고맙…", "date": "2026-10-19", "author": "퍼스트커피랩 강남점" }, "ext": { "reviewId": "6ad5f2011ddd71d9033b9eed", "visited": "10.19.월", "visitCount": 2, "views": 4360, "keywords": ["커피가 맛있어요"], "visit": [{"keywords": ["예약 없이 이용"]}], "reactions": 0, "reviewer": {"reviews": 1238, "photos": 1936, "followers": "37", "avgRating": 4.9}, "item": "딸기바스크", "origin": "영수증", "receipt": true } }, { "id": "6ae1c72cd51bbeaa57e888ee", "rating": 5, "body": "말차바스트케익은 꼭 먹어야해요,, ㄷㄷ 진짜 입에서 말차 꾸덕함이 녹음,, 샤인머스켓 크로플도 바삭하고 휘낭시에도 신기한게많아여 ㅠㅡㅠ 브림브륄레 아인슈페너 마셧는데 달달하면서 고소한게 풍미가 가득합니당,, 인테리어도 너무 이쁘고 외국인 친구들도 조아할곳,, 부모님이랑 오기에도 너무 분…", "author": "취미가리뷰하기", "authorId": "~1~Han7x8zguEVEB5arpwKeKA", "authorUrl": "https://m.place.naver.com/my/5f06da40848333b0d5c0909d/review?v=2", "date": "2026-10-28", "images": [ "https://pup-review-phinf.pstatic.net/MjAyNjEwMjhfMTcy/MDAxNzkzMTgxNDc1MTUw.fmEdZsNjMcs08nLkR2TGU-qp9MwOKOmN3BbAvKsZVLkg.AWLvp3vZ4vinF2lZlyxSnNpUu6Q4Ofw-9dximJw2…", "https://pup-review-phinf.pstatic.net/MjAyNjEwMjhfMTkz/MDAxNzkzMTgxNDc1Nzc2.pOgr35bySsdawTRGPrIauEca9f92AiBrxUo3OVFXalEg.plOQJL_7azooMeIGBqN6WgagH8wYruzthaQeYIUP…" ], "ext": { "reviewId": "6ae1c72cd51bbeaa57e888fd", "visited": "10.28.수", "visitCount": 1, "views": 499, "keywords": ["디저트가 맛있어요"], "visit": [{"keywords": ["예약 없이 이용"]}], "reactions": 0, "reviewer": {"reviews": 574, "photos": 2425, "followers": "60", "avgRating": 4.9}, "item": "크로아", "origin": "영수증", "receipt": true } } ], "cursor": "70w3ND789lci5FNhDAX0y1ck7vAblyM3-FloIMWBrGJuij5dLjqRn0WYldmFKIOo3lkhrmOtA88OPlM3z1zMtQMXnDVPAILHzn-0Dw63u1j-twnSdY98L775bzVZt0vaHaWe7gJ8N0o2GPZSU6InxddThes5Z4JV…", "fetchedAt": "2026-10-30T01:02:31.396Z" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 404 | `NOT_FOUND` | The place does not exist. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call, plus $0.0012 for each extra call it makes — at most 9 more, so $0.012 in total. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - Pass the place's `id` from `places` as `place`. - Naver visitors often leave keywords instead of stars, so a review's `rating` may be absent. It is never `0`. --- # Daum > Daum web, news, image and video search, and suggestions. Source: https://apinoa.com/en/docs-raw/api-reference/daum Daum web, news, image and video search, and suggestions. **Markets:** `KR` ## Operations | Operation | Endpoint | Returns | Price | |---|---|---|---| | [Search](/docs/api-reference/daum/search) | `GET \| POST /v1/daum/search` | `ResultsPage` | $0.0012–$0.006 | | [Suggestions](/docs/api-reference/daum/suggestions) | `GET \| POST /v1/daum/suggestions` | `Suggestions` | $0.0012 | --- # Search > Get one Daum results page, with every block in page order. Source: https://apinoa.com/en/docs-raw/api-reference/daum/search ```http GET | POST /v1/daum/search ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl -G "https://gateway.apinoa.com/v1/daum/search" \ --data-urlencode "q=제주도 여행" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "제주도 여행" }); const res = await fetch(`https://gateway.apinoa.com/v1/daum/search?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/daum/search", params={"q": "제주도 여행"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `country` | enum | | The market, as an ISO 3166 country code. `KR` | | `cursor` | string | | The previous page's `cursor`. Pass it alone for the next page. | | `device` | enum | | Which page to read: the desktop (default) or the mobile one. `desktop` `mobile` | | `limit` | integer 1–240 | | Results wanted (default 10, at most 240). More than one page is charged per page. | | `q` | string | | The query, search operators included. | | `timeRange` | enum | | Only results from this past period. `hour` `day` `week` `month` `year` | | `type` | enum | | What to search: web results (default), news, images or videos. `web` `news` `images` `videos` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`ResultsPage`](/docs/api-reference/serp/response-schema#resultspage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "daum", "query": "제주도 여행", "type": "web", "country": "KR", "device": "desktop", "fetchedAt": "2026-10-30T00:57:47.292Z", "outcome": "results", "page": 1, "items": [ {"type": "relatedSearches", "rank": 1, "queries": ["제주도 여행코스 3박4일", "제주도 여행코스 2박3일"]}, { "type": "other", "rank": 2, "kind": "n0dl", "title": "바로가기", "links": [ {"url": "https://www.visitjeju.net/", "title": "VISIT JEJU"}, {"url": "https://www.visitjeju.net/", "title": "www.visitjeju.net/"} ], "ext": { "items": [{"text": "공식 제주관광 페이지. 제주특별자치도 제주시 선덕로 위치. 비짓제주, 제주관광공사 운영, 관광정보, 테마여행, 관광지도, 축제, 이벤트 안내."}] } }, { "type": "ad", "rank": 3, "block": "top", "url": "http://jejugotour.com/", "title": "제주여행 특가, 제주고투어", "snippet": "제주로 떠나는 여행의 첫걸음! 제주여행의 모든상품을 회원가입없이 간편하게 예약~", "advertiser": "제주고투어", "displayUrl": "jejugotour.com", "ext": {"highlights": ["즐거운제주여행 제주고투어"]}, "thumbnail": "https://search1.daumcdn.net/thumb/R174x174/?fname=https%3A%2F%2Fsearchad-phinf.pstatic.net%2FMjAyNDExMDFfODcg%…" }, { "type": "organic", "rank": 20, "position": 1, "url": "https://search.daum.net/search?w=tot&q=%EB%A7%88%EB%9D%BC%EB%8F%84&ency=sq%3D%EC%A0%9C%EC%A3%BC%EB%8F%84%20%EA…", "title": "마라도", "thumbnail": "thumb_noimg" }, { "type": "videoCarousel", "rank": 27, "title": "동영상", "items": [ { "url": "http://www.youtube.com/watch?v=iB9YgNvjJKY", "title": "제주도 여행 중 갑자기 \"해병대\" 연락이 왔습니다", "source": "Youtube", "channel": "무적권", "date": "2026-10-03", "durationSec": 1089, "thumbnail": "https://search1.kakaocdn.net/thumb/C400x226.q80/?fname=https%3A%2F%2Fsearch3.kakaocdn.net%2Fargon%2F656x0_80_w…", "ext": { "id": "youtb-iB9YgNvjJKY", "channelUrl": "http://www.youtube.com/channel/UCf5CAIf1sxxHFmzkX1mBFkA", "channelLogo": "https://search4.kakaocdn.net/argon/100x100_85_c/2SWQg2pxPt1" } }, { "url": "http://www.youtube.com/watch?v=z7gp570hIjg", "title": "자율주행차로 운전없이 편하게 제주도 여행해보기🚘", "source": "Youtube", "channel": "독고독채널", "date": "2026-10-08", "durationSec": 85, "thumbnail": "https://search1.kakaocdn.net/thumb/C400x226.q80/?fname=https%3A%2F%2Fsearch4.kakaocdn.net%2Fargon%2F656x0_80_w…", "ext": { "id": "youtb-z7gp570hIjg", "channelUrl": "http://www.youtube.com/channel/UCEUSANZNPXY1JsBoqhQIgxQ", "channelLogo": "https://search3.kakaocdn.net/argon/100x100_85_c/C4U7oN550Yb" } } ] } ], "cursor": "ybYbhVVm79YKJx6vHiX_c-G3tqmV4jASE6HrzroTVkS29MShQC00J7Rjt-IrN882dFRLeRXlWbid13Go4WJ_vSojZDGPGjThbn2CsWatigEFO1…" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call, plus $0.0012 for each extra call it makes — at most 4 more, so $0.006 in total. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. --- # Suggestions > Get what Daum's search box suggests for a query. Source: https://apinoa.com/en/docs-raw/api-reference/daum/suggestions ```http GET | POST /v1/daum/suggestions ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl -G "https://gateway.apinoa.com/v1/daum/suggestions" \ --data-urlencode "q=제주도" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "제주도" }); const res = await fetch(`https://gateway.apinoa.com/v1/daum/suggestions?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/daum/suggestions", params={"q": "제주도"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `q` | string | yes | The query, search operators included. | | `country` | enum | | The market, as an ISO 3166 country code. `KR` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`Suggestions`](/docs/api-reference/serp/response-schema#suggestions) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "daum", "query": "제주도", "country": "KR", "suggestions": [{"text": "제주도 날씨", "ext": {"highlighted": [[0]]}}, {"text": "제주도", "ext": {"highlighted": [[0]]}}] } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. --- # Baidu > Baidu web, news, image and video search, reverse-image search, and suggestions. Source: https://apinoa.com/en/docs-raw/api-reference/baidu Baidu web, news, image and video search, reverse-image search, and suggestions. **Markets:** `CN` ## Operations | Operation | Endpoint | Returns | Price | |---|---|---|---| | [Search](/docs/api-reference/baidu/search) | `GET \| POST /v1/baidu/search` | `ResultsPage` | $0.0012–$0.006 | | [Suggestions](/docs/api-reference/baidu/suggestions) | `GET \| POST /v1/baidu/suggestions` | `Suggestions` | $0.0012 | --- # Search > Get one Baidu results page, with every block in page order. Source: https://apinoa.com/en/docs-raw/api-reference/baidu/search ```http GET | POST /v1/baidu/search ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl -G "https://gateway.apinoa.com/v1/baidu/search" \ --data-urlencode "q=人工智能" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "人工智能" }); const res = await fetch(`https://gateway.apinoa.com/v1/baidu/search?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/baidu/search", params={"q": "人工智能"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `country` | enum | | The market, as an ISO 3166 country code. `CN` | | `cursor` | string | | The previous page's `cursor`. Pass it alone for the next page. | | `image` | string | | An image URL: a reverse-image search instead of `q` (`type=image`). | | `limit` | integer 1–50 | | Results wanted (default 10, at most 50). More than one page is charged per page. | | `q` | string | | The query, search operators included. | | `timeRange` | enum | | Only results from this past period. `hour` `day` `week` `month` `year` | | `type` | enum | | What to search: web results (default), news, images, videos or `image` for a reverse-image search. `web` `news` `images` `videos` `image` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`ResultsPage`](/docs/api-reference/serp/response-schema#resultspage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "baidu", "query": "人工智能", "type": "web", "outcome": "results", "country": "CN", "device": "desktop", "page": 1, "items": [ { "type": "ad", "rank": 1, "block": "top", "url": "https://www.extremevision.com.cn/marketplace/?source=baidu&plan=PC-tongyongci-2&unit=2%E3%80%90tongyongci%E3%80%91shijueshibie&keyword=rengongzhinengaishijue&e_…", "title": "人工智能ai视觉-专注AI视觉算法解决方案!", "snippet": "人工智能ai视觉 找极视角,全球开创AI视觉算法商城,15000+成熟算法,准确率超90%,全新算法定制仅需8-12周!服务超过3000+企业,.. 应用方案: 图像识别 视频分析 深度学习 视觉语言大模型 更多 多快好省 去看看 多快好省 1500+成熟算法 精准度≥90% 去看看 精准度≥90% 100+行业覆盖…", "advertiser": "极视角科技", "displayUrl": "extremevision.com.cn", "ext": {"company": "山东极视角科技股份有限公司", "searches": ["ai+人工智能", "ai智能体"]}, "thumbnail": "https://ms.bdimg.com/pacific/0/pic/1494046521_-833442663.jpg?x=0&y=0&h=340&w=510&vh=340.00&vw=510.00&oh=340.00&ow=510.00" }, { "type": "ad", "rank": 2, "block": "top", "url": "https://www.workbuddy.cn/?fromSource=gwzcw.12411645.12411645.12411645&utm_medium=cpc&utm_id=gwzcw.12411645.12411645.12411645", "title": "腾讯WorkBuddy,免部署安装即用,一分钟直连IM", "snippet": "WorkBuddy 官方版 版本:4.24.0 系统:win/mac 大小:447MB AI 专家团 全场景办公 一键下载 双11大促", "advertiser": "WorkBuddy", "displayUrl": "workbuddy.cn", "ext": {"company": "腾讯云计算(北京)有限责任公司", "searches": ["ai+人工智能", "ai智能体"]}, "thumbnail": "https://t7.baidu.com/it/u=2722534176,2919570617&fm=74&app=80&size=f256,256&n=0&f=JPEG&fmt=auto?s=0BA7572257727B8010765A410300C0FE&sec=1779901200&t=45b76cd0194fa…" }, { "type": "knowledgePanel", "rank": 3, "title": "人工智能 - 百度百科", "subtitle": "智能科学与技术专业术语", "description": "简介:人工智能(Artificial Intelligence,缩写AI)是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新技术科学,是计算机科学的一个分支。它企图了解智能的实质,生产出能以人类智能相似方式做出反应的智能机器,该领域的研究包括机器人、语言识别、图像识别、自然语言处理和专家系统等…", "source": {"url": "https://baike.baidu.com/item/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/9180", "title": "百度百科"}, "images": [ "https://gimg3.baidu.com/topone/src=https%3A%2F%2Fbkimg.cdn.bcebos.com%2Fsmart%2Ffaedab64034f78f0f736f375f8661d55b319eac4b6a4-bkimg-process%2Cv_1%2Crw_1%2Crh_1%2…" ], "links": [ { "url": "https://baike.baidu.com/item/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/9180?anchor=1#1", "title": "定义详解" }, { "url": "https://baike.baidu.com/item/%E4%BA%BA%E5%B7%A5%E6%99%BA%E8%83%BD/9180?anchor=2#2", "title": "研究价值" } ] }, { "type": "other", "rank": 4, "kind": "jy_xueshu_journal_atom", "title": "人工智能 - 官方网站", "text": "人工智能 - 官方网站 官方 数据库收录: RCCSE,知网,万方,维普 ISSN: 2096-5036 简介: 《人工智能》由工业和信息化部主管,中国电子信息产业发展研究院、赛迪工业和信息化研究院(集团)有限公司主办 在线投稿 期刊相关论文 期刊合作 百度学术", "links": [ { "url": "http://www.baidu.com/link?url=yuMYqxNOu_ZAExp-TZx5YK_c-u8IOQC1ICsaYiO3fHRlTM3Q8K5zJ-kYNdkgsKOap7RdrEM6O6b5nUxWqhI_10yOU-z1V_-5l5zSYTYTFn3", "title": "人工智能 - 官方网站" }, {"url": "http://trust.baidu.com/vstar/official/intro", "title": "官方"} ] }, {"type": "relatedSearches", "rank": 9, "queries": ["ai培训班一般培训什么", "AI"]}, { "type": "organic", "rank": 10, "position": 1, "url": "https://www.sjchess.com/detail/241059.html", "title": "《人工智能》电影免费在线观看-高清完整版-天堂电影网", "snippet": "《人工智能》电影免费在线观看-高清完整版-天堂电影网 人工智能", "site": "www.sjchess.com/detail/2...", "displayUrl": "sjchess.com", "thumbnail": "https://gips1.baidu.com/it/u=1200376025,2806358308&fm=3026&app=3026&size=re3,2&q=75&n=0&g=4n&f=JPEG&fmt=auto&maxorilen2heic=2000000?s=5231E16867BDBA7D12D9010A01…" } ], "cursor": "a5fMX1ZbYCOfkMZQz0KPY1nAb5M7pflrC0UxYf9Kv8IqfmVVd0u6fEO96EZVg_krOi_UAejM95p-tMIxWUbGslOXPZ4ncH_lDT9hYTmLTtcW2zeLCRe4vr3kLtOWY_EC37N-GK_9MUrl-xOOzXX2RCPPGg", "fetchedAt": "2026-10-30T00:57:31.973Z" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call, plus $0.0012 for each extra call it makes — at most 4 more, so $0.006 in total. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - `type=image` with an `image` URL instead of `q` runs a reverse-image search. - `limit` above one page reads further pages, one unit each. --- # Suggestions > Get what Baidu's search box suggests for a query. Source: https://apinoa.com/en/docs-raw/api-reference/baidu/suggestions ```http GET | POST /v1/baidu/suggestions ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl -G "https://gateway.apinoa.com/v1/baidu/suggestions" \ --data-urlencode "q=人工智能" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "人工智能" }); const res = await fetch(`https://gateway.apinoa.com/v1/baidu/suggestions?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/baidu/suggestions", params={"q": "人工智能"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `q` | string | yes | The query, search operators included. | | `country` | enum | | The market, as an ISO 3166 country code. `CN` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`Suggestions`](/docs/api-reference/serp/response-schema#suggestions) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": {"engine": "baidu", "query": "人工智能", "suggestions": [{"text": "人工智能训练师"}, {"text": "人工智能是什么意思"}]} } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. --- # Sogou > Sogou web, news, image and video search, and suggestions. Source: https://apinoa.com/en/docs-raw/api-reference/sogou Sogou web, news, image and video search, and suggestions. **Markets:** `CN` ## Operations | Operation | Endpoint | Returns | Price | |---|---|---|---| | [Search](/docs/api-reference/sogou/search) | `GET \| POST /v1/sogou/search` | `ResultsPage` | $0.0012–$0.012 | | [Suggestions](/docs/api-reference/sogou/suggestions) | `GET \| POST /v1/sogou/suggestions` | `Suggestions` | $0.0012 | --- # Search > Get one Sogou results page, with every block in page order. Source: https://apinoa.com/en/docs-raw/api-reference/sogou/search ```http GET | POST /v1/sogou/search ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl -G "https://gateway.apinoa.com/v1/sogou/search" \ --data-urlencode "q=人工智能" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "人工智能" }); const res = await fetch(`https://gateway.apinoa.com/v1/sogou/search?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/sogou/search", params={"q": "人工智能"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `country` | enum | | The market, as an ISO 3166 country code. `CN` | | `cursor` | string | | The previous page's `cursor`. Pass it alone for the next page. | | `device` | enum | | The page each tab is served as, and the only value it takes: mobile for web and news, desktop for images and videos. `desktop` `mobile` | | `limit` | integer 1–100 | | Results wanted (default one page: 7-10 on web, 10 news, 48 images; at most 100). More than one page is charged per page. | | `q` | string | | The query, search operators included. | | `timeRange` | enum | | Only results from this past period. `hour` `day` `week` `month` `year` | | `type` | enum | | What to search: web results (default), news, images or videos. `web` `news` `images` `videos` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`ResultsPage`](/docs/api-reference/serp/response-schema#resultspage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "sogou", "query": "人工智能", "type": "web", "outcome": "results", "country": "CN", "device": "mobile", "totalResults": 100000000, "page": 1, "items": [ { "type": "ad", "block": "top", "url": "https://aistudy.baidu.com/site/wjzsorv8/b361addc-ae0f-4175-9c6c-5549fbbe4be4?q=%E7%BD%91%E…", "title": "免费ai大模型有哪些_零成本工具清单,按场景分类查", "snippet": "费用与使用门槛提前列明,官网入口可核对,选择前多对比少走弯路更安心", "advertiser": "百度知了爱学", "displayUrl": "aistudy.baidu.com", "ext": { "imageLabels": ["测试"], "logo": "https://pgdt.gtimg.cn/141/20204/snscosdownload/SZ/reserved/6ad0da310005e2c92977328b19fd011…", "button": "查看详情", "tags": ["官方"], "keywords": ["人工智能ai大模型"], "interest": "最近11小时前有人关注此内容", "interestCount": 510, "sublinks": [{"title": "人工智能制造"}], "testimonials": ["服务很周到,让我有更多时间享受生活!"] }, "rank": 1, "thumbnail": "https://wxsnsencsvp.wxs.qq.com/141/20204/snscosdownload/SZ/reserved/6xykWLEnztKKZvntY76xvN…" }, { "type": "ad", "block": "top", "url": "https://aistudy.baidu.com/site/wjzsorv8/b361addc-ae0f-4175-9c6c-5549fbbe4be4?q=%E7%B3%BB%E…", "title": "人工智能", "snippet": "人工智能", "advertiser": "百度知了爱学", "displayUrl": "aistudy.baidu.com", "ext": { "imageLabels": ["人工智能,数学"], "logo": "https://pgdt.gtimg.cn/141/20204/snscosdownload/SZ/reserved/6ad0da310005e2c92977328b19fd011…", "button": "查看详情", "tags": ["官方"], "keywords": ["人工智能ai系统"], "interest": "最近11小时前有人关注此内容", "interestCount": 248, "testimonials": ["每一次服务都让我感觉物超所值!"], "questions": ["AI人工智能软件如何选购?"] }, "rank": 2, "thumbnail": "https://wxsnsencsvp.wxs.qq.com/141/20204/snscosdownload/SH/reserved/6xykWLEnztI4eFfyQP9ecv…" }, { "type": "knowledgePanel", "title": "人工智能 对比", "subtitle": "本科 工学学士 四年", "facts": [{"label": "开设课程", "value": "高等数学 、 线性代数 、概率和数理统计、 认知心理学 、认知机器人、一门计算机语言(Java/C++/Python 之类)和算法。"}], "images": ["https://dlweb.sogoucdn.com/shicivideo/31ecb9d2643db678bf436c586e6a535c1651718648.jpg"], "ext": { "sections": [ { "title": "开设院校", "url": "https://m.sogou.com/openapi/h5/gaokao/major/school?from=vr_zhuanye&major=%E4%BA%BA%E5%B7%A…" } ], "moreUrl": "https://m.sogou.com/openapi/h5/gaokao/major/related?from=vr_zhuanye&major=%E4%BA%BA%E5%B7%…" }, "rank": 4 }, { "type": "relatedSearches", "queries": ["人工智能ai在线观看完整版"], "ext": {"placement": "middle"}, "rank": 5, "title": "大家还在搜" } ], "cursor": "yJjoAIqJfHYhsL0toVa2iOz_e0XBPQzb5lV4UBcINkLysJnJGJlz_I2yQ1Z-6K0-c5FcCb0cXSlQPANCA_ipAPUyuy…", "fetchedAt": "2026-10-30T00:57:54.651Z" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call, plus $0.0012 for each extra call it makes — at most 9 more, so $0.012 in total. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - `device` takes only the page each tab is served as: `mobile` for web and news, `desktop` for images and videos. - `limit` above one page reads further pages, one unit each. --- # Suggestions > Get what Sogou's search box suggests for a query. Source: https://apinoa.com/en/docs-raw/api-reference/sogou/suggestions ```http GET | POST /v1/sogou/suggestions ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl -G "https://gateway.apinoa.com/v1/sogou/suggestions" \ --data-urlencode "q=人工智能" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "人工智能" }); const res = await fetch(`https://gateway.apinoa.com/v1/sogou/suggestions?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/sogou/suggestions", params={"q": "人工智能"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `q` | string | yes | The query, search operators included. | | `country` | enum | | The market, as an ISO 3166 country code. `CN` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`Suggestions`](/docs/api-reference/serp/response-schema#suggestions) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "sogou", "query": "人工智能", "country": "CN", "suggestions": [{"text": "人工智能"}, {"text": "人工智能的基本概念"}] } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. --- # Yahoo! JAPAN > Yahoo! JAPAN web, news, image and video search, and suggestions. Source: https://apinoa.com/en/docs-raw/api-reference/yahoo-japan Yahoo! JAPAN web, news, image and video search, and suggestions. **Markets:** `JP` ## Operations | Operation | Endpoint | Returns | Price | |---|---|---|---| | [Search](/docs/api-reference/yahoo-japan/search) | `GET \| POST /v1/yahoo-japan/search` | `ResultsPage` | $0.0012–$0.012 | | [Suggestions](/docs/api-reference/yahoo-japan/suggestions) | `GET \| POST /v1/yahoo-japan/suggestions` | `Suggestions` | $0.0012 | --- # Search > Get one Yahoo! JAPAN results page, with every block in page order. Source: https://apinoa.com/en/docs-raw/api-reference/yahoo-japan/search ```http GET | POST /v1/yahoo-japan/search ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl -G "https://gateway.apinoa.com/v1/yahoo-japan/search" \ --data-urlencode "q=東京 ラーメン" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "東京 ラーメン" }); const res = await fetch(`https://gateway.apinoa.com/v1/yahoo-japan/search?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/yahoo-japan/search", params={"q": "東京 ラーメン"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `country` | enum | | The market, as an ISO 3166 country code. `JP` | | `cursor` | string | | The previous page's `cursor`. Pass it alone for the next page. | | `device` | enum | | Which page to read: the desktop (default) or the mobile one. `desktop` `mobile` | | `limit` | integer 1–100 | | Results wanted (default 10, at most 100). More than one page is charged per page. | | `q` | string | | The query, search operators included. | | `timeRange` | enum | | Only results from this past period. `hour` `day` `week` `month` `year` | | `type` | enum | | What to search: web results (default), news, images or videos. `web` `news` `images` `videos` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`ResultsPage`](/docs/api-reference/serp/response-schema#resultspage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "yahoo-japan", "query": "東京 ラーメン", "type": "web", "outcome": "results", "country": "JP", "device": "desktop", "totalResults": 95100000, "page": 1, "items": [ { "type": "relatedSearches", "queries": ["東京 ラーメン ランキング"], "ext": {"shown": 3, "placement": "top"}, "rank": 1 }, { "type": "localPack", "places": [ { "id": "oVCz0MkZEOo", "name": "銀座 八五", "url": "https://map.yahoo.co.jp/place?gid=oVCz0MkZEOo&fr=sydd_p-grmlist-gourmet-list_gl-ttl&from_s…", "categories": ["ラーメン店"], "rating": 4.24, "reviewCount": 362, "website": "https://katsumoto-japan.com/", "photos": ["https://searchgourmetlist-pctr.c.yimg.jp/KD3zi0uFROIrUpGBKHZNKT29WYmZtb8_P4Hu0p54ztvnRNdPK…"], "ext": { "hoursText": "営業状況変更の可能性", "access": "東銀座駅[A7]徒歩2分", "reviewKeywords": {"items": [{"count": 55, "name": "おひとりさま向き"}], "totalCount": 215}, "menu": [ { "imageType": "menu", "imageUrl": "https://searchgourmetlist-pctr.c.yimg.jp/KD3zi0uFROIrUpGBKHZNKT29WYmZtb8_P4Hu0p54ztsiks7dD…", "title": "八五ラーメン", "price": "1,000円〜", "poiUrl": "https://map.yahoo.co.jp/v3/place/oVCz0MkZEOo/menu/624982ffe99e5a203f9edd7f?fr=sydd_p-grmli…", "isQueryMatch": true } ], "photoTypes": ["menu"], "menuUrl": "https://map.yahoo.co.jp/v3/place/oVCz0MkZEOo/menu?filter=menu&fr=sydd_p-grmlist-gourmet-li…", "routeUrl": "https://map.yahoo.co.jp/route/train?from=%E7%8F%BE%E5%9C%A8%E5%9C%B0&to=%E9%8A%80%E5%BA%A7…" }, "reviewsUrl": "https://map.yahoo.co.jp/place?gid=oVCz0MkZEOo&tab=review&fr=sydd_p-grmlist-gourmet-list_gl…" } ], "ext": { "title": "東京周辺のラーメン(12346件)", "mapUrl": "https://map.yahoo.co.jp/search?q=%E6%9D%B1%E4%BA%AC%20%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%B3…", "source": "Yahoo!マップ" }, "rank": 2, "moreUrl": "https://map.yahoo.co.jp/search?q=%E6%9D%B1%E4%BA%AC%20%E3%83%A9%E3%83%BC%E3%83%A1%E3%83%B3…", "total": 12346 }, { "type": "organic", "position": 1, "url": "https://s.tabelog.com/ramen/tokyo/rank", "title": "東京で人気のラーメン・つけ麺 ランキングTOP20 - 食べログ", "snippet": "東京 ラーメン・つけ麺 人気ランキングTOP20 · 1らぁ麺や 嶋 · 2中華そば しば田 · 3ジャパニーズ ラーメン 五感 · 4Homemade Ramen 麦苗 · 5銀…", "site": "食べログ", "displayUrl": "s.tabelog.com/ramen/tokyo/rank", "favicon": "data:image/png;base64,iVBORw0KGgoAAAANSU…", "ext": {"breadcrumbs": ["https://s.tabelog.com"], "exploreQueries": ["東京 ラーメン ランキング"]}, "rank": 3, "images": ["https://searchysnippet-pctr.c.yimg.jp/uUzvQ3lML_bkIqyakc1vFi9yrQXh6avYqqVdgqvBtiCaArZ038dg…"], "lang": "ja" }, { "type": "peopleAlsoAsk", "questions": [ { "question": "東京のラーメンランキングで1位はどこですか?", "answer": "東京で最新の人気ラーメンを探すなら、まずは食べログの「東京都 ラーメンランキング(2026年9月1日更新)」を基準に見るのが実用的です。", "url": "https://tabelog.com/ramen/tokyo/rank/?msockid=10082d06807e60ee165c3bf781a7613d&utm_source=…", "title": "東京で人気のラーメン・つけ麺 ランキングTOP20 | 食べログ" } ], "ext": { "details": [ { "sources": [ { "url": "https://tabelog.com/ramen/tokyo/rank/?msockid=10082d06807e60ee165c3bf781a7613d&utm_source=…", "title": "東京で人気のラーメン・つけ麺 ランキングTOP20 | 食べログ", "site": "食べログ" } ], "followUps": ["東京のラーメン順位は何で決まる?"] } ], "moreQuestions": ["東京ラーメンとはどんなラーメンですか?"] }, "rank": 7, "title": "他の人はこちらも質問" } ], "cursor": "CABpuP0yN8tjQqKCzFn5exfj121ZsQYsv46xRhhTKOWs01L9ZDnrAd2NTfUfRlU1c-_chn5CvdDdp8q6QdU6P2K9GS…", "fetchedAt": "2026-10-30T00:58:04.163Z" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call, plus $0.0012 for each extra call it makes — at most 9 more, so $0.012 in total. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. --- # Suggestions > Get what Yahoo! JAPAN's search box suggests for a query. Source: https://apinoa.com/en/docs-raw/api-reference/yahoo-japan/suggestions ```http GET | POST /v1/yahoo-japan/suggestions ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl -G "https://gateway.apinoa.com/v1/yahoo-japan/suggestions" \ --data-urlencode "q=東京" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "東京" }); const res = await fetch(`https://gateway.apinoa.com/v1/yahoo-japan/suggestions?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/yahoo-japan/suggestions", params={"q": "東京"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `q` | string | yes | The query, search operators included. | | `country` | enum | | The market, as an ISO 3166 country code. `JP` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`Suggestions`](/docs/api-reference/serp/response-schema#suggestions) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "yahoo-japan", "query": "東京", "country": "JP", "suggestions": [ { "text": "東京電力", "type": "query", "ext": { "url": "https://search.yahoo.co.jp/search?ei=UTF-8&p=%E6%9D%B1%E4%BA%AC%E9%9B%BB%E5%8A%9B&ai=2bec0c7d-70e8-4738-81cd-17060a283ad3&at=s" } }, { "text": "東京ガス", "type": "query", "ext": { "url": "https://search.yahoo.co.jp/search?ei=UTF-8&p=%E6%9D%B1%E4%BA%AC%E3%82%AC%E3%82%B9&ai=2bec0c7d-70e8-4738-81cd-17060a283ad3&at=s" } } ] } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. --- # Seznam > Seznam web, news, image and video search, and suggestions. Source: https://apinoa.com/en/docs-raw/api-reference/seznam Seznam web, news, image and video search, and suggestions. **Markets:** `CZ` ## Operations | Operation | Endpoint | Returns | Price | |---|---|---|---| | [Search](/docs/api-reference/seznam/search) | `GET \| POST /v1/seznam/search` | `ResultsPage` | $0.0012–$0.006 | | [Suggestions](/docs/api-reference/seznam/suggestions) | `GET \| POST /v1/seznam/suggestions` | `Suggestions` | $0.0012 | --- # Search > Get one Seznam results page, with every block in page order. Source: https://apinoa.com/en/docs-raw/api-reference/seznam/search ```http GET | POST /v1/seznam/search ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl -G "https://gateway.apinoa.com/v1/seznam/search" \ --data-urlencode "q=počasí praha" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "počasí praha" }); const res = await fetch(`https://gateway.apinoa.com/v1/seznam/search?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/seznam/search", params={"q": "počasí praha"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `country` | enum | | The market, as an ISO 3166 country code. `CZ` | | `cursor` | string | | The previous page's `cursor`. Pass it alone for the next page. | | `device` | enum | | Which page to read: the desktop (default) or the mobile one. `desktop` `mobile` | | `limit` | integer 1–100 | | Results wanted (default 10, at most 100). More than one page is charged per page. | | `q` | string | | The query, search operators included. | | `timeRange` | enum | | Only results from this past period. `hour` `day` `week` `month` `year` | | `type` | enum | | What to search: web results (default), news, images or videos. `web` `news` `images` `videos` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`ResultsPage`](/docs/api-reference/serp/response-schema#resultspage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "seznam", "query": "počasí praha", "type": "web", "country": "CZ", "device": "desktop", "fetchedAt": "2026-10-30T00:57:52.440Z", "outcome": "results", "totalResults": 12000000, "page": 1, "items": [ { "type": "other", "rank": 1, "kind": "weather", "title": "Praha", "text": "Jasno, denní teploty v rozmezí 5 až 10 °C. Ze severu povane slabý vítr…", "ext": { "current": { "bio": 1, "feelTemp": 4.343411571995779, "feelTemp2": 4.343411571995783, "fromStation": false, "icon": 0, "isDay": false, "precip": 0, "pressure": 1031.1091208148287, "temp": 4.343411571995781, "uv": 0, "wind": 0.5696404089287476, "windDir": 329, "windGust": 1.9975428816001073 }, "current_aprox": { "bio": 1, "feelTemp": 4.343411571995779, "feelTemp2": 4.343411571995783, "fromStation": false, "icon": 0, "isDay": false, "precip": 0, "pressure": 1031.1091208148287, "temp": 4.343411571995781, "uv": 0, "wind": 0.5696404089287476, "windDir": 329, "windGust": 1.9975428816001073 }, "daily": [ { "dataHours": 9, "icon": 0, "localDate": "2026-10-29", "precip": 0, "precipType": 0, "snowPrecip": 0, "summary": "Jasno, denní teploty v rozmezí 5 až 10 °C. Ze severu…", "sunrise": "06:44", "sunset": "16:46", "tempMax": 10.464210939698205, "tempMin": 5.089965024221442, "wind": 1.9, "windDir": 346 } ], "entries": [ { "dayId": 0, "icon": 0, "isDay": false, "localDate": "2026-10-29", "localTime": "16:00", "precip": 0, "snowPrecip": 0, "temp": 10.464210939698205, "wind": 1.2, "windDir": 307 } ], "place": { "TZoffset": 1, "lat": 50.083549, "localNow": "2026-10-30T01:54:38+01:00", "lon": 14.434141, "name": { "area": "Pražská plošina", "coun": "Česko", "dist": "Hlavní město Praha", "muni": "Praha", "quar": "Praha 1, Praha, Hlavní město Praha", "regi": "Hlavní město Praha", "stre": "Vrchlického sady, Praha, Hlavní město Praha", "ward": "Nové Město, Praha, Hlavní město Praha" }, "seo": { "coun": "cesko", "isCz": true, "muni": "praha", "placeId": "muni_3468", "source": "muni", "webUrl": "https://pocasi.seznam.cz/praha" } }, "startdate": "2026-10-30" } }, { "type": "organic", "rank": 2, "position": 1, "url": "https://www.in-pocasi.cz/predpoved-pocasi/cz/praha/praha-324/", "title": "Počasí - Praha, předpověď na 10 dní | In-počasí", "snippet": "Dlouhodobá předpověď počasí na 10 dní pro město Praha - Česká republik…", "displayUrl": "https://in-pocasi.cz/predpoved-pocasi/cz/praha/praha-324", "date": "2011-01-12T23:00:00.000Z", "ext": { "docId": "feda8eb0555173f1", "attributes": { "isPorn": false, "language": "CS", "fileType": "HTML", "isHomepage": false, "tags": ["INFORMATIVE"] }, "favicons": [{"url": "https://fimg-resp.seznam.cz/thumbnail/v1.0/favicon16x16/https%3A%2F%2F…", "size": 16}] } }, {"type": "relatedSearches", "rank": 7, "queries": ["počasí praha dlouhodobá předpověď"]} ], "cursor": "X7gjH7nzLMwqljudpX3DCyEjprC6SOzS7CQl3xzRSrhPof536F88YnXxWRRT1scIcPe-Zy…" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call, plus $0.0012 for each extra call it makes — at most 4 more, so $0.006 in total. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. --- # Suggestions > Get what Seznam's search box suggests for a query. Source: https://apinoa.com/en/docs-raw/api-reference/seznam/suggestions ```http GET | POST /v1/seznam/suggestions ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl -G "https://gateway.apinoa.com/v1/seznam/suggestions" \ --data-urlencode "q=počasí" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "počasí" }); const res = await fetch(`https://gateway.apinoa.com/v1/seznam/suggestions?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/seznam/suggestions", params={"q": "počasí"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `q` | string | yes | The query, search operators included. | | `country` | enum | | The market, as an ISO 3166 country code. `CZ` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`Suggestions`](/docs/api-reference/serp/response-schema#suggestions) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "seznam", "query": "počasí", "suggestions": [ { "text": "počasí idnes", "type": "fulltext", "ext": {"source": "global", "count": 80016, "suggestCount": 72405, "visitorCount": 64658} }, {"text": "počasí", "type": "fulltext+weather/location", "ext": {"source": "global+hintservers"}} ], "country": "CZ" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. --- # Tripadvisor > Restaurants, hotels, attractions and more on Tripadvisor, with their details and reviews. Source: https://apinoa.com/en/docs-raw/api-reference/tripadvisor Restaurants, hotels, attractions and more on Tripadvisor, with their details and reviews. **Markets:** `US` `GB` `CA` `AU` `IN` `IE` `DE` `FR` `IT` `ES` `NL` `BR` `MX` `JP` `KR` (the first is the default) ## Operations | Operation | Endpoint | Returns | Price | |---|---|---|---| | [Places](/docs/api-reference/tripadvisor/places) | `GET \| POST /v1/tripadvisor/places` | `PlacesPage` | $0.0012–$0.0048 | | [Place](/docs/api-reference/tripadvisor/place) | `GET \| POST /v1/tripadvisor/place` | `Place` | $0.0012 | | [Reviews](/docs/api-reference/tripadvisor/reviews) | `GET \| POST /v1/tripadvisor/reviews` | `PlaceReviewsPage` | $0.0012–$0.006 | --- # Places > Find places on Tripadvisor. Source: https://apinoa.com/en/docs-raw/api-reference/tripadvisor/places ```http GET | POST /v1/tripadvisor/places ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/tripadvisor/places?q=hotels&category=hotels&near=Paris&country=US&limit=5" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "hotels", category: "hotels", near: "Paris", country: "US", limit: "5" }); const res = await fetch(`https://gateway.apinoa.com/v1/tripadvisor/places?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/tripadvisor/places", params={"q": "hotels", "category": "hotels", "near": "Paris", "country": "US", "limit": "5"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `category` | enum | | What to list: everything (default), restaurants, hotels, attractions (things to do, tours included), tours, destinations or airlines. `all` `restaurants` `hotels` `attractions` `tours` `destinations` `airlines` | | `country` | enum | | The market, as an ISO 3166 country code. `US` `GB` `CA` `AU` `IN` `IE` `DE` `FR` `IT` `ES` `NL` `BR` `MX` `JP` `KR` | | `cursor` | string | | The previous page's `cursor`. Pass it alone for the next page. | | `lang` | string | | Interface language. | | `limit` | integer 1–120 | | Results wanted (default 30, at most 120). More than one page is charged per page. | | `location` | string | | Search as if from this point: `lat,lng`. | | `near` | string | | Search around this place name, or a `lat,lng` point. | | `q` | string | | The query, search operators included. | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`PlacesPage`](/docs/api-reference/serp/response-schema#placespage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "tripadvisor", "query": "hotels", "outcome": "results", "near": "Paris", "country": "US", "lang": "en", "places": [ { "id": "143336", "name": "Paris Las Vegas", "url": "https://www.tripadvisor.com/Hotel_Review-g45963-d143336-Reviews-Paris_Las_Vegas-Las_Vegas_Nevada.html", "categories": ["Hotel"], "rating": 3.9, "reviewCount": 40012, "photos": [ "https://dynamic-media-cdn.tripadvisor.com/media/photo-o/2f/ac/a0/69/paris-las-vegas.jpg?w=1280&h=1103&s=1" ], "description": "Paris Las Vegas Hotel - A Caesars Rewards Destination. Experience everything you love about Paris, in the heart of the Las Vegas Strip. The city of lights shine…", "lang": "en", "ext": { "type": "hotel", "kind": "Hotel", "area": "Las Vegas, Nevada", "snippet": { "text": "But, I tought I scored a good deal on the site of Hotel Paris itself.", "highlights": [{"offset": 50, "length": 5}] }, "mentions": 11474 } }, { "id": "228694", "name": "Hôtel Malte - Astotel", "url": "https://www.tripadvisor.com/Hotel_Review-g187147-d228694-Reviews-Hotel_Malte_Astotel-Paris_Ile_de_France.html", "categories": ["Hotel"], "rating": 4.9, "reviewCount": 3979, "photos": [ "https://dynamic-media-cdn.tripadvisor.com/media/photo-o/33/44/57/47/breakfast-room.jpg?w=3100&h=2069&s=1" ], "description": "Located in the 2nd district next to the Stock Exchange, the Louvre and Place des Victoires, Hotel Malta provides a superb location for a memorable stay. Whether…", "lang": "en", "ext": { "type": "hotel", "kind": "Hotel", "area": "Paris, Ile-de-France, France", "snippet": {"text": "my favorite hotels in Paris.", "highlights": [{"offset": 12, "length": 6}]}, "mentions": 1124 } } ], "page": {"index": 1, "size": 30}, "cursor": "mqcJOnHYbpBCunJIJ48vsmO-A5Os86AMsBlRwIKCGcjSCmu8wlAMK_qtGDrHUEyUilfZgT3-p7E8hFKOOKxWfDJYjjCqVQ5N8fTuGjLS6qvzKcKvxvsSJIjXemS4ncyeRCqsaRVN9KB5h_6R6P6vIFPoYJjWrTyO…", "fetchedAt": "2026-10-30T01:02:43.549Z", "ext": { "category": "hotels", "scope": {"type": "world"}, "sections": [ { "type": "listPreview", "contentType": "HOTELS", "title": "Hotels in Paris", "url": "https://www.tripadvisor.com/Hotels-g187147-Paris_Ile_de_France-Hotels.html", "geo": { "id": "187147", "name": "Paris", "url": "https://www.tripadvisor.com/Tourism-g187147-Paris_Ile_de_France-Vacations.html", "area": "Ile-de-France, France", "description": "Lingering over pain au chocolat in a sidewalk café, relaxing after a day of strolling along the Seine and marveling at icons like the Eiffel Tower and the Arc d…", "photo": "https://dynamic-media-cdn.tripadvisor.com/media/photo-o/17/15/6d/d6/paris.jpg?w=3575&h=2600&s=1" } } ] } } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call, plus $0.0012 for each extra call it makes — at most 3 more, so $0.0048 in total. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - `category` picks what to list: restaurants, hotels, attractions, tours, destinations or airlines. - `limit` above one page reads further pages, one unit each. --- # Place > Get one place's details from Tripadvisor. Source: https://apinoa.com/en/docs-raw/api-reference/tripadvisor/place ```http GET | POST /v1/tripadvisor/place ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/tripadvisor/place?id=143336&country=US" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ id: "143336", country: "US" }); const res = await fetch(`https://gateway.apinoa.com/v1/tripadvisor/place?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/tripadvisor/place", params={"id": "143336", "country": "US"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `country` | enum | | The market, as an ISO 3166 country code. `US` `GB` `CA` `AU` `IN` `IE` `DE` `FR` `IT` `ES` `NL` `BR` `MX` `JP` `KR` | | `id` | string | | The place's id, as `places` returns it (a Tripadvisor link is taken too). | | `lang` | string | | Interface language. | | `url` | string | | A Tripadvisor place link. | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`Place`](/docs/api-reference/serp/response-schema#place) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "id": "143336", "name": "Paris Las Vegas", "url": "https://www.tripadvisor.com/Hotel_Review-g45963-d143336-Reviews-Paris_Las_Vegas-Las_Vegas_…", "address": { "street": "3655 S Las Vegas Blvd", "city": "Las Vegas", "region": "Nevada", "postalCode": "89109", "country": "US", "full": "3655 S Las Vegas Blvd, Las Vegas, NV 89109" }, "coordinates": {"lat": 36.11246, "lng": -115.17071}, "rating": 3.9, "reviewCount": 40012, "photos": ["https://dynamic-media-cdn.tripadvisor.com/media/photo-o/2f/ac/a0/69/paris-las-vegas.jpg?w=…"], "description": "Paris Las Vegas Hotel - A Caesars Rewards Destination. Experience everything you love abou…", "lang": "en", "ext": { "type": "hotel", "placeType": "ACCOMMODATION", "parent": {"id": "45963", "name": "Las Vegas"}, "neighborhoods": ["The Strip"], "email": "totalrewards@custhelp.com", "ratings": { "starCounts": {"1": 2772, "2": 2833, "3": 5948, "4": 11959, "5": 16500}, "distribution": {"1": 6.93, "2": 7.08, "3": 14.87, "4": 29.89, "5": 41.24}, "subRatings": { "activitiesAndGym": 3.5, "cleanliness": 4.2, "dining": 3.9, "location": 4.7, "pool": 3.7, "room": 4, "service": 3.9, "sleep": 4.2, "value": 3.9 } }, "nearby": { "neighborhood": { "name": "The Strip", "description": "Las Vegas Strip, a neon wonderland that never sleeps, is the epicenter of thrill and enter…" }, "hotels": [ { "id": "1639337", "name": "Hilton Grand Vacations Club Elara Center Strip Las Vegas", "url": "https://www.tripadvisor.com/Hotel_Review-g45963-d1639337-Reviews-Hilton_Grand_Vacations_Cl…", "coordinates": {"lat": 36.10882, "lng": -115.16833}, "photo": "https://dynamic-media-cdn.tripadvisor.com/media/photo-o/15/22/91/ac/pool.jpg?w=4950&h=3300…", "rating": 4.3, "reviewCount": 8809, "award": {"type": "COE", "year": 2026} } ], "attractions": [ { "id": "553008", "name": "Paris Las Vegas Wedding Chapel", "url": "https://www.tripadvisor.com/Attraction_Review-g45963-d553008-Reviews-Paris_Las_Vegas_Weddi…", "coordinates": {"lat": 36.112034, "lng": -115.171036}, "photo": "https://dynamic-media-cdn.tripadvisor.com/media/photo-o/28/fd/2d/eb/arc-de-triomphe.jpg?w=…", "rating": 4.6, "reviewCount": 55, "distance": 0.034517966 } ], "landmarks": [{"name": "Fountains of Bellagio"}], "restaurantsUrl": "https://www.tripadvisor.com/RestaurantsNear-g45963-d143336-Paris_Las_Vegas-Las_Vegas_Nevad…", "hotelsUrl": "https://www.tripadvisor.com/HotelsNear-g45963-d143336-Paris_Las_Vegas-Las_Vegas_Nevada.htm…", "attractionsUrl": "https://www.tripadvisor.com/ClientLink?value=b0JIXy9BdHRyYWN0aW9uc19VMGU%3D" }, "ranking": { "text": "#164 of 261 hotels in Las Vegas", "url": "https://www.tripadvisor.com/Hotels-g45963-a_sort.POPULARITY-Las_Vegas_Nevada-Hotels.html" }, "hotel": { "accommodationType": "T_HOTEL", "categoryRanking": "#164 of 261 hotels in Las Vegas", "starRating": {"tagIds": [9566], "source": "This property is classified according to Giata."}, "subRatings": { "cleanliness": 4.190542, "location": 4.6725383, "rooms": 3.9813929, "service": 3.9386554, "sleepQuality": 4.166858, "value": 3.9060726 }, "styles": [{"name": "Family", "rankInCity": 109, "score": 1.9675850720952188}], "amenities": [{"group": "Room features", "label": "Blackout curtains", "category": "Comfort", "highlighted": true}], "roomFeaturesUrl": "https://www.tripadvisor.com/Hotel_Feature-g45963-d143336-zft1-Paris_Las_Vegas.html", "parents": [ { "id": "45963", "hotelsUrl": "https://www.tripadvisor.com/Hotels-g45963-Las_Vegas_Nevada-Hotels.html" } ] } }, "attributes": [{"group": "Room features", "label": "Blackout curtains"}], "verifiedOwner": true } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 404 | `NOT_FOUND` | The place does not exist. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - Pass `id` from `places`, or a Tripadvisor link as `id` or `url`. --- # Reviews > Get a place's reviews from Tripadvisor. Source: https://apinoa.com/en/docs-raw/api-reference/tripadvisor/reviews ```http GET | POST /v1/tripadvisor/reviews ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/tripadvisor/reviews?place=143336&limit=5" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ place: "143336", limit: "5" }); const res = await fetch(`https://gateway.apinoa.com/v1/tripadvisor/reviews?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/tripadvisor/reviews", params={"place": "143336", "limit": "5"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `cursor` | string | | The previous page's `cursor`. Pass it alone for the next page. | | `language` | string | | Only reviews in this language — Tripadvisor counts its machine translations into it (each review says when it is one). All languages by default. | | `limit` | integer 1–100 | | Results wanted (default 20, at most 100). More than one page is charged per page. | | `months` | string | | Only reviews of visits in these months, e.g. `6,7,8` or `june`. | | `place` | string | | The place's id, as `places` returns it (a Tripadvisor link is taken too). | | `q` | string | | Only reviews that mention this text. | | `rating` | string | | Only reviews with these stars, e.g. `5` or `1,2`. | | `sort` | enum | | Review order: Tripadvisor's own (default), newest first, or the most detailed first. `relevant` `newest` `detailed` | | `visitType` | string | | Only reviews by these travellers: families, couples, solo, business, friends (comma-separated). | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`PlaceReviewsPage`](/docs/api-reference/serp/response-schema#placereviewspage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "tripadvisor", "placeId": "143336", "summary": { "average": 3.9, "count": 40012, "distribution": {"1": 6.93, "2": 7.08, "3": 14.87, "4": 29.89, "5": 41.24} }, "starCounts": {"1": 2772, "2": 2833, "3": 5948, "4": 11959, "5": 16500}, "sort": "newest", "page": {"index": 1, "size": 5, "total": 40012}, "reviews": [ { "id": "1083706294", "author": "Richie J", "authorId": "DEE03B589798E25B6D9C7B158ED1E551", "authorUrl": "https://www.tripadvisor.com/Profile/536richiej", "authorAvatarUrl": "https://dynamic-media-cdn.tripadvisor.com/media/photo-o/1a/f6/f2/11/default-avatar-2020-23.jpg?w=1200&h=1200&s=1", "rating": 3, "title": "Multiple issues derailed experience", "body": "The shower only had cold water. There was no body wash bc the canister was broken. Called housekeeping and a bag of soaps were left on bathroom counter. This is…", "date": "2026-10-29T22:42:49.097Z", "helpfulCount": 0, "images": [], "language": "en", "pinned": false, "ext": { "url": "https://www.tripadvisor.com/ShowUserReviews-g45963-d143336-r1083706294-Paris_Las_Vegas-Las_Vegas_Nevada.html", "visit": {"type": "couples", "date": "2026-10"}, "photoCount": 0, "trustSafetyAlert": false, "reviewer": {"username": "536richiej", "contributions": 1, "helpfulVotes": 0} } }, { "id": "1083555734", "author": "Dorothy I", "authorId": "A12310ACFD286DA674866408BEEA29DC", "authorUrl": "https://www.tripadvisor.com/Profile/dorothyi321", "authorAvatarUrl": "https://dynamic-media-cdn.tripadvisor.com/media/photo-s/01/2e/70/69/avatar047.jpg?w=450&h=450&s=1", "rating": 5, "title": "Lovely", "body": "Initially they put me in Versailles tower, I was a bit disappointed, great view but loud and elevator issues, it’s not quite as elegant as I expected from this…", "date": "2026-10-28T16:59:35.842Z", "helpfulCount": 0, "images": [ "https://dynamic-media-cdn.tripadvisor.com/media/v2/photo-o/35/0f/26/ce/image.jpg?w=3024&h=4032&s=1", "https://dynamic-media-cdn.tripadvisor.com/media/v2/photo-o/35/0f/26/d0/image.jpg?w=3024&h=4032&s=1" ], "language": "en", "pinned": false, "ext": { "url": "https://www.tripadvisor.com/ShowUserReviews-g45963-d143336-r1083555734-Paris_Las_Vegas-Las_Vegas_Nevada.html", "visit": {"type": "solo", "date": "2026-10"}, "photoCount": 3, "photoCaptions": ["Perfect view"], "trustSafetyAlert": false, "reviewer": {"username": "dorothyi321", "contributions": 8, "helpfulVotes": 0} } } ], "cursor": "CLGdsXzj_3O3ElOeWzJoq8nqyzEjXq15aaxleTqAcTLFSh2SehSKQB2jIsWOaf8IfICs6nJDR5VnR9U0GpzUQSOAoVlzyvpvL9RzaURF88Z0S5LTXzqHsxc3nH0AOmvJCgsfOSRzVgAZi5qoJ_WLj_8Yg12i9w", "fetchedAt": "2026-10-30T01:02:47.016Z", "ext": { "place": { "name": "Paris Las Vegas", "type": "hotel", "url": "https://www.tripadvisor.com/Hotel_Review-g45963-d143336-Reviews-Paris_Las_Vegas-Las_Vegas_Nevada.html" }, "subRatings": { "activitiesAndGym": 3.5, "cleanliness": 4.2, "dining": 3.9, "location": 4.7, "pool": 3.7, "room": 4, "service": 3.9, "sleep": 4.2, "value": 3.9 }, "languages": { "de": 13697, "no": 16161, "fi": 92, "ru": 19635, "pt": 5745, "zhTW": 13079, "fr": 10019, "hu": 93, "sk": 92, "sr": 92, "zhCN": 12377, "sv": 12000, "ko": 13790, "in": 13751, "el": 13880, "en": 36553, "it": 17367, "es": 17965, "iw": 161, "cs": 93, "ar": 9357, "vi": 170, "th": 13062, "ja": 10254, "pl": 10764, "da": 10191, "nl": 16104, "tr": 7945 } } } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 404 | `NOT_FOUND` | The place does not exist. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call, plus $0.0012 for each extra call it makes — at most 4 more, so $0.006 in total. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - Pass the place's `id` from `places` as `place`. - Filter by `rating`, `visitType`, `months`, `language` or text in `q`. With `language`, Tripadvisor counts its machine translations, and each review says when it is one. --- # Google Shopping > Products on Google Shopping, with their merchants and reviews. Google Shopping returns the marketplace types, so it reads like the Marketplace API. Source: https://apinoa.com/en/docs-raw/api-reference/google-shopping Products on Google Shopping, with their merchants and reviews. Google Shopping returns the [marketplace types](/docs/api-reference/marketplaces/response-schema), so it reads like the Marketplace API. **Markets:** `US` `GB` `CA` `AU` (the first is the default) ## Operations | Operation | Endpoint | Returns | Price | |---|---|---|---| | [Search](/docs/api-reference/google-shopping/search) | `GET \| POST /v1/google-shopping/search` | `SearchResult` | $0.0012 | | [Product](/docs/api-reference/google-shopping/product) | `GET \| POST /v1/google-shopping/product` | `Product` | $0.0012–$0.0252 | | [Reviews](/docs/api-reference/google-shopping/reviews) | `GET \| POST /v1/google-shopping/reviews` | `ReviewPage` | $0.0012 | --- # Search > Search Google Shopping for products, with each one's price, merchant and rating. Source: https://apinoa.com/en/docs-raw/api-reference/google-shopping/search ```http GET | POST /v1/google-shopping/search ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/google-shopping/search?query=running+shoes®ion=US" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ query: "running shoes", region: "US" }); const res = await fetch(`https://gateway.apinoa.com/v1/google-shopping/search?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/google-shopping/search", params={"query": "running shoes", "region": "US"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `cursor` | string | | Next page: pass the previous result's `cursor` alone. | | `facets` | string \| object list | | One value from a result's `facets` (include=facets), e.g. facets=Brand:. Google applies one at a time. | | `include` | string list | | `facets` — the filter rail Google shows beside the results, on the same page (no extra request). | | `priceMax` | number ≥ 0 | | Highest price, in the market's currency (decimal major units). | | `priceMin` | number ≥ 0 | | Lowest price, in the market's currency (decimal major units). | | `query` | string | | Keywords to search for. | | `region` | enum | | The market, ISO 3166-1 alpha-2: US (default), GB, CA, AU. Sets the shops, prices and currency. `US` `GB` `CA` `AU` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`SearchResult`](/docs/api-reference/marketplaces/response-schema#searchresult) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "marketplace": "google-shopping", "query": "running shoes", "page": {"index": 1, "size": 54}, "items": [ { "marketplace": "google-shopping", "id": "14699928440903523478", "url": "https://www.google.com/search?ibp=oshop&q=Hoka+Men%27s+Clifton+11&prds=catalogid%3A5939486839279040471%2Cgpcid%3A14699928440903523478%2CheadlineOfferDocid%3A905…", "title": "Hoka Men's Clifton 11", "price": {"currency": "USD", "amount": 154.95}, "brand": "Hoka One One", "seller": {"name": "Zappos.com", "logoUrl": "data:image/png;base64,iVBORw0KGgoAAAANSU…"}, "rating": {"average": 4.484, "count": 412}, "delivery": {"estimate": "Free delivery by Mon", "free": true}, "returnsPolicy": "Free 365-day returns", "badges": [], "promotions": [], "attributes": [], "groupId": "14699928440903523478", "imageUrl": "https://encrypted-tbn3.gstatic.com/shopping?q=tbn:ANd9GcRqYH_zOknkUmPHPQooSsPMYiYGJMv-jev2oHa3IYWYR3S1ZdTQiAb3gLS_dNid6BzrdE1cSbjGZFbQVF2Nkj2ST_R5sfE4Tw", "ext": { "summary": "Hoka Men's Clifton 11. Current Price: $154.95. Zappos.com & more. Free delivery by Mon. Free 365-day returns. Rated 4.5 out of 5. 412 reviews.", "moreStores": true, "shelf": "Beginner Running Shoes", "catalogId": "5939486839279040471", "productId": "13107188378090301883", "offerId": "9057001329748764354", "imageId": "8494207511608046187" }, "offers": [ { "seller": { "name": "Peter Glenn Ski & Sports", "logoUrl": "https://encrypted-tbn2.gstatic.com/favicon-tbn?q=tbn%3AANd9GcTgj6MTV2jVPsWTKNdSwoPkVupNia0bUqnfBm8PYegVt-ywkuVH1n9-VCekAnK6c1rBK6Eho-3SEcUhcTEOMxTwKsE_qF3XMchpt…" }, "price": {"currency": "USD", "amount": 155}, "delivery": {"estimate": "Free delivery by Tue", "free": true}, "ext": {"offerId": "18164253511807076099", "shelf": "All products"} } ] }, { "marketplace": "google-shopping", "id": "1522057692120988320", "url": "https://www.google.com/search?ibp=oshop&q=New+Balance+Women%27s+Fresh+Foam+X+Kaiha+Road+V2+Running+Shoes&prds=catalogid%3A2224207068186773069%2Cgpcid%3A15220576…", "title": "New Balance Women's Fresh Foam X Kaiha Road V2 Running Shoes", "price": {"currency": "USD", "amount": 104.99}, "brand": "New Balance", "seller": {"name": "New Balance", "logoUrl": "data:image/png;base64,iVBORw0KGgoAAAANSU…"}, "rating": {"average": 5, "count": 166}, "returnsPolicy": "45-day returns", "badges": [], "promotions": [], "attributes": [], "groupId": "1522057692120988320", "imageUrl": "https://encrypted-tbn3.gstatic.com/shopping?q=tbn:ANd9GcSSyE2K1PfUS8yxgpTwvT2vlaiCaO84uGQNRSOkkjF_LCLn3s7bRKN1RMRFX2rwek5QYVUaeWIIL4W6zE7k1A266nu7dx6K", "ext": { "summary": "New Balance Women's Fresh Foam X Kaiha Road V2 Running Shoes. Current Price: $104.99. New Balance & more. 45-day returns. Rated 5.0 out of 5. 166 reviews.", "moreStores": true, "shelf": "Beginner Running Shoes", "catalogId": "2224207068186773069", "productId": "16229217600571913203", "offerId": "8468470629989173210", "imageId": "1190089453230405951" } } ], "cursor": "tRlUbjVXzLQ2mckO_0hUg_oRXAX71LylzGzTA4ov5NQm-NnRYdL9Cydv_yTsWQvUY7ouiehwkp5AzTrHVcRpPcxjhMZBDfWSR6cMUeo1EiZf7Lnj_fUyC3sfVIdge_nN-YWBk_4YkMM" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - `include=facets` adds the filter rail Google shows beside the results, at no extra cost. Pass one of its values as `facets` to filter. - `priceMin` and `priceMax` are in the market's currency, in decimal major units. --- # Product > Get a product's page from Google Shopping: its details, specs and the merchants selling it. Source: https://apinoa.com/en/docs-raw/api-reference/google-shopping/product ```http GET | POST /v1/google-shopping/product ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/google-shopping/product?id=14699928440903523478®ion=US" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ id: "14699928440903523478", region: "US" }); const res = await fetch(`https://gateway.apinoa.com/v1/google-shopping/product?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/google-shopping/product", params={"id": "14699928440903523478", "region": "US"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `id` | string | | The product, as a search item's `id` carries it. | | `include` | string | | `offers` · `offers:5` · `offers:all` — every merchant selling the product, 10 per request after the 3 the page shows. Depth counts requests and each is charged; `all` walks to the end, capped at 20. | | `region` | enum | | The market, ISO 3166-1 alpha-2: US (default), GB, CA, AU. Sets the shops, prices and currency. `US` `GB` `CA` `AU` | | `url` | string | | A Google Shopping product link instead of `id` (the `url` a search item carries). | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`Product`](/docs/api-reference/marketplaces/response-schema#searchitem-and-product) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "marketplace": "google-shopping", "id": "14699928440903523478", "url": "https://www.google.com/search?ibp=oshop&q=Hoka+Men%27s+Clifton+11&prds…", "title": "Hoka Men's Clifton 11", "price": {"currency": "USD", "amount": 154.95}, "brand": "Hoka One One", "rating": { "average": 4.72, "count": 445, "distribution": {"1": 3, "2": 1, "3": 4, "4": 11, "5": 84}, "starCounts": {"1": 11, "2": 2, "3": 14, "4": 46, "5": 372} }, "seller": { "id": "15872", "name": "Zappos.com", "logoUrl": "https://encrypted-tbn3.gstatic.com/faviconV2?url=https://www.zappos.co…", "rating": {"average": 4.8} }, "badges": [], "promotions": [], "attributes": [{"name": "Size", "value": "Size 5, Size 5½, Size 6, Size 6½, Size 7, Size 7½, Size 8, Size 8½, Si…"}], "groupId": "14699928440903523478", "description": "The Men's HOKA Clifton 11 Running Shoe is a lightweight shoe for runni…", "features": [], "media": {"images": ["https://encrypted-tbn1.gstatic.com/shopping?q=tbn:ANd9GcSwvRhrsajonYuP…"], "videos": []}, "category": [], "options": [ { "id": "Color", "name": "Color", "values": [ { "id": "EigiBWNvbG9yKh9hbnRpcXVlIG9saXZlIC8gcml2ZXIgcm9jayBncmV5", "name": "Antique Olive / River Rock Grey", "imageUrl": "https://encrypted-tbn1.gstatic.com/shopping?q=tbn:ANd9GcSTx7SmeSRrNlMr…" } ] } ], "variants": [], "offers": [ { "seller": { "id": "15872", "name": "Zappos.com", "logoUrl": "https://encrypted-tbn3.gstatic.com/faviconV2?url=https://www.zappos.co…", "rating": {"average": 4.8} }, "price": {"currency": "USD", "amount": 154.95}, "inStock": true, "status": "In stock online", "delivery": {"estimate": "Free delivery between Sat - Mon", "free": true}, "ext": { "title": "HOKA Clifton 11 Men's Running Shoes Galactic Grey/Stellar Grey : 10 D…", "returns": "Free 365-day returns", "offerId": "6449949928584705062", "badges": ["Best price"], "url": "https://www.zappos.com/product/10047344/color/1107224?utm_medium=fpa&u…" } } ], "reviewSummary": "Users praise these shoes for their exceptional comfort, lightweight fe…", "reviewAspects": [{"name": "Comfort", "positive": 130, "negative": 7}], "boxContents": [], "reviews": [ { "id": "PR_3P_f5ad9bac86f8a072818655448a2d2a25", "author": "Joshua W", "authorAvatarUrl": "https://lh3.googleusercontent.com/shsm/AGYqVK3f_a0qsNdewufUaN9jNMjhBA2…", "rating": 3, "title": "Looking for some help", "body": "The shoes feel great.. the very light and comfortable under the foot….…", "images": [], "syndicatedFrom": "ewavedemo.com", "ext": {"dateText": "2 months ago"} } ], "ext": { "aspectDetails": [ { "name": "Comfort", "positive": "Comfortable", "negative": "Uncomfortable", "summary": "Users find the shoes to be very comfortable, with many experiencing a…" } ], "reviewImageCount": 39, "insights": [ { "topic": "Comfort (Midsole, Cushioning)", "cards": [ { "kind": "review", "source": "Tom's Guide", "title": "I ran 35 miles in the Hoka Clifton 11 and it’s a comfortable daily tra…", "url": "https://www.tomsguide.com/wellness/running/hoka-clifton-11-review", "favicon": "https://encrypted-tbn0.gstatic.com/faviconV2?url=https://www.tomsguide…", "pros": ["Comfortable upper"], "more": "4 more pros and cons", "dateText": "2mo" } ] } ], "discussions": [ { "title": "Have you upgraded to the new HOKA Clifton 11 yet? We've been testing o…", "url": "https://www.facebook.com/RoadRunnerSports/posts/have-you-upgraded-to-t…", "source": "Facebook", "favicon": "https://encrypted-tbn2.gstatic.com/faviconV2?url=https://www.facebook.…", "dateText": "3 months ago", "answers": [ { "text": "A supercritical ProGlide+ midsole brings it in line with its daily tra…", "url": "https://www.facebook.com/RoadRunnerSports/posts/have-you-upgraded-to-t…" } ] } ], "relatedProducts": [ { "id": "11647404279960666288", "url": "https://www.google.com/search?ibp=oshop&q=HOKA+Men%27s+Rincon+4&prds=c…", "title": "HOKA Men's Rincon 4", "price": {"currency": "USD", "amount": 80}, "listPrice": {"currency": "USD", "amount": 125}, "seller": "JD Sports", "rating": {"average": 4.4}, "reviewCountText": "1k+", "badges": ["36% OFF"], "imageUrl": "https://encrypted-tbn3.gstatic.com/shopping?q=tbn:ANd9GcSGvxJsiQ4WzXyw…", "shelf": "More options" } ], "typicalPrice": {"min": {"currency": "USD", "amount": 155}, "max": {"currency": "USD", "amount": 165}}, "typicalPriceText": "Typically $155 to $165", "priceHistory": [ { "seller": "Zappos.com", "points": [{"date": "2026-08-13", "price": {"currency": "USD", "amount": 155}}] } ] } } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 404 | `PRODUCT_NOT_FOUND` | Google Shopping has no such product. The message names the id. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call, plus $0.0012 for each extra call it makes — at most 20 more, so $0.0252 in total. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - Pass a search item's `id`, or its `url`. - `include=offers` adds every merchant selling the product: 10 per request after the 3 the page shows, one unit per request (`offers:5` for five requests, `offers:all` up to 20). --- # Reviews > Get a product's reviews from Google Shopping. Source: https://apinoa.com/en/docs-raw/api-reference/google-shopping/reviews ```http GET | POST /v1/google-shopping/reviews ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/google-shopping/reviews?id=14699928440903523478" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ id: "14699928440903523478" }); const res = await fetch(`https://gateway.apinoa.com/v1/google-shopping/reviews?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/google-shopping/reviews", params={"id": "14699928440903523478"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `cursor` | string | | Next page: pass the previous result's `cursor` alone. | | `id` | string | | The product, as a search item's `id` carries it. Only a product Google groups across stores (an id of digits only) has reviews. | | `url` | string | | A Google Shopping product link instead of `id` (the `url` a search item carries). | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`ReviewPage`](/docs/api-reference/marketplaces/response-schema#reviewpage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "marketplace": "google-shopping", "productId": "14699928440903523478", "summary": { "average": 4.7083335, "count": 456, "distribution": {"1": 3, "2": 1, "3": 4, "4": 11, "5": 83}, "starCounts": {"1": 11, "2": 4, "3": 14, "4": 49, "5": 378} }, "page": {"index": 1, "size": 10, "total": 456}, "reviews": [ { "id": "PR_3P_f5ad9bac86f8a072818655448a2d2a25", "author": "Joshua W", "authorAvatarUrl": "https://lh3.googleusercontent.com/shsm/AGYqVK3f_a0qsNdewufUaN9jNMjhBA2iqYGxMmbkzY_-9XUnWM-EHp54sZUtlNtGLSKzmHRExg=w40-h40-c0x00000000-cc", "rating": 3, "title": "Looking for some help", "body": "The shoes feel great.. the very light and comfortable under the foot…. The staff were great and very helpful when I was there… she told me I had a slight curved…", "images": [], "syndicatedFrom": "ewavedemo.com", "ext": {"dateText": "2 months ago"} }, { "id": "PR_3P_b2d0f4e9a87ebcd67397b1a448940f0a", "author": "Default", "authorAvatarUrl": "https://lh3.googleusercontent.com/shsm/AGYqVK36QOcqS62Et64UZUlsDp50FK0-LzpzaUd1Agzu2JVkg3ql3vf6jik6HH6NLO97COzJZg=w40-h40-c0x00000000-cc", "rating": 5, "title": "Great shoe for training runs", "body": "I’ve put 20 miles on these shoes now in 4 easy runs. I have never had a rocker-style shoe before but they were noticeably plusher/softer and also nicer when goi…", "images": [], "syndicatedFrom": "scheels.com", "ext": {"dateText": "2 months ago"} } ], "cursor": "YN15aw6pZJw1FMvFzP6fLCf0K96FEghuBGv4a93oJ-0zQyEfuCFWmFieSYh0NJKmYigKFBV16DeiEsT-lY3MyBrmGWZdMJ9vH_JZWUXjH0-TI4WKYoKGUF6U2-RV9NMs7SqyGL3MrLEVFTYSCgTtTtfdeF_O-7xW…" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 404 | `REVIEWS_NOT_FOUND` | Google Shopping keeps no reviews for this product: it is one store's product, not one Google groups across stores. The message names the id. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - Google keeps reviews per product it groups across stores. A search item whose `id` is all digits is one of those. An `id` that starts with `c` or `p` is one store's product, which has no reviews there: it returns `404 REVIEWS_NOT_FOUND` without being billed. --- # Google Play > Apps on Google Play: search, each app's page, and its reviews. Source: https://apinoa.com/en/docs-raw/api-reference/google-play Apps on Google Play: search, each app's page, and its reviews. **Markets:** `US` `GB` `CA` `AU` `NZ` `IE` `DE` `FR` `IT` `ES` `NL` `BE` `AT` `CH` `SE` `NO` `DK` `FI` `PL` `PT` `CZ` `GR` `HU` `RO` `TR` `UA` `IL` `AE` `SA` `EG` `ZA` `NG` `KE` `IN` `PK` `ID` `MY` `SG` `TH` `VN` `PH` `JP` `KR` `TW` `HK` `MX` `BR` `AR` `CL` `CO` `PE` (the first is the default) ## Operations | Operation | Endpoint | Returns | Price | |---|---|---|---| | [Search](/docs/api-reference/google-play/search) | `GET \| POST /v1/google-play/search` | `AppsPage` | $0.0012 | | [App](/docs/api-reference/google-play/app) | `GET \| POST /v1/google-play/app` | `App` | $0.0012 | | [Reviews](/docs/api-reference/google-play/reviews) | `GET \| POST /v1/google-play/reviews` | `AppReviewsPage` | $0.0012 | --- # Search > Search Google Play for apps. Source: https://apinoa.com/en/docs-raw/api-reference/google-play/search ```http GET | POST /v1/google-play/search ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/google-play/search?q=meditation&country=US" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "meditation", country: "US" }); const res = await fetch(`https://gateway.apinoa.com/v1/google-play/search?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/google-play/search", params={"q": "meditation", "country": "US"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `country` | enum | | The market, as an ISO 3166 country code. `US` `GB` `CA` `AU` `NZ` `IE` `DE` `FR` `IT` `ES` `NL` `BE` `AT` `CH` `SE` `NO` `DK` `FI` `PL` `PT` `CZ` `GR` `HU` `RO` `TR` `UA` `IL` `AE` `SA` `EG` `ZA` `NG` `KE` `IN` `PK` `ID` `MY` `SG` `TH` `VN` `PH` `JP` `KR` `TW` `HK` `MX` `BR` `AR` `CL` `CO` `PE` | | `cursor` | string | | The previous page's `cursor`. Pass it alone for the next page. | | `lang` | string | | Interface language. | | `limit` | integer 1–30 | | Results wanted (default 30, at most 30). More than one page is charged per page. | | `q` | string | | The query, search operators included. | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`AppsPage`](/docs/api-reference/serp/response-schema#appspage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "google-play", "query": "meditation", "outcome": "results", "country": "US", "apps": [ { "id": "com.spotlightsix.zentimerlite2", "name": "Insight Timer - Meditation App", "url": "https://play.google.com/store/apps/details?id=com.spotlightsix.zentimerlite2", "developer": {"name": "Insight Network Inc"}, "icon": "https://play-lh.googleusercontent.com/H7MMtGtHuKqoT73wpfXXuqBgufaw3k03jUG58cqwJ1KITPU6nY8c1cvdAYCNcZY7xRwKwi-G3W6yltje3VbMnfY", "screenshots": [ "https://play-lh.googleusercontent.com/jLCw4Aqw9zXkEqg4PTQY2qbhRBeitJCSdoSxFLGcWoRXHmlvIpooDGM0_e-qiC1bOHescBoXYc8MbSN7Rto2", "https://play-lh.googleusercontent.com/2F8LBZCzqXlm6d7VXOQfLxMmBTMODV7J8AzOxIYKTu5SUlp_OK1rCHW-jpq4whVMOn-74iv4OYJr6aWwFkSOOw" ], "description": "The world’s most popular wellness app.\n* Apps of the Year Winner - TIME magazine and Women's Health *\n* More time is spent on Insight Timer than on all other we…", "categories": ["Health & Fitness"], "rating": {"average": 4.6978846}, "price": {"currency": "USD", "amount": 0}, "inAppPurchases": true, "contentRating": "Everyone", "ext": { "inAppPriceRange": "$1.99 - $199.99 per item", "installs": "10,000,000+", "minInstalls": 10000000, "ratingText": "4.7", "headerImage": "https://play-lh.googleusercontent.com/HQk75PKY_glb6q9__cntlH06tyvIs-W2eRkC27BUokIzh4SmUPv-nZUNz30OLLf5S1JVZV7-A7bcR9gSlvnuJQ", "interactiveElements": "Users Interact, In-App Purchases", "descriptionHtml": "The world’s most popular wellness app.
* Apps of the Year Winner - TIME magazine and Women's Health *
* More time is spent on Insight Timer than on al…" }, "rank": 1, "country": "US" }, { "id": "meditofoundation.medito", "name": "Medito: Meditation & Sleep", "url": "https://play.google.com/store/apps/details?id=meditofoundation.medito", "developer": {"name": "Medito for Mindfulness, Meditation and Sleep"}, "icon": "https://play-lh.googleusercontent.com/3GKenq_HBUYKA__-5oSy9wU0n3wWUYvaqcDg-tu3Di9MwsXkyPD9Gu3pdx9M8WJ8hK4bsfxKSdNTtckeKycywg", "screenshots": [ "https://play-lh.googleusercontent.com/bQdN7TboplA9nw9bMVa-ahBtFh1tGG8Doa4gFO5AhdUAmfqmo2zsnbC4T0Sfq4ACsLQIMe2SUSkVrae9rXCK5w", "https://play-lh.googleusercontent.com/sNEmop6Cu57pqI55fH7xsK2_cPZWD60ad2srrdKm962kaabuUfOV12ZvTY7BOvEHZEjWooSb26qdJEzbSMZp6A" ], "description": "Free Meditation & Sleep Made Easy — Always Free.\n\nJoin 4 million+ people finding calm with Medito, your pocket‑size studio for guided meditation, mindfulness co…", "categories": ["Health & Fitness"], "rating": {"average": 4.780543}, "price": {"currency": "USD", "amount": 0}, "contentRating": "Everyone", "ext": { "installs": "1,000,000+", "minInstalls": 1000000, "ratingText": "4.8", "headerImage": "https://play-lh.googleusercontent.com/JbBFlKdHK2k9RtnL80bH81XGjwDnq2pgtI5uzLBB-zR7yZGCOJU3EydrCrouRlxrsWUobvY_1GXibfoAGZWj-BY", "contentRatingDescription": "Content is generally suitable for all ages. May contain minimal cartoon, fantasy or mild violence and/or infrequent use of mild language.", "descriptionHtml": "Free Meditation & Sleep Made Easy — Always Free.

Join 4 million+ people finding calm with Medito, your pocket‑size studio for guided meditation, mind…" }, "rank": 2, "country": "US" } ], "page": {"index": 1, "size": 21}, "fetchedAt": "2026-10-30T00:57:28.064Z" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. --- # App > Get an app's page from Google Play. Source: https://apinoa.com/en/docs-raw/api-reference/google-play/app ```http GET | POST /v1/google-play/app ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/google-play/app?id=com.strava&country=US" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ id: "com.strava", country: "US" }); const res = await fetch(`https://gateway.apinoa.com/v1/google-play/app?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/google-play/app", params={"id": "com.strava", "country": "US"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `country` | enum | | The market, as an ISO 3166 country code. `US` `GB` `CA` `AU` `NZ` `IE` `DE` `FR` `IT` `ES` `NL` `BE` `AT` `CH` `SE` `NO` `DK` `FI` `PL` `PT` `CZ` `GR` `HU` `RO` `TR` `UA` `IL` `AE` `SA` `EG` `ZA` `NG` `KE` `IN` `PK` `ID` `MY` `SG` `TH` `VN` `PH` `JP` `KR` `TW` `HK` `MX` `BR` `AR` `CL` `CO` `PE` | | `id` | string | | The app's Play id: its package name (`com.strava`). | | `lang` | string | | Interface language. | | `url` | string | | The app's Play link, instead of `id`. | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`App`](/docs/api-reference/serp/response-schema#app) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "id": "com.strava", "name": "Strava: Run, Bike, Walk", "url": "https://play.google.com/store/apps/details?id=com.strava", "developer": { "id": "4627506231732616211", "name": "Strava Inc.", "url": "https://play.google.com/store/apps/developer?id=Strava+Inc.", "website": "https://www.strava.com/", "email": "support@strava.com", "address": "181 Fremont St FL 27\nSan Francisco, CA 94105-2207\nUnited States" }, "icon": "https://play-lh.googleusercontent.com/J4LN2qH2PQkZ3sFQonz-HWYkd7M38BtEO4Grzh1Xn7L2J6NUILHP…", "screenshots": ["https://play-lh.googleusercontent.com/A6tzOmAEAZMirzO_o7ddyHn_100dCu9z5FeApDZkCTjqG2eX8dao…"], "summary": "Track your active life in one place and share the journey with friends.", "description": "Join over 180 million active people on Strava – the free app where building community meet…", "categories": ["Health & Fitness"], "rating": { "average": 4.5945516, "count": 1209062, "distribution": {"1": 5.55, "2": 1.46, "3": 2.7, "4": 8.58, "5": 81.72} }, "price": {"currency": "USD", "amount": 0}, "inAppPurchases": true, "contentRating": "Teen", "version": "487.11", "releasedAt": "2011-06-09T21:09:54.000Z", "updatedAt": "2026-10-27T17:54:25.000Z", "whatsNew": "Hi there. We fixed a couple bugs and made some performance improvements, so the app should…", "starCounts": {"1": 67059, "2": 17647, "3": 32636, "4": 103710, "5": 987987}, "editorsChoice": true, "related": [ { "id": "homeworkout.homeworkouts.noequipment", "name": "Home Workout - No Equipment", "url": "https://play.google.com/store/apps/details?id=homeworkout.homeworkouts.noequipment", "developer": {"name": "Leap Fitness Group"}, "icon": "https://play-lh.googleusercontent.com/NlQFS5pgo96dzbRuwZfkBhGf3ecKSGH5lRx0DSsmELYZXRYHlXrd…", "screenshots": ["https://play-lh.googleusercontent.com/Udi5jdaiqs8plPZwfnI5eH3FpjDDgK6wtQo-3POLE6um6Annm6vu…"], "description": "Build muscle, lose weight, gain strength, and increase height with Home Workouts through e…", "categories": ["Health & Fitness"], "rating": {"average": 4.860637}, "price": {"currency": "USD", "amount": 0}, "inAppPurchases": true, "contentRating": "Everyone", "ext": { "inAppPriceRange": "$2.99 - $69.99 per item", "installs": "100,000,000+", "minInstalls": 100000000, "ratingText": "4.9", "headerImage": "https://play-lh.googleusercontent.com/7dcnj4_NE2eeKT8_ZzbtyRFC52dHy5jrgzofe2XMG9tQ7tRC83uY…", "contentRatingDescription": "Content is generally suitable for all ages. May contain minimal cartoon, fantasy or mild v…", "descriptionHtml": "Build muscle, lose weight, gain strength, and increase height…" } } ], "privacyPolicyUrl": "https://www.strava.com/privacy", "chart": {"name": "top grossing health & fitness", "position": 4}, "ext": { "inAppPriceRange": "$2.99 - $249.99 per item", "installs": "100,000,000+", "minInstalls": 100000000, "ratingText": "4.6", "reviewCount": 34487, "ratingsByDevice": {"phone": 4.6145573, "tablet": 4.483731, "watch": 4.0507097, "chromebook": 4.21}, "installCount": 136896139, "installsShort": "100M+", "categoryId": "HEALTH_AND_FITNESS", "categoryIds": ["HEALTH_AND_FITNESS"], "developerContact": {"legalName": "Strava, Inc.", "email": "phonesupport@strava.com", "phone": "+1 415-320-7817"}, "interactiveElements": "Users Interact, Shares Location, In-App Purchases", "permissions": [{"group": "Identity", "permissions": ["find accounts on the device"]}], "dataSafety": [ { "statement": "This app may share these data types with third parties", "detail": "App info and performance and Device or other IDs" } ], "targetSdk": 36, "headerImage": "https://play-lh.googleusercontent.com/D7gInUs6uPbJEqpkODMRsL9v042OwdAkcjgdsiSAUFYolQkeRVfm…", "released": "Jun 9, 2011", "updated": "Oct 27, 2026", "descriptionHtml": "Join over 180 million active people on Strava – the free app where building community m…", "phoneRating": { "average": 4.6145573, "count": 1188432, "reviewCount": 33890, "starCounts": {"1": 61529, "2": 16191, "3": 30764, "4": 101801, "5": 978113} }, "events": [ { "title": "October 10k Challenge", "status": "Ends in 23h", "url": "https://play.google.com/store/apps/eventdetails/4831046910425965663", "image": "https://play-lh.googleusercontent.com/8C_VLv8U2TPVBHn5GlajOhsMd95L7JsBPifFNChZWvaJbeKZQ_Bc…" } ], "reviews": [ { "id": "a060af74-12c9-4359-a779-fe0560d54d96", "author": "Greg Gidden", "rating": 1, "body": "Used to work great, but after the recent update a couple weeks ago the app is no longer wo…", "date": "2025-07-20T15:30:54.000Z", "helpfulCount": 631, "images": [], "ext": { "authorAvatarUrl": "https://play-lh.googleusercontent.com/a-/ALV-UjXq0_JWMUg-Da6c9DfCCCKHYY1_ke_jR-xUroY0ZzdX2…", "authorId": "108049197622652298322", "appVersion": "419.12", "device": "phone" } } ] }, "country": "US" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 404 | `NOT_FOUND` | The app is not in this store's market. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - Pass the app's package name (`com.strava`), or its Play link as `url`. --- # Reviews > Get an app's reviews from Google Play. Source: https://apinoa.com/en/docs-raw/api-reference/google-play/reviews ```http GET | POST /v1/google-play/reviews ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/google-play/reviews?id=com.strava&country=US&sort=newest&limit=10" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ id: "com.strava", country: "US", sort: "newest", limit: "10" }); const res = await fetch(`https://gateway.apinoa.com/v1/google-play/reviews?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/google-play/reviews", params={"id": "com.strava", "country": "US", "sort": "newest", "limit": "10"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `country` | enum | | The market, as an ISO 3166 country code. `US` `GB` `CA` `AU` `NZ` `IE` `DE` `FR` `IT` `ES` `NL` `BE` `AT` `CH` `SE` `NO` `DK` `FI` `PL` `PT` `CZ` `GR` `HU` `RO` `TR` `UA` `IL` `AE` `SA` `EG` `ZA` `NG` `KE` `IN` `PK` `ID` `MY` `SG` `TH` `VN` `PH` `JP` `KR` `TW` `HK` `MX` `BR` `AR` `CL` `CO` `PE` | | `cursor` | string | | The previous page's `cursor`. Pass it alone for the next page. | | `device` | enum | | Reviews written on this kind of device (default phone). `phone` `tablet` `watch` `chromebook` `tv` `car` | | `id` | string | | The app's Play id: its package name (`com.strava`). | | `lang` | string | | Interface language. | | `limit` | integer 1–200 | | Results wanted (default 40, at most 200). More than one page is charged per page. | | `rating` | integer 1–5 | | Only reviews with this many stars (1-5). | | `sort` | enum | | Review order. `relevant` `newest` `highest` `lowest` | | `url` | string | | The app's Play link, instead of `id`. | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`AppReviewsPage`](/docs/api-reference/serp/response-schema#appreviewspage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "google-play", "appId": "com.strava", "sort": "newest", "country": "US", "page": {"index": 1, "size": 10}, "reviews": [ { "id": "525d1b9c-6ae9-4caf-9e64-b97d92a1ba7a", "author": "Ryan Oliver", "rating": 4, "body": "expensive", "date": "2026-10-29T00:57:18.000Z", "helpfulCount": 0, "images": [], "ext": { "authorAvatarUrl": "https://play-lh.googleusercontent.com/a/ACg8ocIWJhJWleii7ygul0I9hOi7_TsD8dZhdfuBs3IpQdXu-A4bMA=mo", "authorId": "115264893161167747303", "appVersion": "486.11", "device": "phone" } }, { "id": "a0b644e0-5d0c-4edc-b5ed-7f01f622d7cb", "author": "Yashika maayra Choudhary", "rating": 4, "body": "subscription is the bad else all good 🙌", "date": "2026-10-29T00:50:16.000Z", "helpfulCount": 0, "images": [], "ext": { "authorAvatarUrl": "https://play-lh.googleusercontent.com/a/ACg8ocLNkxYDolwPkpUyDO5nkv64QeZ9s6fhP9yfMyOs3ucO59dos80=mo", "authorId": "113477972146124328942", "appVersion": "486.11", "device": "phone" } } ], "cursor": "WkN_1HrvmhecZNG2rrdbx5weIWYO79AO2I7NN6ZpjZalfvHANgMvhooKLP5ZJfnBwvHwOehzDglpq5jMbzxuZ2P1wcEgwFWOR94mpo9l5a8_-DP_Rg-LvXESLvaVVWYtzuSB9UAkwl4G24l_vIG97vngjgIf2oNM…", "fetchedAt": "2026-10-30T00:57:31.869Z" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 404 | `NOT_FOUND` | The app is not in this store's market. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - Pass the app's package name, or its Play link as `url`. `rating` keeps one star level, and `device` picks the kind of device the reviews were written on. --- # App Store > Apps on Apple's App Store: search, each app's page, and its reviews. Source: https://apinoa.com/en/docs-raw/api-reference/app-store Apps on Apple's App Store: search, each app's page, and its reviews. **Markets:** `US` `GB` `CA` `AU` `NZ` `IE` `DE` `FR` `IT` `ES` `NL` `BE` `AT` `CH` `SE` `NO` `DK` `FI` `PL` `PT` `CZ` `GR` `HU` `RO` `TR` `UA` `IL` `AE` `SA` `EG` `ZA` `NG` `KE` `IN` `PK` `ID` `MY` `SG` `TH` `VN` `PH` `JP` `KR` `CN` `TW` `HK` `MX` `BR` `AR` `CL` `CO` `PE` (the first is the default) ## Operations | Operation | Endpoint | Returns | Price | |---|---|---|---| | [Search](/docs/api-reference/app-store/search) | `GET \| POST /v1/app-store/search` | `AppsPage` | $0.0012 | | [App](/docs/api-reference/app-store/app) | `GET \| POST /v1/app-store/app` | `App` | $0.0012 | | [Reviews](/docs/api-reference/app-store/reviews) | `GET \| POST /v1/app-store/reviews` | `AppReviewsPage` | $0.0012–$0.006 | --- # Search > Search the App Store for apps. Source: https://apinoa.com/en/docs-raw/api-reference/app-store/search ```http GET | POST /v1/app-store/search ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/app-store/search?q=meditation&country=US&limit=10" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ q: "meditation", country: "US", limit: "10" }); const res = await fetch(`https://gateway.apinoa.com/v1/app-store/search?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/app-store/search", params={"q": "meditation", "country": "US", "limit": "10"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `country` | enum | | The market, as an ISO 3166 country code. `US` `GB` `CA` `AU` `NZ` `IE` `DE` `FR` `IT` `ES` `NL` `BE` `AT` `CH` `SE` `NO` `DK` `FI` `PL` `PT` `CZ` `GR` `HU` `RO` `TR` `UA` `IL` `AE` `SA` `EG` `ZA` `NG` `KE` `IN` `PK` `ID` `MY` `SG` `TH` `VN` `PH` `JP` `KR` `CN` `TW` `HK` `MX` `BR` `AR` `CL` `CO` `PE` | | `cursor` | string | | The previous page's `cursor`. Pass it alone for the next page. | | `lang` | string | | Interface language. | | `limit` | integer 1–200 | | Results wanted (default 50, at most 200). More than one page is charged per page. | | `q` | string | | The query, search operators included. | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`AppsPage`](/docs/api-reference/serp/response-schema#appspage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "app-store", "query": "meditation", "outcome": "results", "country": "US", "apps": [ { "id": "337472899", "name": "Insight Timer: Meditate, Sleep", "url": "https://apps.apple.com/us/app/insight-timer-meditate-sleep/id337472899?uo=4", "developer": { "name": "Insight Network Inc", "id": "983080487", "url": "https://apps.apple.com/us/developer/insight-network-inc/id983080487?uo=4", "website": "http://www.insighttimer.com" }, "icon": "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/b7/68/07/b768071e-fb00-0d0f-f9d3-e0e427d85e4b/AppIcon-0-0-1x_U007epad-0-1-85-220.png/512x512bb.jpg", "screenshots": [ "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/9f/89/d3/9f89d364-4d66-e14f-7cff-5be7e3a6445a/0_APP_IPHONE_55_0.png/392x696bb.png", "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/79/de/a5/79dea510-d411-3746-a506-82794b4fcd37/1_APP_IPHONE_55_1.png/392x696bb.png" ], "description": "The world’s most popular wellness app.\n\n* Apps of the Year Winner - TIME magazine and Women's Health *\n* More time is spent on Insight Timer than on all other w…", "categories": ["Health & Fitness", "Lifestyle"], "rating": {"average": 4.89513, "count": 448546}, "price": {"currency": "USD", "amount": 0}, "contentRating": "12+", "version": "20.40.0", "requires": "Requires iOS 15.0 or later", "releasedAt": "2009-11-05T18:55:12Z", "updatedAt": "2026-10-25T08:30:36Z", "whatsNew": "The world's largest free mental health app just got even bigger! In the last week we've added 925 new free meditations for you to enjoy, plus 500 new free sleep…", "ext": { "bundleId": "com.spotlightsix.zentimer", "languages": ["NL"], "sellerName": "Insight Network Inc", "sizeBytes": 241229824, "formattedPrice": "Free", "icons": { "60": "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/b7/68/07/b768071e-fb00-0d0f-f9d3-e0e427d85e4b/AppIcon-0-0-1x_U007epad-0-1-85-220.png/60x60bb.jpg", "100": "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/b7/68/07/b768071e-fb00-0d0f-f9d3-e0e427d85e4b/AppIcon-0-0-1x_U007epad-0-1-85-220.png/100x100bb.jpg", "512": "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/b7/68/07/b768071e-fb00-0d0f-f9d3-e0e427d85e4b/AppIcon-0-0-1x_U007epad-0-1-85-220.png/512x512bb.jpg" }, "ipadScreenshots": [ "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/0d/63/ee/0d63eeb3-02e9-d06b-a73b-291a6ae634a3/0_APP_IPAD_PRO_129_0.png/576x768bb.png" ], "genreIds": ["6013"], "primaryGenre": {"id": "6013", "name": "Health & Fitness"}, "contentAdvisoryRating": "12+", "advisories": ["Infrequent/Mild Alcohol, Tobacco, or Drug Use or References"], "currentVersionRating": {"average": 4.89513, "count": 448546}, "minimumOsVersion": "15.0", "supportedDevices": ["iPhone5s-iPhone5s"], "features": ["iosUniversal"], "isGameCenterEnabled": false, "isVppDeviceBasedLicensingEnabled": true, "kind": "software" }, "rank": 1, "country": "US" }, { "id": "493145008", "name": "Headspace: Sleep & Meditation", "url": "https://apps.apple.com/us/app/headspace-sleep-meditation/id493145008?uo=4", "developer": { "name": "Headspace Inc.", "id": "384434796", "url": "https://apps.apple.com/us/developer/headspace-inc/id384434796?uo=4", "website": "https://www.headspace.com/" }, "icon": "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/ec/20/88/ec208862-22e5-ef28-fd52-eff6151054fe/AppIcon-0-0-1x_U007epad-0-1-85-220.png/512x512bb.jpg", "screenshots": [ "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/72/5a/ec/725aec3b-ce7e-04e5-3fb2-c3eddd568959/6edb2838-55b4-46d0-b166-358beae09bf2_1242x2208bb__U002…", "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/17/aa/29/17aa2961-e804-11d8-d196-58c486554ffe/7cfe3748-bd48-4629-8716-8735363c19b2_1242x2208bb__U002…" ], "description": "Welcome to Headspace, your expert-led guide to mental health, mindfulness, and meditation. Whether you're navigating stress, anxiety, sleep trouble, or life’s u…", "categories": ["Health & Fitness", "Productivity"], "rating": {"average": 4.84216, "count": 973755}, "price": {"currency": "USD", "amount": 0}, "contentRating": "12+", "version": "8.38.1", "requires": "Requires iOS 15.6 or later", "releasedAt": "2012-02-02T18:57:49Z", "updatedAt": "2026-10-28T15:55:23Z", "whatsNew": "Thanks for using Headspace! This update includes bug fixes and performance improvements.\n\nAs always, if you run into any troubles, let us know at help@headspace…", "ext": { "bundleId": "com.getsomeheadspace.headspace", "languages": ["EN"], "sellerName": "Headspace Inc.", "sizeBytes": 451194880, "formattedPrice": "Free", "icons": { "60": "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/ec/20/88/ec208862-22e5-ef28-fd52-eff6151054fe/AppIcon-0-0-1x_U007epad-0-1-85-220.png/60x60bb.jpg", "100": "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/ec/20/88/ec208862-22e5-ef28-fd52-eff6151054fe/AppIcon-0-0-1x_U007epad-0-1-85-220.png/100x100bb.jpg", "512": "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/ec/20/88/ec208862-22e5-ef28-fd52-eff6151054fe/AppIcon-0-0-1x_U007epad-0-1-85-220.png/512x512bb.jpg" }, "ipadScreenshots": [ "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/33/c1/e8/33c1e8bd-22f2-501b-3d45-b529bb7159f5/1.png/576x768bb.png" ], "genreIds": ["6013"], "primaryGenre": {"id": "6013", "name": "Health & Fitness"}, "contentAdvisoryRating": "12+", "currentVersionRating": {"average": 4.84216, "count": 973755}, "minimumOsVersion": "15.6", "supportedDevices": ["iPhone5s-iPhone5s"], "features": ["iosUniversal"], "isGameCenterEnabled": false, "isVppDeviceBasedLicensingEnabled": true, "kind": "software" }, "rank": 2, "country": "US" } ], "page": {"index": 1, "size": 9}, "cursor": "Rl3-aEioiw8jPXTAto6_y35Jx3GMcueBNp5H67_hEE-LLcoHOLkRJZHNmJ8MHqWIVY8iJEvRARMIDnhl2g-NjcqTABxE60OMknPnEWoXagyBpGU6jdqpmklxtd7LcrZEiSFW17vPwmVY1LvT1HqPuHqw_2M2Zfw_…", "fetchedAt": "2026-10-30T00:57:25.431Z" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. --- # App > Get an app's page from the App Store. Source: https://apinoa.com/en/docs-raw/api-reference/app-store/app ```http GET | POST /v1/app-store/app ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/app-store/app?id=324684580&country=US" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ id: "324684580", country: "US" }); const res = await fetch(`https://gateway.apinoa.com/v1/app-store/app?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/app-store/app", params={"id": "324684580", "country": "US"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `country` | enum | | The market, as an ISO 3166 country code. `US` `GB` `CA` `AU` `NZ` `IE` `DE` `FR` `IT` `ES` `NL` `BE` `AT` `CH` `SE` `NO` `DK` `FI` `PL` `PT` `CZ` `GR` `HU` `RO` `TR` `UA` `IL` `AE` `SA` `EG` `ZA` `NG` `KE` `IN` `PK` `ID` `MY` `SG` `TH` `VN` `PH` `JP` `KR` `CN` `TW` `HK` `MX` `BR` `AR` `CL` `CO` `PE` | | `id` | string | | The app's App Store id: the number in its link (`…/id426826309`). | | `lang` | string | | Interface language. | | `url` | string | | The app's App Store link, instead of `id`. | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`App`](/docs/api-reference/serp/response-schema#app) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "id": "324684580", "name": "Spotify: Music and Podcasts", "url": "https://apps.apple.com/us/app/spotify-music-and-podcasts/id324684580", "developer": { "id": "324684583", "name": "Spotify", "url": "https://apps.apple.com/us/developer/spotify/id324684583", "website": "https://www.spotify.com/" }, "icon": "https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/8b/f2/6a/8bf26ab…", "screenshots": ["https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/f3/ce/05/f…"], "summary": "Songs, Playlists & Audiobooks", "description": "With the Spotify app, you can explore an extensive library of music an…", "categories": ["Music"], "rating": { "average": 4.8, "count": 42829788, "distribution": {"1": 2.21, "2": 0.88, "3": 2.23, "4": 7.02, "5": 87.66} }, "price": {"currency": "USD", "amount": 0}, "inAppPurchases": false, "contentRating": "13+", "version": "9.1.94", "requires": "Requires iOS 16.1 and watchOS 10.0 or later. Compatible with iPhone, i…", "releasedAt": "2011-07-14", "updatedAt": "2026-10-23T17:59:53Z", "whatsNew": "We’re always making changes and improvements to Spotify. To make sure…", "starCounts": {"1": 948553, "2": 376136, "3": 954391, "4": 3004629, "5": 37546079}, "related": [ { "id": "912390687", "name": "TREBEL Music - Download Songs", "url": "https://apps.apple.com/us/app/trebel-music-download-songs/id912390687", "developer": { "id": "912390690", "name": "M&M Media, Inc.", "url": "https://apps.apple.com/us/developer/m-m-media-inc/id912390690", "website": "http://www.trebel.io" }, "icon": "https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/ba/59/03/ba5903b…", "screenshots": ["https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/f7/5e/e0/f…"], "summary": "AI, Offline Music & Mp3 Player", "description": "TREBEL Music is a free music app that allows you to listen to your fav…", "categories": ["Music"], "rating": { "average": 4.7, "count": 187133, "distribution": {"1": 2.37, "2": 1.48, "3": 3.71, "4": 9.77, "5": 82.67} }, "price": {"currency": "USD", "amount": 0}, "inAppPurchases": true, "contentRating": "13+", "version": "7.9.8", "releasedAt": "2014-11-03", "updatedAt": "2026-10-27T19:53:41Z", "whatsNew": "This update includes bug fixes and performance improvements to make th…", "starCounts": {"1": 4428, "2": 2773, "3": 6940, "4": 18281, "5": 154711}, "ext": { "bundleId": "com.mmm.projectcarmen", "ratingLabel": "4.7 stars", "sizeBytes": 236870656, "offers": [{"type": "get", "price": 0, "currency": "USD", "priceFormatted": "$0.00", "sizeBytes": 236870656}], "genres": [ { "id": "6011", "name": "Music", "url": "https://itunes.apple.com/us/genre/id6011", "parentId": "36", "parentName": "App Store" } ], "chart": { "chart": "top-free", "genre": "Music", "genreId": "6011", "position": 82, "url": "https://apps.apple.com/us/charts/iphone/music-apps/6011" }, "advisories": ["Infrequent/Mild Alcohol, Tobacco, or Drug Use or References"], "legacyContentRating": "12+", "ageRating": { "levels": [{"level": "Infrequent", "kind": "INFREQUENT", "descriptors": ["Profanity or Crude Humor"]}] }, "privacyPolicyUrl": "https://www.trebel.io/web/privacy", "supportUrl": "http://www.trebel.io", "minimumOsVersion": "15.6", "minimumMacOsVersion": "12.5", "minimumVisionOsVersion": "1.0", "requirements": [{"device": "iPad", "requires": "Requires iPadOS 15.6 or later."}], "requiredCapabilities": "arm64 armv7", "requiredCapabilitiesVisionOs": "arm64 armv7", "artwork": { "brandLogo": "https://is1-ssl.mzstatic.com/image/thumb/Features116/v4/e3/03/3c/e3033…", "contentIconTrimmed": "https://is1-ssl.mzstatic.com/image/thumb/Features116/v4/31/1e/55/311e5…", "contentIconTrimmedMonochrome": "https://is1-ssl.mzstatic.com/image/thumb/Features126/v4/14/5d/a1/145da…", "subscriptionHero": "https://is1-ssl.mzstatic.com/image/thumb/Features125/v4/77/ea/60/77ea6…" }, "deviceFamilies": ["iphone"], "screenshotsByType": { "ipadPro": ["https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/7a/48/34/7…"], "ipadPro_2018": ["https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/11/8b/d4/1…"], "iphone6+": ["https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/f7/5e/e0/f…"], "iphone_6_5": ["https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/01/66/af/0…"], "iphone_d74": ["https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/9e/3d/3f/9…"] }, "versionHistory": [ { "version": "7.9.8", "date": "2026-10-27T19:53:41Z", "notes": "This update includes bug fixes and performance improvements to make th…" } ], "distribution": "APP_STORE", "flags": { "isPreorder": false, "supportsArcade": false, "reviewsRestricted": false, "isMacCompatible": false, "isAppleWatchSupported": false, "isStandaloneForWatchOS": false, "isVisionOsCompatible": true, "requiresGameController": false, "supportsSharePlay": false, "hasMessagesExtension": false, "hasSafariExtension": false, "isHiddenFromSpringboard": false, "requires32bit": false, "is32bitOnlyForWatchOS": false, "isDeliveredInIOSAppForWatchOS": false, "isStandaloneWithCompanionForWatchOS": false, "isFirstPartyHideableApp": false, "supportsStreamlinedBuy": true }, "privacy": { "sections": [ { "type": "Data Used to Track You", "description": "The following data may be used to track you across apps and websites o…", "categories": [{"category": "Identifiers", "data": ["Device ID"]}] } ] } } } ], "moreByDeveloper": [ { "id": "1056182234", "name": "Spotify for Creators", "url": "https://apps.apple.com/us/app/spotify-for-creators/id1056182234", "developer": { "id": "324684583", "name": "Spotify", "url": "https://apps.apple.com/us/developer/spotify/id324684583", "website": "https://pod.spoti.fi/34AfucUF3xb" }, "icon": "https://is1-ssl.mzstatic.com/image/thumb/Purple221/v4/3b/2c/21/3b2c21b…", "screenshots": ["https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/b4/1b/62/b…"], "summary": "Manage and grow your podcast", "description": "The official app from Spotify that helps creators grow, monetize, and…", "categories": ["News"], "rating": { "average": 4.8, "count": 117751, "distribution": {"1": 1.14, "2": 0.54, "3": 1.7, "4": 6.07, "5": 90.55} }, "price": {"currency": "USD", "amount": 0}, "inAppPurchases": false, "contentRating": "13+", "version": "7.122.0", "releasedAt": "2015-12-21", "updatedAt": "2026-10-20T01:47:52Z", "whatsNew": "You can use the Spotify for Creators (formerly Spotify for Podcasters)…", "starCounts": {"1": 1339, "2": 634, "3": 1999, "4": 7150, "5": 106629}, "ext": { "bundleId": "com.anchorfminc.Anchor", "ratingLabel": "4.8 stars", "sizeBytes": 67548160, "offers": [{"type": "get", "price": 0, "currency": "USD", "priceFormatted": "$0.00", "sizeBytes": 67548160}], "genres": [ { "id": "6009", "name": "News", "url": "https://itunes.apple.com/us/genre/id6009", "parentId": "36", "parentName": "App Store" } ], "chart": { "chart": "top-free", "genre": "News", "genreId": "6009", "position": 55, "url": "https://apps.apple.com/us/charts/iphone/news-apps/6009" }, "legacyContentRating": "12+", "editorialNotes": { "tagline": "All-in-one podcast creator", "short": "Record, manage and distribute your podcast easily from one place.", "standard": "Adding your voice with a podcast is now easier than ever. Record your…" }, "privacyPolicyUrl": "https://podcasters.spotify.com/pod/privacy", "supportUrl": "https://support.spotify.com/us/creators", "minimumOsVersion": "18.0", "minimumMacOsVersion": "15.0", "minimumVisionOsVersion": "2.0", "requirements": [{"device": "iPad", "requires": "Requires iPadOS 18.0 or later."}], "requiredCapabilities": "arm64 armv7", "requiredCapabilitiesVisionOs": "arm64 armv7", "artwork": { "brandLogo": "https://is1-ssl.mzstatic.com/image/thumb/Features116/v4/19/3e/cd/193ec…", "contentIconTrimmed": "https://is1-ssl.mzstatic.com/image/thumb/Features116/v4/54/2e/67/542e6…", "contentIconTrimmedMonochrome": "https://is1-ssl.mzstatic.com/image/thumb/Features126/v4/9b/2f/2c/9b2f2…", "storeFlowcase": "https://is1-ssl.mzstatic.com/image/thumb/Features111/v4/73/b1/33/73b13…", "subscriptionHero": "https://is1-ssl.mzstatic.com/image/thumb/Features62/v4/8f/f3/48/8ff348…" }, "deviceFamilies": ["iphone"], "screenshotsByType": { "ipadPro_2018": ["https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/ea/0a/66/e…"], "iphone_d74": ["https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/b4/1b/62/b…"] }, "versionHistory": [ { "version": "7.122.0", "date": "2026-10-20T01:47:52Z", "notes": "You can use the Spotify for Creators (formerly Spotify for Podcasters)…" } ], "distribution": "APP_STORE", "flags": { "isPreorder": false, "supportsArcade": false, "reviewsRestricted": false, "isMacCompatible": false, "isAppleWatchSupported": false, "isStandaloneForWatchOS": false, "isVisionOsCompatible": true, "requiresGameController": false, "supportsSharePlay": false, "hasMessagesExtension": false, "hasSafariExtension": false, "isHiddenFromSpringboard": false, "requires32bit": false, "is32bitOnlyForWatchOS": false, "isDeliveredInIOSAppForWatchOS": false, "isStandaloneWithCompanionForWatchOS": false, "isFirstPartyHideableApp": false, "supportsStreamlinedBuy": true }, "privacy": { "sections": [ { "type": "Data Used to Track You", "description": "The following data may be used to track you across apps and websites o…", "categories": [{"category": "Contact Info", "data": ["Email Address"]}] } ] } } } ], "privacyPolicyUrl": "http://www.spotify.com/legal/privacy-policy/", "chart": {"name": "top-free", "position": 1}, "ext": { "bundleId": "com.spotify.client", "languages": ["English"], "ratingLabel": "4.8 stars", "seller": "Spotify", "sellerLabel": "Seller", "sizeBytes": 325112832, "offers": [{"type": "get", "price": 0, "currency": "USD", "priceFormatted": "$0.00", "sizeBytes": 325112832}], "genres": [ { "id": "6011", "name": "Music", "url": "https://itunes.apple.com/us/genre/id6011", "parentId": "36", "parentName": "App Store" } ], "advisories": ["Infrequent/Mild Alcohol, Tobacco, or Drug Use or References"], "legacyContentRating": "12+", "ageRating": { "description": "This app is rated 13+ with content restrictions.\n\nSome content may be…", "levels": [{"level": "In-App Controls", "kind": "IAC", "descriptors": ["Age Assurance"]}] }, "copyright": "© 2008–2026 Spotify Ltd.", "supportUrl": "https://support.spotify.com/", "minimumOsVersion": "16.1", "minimumMacOsVersion": "13.0", "minimumWatchOsVersion": "10.0", "minimumVisionOsVersion": "1.0", "requirements": [{"device": "iPad", "requires": "Requires iPadOS 16.1 or later."}], "requiredCapabilities": "arm64", "requiredCapabilitiesVisionOs": "arm64", "externalVersionId": "893512212", "artwork": { "circular": "https://is1-ssl.mzstatic.com/image/thumb/Purple211/v4/24/d4/a6/24d4a66…", "circularIcon": "https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/5c/49/a2/5…", "brandLogo": "https://is1-ssl.mzstatic.com/image/thumb/Features116/v4/e3/03/3c/e3033…", "contentIconTrimmed": "https://is1-ssl.mzstatic.com/image/thumb/Features116/v4/31/1e/55/311e5…", "contentIconTrimmedMonochrome": "https://is1-ssl.mzstatic.com/image/thumb/Features126/v4/14/5d/a1/145da…" }, "deviceFamilies": ["tvos"], "locales": ["en-US"], "screenshotsByType": { "appleWatch_2021": ["https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/55/7e/e5/5…"], "ipadPro": ["https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/31/15/15/3…"], "ipadPro_2018": ["https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/c4/29/71/c…"], "iphone6+": ["https://is1-ssl.mzstatic.com/image/thumb/PurpleSource211/v4/f3/ce/05/f…"], "iphone_6_5": ["https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/ee/75/d1/e…"], "iphone_d74": ["https://is1-ssl.mzstatic.com/image/thumb/PurpleSource221/v4/fd/04/70/f…"] }, "versionHistory": [ { "version": "9.1.94", "date": "2026-10-23T17:59:53Z", "notes": "We’re always making changes and improvements to Spotify. To make sure…" } ], "watchBundleId": "com.spotify.client.watchkitapp", "distribution": "APP_STORE", "familyShareSince": "0001-04-23T00:00:00Z", "flags": { "hasEula": false, "isPreorder": false, "supportsArcade": false, "reviewsRestricted": false, "usesLocationInBackground": false, "isMacCompatible": false, "isGameCenterEnabled": false, "isSiriSupported": true, "isAppleWatchSupported": true, "isStandaloneForWatchOS": false, "isVisionOsCompatible": false, "supportsGameController": false, "requiresGameController": false, "supportsSharePlay": true, "supportsPassbook": false, "hasMessagesExtension": false, "hasSafariExtension": false, "hasFamilyShareableInAppPurchases": false, "hasPrivacyPolicyText": true, "is32bitOnly": false, "isHiddenFromSpringboard": false, "requires32bit": false, "is32bitOnlyForWatchOS": false, "isDeliveredInIOSAppForWatchOS": true, "isStandaloneWithCompanionForWatchOS": false, "isFirstPartyHideableApp": false, "supportsStreamlinedBuy": true }, "privacy": { "sections": [ { "type": "Data Used to Track You", "description": "The following data may be used to track you across apps and websites o…", "categories": [{"category": "Contact Info", "data": ["Email Address"]}] } ] }, "chartGenre": "Music", "chartGenreId": "6011", "chartUrl": "https://apps.apple.com/us/charts/iphone/music-apps/6011", "tags": [ { "id": "6011", "name": "Music", "url": "https://itunes.apple.com/us/genre/id6011", "parentId": "36", "parentName": "App Store" } ] }, "country": "US", "lang": "en-US" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 404 | `NOT_FOUND` | The app is not in this store's market. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - Pass the app's numeric id (the number in its link, `…/id324684580`), or its App Store link as `url`. --- # Reviews > Get an app's reviews from the App Store. Source: https://apinoa.com/en/docs-raw/api-reference/app-store/reviews ```http GET | POST /v1/app-store/reviews ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/app-store/reviews?id=324684580&country=US&sort=newest&limit=10" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ id: "324684580", country: "US", sort: "newest", limit: "10" }); const res = await fetch(`https://gateway.apinoa.com/v1/app-store/reviews?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/app-store/reviews", params={"id": "324684580", "country": "US", "sort": "newest", "limit": "10"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `country` | enum | | The market, as an ISO 3166 country code. `US` `GB` `CA` `AU` `NZ` `IE` `DE` `FR` `IT` `ES` `NL` `BE` `AT` `CH` `SE` `NO` `DK` `FI` `PL` `PT` `CZ` `GR` `HU` `RO` `TR` `UA` `IL` `AE` `SA` `EG` `ZA` `NG` `KE` `IN` `PK` `ID` `MY` `SG` `TH` `VN` `PH` `JP` `KR` `CN` `TW` `HK` `MX` `BR` `AR` `CL` `CO` `PE` | | `cursor` | string | | The previous page's `cursor`. Pass it alone for the next page. | | `id` | string | | The app's App Store id: the number in its link (`…/id426826309`). | | `lang` | string | | Interface language. | | `limit` | integer 1–100 | | Results wanted (default 20, at most 100). More than one page is charged per page. | | `sort` | enum | | Review order. `relevant` `newest` `highest` `lowest` | | `url` | string | | The app's App Store link, instead of `id`. | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`AppReviewsPage`](/docs/api-reference/serp/response-schema#appreviewspage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "app-store", "appId": "324684580", "sort": "newest", "country": "US", "lang": "en-US", "page": {"index": 1, "size": 10}, "reviews": [ { "id": "14721777235", "author": "Austin’s Review 1.1", "rating": 5, "title": "Review", "body": "It’s great stop asking", "date": "2026-10-28T13:46:45Z", "images": [], "ext": {"edited": false} }, { "id": "14721750538", "author": "Simmmmmmmmmmms", "rating": 1, "title": "Fix app", "body": "The app has been so horrible this past month. Issues with CarPlay, it freezes loading the home page, I always have to delete and reinstall just to make it work…", "date": "2026-10-28T13:39:15Z", "images": [], "ext": {"edited": false} } ], "cursor": "7eD3X9M1aKy9J_HywpfxL3WzYzxInTVvEOH-HCYmqXYZkejFy9J7umNx7C0ur-7E80ae0zDTqiweIbEGVD3ZR607BDy5qYmmdOyteewmAsbNGsb6v71HVZdnhYRRFkm1t8DL93VJVwf1k_E8Qn6pnLdKC3SEakTL…", "fetchedAt": "2026-10-30T00:57:27.221Z" } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_CURSOR` | The `cursor` is not one this operation returned. Start again without it. | | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 404 | `NOT_FOUND` | The app is not in this store's market. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call, plus $0.0012 for each extra call it makes — at most 4 more, so $0.006 in total. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - Pass the app's numeric id, or its App Store link as `url`. - `limit` above one page reads further pages, one unit each. --- # Google Trends > Google Trends: interest over time and by region for up to five terms, related topics and queries, and what is trending now. Source: https://apinoa.com/en/docs-raw/api-reference/google-trends Google Trends: interest over time and by region for up to five terms, related topics and queries, and what is trending now. **Markets:** every country Trends covers; without `country`, worldwide. ## Operations | Operation | Endpoint | Returns | Price | |---|---|---|---| | [Explore](/docs/api-reference/google-trends/explore) | `GET \| POST /v1/google-trends/explore` | `TrendsExplore` | $0.0012 | | [Trending](/docs/api-reference/google-trends/trending) | `GET \| POST /v1/google-trends/trending` | `TrendingPage` | $0.0012–$0.0024 | --- # Explore > Compare up to five search terms on Google Trends: interest over time and by region, and related topics and queries. Source: https://apinoa.com/en/docs-raw/api-reference/google-trends/explore ```http GET | POST /v1/google-trends/explore ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/google-trends/explore?terms=chatgpt,gemini&country=US&timeRange=month" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ terms: "chatgpt,gemini", country: "US", timeRange: "month" }); const res = await fetch(`https://gateway.apinoa.com/v1/google-trends/explore?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/google-trends/explore", params={"terms": "chatgpt,gemini", "country": "US", "timeRange": "month"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `terms` | string | yes | Up to five search terms to compare, separated by commas. | | `category` | integer ≥ 0 | | A Trends category id, to measure the terms within it (0 = all categories). | | `country` | enum | | The country, as an ISO 3166 code. Absent: worldwide. `AD` `AE` `AF` `AG` `AI` `AL` `AM` `AO` `AQ` `AR` `AS` `AT` `AU` `AW` `AX` `AZ` `BA` `BB` `BD` `BE` `BF` `BG` `BH` `BI` `BJ` `BL` `BM` `BN` `BO` `BQ` `BR` `BS` `BT` `BV` `BW` `BY` `BZ` `CA` `CC` `CD` `CF` `CG` `CH` `CI` `CK` `CL` `CM` `CN` `CO` `CR` `CU` `CV` `CW` `CX` `CY` `CZ` `DE` `DJ` `DK` `DM` `DO` `DZ` `EC` `EE` `EG` `EH` `ER` `ES` `ET` `FI` `FJ` `FK` `FM` `FO` `FR` `GA` `GB` `GD` `GE` `GF` `GG` `GH` `GI` `GL` `GM` `GN` `GP` `GQ` `GR` `GS` `GT` `GU` `GW` `GY` `HK` `HM` `HN` `HR` `HT` `HU` `ID` `IE` `IL` `IM` `IN` `IO` `IQ` `IR` `IS` `IT` `JE` `JM` `JO` `JP` `KE` `KG` `KH` `KI` `KM` `KN` `KP` `KR` `KW` `KY` `KZ` `LA` `LB` `LC` `LI` `LK` `LR` `LS` `LT` `LU` `LV` `LY` `MA` `MC` `MD` `ME` `MF` `MG` `MH` `MK` `ML` `MM` `MN` `MO` `MP` `MQ` `MR` `MS` `MT` `MU` `MV` `MW` `MX` `MY` `MZ` `NA` `NC` `NE` `NF` `NG` `NI` `NL` `NO` `NP` `NR` `NU` `NZ` `OM` `PA` `PE` `PF` `PG` `PH` `PK` `PL` `PM` `PN` `PR` `PS` `PT` `PW` `PY` `QA` `RE` `RO` `RS` `RU` `RW` `SA` `SB` `SC` `SD` `SE` `SG` `SH` `SI` `SJ` `SK` `SL` `SM` `SN` `SO` `SR` `SS` `ST` `SV` `SX` `SY` `SZ` `TC` `TD` `TF` `TG` `TH` `TJ` `TK` `TL` `TM` `TN` `TO` `TR` `TT` `TV` `TW` `TZ` `UA` `UG` `UM` `US` `UY` `UZ` `VA` `VC` `VE` `VG` `VI` `VN` `VU` `WF` `WS` `XK` `YE` `YT` `ZA` `ZM` `ZW` | | `from` | string | | A custom period's first day (`YYYY-MM-DD`), or hour within the past week (`YYYY-MM-DDTHH`), with `to`. | | `lang` | string | | Interface language: the language of topic names and labels (`en`, `pt-BR`). | | `lowVolume` | enum \| boolean | | Include regions with low search volume in interest by region. | | `property` | enum | | Which Google search: web (default), images, news, shopping or youtube. `web` `images` `news` `shopping` `youtube` | | `resolution` | enum | | Interest by region by country, region, metro (US only) or city. Default: the next level below the place asked. `country` `region` `metro` `city` | | `subregion` | string | | A state, province or US metro inside `country` (`US-CA`, `US-CA-807`), instead of the whole country. | | `timeRange` | enum | | The period: the past hour, 4 hours, day, week (7 days), month, quarter (3 months), year (12 months, the default), 5 years, or `all` (since 2004). `hour` `4hours` `day` `week` `month` `quarter` `year` `5years` `all` | | `to` | string | | A custom period's last day (`YYYY-MM-DD`) or hour (`YYYY-MM-DDTHH`), with `from`. | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`TrendsExplore`](/docs/api-reference/serp/response-schema#trendsexplore) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "google-trends", "terms": ["chatgpt", "gemini"], "country": "US", "timeRange": "month", "interestOverTime": { "points": [{"date": "2026-09-30", "values": [90]}, {"date": "2026-10-01", "values": [87]}], "averages": [82, 36] }, "interestByRegion": { "resolution": "region", "measure": "share", "regions": [ {"code": "US-CA", "name": "California", "values": [69]}, {"code": "US-NJ", "name": "New Jersey", "values": [71]} ] }, "related": [ { "term": "chatgpt", "queries": { "top": [ { "title": "what is chatgpt", "url": "https://trends.google.com/trends/explore?q=what+is+chatgpt&date=today+1-m&geo=US", "value": 100 } ], "rising": [ { "title": "david rosenthal chatgpt complaint", "url": "https://trends.google.com/trends/explore?q=david+rosenthal+chatgpt+complaint&date=today+1-m&geo=US", "growth": "+1,150%", "growthValue": 1150 } ] } }, { "term": "gemini", "queries": { "top": [ { "title": "gemini google", "url": "https://trends.google.com/trends/explore?q=gemini+google&date=today+1-m&geo=US", "value": 100 } ], "rising": [ { "title": "gemini 4 argon", "url": "https://trends.google.com/trends/explore?q=gemini+4+argon&date=today+1-m&geo=US", "growth": "Breakout", "growthValue": 23100 } ] } } ], "fetchedAt": "2026-10-30T01:04:54.914Z", "ext": { "keywords": [ {"term": "chatgpt", "name": "chatgpt", "type": "Search term"}, {"term": "gemini", "name": "gemini", "type": "Search term"} ], "period": {"from": "2026-09-30", "to": "2026-10-30"}, "periodLabel": "Past 30 days", "interval": "day", "risingComparedWith": {"from": "2026-08-30", "to": "2026-09-29"} } } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - Values are relative interest from 0 to 100, measured against the busiest point of the request. A `0` is a value Trends stated. - For a custom period, pass `from` and `to` instead of `timeRange`. --- # Trending > Get what is trending on Google in a country right now. Source: https://apinoa.com/en/docs-raw/api-reference/google-trends/trending ```http GET | POST /v1/google-trends/trending ``` Send parameters as a query string with `GET`, or as a JSON body with `POST`. Both are equivalent. ## Request ```bash tab="cURL" curl "https://gateway.apinoa.com/v1/google-trends/trending?country=US" \ -H "x-api-key: $APINOA_API_KEY" ``` ```js tab="JavaScript" const params = new URLSearchParams({ country: "US" }); const res = await fetch(`https://gateway.apinoa.com/v1/google-trends/trending?${params}`, { headers: { "x-api-key": process.env.APINOA_API_KEY }, }); const { success, data, error } = await res.json(); ``` ```python tab="Python" import os import requests res = requests.get( "https://gateway.apinoa.com/v1/google-trends/trending", params={"country": "US"}, headers={"x-api-key": os.environ["APINOA_API_KEY"]}, ) body = res.json() ``` ## Parameters | Parameter | Type | Required | Notes | |---|---|---|---| | `country` | enum | yes | The country, as an ISO 3166 code. `AE` `AL` `AM` `AO` `AR` `AT` `AU` `AZ` `BA` `BD` `BE` `BF` `BG` `BH` `BJ` `BO` `BR` `BY` `CA` `CD` `CH` `CI` `CL` `CM` `CO` `CR` `CU` `CY` `CZ` `DE` `DK` `DO` `DZ` `EC` `EE` `EG` `ES` `ET` `FI` `FR` `GB` `GE` `GH` `GR` `GT` `HK` `HN` `HR` `HT` `HU` `ID` `IE` `IL` `IN` `IQ` `IR` `IT` `JM` `JO` `JP` `KE` `KG` `KH` `KR` `KW` `KZ` `LB` `LK` `LT` `LV` `LY` `MA` `MD` `MK` `ML` `MM` `MX` `MY` `MZ` `NG` `NI` `NL` `NO` `NP` `NZ` `OM` `PA` `PE` `PH` `PK` `PL` `PR` `PS` `PT` `PY` `QA` `RO` `RS` `RU` `SA` `SE` `SG` `SI` `SK` `SN` `SV` `SY` `TH` `TM` `TN` `TR` `TT` `TW` `TZ` `UA` `UG` `US` `UY` `UZ` `VE` `VN` `YE` `ZA` `ZM` `ZW` | | `category` | integer | | Only trends in this category (trending now's own 1-20; 0 = all). | | `include` | enum | | `articles`: every news article Trends holds for each trend, for the first 300 trends (charged as one more unit). `articles` | | `lang` | string | | Interface language: the language of topic names and labels (`en`, `pt-BR`). | | `subregion` | string | | A state or province inside `country` (`US-CA`). | | `window` | enum | | The period: past 4 hours, 24 hours (default), 48 hours or 7 days. `4h` `24h` `48h` `7d` | The same parameters, and every response type, are in the OpenAPI document: https://apinoa.com/openapi.json ## Response Returns [`TrendingPage`](/docs/api-reference/serp/response-schema#trendingpage) in `data`. A real response, shortened: arrays keep their first entries and long text is cut. ```json { "success": true, "data": { "engine": "google-trends", "country": "US", "window": "24h", "items": [ { "rank": 1, "query": "patrick stewart", "volume": "2M+", "minVolume": 2000000, "growth": "+1,000%", "startedAt": "2026-10-29T19:30:00Z", "active": true, "categories": ["Entertainment"], "related": ["patrick stewart", "sir patrick stewart"], "ext": {"categoryIds": [4], "articleIds": [[4906062271]]} }, { "rank": 2, "query": "panthers vs packers", "volume": "500K+", "minVolume": 500000, "growth": "+1,000%", "startedAt": "2026-10-29T05:30:00Z", "active": true, "categories": ["Sports"], "related": ["panthers vs packers", "packers vs panthers"], "ext": {"categoryIds": [17], "articleIds": [[4899588623]]} } ], "fetchedAt": "2026-10-30T01:00:30.090Z", "ext": {"listed": 537} } } ``` ## Errors | Status | Code | Meaning | |---|---|---| | 400 | `INVALID_PARAMS` | A parameter is missing, unknown or out of range, or the engine does not take it. The message names it. | | 401 | `UNAUTHORIZED` | The `x-api-key` header is missing, or the key is revoked or unknown. | | 402 | `INSUFFICIENT_BALANCE` | The balance does not cover this call. Top up in the dashboard. | | 429 | `MARKETPLACE_SATURATED` | Too many concurrent calls. Retry after the `Retry-After` seconds. | | 502 | `UPSTREAM_ERROR` | The engine answered with something unusable. Retry with backoff. | | 503 | `SERVICE_UNAVAILABLE` | A temporary failure. Retry with backoff. | Every code is listed in [Errors](/docs/errors). Failed calls are not billed. ## Pricing **Price** $0.0012 per call, plus $0.0012 for each extra call it makes — at most 1 more, so $0.0024 in total. [List price](https://apinoa.com/en/pricing); the rate steps down above 1,000 calls a day. ## Notes - `include=articles` adds every news article Trends holds for each trend, for one more unit.