Naver APInaver.com ↗
Search Naver across web, blog, news, cafe, video, and shopping. Returns titles, links, descriptions, and sources. Includes autocomplete suggestions.
What is the Naver API?
The Naver API covers 2 endpoints that return structured search results and autocomplete suggestions from Korea's largest search engine. The search endpoint accepts a required query string and an optional where parameter to target one of seven content types — web, blog, news, cafe, image, video, or shopping — returning up to 10 paginated results per page with title, link, description, source, and total_results fields.
curl -X GET 'https://api.parse.bot/scraper/59b25417-91af-4955-8c05-f24339274634/search' \ -H 'X-API-Key: $PARSE_API_KEY'
Typed, relational, agent-ready
A generated client with real types, enums, and the links between objects — the structure a flat JSON response can't carry. Autocompletes in your editor and reads cleanly to coding agents.
- Fully typed · autocompletes
- Objects link to objects
- Typed errors & pagination
Typed Python client. Set up the SDK in your uv project, then pull this API’s typed client:
uv add parse-sdk uv run parse init uv run parse add --marketplace naver-com-api
uv run parse add --marketplace pulls a pinned snapshot of this canonical API — it won’t change underneath you. To customize it, subscribe and swap to your own copy.
"""
Naver Search API Client
This module provides a Python client for the Naver Search API, allowing you to search
across multiple content types and get autocomplete suggestions.
Get your API key from: https://parse.bot/settings
"""
import os
import json
import requests
from typing import Optional
class ParseClient:
"""Client for interacting with the Parse API (Naver Search)."""
def __init__(self, api_key: Optional[str] = None):
"""
Initialize the Parse API client.
Args:
api_key: API key for authentication. If not provided, reads from PARSE_API_KEY env var.
"""
self.base_url = "https://api.parse.bot"
self.scraper_id = "59b25417-91af-4955-8c05-f24339274634"
self.api_key = api_key or os.getenv("PARSE_API_KEY")
if not self.api_key:
raise ValueError("API key must be provided or set in PARSE_API_KEY environment variable")
def _call(self, endpoint: str, method: str = "POST", **params) -> dict:
"""
Make a request to the Parse API.
Args:
endpoint: The API endpoint to call (e.g., 'search', 'autocomplete')
method: HTTP method ('GET' or 'POST')
**params: Query parameters or request body
Returns:
Response data as a dictionary
"""
url = f"{self.base_url}/scraper/{self.scraper_id}/{endpoint}"
headers = {"X-API-Key": self.api_key, "Content-Type": "application/json"}
if method.upper() == "GET":
response = requests.get(url, headers=headers, params=params)
else: # POST
response = requests.post(url, headers=headers, json=params)
response.raise_for_status()
return response.json()
def search(
self,
query: str,
where: str = "nexearch",
page: int = 1,
) -> dict:
"""
Search Naver for content across multiple types.
Args:
query: Search query string
where: Content type ('nexearch', 'blog', 'news', 'cafe', 'image', 'video', 'shop')
page: Page number for pagination (starts at 1)
Returns:
Dictionary with search results and metadata
"""
return self._call(
"search",
method="GET",
query=query,
where=where,
page=page,
)
def autocomplete(self, query: str) -> dict:
"""
Get autocomplete suggestions for a search query.
Args:
query: Query prefix to get suggestions for
Returns:
Dictionary with suggestions list
"""
return self._call(
"autocomplete",
method="GET",
query=query,
)
def main():
"""Demonstrate practical usage of the Naver Search API client."""
# Initialize the client
client = ParseClient()
# Workflow: Search for a topic, then get suggestions for related searches
search_topic = "machine learning"
print("=" * 60)
print(f"NAVER SEARCH WORKFLOW: Exploring '{search_topic}'")
print("=" * 60)
# Step 1: Get autocomplete suggestions for the topic
print(f"\n1. Getting autocomplete suggestions for '{search_topic}'...")
autocomplete_response = client.autocomplete(search_topic)
if autocomplete_response.get("status") == "success":
suggestions = autocomplete_response.get("data", {}).get("suggestions", [])
print(f" Found {len(suggestions)} suggestions:")
for i, suggestion in enumerate(suggestions[:5], 1):
print(f" {i}. {suggestion}")
else:
print(" Error getting suggestions")
# Step 2: Search for blog posts about the topic
print(f"\n2. Searching for blog posts about '{search_topic}'...")
blog_search = client.search(query=search_topic, where="blog", page=1)
if blog_search.get("status") == "success":
search_data = blog_search.get("data", {})
results = search_data.get("results", [])
total_results = search_data.get("total_results", 0)
print(f" Found {total_results} blog posts (showing first {len(results)}):")
for i, result in enumerate(results[:3], 1):
print(f"\n Blog Post {i}:")
print(f" Title: {result.get('title', 'N/A')}")
print(f" Source: {result.get('source', 'N/A')}")
description = result.get("description", "N/A")
if len(description) > 100:
description = description[:100] + "..."
print(f" Description: {description}")
else:
print(" Error searching blog posts")
# Step 3: Search for news articles
print(f"\n3. Searching for news articles about '{search_topic}'...")
news_search = client.search(query=search_topic, where="news", page=1)
if news_search.get("status") == "success":
search_data = news_search.get("data", {})
results = search_data.get("results", [])
print(f" Found news articles (showing up to 3):")
for i, result in enumerate(results[:3], 1):
print(f"\n News {i}:")
print(f" Title: {result.get('title', 'N/A')}")
print(f" Source: {result.get('source', 'N/A')}")
else:
print(" Error searching news")
# Step 4: Use a suggestion from autocomplete for a new search
if autocomplete_response.get("status") == "success":
suggestions = autocomplete_response.get("data", {}).get("suggestions", [])
if len(suggestions) > 2:
related_query = suggestions[2] # Use third suggestion
print(f"\n4. Searching web results for related topic: '{related_query}'...")
web_search = client.search(query=related_query, where="nexearch", page=1)
if web_search.get("status") == "success":
search_data = web_search.get("data", {})
results = search_data.get("results", [])
total_results = search_data.get("total_results", 0)
print(f" Found {total_results} web results (showing first 2):")
for i, result in enumerate(results[:2], 1):
print(f"\n Result {i}:")
print(f" Title: {result.get('title', 'N/A')}")
print(f" Link: {result.get('link', 'N/A')}")
else:
print(" Error searching web")
print("\n" + "=" * 60)
print("WORKFLOW COMPLETE")
print("=" * 60)
if __name__ == "__main__":
main()Search Naver across multiple content types including web, blog, news, cafe, image, video, and shopping. Returns structured search results with titles, links, descriptions, and sources. Results are paginated with 10 results per page.
| Param | Type | Description |
|---|---|---|
| page | integer | Page number for pagination (starts at 1). |
| queryrequired | string | Search query string. |
| where | string | Content type to search. Accepts exactly one of: nexearch, blog, news, cafe, image, video, shop. |
{
"type": "object",
"fields": {
"page": "integer",
"query": "string",
"where": "string",
"results": "array of search result objects with title, link, description, and source fields",
"total_results": "integer"
},
"sample": {
"data": {
"page": 1,
"query": "python programming",
"where": "blog",
"results": [
{
"link": "https://blog.naver.com/jazzlubu/224260960970",
"title": "파이썬 독학, Python 프로그래밍으로 컴퓨터 프로그래머 입문 시작",
"source": "진실여포",
"description": "이번 글에서는 파이썬 독학을 시작하려는 분들을 기준으로 Python 프로그래밍을 어떻게 보면 덜 어렵게 느껴지는지..."
}
],
"total_results": 10
},
"status": "success"
}
}About the Naver API
Search Endpoint
The search endpoint queries Naver across multiple content types controlled by the where parameter. Accepted values are nexearch (general web), blog, news, cafe, image, video, and shop. Each response includes a results array of objects containing title, link, description, and source, plus top-level page, query, where, and total_results fields. Pagination is handled through the page integer parameter starting at 1, with 10 results returned per page.
Autocomplete Endpoint
The autocomplete endpoint takes a query prefix string and returns up to 10 Korean-language suggestions as a flat suggestions array alongside the original query string. This is useful for building type-ahead search interfaces or discovering how Naver users phrase queries around a topic.
Coverage and Scope
Naver is the dominant search engine in South Korea, indexing Korean-language web content, blog posts (Naver Blog is a major publishing platform in Korea), news articles from Korean outlets, Naver Cafe community posts, and shopping listings. Results reflect the Korean-language web, so queries in Korean will yield the most representative results. The shop content type returns product-level results useful for Korean e-commerce research.
The Naver API is a managed, monitored endpoint for naver.com — not a raw scraper you maintain. Every endpoint is automatically health-checked on a schedule, and when naver.com changes and a check fails, the API is automatically queued for repair and re-verified. It is built to keep working as the site underneath it changes.
This isn't an official naver.com API — it's an independent, maintained REST wrapper over public data. Where the source has no official API (or only a limited one), Parse gives you a stable contract over a source that never promised one, and keeps it current. Need a new endpoint or field? You can revise it yourself in plain English and the agent rebuilds it against the live site in minutes — contributing the change back to the shared API is free.
Will this API break when the source site changes?+
Is this an official API from the source site?+
Can I fix or extend this API myself if I need a new endpoint or field?+
What happens if I call an endpoint that has an issue?+
- Monitor Korean news coverage of a brand or topic by querying the
newscontent type and trackingtitleandlinkfields over time. - Build a Korean-language type-ahead search widget using autocomplete
suggestionsresponses. - Aggregate Naver Blog posts about a product category using the
blogcontent type and extractingdescriptionandsourcefields. - Research Korean shopping trends by querying the
shopcontent type and collecting product titles and links. - Track how Korean internet communities discuss a topic by querying the
cafecontent type. - Discover high-volume Korean search query variants by feeding seed terms into the
autocompleteendpoint. - Collect
total_resultscounts across content types to gauge relative interest in a keyword on the Korean web.
| Tier | Price | Credits/month | Rate limit |
|---|---|---|---|
| Free | $0/mo | 100 | 5 req/min |
| Hobby | $30/mo | 1,000 | 20 req/min |
| Developer | $100/mo | 5,000 | 100 req/min |
One credit = one API call regardless of which marketplace API you call. Exceeding the rate limit returns a 429 response. Authenticate with the X-API-Key header.
Does Naver have an official developer API?+
What does the `where` parameter control, and what are the valid values?+
where parameter selects the content type searched. Valid values are nexearch (general web results), blog, news, cafe, image, video, and shop. Only one value can be passed per request. Omitting it defaults to general web search.Does the search endpoint return image or video media files directly?+
where is set to image or video, the results array returns title, link, description, and source fields pointing to the content — it does not return binary media, thumbnails, or embeds directly. You can fork the API on Parse and revise it to extract additional media metadata fields if needed.Is there support for filtering search results by date range or sorting by recency?+
search endpoint accepts query, where, and page but no date-range or sort parameters. You can fork the API on Parse and revise it to add date filtering for content types like news or blog where recency is relevant.How deep can pagination go, and is there a cap on total pages retrievable?+
page parameter starts at 1 and each page returns 10 results. The total_results field in the response indicates the full result count. In practice, Naver limits how many pages of results are accessible for any given query, so very high page numbers may return empty result sets regardless of total_results.