Naver Place Business & Reviews Scraper (Korea)
The out-of-area padding removed, and counted.
Korean local business data from Naver Place — the directory Koreans actually use, where Google Maps coverage is thin — with businesses, visitor reviews, Naver's own reputation aggregates, menus and photos. Naver pads its search results with businesses from outside the area you asked for, silently and with no marker; this Actor filters them out and reports how many it dropped.
oswaldocarabano/naver-place-scraper
{
"queries": ["치과", "카페"],
"regions": ["서울 강남구", "서울 마포구"],
"entityType": "businesses",
"maxResults": 200,
"includeReputation": true
}- Version
- v0.1.10
- Memory
- 512 MB
- Browser
- none
- Proxy
- None needed: plain HTTP from datacenter IPs works
Short answer
The Naver Place Business & Reviews Scraper extracts Korean local businesses and visitor reviews from Naver Place without a login or a browser. Its distinguishing behaviour is that it removes the out-of-area results Naver pads its own search responses with — measured on 역삼동 치과, only 162 of the 300 results Naver served were actually in the area — and it reports the count it dropped. Fill rates were measured on 3,295 businesses across 8 verticals and 8 regions. Pricing is $0.0014 per business and $0.00045 per review.
Key points
- Naver pads search results with businesses from neighbouring areas, silently, with HTTP 200 and no marker in the response. This Actor filters them and reports how many were dropped.
- Measured on 역삼동 치과: Naver reports 638 matches, serves 300, and only 162 are actually in the area. For 율현동 치과 it reports 52, serves 52, and 2 are in the area.
- The real ceiling is 300 results per query, and the run log says so rather than letting you assume you got everything.
- Reviewer identities are never returned — no nickname, no account id, no link to a review history. An automated test fails the build if a reviewer identifier appears in any delivered row, at any depth.
- Fill rates measured on 3,295 businesses across 8 verticals and 8 regions. Phone is 88% on average and 37% in the worst vertical measured, and `phone_is_virtual` says whether you got Naver's relay number or the real one.
- Star ratings depend on the vertical: restaurants and cafés carry them, clinics and pharmacies do not, and the field is `null` rather than a made-up zero.
What it does
Korean local business data from Naver Place — the directory Koreans actually use, where Google Maps coverage is thin — with businesses, visitor reviews, Naver's own reputation aggregates, menus and photos. Naver pads its search results with businesses from outside the area you asked for, silently and with no marker; this Actor filters them out and reports how many it dropped.
{
"place_id": "1234567890",
"name": "강남예치과",
"category": "Dentist",
"category_ko": "치과",
"region": "서울 강남구",
"phone": "0507-1234-5678",
"phone_is_virtual": true,
"road_address": "서울 강남구 테헤란로 123",
"full_address": "서울 강남구 역삼동 678-9",
"latitude": 37.5006,
"longitude": 127.0364,
"hours_status": "영업 중",
"visitor_review_count": 214,
"blog_review_count": 88,
"reputation": {
"average_rating": null,
"star_distribution": null,
"reviewer_count": 196,
"image_review_count": 41,
"themes": [{ "name": "친절해요", "count": 63 }]
},
"place_url": "https://map.naver.com/p/entry/place/1234567890",
"scraped_at": "2026-08-19T09:12:00.000Z",
"from_cache": false,
"fetched_at": null,
"data_age_hours": null
}Why this one
It removes the padding, and tells you how much there was
This is the whole reason the Actor exists. Ask Naver for dentists in 역삼동 and it serves 300 results of which 162 are in 역삼동 — the rest are neighbouring areas, unmarked. Any tool that passes that through gives you a dataset whose geography is wrong by 46% while looking complete. The filter runs on the address, and the run log reports the dropped count and warns that Naver's own match count includes padding and is not an inventory figure.
Reviewer identity is not available, at any price
Every Naver review carries the reviewer's nickname, a stable account id and a link to their entire public review history. None of it is returned — not behind a flag, not on request — and a build-time test fails if a reviewer identifier appears anywhere in a delivered row. What you get is what was said and how it was rated, which is what competitor analysis needs, not who said it.
Vertical-dependent fields are declared, not silently empty
`visitor_review_score` is absent for clinics, academies and pharmacies because Naver does not compute one there. `micro_review` and `save_count` only appear for restaurants and cafés. The row always includes the key with an explicit `null`, and the documentation says which vertical produces which — so a pipeline built on a rating column knows before it runs that a dentist sweep will not have one.
The relay number is flagged rather than passed off as a phone
Between 37% and 87% of businesses, depending on vertical, publish only the `0507-…` relay number Naver puts in front of the real line. `phone_is_virtual` tells you which one you got, because a dataset that mixes the two silently is a call list that partly reaches a redirect service.
Use cases
- Build a region-accurate directory of Korean businesses in a vertical, without the neighbouring-area padding.
- Analyse Korean visitor reviews — text, star rating, visit date, receipt-verified flag — without collecting reviewer identities.
- Read Naver's own reputation aggregates: average rating, the ten-band star distribution and its theme analysis with counts.
- Collect menus with prices in KRW for restaurant and café benchmarking.
- Compare a vertical across districts by adding regions, which is also how you get past the 300-per-query ceiling.
- Reach Korean local data where Google Maps coverage is thin, which is most of it.
Input
Every field has a default, and the defaults are deliberately small so a first run is cheap enough to inspect before you commit to a sweep. This table mirrors the Actor's own input schema field for field.
| Field | Default | What it does |
|---|---|---|
queriesstring[] | ["치과"] | Search termsCategory or business terms. Korean gives far better coverage than English, because Naver's search is Korean-first: `치과` returns far more than `dentist`. |
regionsstring[] | [] | RegionsKorean administrative regions, e.g. `["서울 강남구", "부산 해운대구"]`. Empty sweeps all 17 first-level regions. Results are filtered so only businesses actually located in the region are returned. |
entityTypeselect | "businesses" | What to scrapeOne entity type per run: businesses, reviews, menu items or photos. Their fields genuinely differ, so each run writes a single clean shape. |
businessTypeselect | "restaurant" | Business typeWhich Naver vertical to read detail pages from. It does not filter search results — Naver ignores it — and the search term is what selects the category. |
maxResultsinteger | 100 | Max businessesHard cap on rows of the selected type. Naver serves at most 300 results per query, so wide coverage needs more regions rather than a bigger number here. |
includeReputationboolean | true | Include reputation aggregatesAverage rating, the ten-band star distribution, reviewer count and Naver's own theme analysis with counts. Costs one detail request per business. |
maxReviewsPerBusinessinteger | 50 | Max reviews per businessNaver paginates reviews by cursor, so the full corpus is reachable — 1,120 reviews cost 24 requests. Keep it low unless you need depth. |
proxyConfigurationobject | { "useApifyProxy": false } | ProxyOptional and not needed today: Naver Place answers plain HTTP requests from datacenter IPs. |
Output and fill rates
A field being in the schema is not the same as it having a value. The percentages below were counted on real runs; the sample sizes are in Measurements. Anything not listed here is not promised.
| Field | Filled | Meaning |
|---|---|---|
place_idstring | 100% | Naver's business identifier. The join key across runs and entity types. |
namestring | 100% | Business name in Korean. |
categorystring | 90% | Category, translated, with the Korean original kept. |
regionstring | 90% | The region the business is actually in — the field the padding filter acts on. |
road_addressstring | 90% | Road-name address. `full_address` and the jibun form are separate fields. |
phonestring | 88% | Business phone. 88% on average across verticals, and 37% in the worst measured (pharmacies). |
phone_is_virtualboolean | 88% | Whether the number is Naver's `0507-…` relay rather than the real line. Between 37% and 87% of businesses publish only the relay. |
latitudenumber | 90% | Coordinates, with `longitude`. |
hours_statusstring | not measured | Opening status and hours as Naver reports them. |
visitor_review_countinteger | 90% | Visitor review count. `blog_review_count` is separate and better filled. |
reputationobject | not measured | Naver's own aggregates: average rating, the ten-band star distribution, reviewer and image-review counts, theme analysis with counts. |
ratingnumber | not measured | Star rating on a review. `null` for verticals where Naver computes none — clinics, academies, pharmacies. |
bodystring | not measured | Full review text. |
visited_atstring | not measured | Visit date on a review. |
is_receipt_verifiedboolean | not measured | Whether Naver verified the review against a receipt. |
pricenumber | not measured | Menu item price, with `currency` — KRW. |
place_urlstring | 100% | Public Naver Place URL for the business. |
from_cacheboolean | 100% | Always false today: shared caching is designed but not switched on. |
Every key is always present. A field that exists but is empty comes back as explicit null, so a parser never has to guess.
Datasets
Different record types go to different datasets, so the main table never carries columns that are blank on most rows.
defaultOne row per entity of the type you selected: business, review, menu item or photo.billedERRORS (key-value store)Anything that failed, with the reason.never billed
Pricing
Pay per delivered result. Charges are applied as each row is produced rather than in a lump at the end, so an aborted run bills only for what it actually gave you.
| Event | Price | Notes |
|---|---|---|
actor-startActor start | $0.00001 | Effectively free. A run that finds nothing costs you nothing. |
businessBusiness | $0.0014 | One Korean local business: name, translated category, phone, both address forms, coordinates and hours. |
business_reputationReputation aggregates | $0.0008 | Average rating, the ten-band star distribution, reviewer counts and theme analysis. |
reviewVisitor review | $0.00045 | One review: text, rating, visit date, photos and the receipt-verified flag. No reviewer identity. |
menuMenu item | $0.0002 | One menu item with name, price in KRW, description and photos. |
photoBusiness photo | $0.0002 | One business photo URL. Photo author information is never returned. |
Measurements
Each figure is shown with the method that produced it. A benchmark without a method is a marketing claim wearing a number's clothes.
Out-of-area padding
162 of 300 results in-area
Measured on 역삼동 치과: Naver reports 638 matches, serves 300, and 162 are actually in 역삼동. On 율현동 치과 it reports 52, serves 52, and 2 are in the area. Measured across 10 queries.
Per-query ceiling
300 results
Naver's own limit, regardless of the match count it reports. More coverage needs more regions or narrower terms.
Fill-rate sample
3,295 businesses
Across 8 verticals and 8 regions. Name, category, all three address forms, coordinates, image count and blog review count were present for at least 90% in every vertical.
Phone coverage
88% average, 37% worst vertical
Pharmacies were the worst measured. Between 37% and 87% of businesses publish only the 0507 relay number, which `phone_is_virtual` flags.
Review pagination cost
1,120 reviews in 24 requests
Naver paginates reviews by cursor, so the full corpus is reachable — but each business needs its own sweep, which is why reviews cost more than businesses.
Reviewer identity leakage
0, enforced at build time
An automated test fails the build if a reviewer nickname, account id or history link appears in any delivered row, at any depth.
What it will not do
Stated plainly so you can judge fit before spending anything.
- Naver serves at most 300 results per query. Wide coverage needs more regions or narrower terms, and the run log states this.
- Reviewer identities are never returned, under any setting.
- Star ratings do not exist for every vertical: clinics, academies and pharmacies have none, and the field is `null`.
- One entity type per run — businesses, reviews, menu items or photos — so each dataset has one shape.
- `businessType` does not filter search results. Naver ignores it; the search term is what selects the category.
- Photo author information is never returned with photos.
- Shared caching is designed but not switched on, so `from_cache` is always false and `fetched_at` is null today.
Privacy
- Reviewer nicknames, account ids and review-history links are never returned. A build-time test enforces it at any depth of the row.
- Photo author information is never returned.
- Business contact details are published by the businesses themselves, and `phone_is_virtual` distinguishes Naver's relay number from the real line.
- Data policy and removal requests: naver.actorstack.dev, or privacy@actorstack.dev
See also the data removal process.
Frequently asked questions
Why do Naver searches return businesses from other areas?
How many results can one query return?
Can I get the reviewers' names?
Why is the star rating null for some businesses?
Should I search in Korean or English?
What is the 0507 number?
Do I need a proxy?
Guides for this Actor
- Scrape Naver PlaceGoogle Maps coverage in Korea is thin; Naver Place is where the data is. A walkthrough of querying it, and of the padding you have to remove before the results mean anything.
- Naver Place APINaver publishes developer APIs, but not the one people are looking for. What exists, what it covers, and why the public pages are the practical route.
- The padding findingNaver silently pads its search results with businesses from neighbouring areas. Measured across ten queries — and it is the difference between a local dataset and a regional blur.
- The 300 ceilingEvery Naver query stops at 300 results regardless of what it claims to have matched. Coverage is a function of how you partition the map, not of how high you set a limit.
- Naver Place fieldsMeasured on 3,295 businesses across 8 verticals and 8 regions — including which fields simply do not exist for clinics, academies and pharmacies.
- Virtual phone numbersNaver puts a relay number in front of many businesses' real lines. Between 37% and 87% of them, depending on vertical, publish only that — and a dataset that does not flag it is a call list into a redirect.
- Reviews without identitiesEvery Naver review carries a nickname, a stable account id and a link to the reviewer's entire history. None of it is returned, and a test fails the build if it ever is.
- Naver vs Google MapsIn most countries this is not a question. In Korea it is the whole question, because the platform Koreans use is not the one most tooling targets.
- Reputation aggregatesAverage rating, a ten-band star distribution, reviewer counts and a theme analysis with counts — all computed by Naver, and all cheaper than deriving them from raw reviews.
- Korean search termsNaver's search is Korean-first. The choice of term decides coverage more than any other input, and the region list decides whether the results are where you think they are.