Naver API & Scraper
The Naver Place API returns South Korean local-business data as clean JSON.
🤖 Using an AI assistant? Copy this link into ChatGPT / Claude / Cursor — it reads every endpoint and parameter instantly and tells you if this API fits your use case.
The primary place/search endpoint returns places with name, address, review count and, on most rows, a rating; you can run a broader search-all, pull a place/detail, reviews and blog-reviews, resolve a name to an id with its candidates and its exact-match flag, and autocomplete a query. It is built for Korean local-data products and review monitoring that need Naver data without a scraper. One ReefAPI key, one shared credit pool, the standard envelope.
What a Naver Place row contains, and which address is which
Korea runs two parallel address systems and Naver returns both on every place, which is the field pair most integrations mismatch. These are the fields measured on place/search-all rows for Korean business queries on 2026-08-26. Note what is not there: a search row carries review_count but no rating - the star rating lives on place/detail.
| Field | What it holds | Measured example |
|---|---|---|
| place_id | Naver's numeric place id, as a string; length varies, no prefix | "1943746521" and "33084820" were both live |
| road_address | doro-myeong address - the post-2011 official street-name system | 서울특별시 강남구 강남대로 388 |
| jibun_address | jibeon address - the legacy lot-number system, still used in records | 서울특별시 강남구 역삼동 825-13 |
| short_address | the abbreviated form Naver prints on a card | 서울 강남구 강남대로 388 |
| category / category_id | Korean category name plus its numeric id | 성형외과 with "223246"; 카페,디저트 for cafes |
| review_count | integer, the review count Naver shows for the place | 1408, 2055, 7791 |
| has_booking | boolean - whether the place takes Naver reservations | true / false |
| latitude / longitude | WGS84 decimal degrees, as numbers | 37.4974539 / 127.0284206 |
| distance_km | float, distance from Naver's own map center for the query | Hongdae cafes returned about 11 km on a Hongdae query |
There is no rating field on a search row, so a missing rating is not an unrated business. Also, limit does not raise the row count past 10: queries asking for 20, 30, 40 and 100 all returned exactly 10 places, with data.total also reporting 10.
Real request and response JSON
Captured from the indexed primary action, place/search, on .
{
"method": "POST",
"url": "https://api.reefapi.com/naver/v1/place/search",
"headers": {
"x-api-key": "$REEF_KEY",
"content-type": "application/json"
},
"body": {
"query": "강남 맛집",
"limit": 5
}
}{
"ok": true,
"meta": {
"api": "naver",
"endpoint": "place/search",
"mode": "live",
"latency_ms": 1007.3,
"record_count": 5,
"bytes": 3906,
"cache_hit": false,
"completeness_pct": 100,
"completeness_basis": {
"record_count": 5
},
"attempts": 1
},
"data": {
"places": [
{
"place_id": "[redacted-phone]",
"name": "[redacted-name]",
"category": "한식",
"address": "강남대로102길 15 지상1층",
"review_count": 1143,
"rating": null,
"image_url": "https://ldb-phinf.pstatic.net/20260213_101/[redacted-phone]PaKB0_PNG/%BD%BA%C5%A9%B8%B0%BC%A6_[redacted-phone]_163001.png",
"longitude": 127.0270063,
"latitude": 37.5022171
},
{
"place_id": "34590424",
"name": "[redacted-name]",
"category": "소고기구이",
"address": "테헤란로70길 25 백합힐 1층",
"review_count": 4127,
"rating": 4.57,
"image_url": "https://ldb-phinf.pstatic.net/20251105_52/[redacted-phone]s9FGy_JPEG/KakaoTalk_20220812_[redacted-phone]_01.jpg",
"longitude": 127.0539791,
"latitude": 37.5039962
},
{
"place_id": "[redacted-phone]",
"name": "[redacted-name]",
"category": "일본식라면",
"address": "논현로175길 40 1층 102호, 104호",
"review_count": 2243,
"rating": null,
"image_url": "https://ldb-phinf.pstatic.net/20260408_149/[redacted-phone]WauH8_PNG/KakaoTalk_20260408_[redacted-phone].png",
"longitude": 127.0253839,
"latitude": 37.525023
}
],
"total": 34636,
"query": "강남 맛집"
}
}What the Naver API does
| Action | Description | Concrete use case | Key params |
|---|---|---|---|
| place/search | search restaurants & food places by query (richest food data) | Support teams call place/search to search restaurants & food places by query (richest food data). | query, limit |
| place/search-all | search ANY business type on Naver Place/Map (clinics, cafes, hotels, salons, shops…) | Reputation platforms call place/search-all to search ANY business type on Naver Place/Map (clinics, cafes, hotels, salons, shops…). | query, limit |
| place/detail | full place profile (rating, phone, hours, images) | Market researchers call place/detail to get full place profile (rating, phone, hours, images). | place_id, query |
| place/reviews | visitor reviews (latest page, ~20 per call) with the true total | B2B review analysts call place/reviews to get visitor reviews (latest page, ~20 per call) with the true total. | place_id, limit, page_size, sort, query |
| place/blog-reviews | blog reviews | Support teams call place/blog-reviews to get blog reviews. | place_id, limit, page_size, query |
| place/resolve | resolve a query → place_id (works for food AND any other business) | Reputation platforms call place/resolve to resolve a query → place_id (works for food AND any other business). | query, place_id |
| search/autocomplete | Naver search-box keyword suggestions for a partial term (keyword research) | Market researchers call search/autocomplete to get naver search-box keyword suggestions for a partial term (keyword research). | query, limit |
Call place/search from your stack
curl -X POST https://api.reefapi.com/naver/v1/place/search \
-H "x-api-key: $REEF_KEY" \
-H "content-type: application/json" \
-d '{"query":"강남 맛집","limit":5}'import requests
r = requests.post(
"https://api.reefapi.com/naver/v1/place/search",
headers={"x-api-key": REEF_KEY},
json={
"query": "강남 맛집",
"limit": 5
},
)
print(r.json()["data"])const res = await fetch("https://api.reefapi.com/naver/v1/place/search", {
method: "POST",
headers: {
"x-api-key": process.env.REEF_KEY,
"content-type": "application/json",
},
body: JSON.stringify({
"query": "강남 맛집",
"limit": 5
}),
});
const { ok, data, meta, error } = await res.json();Ask your MCP-connected assistant: call reefapi.naver.place/search with {"query":"강남 맛집","limit":5}.Who uses this API and why
- Local apps call place/search to list Korean businesses by area.
- Reputation tools use place/reviews and place/blog-reviews to monitor sentiment.
- Lead-gen uses place/search-all to build local business lists.
Questions developers ask before integrating
Should I call place/search or place/search-all?
place/search-all, unless you specifically want restaurants. place/search is the food-oriented surface and carries the richest restaurant fields; place/search-all covers every business type - clinics, cafes, hotels, salons, shops - and is the one that returns place_id, category_id, both addresses and coordinates on a single row. A measured call for 강남 성형외과 (Gangnam plastic surgery) returned five clinics with full profiles.
Why do I get only 10 results when I set limit to 30?
Because Naver's place panel serves one page and the engine returns that page. Measured on 2026-08-26: limit 5 returned 5 places, but limit 20, 30, 40 and 100 all returned exactly 10, with data.total also reading 10, across three different queries. Treat 10 as the practical ceiling per query and narrow the query - by district, by neighborhood, by category word - instead of raising limit.
What is a Naver place_id and where else can I use it?
It is the numeric id in Naver's own place URLs (map.naver.com/p/entry/place/<id>, place.naver.com/restaurant/<id>), returned as a string. Length is not fixed: 33084820 (8 digits) and 1943746521 (10 digits) appeared in the same result set, so do not validate by length. If all you have is a name, place/resolve turns it into a place_id and shows its work: a measured call on 강남 맛집 returned id 1427134948 with the place's name, category, road address and 9,038 reviews beside it, exact_name_match false because a category phrase is not a shop name, and the six runners-up it passed over. Read exact_name_match before you trust the id.
Why are there two addresses on every place?
Korea moved from lot-number addressing (jibeon) to street-name addressing (doro-myeong) in 2011, and both remain in daily use, so Naver carries both. road_address is the official current form and the one to use for mail and geocoding; jibun_address is what older records, land registries and many locals still use. short_address is neither - it is the display abbreviation, with 서울특별시 shortened to 서울. All three describe the same building.
What are place_suggestions?
Naver's own related-query list for the search you ran, returned alongside the places as plain strings. A measured call for 강남 성형외과 returned ["강남역성형외과"], and one for 홍대 카페 returned nine, including 홍대 만화카페 and 홍대 고양이카페. Because the row ceiling is 10, these are the practical way to widen coverage: feed each suggestion back as a fresh query.
Do I have to search in Korean?
For places, in practice yes. The queries that returned data were Korean text - a business name, or an area plus a business word, like 강남 성형외과 or 홍대 카페 - because that is how the listings themselves are written. Names, categories and addresses all come back in Hangul with no romanized variants, so plan for UTF-8 end to end and for a transliteration step if your users read Latin script. search/autocomplete takes a partial term and returns Naver's own completions - 아이폰 returned 아이폰18, 아이폰17 and 아이폰17프로 - which is the cheapest way to learn the exact wording Korean users type.
What does a TARGET_BLOCKED response mean here?
It means Naver answered that attempt with a challenge instead of data, and it comes back with retryable set to true. It is a transient condition rather than a verdict on your parameters, so there is nothing to fix on your side beyond retrying later or spacing calls out. Handle it the way you would a 503: catch the code, back off, and never read the absence of data as "this place does not exist".
How does this engine handle a bad parameter?
limit is parsed strictly - a non-numeric limit returns PARSE_ERROR with retryable false rather than being ignored - while query is required and rejected when empty. There is no page parameter on any place action, so pagination is not the shape of this engine. You widen coverage by issuing more queries, not by walking pages.
What is the Naver API?
Naver API is a ReefAPI endpoint group for korean business listings, reviews and ratings. It returns live JSON through POST requests under /naver/v1.
Is the Naver API free to try?
Yes. ReefAPI starts with 1,000 free credits, no card required. Naver calls use the same shared credit balance as every other ReefAPI engine.
Do I need a Naver login or account?
No login to Naver is needed for the API response. You call ReefAPI with your x-api-key header, and the playground can run live examples before you create a production key.
How fresh is the Naver data?
The page example is captured from a live place/search call, and production requests fetch live data through ReefAPI rather than a static sample.
How many credits does the Naver API use?
Naver actions currently cost 1 credit per successful call. Failed or blocked calls are free, and all APIs draw from one credit pool.
Can I call Naver from an AI assistant or MCP client?
Yes. Connect ReefAPI once through MCP and your assistant can call naver actions with the same key, credit pool and JSON envelope used by normal REST requests.