{"library":"naver-openapi","title":"Naver Open API (Search, Papago, Clova)","description":"Naver's consumer-facing Open API suite — provides programmatic access to South Korea's dominant search engine (70%+ market share), Papago translation, Clova OCR/AI services, Naver Maps, and Naver Login (OAuth). No official Python SDK exists — integration is done via direct HTTP requests using the requests library. Auth uses Client ID and Client Secret passed as HTTP headers. All APIs are registered and managed via the Naver Cloud Platform console. IMPORTANT: Naver Open API is Korea-first — registration UI, documentation, and error messages are primarily in Korean. Daily quota resets at 00:00 KST (UTC+9), not UTC.","language":"python","status":"active","last_verified":"Tue May 12","install":{"commands":["pip install requests"],"cli":null},"imports":["import requests"],"auth":{"required":false,"env_vars":[]},"quickstart":{"code":"import os\nimport requests\n\nCLIENT_ID = os.environ['NAVER_CLIENT_ID']        # X-NCP-APIGW-API-KEY-ID\nCLIENT_SECRET = os.environ['NAVER_CLIENT_SECRET']  # X-NCP-APIGW-API-KEY\n\nheaders = {\n    'X-NCP-APIGW-API-KEY-ID': CLIENT_ID,\n    'X-NCP-APIGW-API-KEY': CLIENT_SECRET,\n}\n\n# --- Search API (blog, news, web, image, shopping, book) ---\n# Base URL: https://openapi.naver.com/v1/search/{type}.json\ndef search_blog(query: str, display: int = 10, start: int = 1):\n    url = 'https://openapi.naver.com/v1/search/blog.json'\n    params = {\n        'query': query,\n        'display': display,  # 1-100, default 10\n        'start': start,      # 1-1000\n        'sort': 'sim',       # 'sim' (relevance) or 'date'\n    }\n    response = requests.get(url, headers=headers, params=params)\n    response.raise_for_status()\n    return response.json()\n\ndef search_news(query: str):\n    url = 'https://openapi.naver.com/v1/search/news.json'\n    params = {'query': query, 'display': 10, 'sort': 'date'}\n    response = requests.get(url, headers=headers, params=params)\n    response.raise_for_status()\n    return response.json()\n\n# --- Papago Translation ---\n# Supported language pairs: ko<->en, ko<->zh-CN, ko<->zh-TW, ko<->ja, ko<->es, ko<->fr, etc.\ndef translate(text: str, source: str = 'ko', target: str = 'en'):\n    url = 'https://naveropenapi.apigw.ntruss.com/nmt/v1/translation'\n    # NOTE: Papago uses different base URL than Search API\n    data = {\n        'source': source,\n        'target': target,\n        'text': text,\n    }\n    response = requests.post(url, headers=headers, data=data)\n    response.raise_for_status()\n    return response.json()['message']['result']['translatedText']\n\n# --- Clova OCR ---\ndef ocr_image(image_url: str):\n    url = 'https://naveropenapi.apigw.ntruss.com/ocr/v1/recognize'\n    data = {\n        'image': image_url,\n        'lang': 'ko',\n        'type': 'url',\n    }\n    response = requests.post(url, headers=headers, data=data)\n    response.raise_for_status()\n    return response.json()\n\n# --- Naver Login (OAuth 2.0) ---\n# Step 1: Redirect user to Naver auth URL\nimport urllib.parse\n\ndef get_naver_login_url(state: str) -> str:\n    params = {\n        'response_type': 'code',\n        'client_id': CLIENT_ID,\n        'redirect_uri': 'https://yourdomain.com/callback',\n        'state': state,\n    }\n    return 'https://nid.naver.com/oauth2.0/authorize?' + urllib.parse.urlencode(params)\n\n# Step 2: Exchange code for token\ndef get_naver_token(code: str, state: str) -> dict:\n    url = 'https://nid.naver.com/oauth2.0/token'\n    params = {\n        'grant_type': 'authorization_code',\n        'client_id': CLIENT_ID,\n        'client_secret': CLIENT_SECRET,\n        'code': code,\n        'state': state,\n    }\n    response = requests.get(url, params=params)\n    return response.json()\n\n# Step 3: Get user profile\ndef get_naver_profile(access_token: str) -> dict:\n    url = 'https://openapi.naver.com/v1/nid/me'\n    headers_auth = {'Authorization': f'Bearer {access_token}'}\n    response = requests.get(url, headers=headers_auth)\n    return response.json()","lang":"python","description":"Two different base URLs are used depending on the service: 'openapi.naver.com' for Search and Login APIs, 'naveropenapi.apigw.ntruss.com' for AI services (Papago, Clova). Using the wrong base URL returns a 404 with no helpful error message. Daily quota resets at midnight KST (UTC+9), not UTC.","tag":"stale","tag_description":"widespread failures or data too old to trust","last_tested":"2026-05-12","results":[{"runtime":"python:3.10-alpine","exit_code":1},{"runtime":"python:3.10-slim","exit_code":1},{"runtime":"python:3.11-alpine","exit_code":1},{"runtime":"python:3.11-slim","exit_code":1},{"runtime":"python:3.12-alpine","exit_code":1},{"runtime":"python:3.12-slim","exit_code":1},{"runtime":"python:3.13-alpine","exit_code":1},{"runtime":"python:3.13-slim","exit_code":1},{"runtime":"python:3.9-alpine","exit_code":1},{"runtime":"python:3.9-slim","exit_code":1}]},"compatibility":{"tag":"verified","tag_description":"installs cleanly on critical runtimes, fast import, recently tested","last_tested":"2026-05-12","installed_version":null,"pypi_latest":null,"is_stale":null,"summary":{"python_range":"3.10–3.9","success_rate":100,"avg_install_s":null,"avg_import_s":0.57,"wheel_type":null},"results":[{"runtime":"python:3.10-alpine","python_version":"3.10","os_libc":"alpine (musl)","variant":"requests","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.54,"mem_mb":9.6,"disk_size":"70.4M"},{"runtime":"python:3.10-slim","python_version":"3.10","os_libc":"slim (glibc)","variant":"requests","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.38,"mem_mb":9.6,"disk_size":"142M"},{"runtime":"python:3.11-alpine","python_version":"3.11","os_libc":"alpine (musl)","variant":"requests","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.74,"mem_mb":10.8,"disk_size":"77.1M"},{"runtime":"python:3.11-slim","python_version":"3.11","os_libc":"slim (glibc)","variant":"requests","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.58,"mem_mb":10.8,"disk_size":"148M"},{"runtime":"python:3.12-alpine","python_version":"3.12","os_libc":"alpine (musl)","variant":"requests","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.64,"mem_mb":11.2,"disk_size":"67.6M"},{"runtime":"python:3.12-slim","python_version":"3.12","os_libc":"slim (glibc)","variant":"requests","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.65,"mem_mb":11.2,"disk_size":"139M"},{"runtime":"python:3.13-alpine","python_version":"3.13","os_libc":"alpine (musl)","variant":"requests","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.63,"mem_mb":11.6,"disk_size":"64.1M"},{"runtime":"python:3.13-slim","python_version":"3.13","os_libc":"slim (glibc)","variant":"requests","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.61,"mem_mb":11.6,"disk_size":"137M"},{"runtime":"python:3.9-alpine","python_version":"3.9","os_libc":"alpine (musl)","variant":"requests","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.5,"mem_mb":9.4,"disk_size":"69.3M"},{"runtime":"python:3.9-slim","python_version":"3.9","os_libc":"slim (glibc)","variant":"requests","exit_code":0,"wheel_type":null,"failure_reason":null,"import_side_effects":null,"install_time_s":null,"import_time_s":0.4,"mem_mb":9.4,"disk_size":"141M"}]}}