Naver Shopping Price Comparison Scraper
Search Naver Shopping by keyword, pull product details by ID, browse a category or fetch trending products, with price range across sellers, review and purchase counts, brand and mall name.
Input schema
Input fields, types, required flags, descriptions, defaults, and prefills come from the published definition. Prefill examples are distinct from defaults.
| Field | Type | Required | Description |
|---|---|---|---|
searchQueries | array | optional | One Naver Shopping search per keyword, in Korean or English. Each keyword returns up to 90 product cards, including ads. Leave empty only when an old task supplies a single `keyword`. |
includeAds | boolean | optional | Keep sponsored product cards in the results. Ads take a large share of the up to 90 cards, so ads-off runs return the organic subset. Every record carries `isAd`. |
minPrice | integer | optional | Drop fetched products cheaper than this price in Korean Won. Applied after collection, to the products this run fetched. |
Show all input fields
| Field | Type | Required | Description |
|---|---|---|---|
searchQueries | array | optional | One Naver Shopping search per keyword, in Korean or English. Each keyword returns up to 90 product cards, including ads. Leave empty only when an old task supplies a single `keyword`. |
includeAds | boolean | optional | Keep sponsored product cards in the results. Ads take a large share of the up to 90 cards, so ads-off runs return the organic subset. Every record carries `isAd`. |
minPrice | integer | optional | Drop fetched products cheaper than this price in Korean Won. Applied after collection, to the products this run fetched. |
maxPrice | integer | optional | Drop fetched products more expensive than this price in Korean Won. Applied after collection, to the products this run fetched. |
sort | string | optional | Order the products this run fetched. Naver's mobile page does not accept a server-side sort, so this is a local sort, not a re-query. |
maxItems | integer | optional | Total products to save across all keywords, after ad and price filtering (1–1000). The source still caps each keyword at 90 cards. |
Download the published input schema
View complete JSON
{
"description": "Search Naver Shopping by keyword and collect product prices, ratings, reviews, sellers, delivery and variants.",
"properties": {
"includeAds": {
"default": true,
"description": "Keep sponsored product cards in the results. Ads take a large share of the up to 90 cards, so ads-off runs return the organic subset. Every record carries `isAd`.",
"prefill": false,
"title": "Include paid ads",
"type": "boolean"
},
"maxItems": {
"default": 100,
"description": "Total products to save across all keywords, after ad and price filtering (1–1000). The source still caps each keyword at 90 cards.",
"maximum": 1000,
"minimum": 1,
"prefill": 2,
"title": "Max products",
"type": "integer"
},
"maxPrice": {
"description": "Drop fetched products more expensive than this price in Korean Won. Applied after collection, to the products this run fetched.",
"maximum": 100000000,
"minimum": 0,
"title": "Maximum price (KRW)",
"type": "integer"
},
"minPrice": {
"description": "Drop fetched products cheaper than this price in Korean Won. Applied after collection, to the products this run fetched.",
"maximum": 100000000,
"minimum": 0,
"title": "Minimum price (KRW)",
"type": "integer"
},
"searchQueries": {
"default": [],
"description": "One Naver Shopping search per keyword, in Korean or English. Each keyword returns up to 90 product cards, including ads. Leave empty only when an old task supplies a single `keyword`.",
"editor": "stringList",
"prefill": [
"스마트폰"
],
"title": "Search keywords",
"type": "array"
},
"sort": {
"default": "relevance",
"description": "Order the products this run fetched. Naver's mobile page does not accept a server-side sort, so this is a local sort, not a re-query.",
"editor": "select",
"enum": [
"relevance",
"priceLow",
"priceHigh",
"reviews"
],
"enumTitles": [
"Relevance (Naver's order)",
"Price: low to high",
"Price: high to low",
"Most reviews"
],
"prefill": "relevance",
"title": "Sort products",
"type": "string"
}
},
"schemaVersion": 1,
"title": "Naver Shopping Scraper Input",
"type": "object"
}
Output schema
Published result links and storage locations. This schema is not an exhaustive contract for every field in a dataset record.
| Field | Type | Required | Description |
|---|---|---|---|
products | string | optional | Dataset containing all scraped Naver Shopping products. |
Download the published output schema
View complete JSON
{
"actorOutputSchemaVersion": 1,
"description": "One record per Naver Shopping product — price and discount, review rating and count, sellers, delivery, variants, category IDs, image and product link.",
"properties": {
"products": {
"description": "Dataset containing all scraped Naver Shopping products.",
"template": "{{links.apiDefaultDatasetUrl}}/items",
"title": "Naver Shopping products",
"type": "string"
}
},
"title": "Naver Shopping Price & Review Scraper Output"
}
Dataset schema
Published dataset views and any declared field definitions. A view can select only a subset of the returned record fields.
Download the published dataset schema
View complete JSON
{
"actorSpecification": 1,
"views": {
"overview": {
"display": {
"component": "table",
"properties": {}
},
"title": "Products",
"transformation": {
"fields": [
"productName",
"price",
"originalPrice",
"discountPercent",
"reviewScore",
"reviewCount",
"sellerCount",
"isAd",
"mallName",
"productUrl"
]
}
}
}
}
Key-value schema
Published key-value store definitions, when provided by this build.
This definition is not present in the default published build. See the published README for available documentation.
Published README
Read the full published documentation
Naver Shopping Price & Review Scraper
Collect Naver Shopping products by keyword — the displayed price and discount, rating and review count, competing seller count, delivery terms, purchase options, category IDs, image and product link. Results come from Naver's public mobile shopping search, with no account, cookie or API key required.
What this actor does
- Keyword search at scale: one search per keyword, in Korean or English, with up to 90 product cards per keyword (ads included; ads-off runs return the organic subset)
- 30+ card-level fields: price, original price, discount, rating, reviews, sellers, wishlist saves, delivery, variants, category IDs, images and links
- Ads under your control: ads take a large share of the up to 90 cards (16–50 in our samples), so ads-off runs return the organic subset; every record exposes
isAd - Local price filter and sort: keep a KRW price band and order the fetched set by relevance, price or review count
- Clean records: HTML highlight tags are stripped, and empty fields are omitted rather than sent as
null
Services and data source
The actor reads Naver's anonymous mobile integrated search page (m.search.naver.com/search.naver?where=m_shop). It does not use the login-gated shopping portal, so it needs no Naver account and no proxy configuration. Each keyword returns the product cards that Naver renders on that page, including marketplace cards, catalog cards and sponsored cards.
How it works
For every keyword, the actor fetches the mobile search page once and reads the embedded shopping state. It flattens the product cards, removes duplicates by Naver product ID, drops ads when includeAds is false, applies your KRW price band, sorts the remaining products locally, and saves them up to maxItems. Multiple keywords are collected in one run, and a product found by more than one keyword is saved once.
The free mobile page has no pagination, server-side sort or server-side price filter. Sorting and filtering therefore apply to the products this run fetched, not to all of Naver's results.
Output per product
productId— Naver product ID (nvMid), the stable identifierchannelProductId— the seller's own product ID, when the card has oneproductName— product title with Naver's<mark>highlight tags removedproductUrl— direct seller or marketplace URL; falls back to the Naver catalog page for catalog cardsimageUrl— product image from Naver's image CDNmallId,mallName— selling store ID and name;mallIdisnaver_modelon catalog cards, wheremallNameis omittedmallBadge— store badge such as official or certified, when shownisAd—truefor sponsored cards,falsefor organic cardscardType— Naver card type (CATALOG_CARD,ORGANIC_CARD,AD_CARD)searchRank— Naver's rank within the card's own section (ads and organic cards have separate rank sequences)position— consecutive position after filtering, sorting and de-duplicationkeyword— keyword that found the productprice— displayed selling price in KRWlowPrice— same aspriceon this sourceoriginalPrice— list price before discount, when higher thanpricediscountPercent— discount rate shown on the card, when greater than zerohighPrice— highest price across sellers, only when a source card carries itpriceCurrency— usuallyKRWbrand— brand or maker, only when the source card carries itsellerCount— number of competing sellers, when greater than zeroreviewScore— average review rating out of 5, when the product has reviewsreviewCount— total review count, when greater than zeropurchaseCount— recorded purchase count, when shownwishlistCount— number of shoppers who saved the productpurchaseOptions— variants withnameandprice, when the card lists optionscategoryId— leaf category IDcategoryIds— category IDs grouped asl,m,sandss(large to small)category— category names, only when a source card carries themdeliveryFee— delivery fee in KRW (0means free)freeDelivery—truewhen delivery is free,falsewhen paidfastDeliveryType— Naver's fast-delivery label (NONE,TODAY,ARRIVAL, …)isBrandStore—truefor official brand storesisSmartStore—truefor SmartStore productsisOverseas—truefor overseas productsrecordType—productfor every recordscrapedAt— ISO 8601 timestamp for the run
Input
| Field | Type | Default | Description |
|---|---|---|---|
searchQueries |
array | [] |
One Naver Shopping search per keyword (Korean or English). The actor reads old single-keyword keyword tasks too. |
includeAds |
boolean | true |
Keep sponsored cards. Every record is flagged with isAd. |
minPrice |
integer | – | Drop fetched products below this KRW price. |
maxPrice |
integer | – | Drop fetched products above this KRW price. |
sort |
string | relevance |
relevance / priceLow / priceHigh / reviews — local sort of the fetched products. |
maxItems |
integer | 100 |
Total products to save across all keywords (1–1000). |
Example: three keywords, ads off
{
"searchQueries": ["스마트폰", "무선이어폰", "노트북"],
"includeAds": false,
"maxItems": 150
}
Example: price band with cheapest first
{
"searchQueries": ["에어프라이어"],
"minPrice": 50000,
"maxPrice": 200000,
"sort": "priceLow",
"maxItems": 50
}
Example: most-reviewed products for an English query
{
"searchQueries": ["iphone case"],
"includeAds": false,
"sort": "reviews",
"maxItems": 30
}
Example: competitive snapshot including ads
{
"searchQueries": ["강아지사료"],
"includeAds": true,
"sort": "relevance",
"maxItems": 90
}
Use cases
- Price monitoring — capture the current displayed price and discount for a list of Korean keywords
- Assortment research — see which stores and brands appear for a category search
- Review intelligence — sort a fetched set by rating volume to find established products
- Delivery benchmarking — compare free delivery, paid delivery and fast-delivery labels across sellers
- Catalog enrichment — attach Naver category IDs, images and product links to an existing feed
- Campaign tracking — keep ads in the result and separate them later with
isAd
Usage cost
You pay for Apify platform usage under your plan. The actor uses only Naver's public mobile pages: no paid data API, no residential proxy and no external credential. A typical keyword costs one page fetch, small inputs finish in seconds, and maxItems bounds the number of saved rows.
Notes
- Each keyword returns at most 90 product cards, including ads, because that is the complete set embedded in Naver's mobile page. With
includeAdsoff you get the organic subset (roughly 40–75 cards, depending on how many ads Naver inserts). - Ads are mixed into the same page; read
isAdinstead of assuming every row is organic. productNameis Korean or English exactly as Naver shows it; there is no translation step. Naver sometimes includes double spaces, which are kept as shown.lowPricemirrorsprice.highPriceis usually absent on this source because a single card shows one displayed price, not every seller's offer.- When a keyword's page has no shopping module, that keyword yields zero rows and the run continues with the next keyword.
- A small number of carrier-subsidy catalog cards have no listed price at all; those records omit
pricerather than inventing one. When their delivery type and fee contradict each other, delivery fields are omitted too. - Catalog-card
productUrllinks point at Naver's catalog page, which can redirect to a maintenance page outside Korea; theproductIdandimageUrlremain usable. - The dataset is written once per run;
scrapedAtis identical for all rows from that run.
Limitations
- 90 cards per keyword, not 90 organic products. Naver's mobile page embeds up to 10 pages of 9 cards, and ads take 16–50 of those cards. With
includeAdsoff the source ceiling is the organic subset (roughly 40–75). The page exposes no next page or cursor, so there is no way to request more from this free surface; split a broad market into narrower keywords to cover more products. - No server-side pagination, sort or price filter.
sortandminPrice/maxPriceapply only to the cards fetched in the same run. They do not reorder or paginate Naver's full result set. - No product detail, review text, specifications or stock. Those live on Naver's shopping portal and product pages, which are gated and return blocks outside Korea. This actor does not ship those modes.
- No brand, maker or category names from search cards. Brand and category names come from detail pages that are not available here. Category IDs are provided instead.
- Some keywords return no cards. Very broad category words can render neither the shopping module nor the explore module, so they produce zero rows.
- A few catalog cards have no price. They are carrier or catalog placeholders without a live offer, so the price fields are omitted. Drop them downstream if your workflow needs a price on every row.
- The page shape can change. The actor parses Naver's embedded shopping state; if Naver changes that structure, the run reports it instead of inventing records.
FAQ
What is Naver Shopping? Naver Shopping is South Korea's largest shopping search surface. It groups products from many Korean stores and shows price, reviews, delivery and seller information on one card.
Why do I get at most 90 cards per keyword? Naver's mobile shopping page contains up to 10 embedded pages of 9 cards, so 90 cards is the source ceiling for each keyword. Ads take 16–50 of those cards, so with ads off you get the remaining organic cards (roughly 40–75). The page does not expose a next-page link or cursor. Run more specific keywords to cover a larger market.
Why is sort described as a local sort?
The free mobile page ignores sort parameters. The actor therefore sorts the products it fetched, which is useful for a single keyword and for a combined multi-keyword result, but it is not a global Naver ranking.
Why are brand, category names or highPrice sometimes missing?
Search cards do not carry a brand tag, a category name path or every seller's price. The actor omits those fields instead of guessing. Category IDs, seller count and the displayed price are still provided.
Why is there no review text, star distribution, stock or specification list? Those fields exist only on Naver's product-detail and review pages. Those pages are gated and blocked from outside Korea, so this actor does not offer detail or review modes. The search card still gives the average rating and review count.
Do I need a Naver account, cookies or a proxy? No. The actor uses Naver's anonymous mobile search page. There is nothing to log in to and nothing to configure.
Can I include or exclude ads?
Yes. Set includeAds to true or false. Every record also carries isAd so you can keep a mixed snapshot and filter it later.
Is the data live?
Yes. Every run reads the current mobile search page. scrapedAt records when the snapshot was taken. Naver may personalize or rotate cards over time, so counts can differ slightly between runs.
Is this affiliated with Naver? No. This is an independent third-party actor that reads Naver's public search page. It is not affiliated with or endorsed by Naver Corporation.
Python quickstart
Use a schema-derived input and the Python standard library to start a run. An Apify account and token are required for execution.
Source build dJUrNu0nTry9REFAJ. Documentation is regenerated from the default published build; private drafts are not included.