비개발자를 위한 네이버 데이터랩 API: 상대 지수와 첫 조회
검색 횟수와 상대 지수를 구분하는 연습부터 시작합니다. NAVER API HUB의 신규 이용 절차와 기존 키의 전환 일정, 검색어 트렌드 조회 및 쇼핑 클릭 자료의 해석 기준을 설명합니다.

목차
세 줄로 먼저 읽기
이번 방문에서 한 편은 바로 볼 수 있습니다.
“우리 상품을 찾는 관심이 지난달보다 늘었을까요?” 네이버 데이터랩은 이런 질문에 쓸 수 있는 검색과 클릭의 추이 자료를 제공합니다. API는 프로그램으로 이 자료를 요청하는 기능입니다.
처음에는 검색어 두 개의 같은 기간 지수를 읽고, 무엇을 알 수 없는지도 설명하는 것을 목표로 합니다. 광고 계정은 필요하지 않지만 API 이용 신청과 인증은 필요합니다. 계정 연결 전에는 아래 가상 자료만으로 연습할 수 있습니다.
먼저 확인할 변경: 신규 신청은 NAVER API HUB에서
2026년 10월 4일 기준, 기존 네이버 개발자센터에서는 검색어 트렌드와 쇼핑인사이트 API의 신규 신청을 받지 않습니다. 2026년 7월 31일부터 신규 이용 경로가 NAVER API HUB로 바뀌었습니다. 네이버 클라우드 플랫폼이 API 이용과 키, 사용량을 관리하는 서비스입니다.
기존 개발자센터에서 그 전에 신청한 이용자는 2027년 6월 30일까지 지원받는 전환 기간에 해당합니다. 새로 시작하는 분과 기존 키를 가진 분의 절차를 섞지 않습니다. 네이버의 서비스 이관 공지
| 구분 | 기존 개발자센터 | NAVER API HUB |
|---|---|---|
| 이용 상황 | 기존 신청자의 전환 기간 | 신규 신청과 이관 |
| 검색어 조회 주소 | https://openapi.naver.com/v1/datalab/search | https://naverapihub.apigw.ntruss.com/search-trend/v1/search |
| 인증 헤더 | X-Naver-Client-Id, X-Naver-Client-Secret | X-NCP-APIGW-API-KEY-ID, X-NCP-APIGW-API-KEY |
| 키 | 기존 애플리케이션의 키 | HUB에서 새로 발급한 키 |
헤더는 요청에 붙이는 인증 등의 부가 정보입니다. 주소만 바꾸고 예전 키를 그대로 보내면 이관이 끝난 것이 아닙니다. 키, 헤더 이름, 경로와 응답 형식을 함께 확인합니다. 공식 이관 가이드
검색과 쇼핑 클릭은 다른 자료입니다
| API | 관찰하는 행동 | 뜻하지 않는 것 |
|---|---|---|
| 검색어 트렌드 | 네이버 통합검색에서 검색한 추이 | 전체 인터넷 검색량, 우리 매출 |
| 쇼핑인사이트 | 네이버쇼핑과 통합검색 쇼핑 영역에서 검색 결과를 클릭한 추이 | 구매 완료 건수, 고유 구매자 수 |
두 자료 모두 ratio라는 상대 지수를 사용합니다. 네이버에서 관찰한 범위이므로 시장 전체의 수요라고 확대하지 않습니다. 검색이 늘었다면 관심 변화의 단서로 볼 수 있지만 매출 증가가 확인된 것은 아닙니다. 데이터랩 기능과 지수 설명
이 그림은 기존 개발자센터 문서입니다. 지수의 뜻을 읽는 데 참고하되 신규 요청 주소와 필드 형식은 HUB 문서를 기준으로 확인합니다.
첫 연습: 지수 100을 검색 100회로 읽지 않습니다
아래는 계산 연습용 가상 자료입니다. 두 검색어 묶음을 같은 요청으로 조회했다고 가정합니다.
| 월 | 가상 브랜드 A 지수 | 가상 브랜드 B 지수 |
|---|---|---|
| 6월 | 50 | 25 |
| 7월 | 100 | 40 |
| 8월 | 80 | 30 |
A의 7월 지수는 6월의 두 배입니다. 그러나 검색이 50회에서 100회가 됐다는 뜻은 아닙니다. 100은 이 조회의 가장 큰 값을 기준으로 나타낸 숫자이고, 시장 점유율 100%도 아닙니다.
혼자 확인해 봅니다. A의 8월 지수는 7월보다 얼마나 낮을까요? (80 - 100) / 100 × 100 = -20%이므로 지수가 20% 낮습니다. 반면 A의 실제 8월 검색 횟수는 이 표만으로 알 수 없습니다.
서로 다른 요청에서 받은 80과 80도 그대로 비교하지 않습니다. 기간, 검색어 구성과 필터가 바뀌면 기준이 달라질 수 있습니다. 조회 날짜가 다르다는 이유만으로 반드시 숫자가 달라지는 것은 아니지만, 조건이 달라진 표를 이어 붙이면 실제 변화와 기준 변경을 구분하기 어렵습니다.
신규 이용자가 준비할 것
네이버 클라우드 플랫폼 콘솔에서 NAVER API HUB 이용을 신청하고 Application을 등록합니다. Application은 사용할 API와 인증 정보를 묶어 관리하는 등록 항목입니다. 검색어 트렌드를 선택하고 Client ID와 Client Secret을 확인합니다. 쇼핑 자료도 필요하면 쇼핑인사이트를 함께 선택합니다. 등록 절차
Client Secret은 비밀 인증값입니다. AI 대화, 코드와 공개 저장소에 적지 않습니다. 회사의 비밀값 관리 방식으로 실행 환경에 설정하고, 어느 계정에서 관리할지 담당자와 정합니다. 신청이 끝나지 않았다면 앞의 지수 해석 연습을 먼저 진행합니다.
현재 공식 개요는 HUB의 한시적 무료 제공과 검색어 트렌드 및 쇼핑인사이트 각각 월 최대 50,000건을 안내합니다. 두 API가 한 한도를 나눠 쓴다는 뜻이 아닙니다. 같은 키를 공유하는 프로그램의 사용량은 합산되므로 실행 전에 현재 요금과 콘솔의 한도를 확인합니다. HUB 요금과 한도 안내
검색어 트렌드의 요청 조건
검색어를 묶는 keywordGroups에는 표시 이름인 groupName과 실제 검색할 단어 목록인 keywords를 넣습니다. 표시 이름만 바꾼다고 조회 대상이 바뀌지는 않습니다. 묶음에 어떤 단어를 넣었는지가 중요합니다.
아래 첫 조회는 ‘텀블러’와 ‘머그컵’이라는 단어 하나씩을 비교합니다. 브랜드 비교로 바꿀 때는 양쪽에 같은 원칙으로 표기 변형을 넣고, 한쪽에만 관련 상품어를 많이 추가하지 않습니다. 묶음이 달라지면 비교하려는 대상도 달라집니다.
| 항목 | 첫 조회에서 사용할 값 |
|---|---|
startDate, endDate | 2026-06-01과 2026-08-31 |
timeUnit | month, 월별 구간 |
keywordGroups | 두 묶음, 각 한 단어 |
device, gender, ages | 생략해 전체 조건으로 조회 |
조회는 JSON 형식의 조건을 요청 본문에 담는 POST 방식입니다. JSON은 항목 이름과 값을 정해진 형식으로 표현하는 방법입니다. 이 API의 POST는 검색 추이 조회이며 광고 생성 요청이 아닙니다. HUB 검색어 트렌드 명세
그림은 기존 문서의 표이며 일부 행이 화면 메뉴에 가려져 있습니다. 현재 요청에 필요한 값은 위 표와 HUB 명세로 확인합니다. 검색어 수를 처음부터 한도까지 채울 필요는 없습니다. 현재 HUB의 개요와 상세 명세에는 그룹당 검색어 한도가 서로 다르게 적혀 있습니다. 이 예제는 각 한 단어만 사용합니다. 대량 조회로 늘릴 때는 최신 상세 명세와 지원 안내에서 실제 허용 개수를 확인합니다.
Python으로 한 번 조회하고 조건과 함께 저장합니다
Python 3가 있는 환경에서 아래 코드를 datalab_first.py로 저장합니다. 추가 패키지는 필요하지 않습니다. 환경 변수는 프로그램이 읽는 설정값이며, NAVER_HUB_CLIENT_ID와 NAVER_HUB_CLIENT_SECRET에 HUB의 인증 정보가 준비돼 있어야 합니다.
import os, json, csv
from pathlib import Path
from datetime import datetime, timezone
from urllib.request import Request, urlopen
from urllib.error import HTTPError
client_id = os.environ["NAVER_HUB_CLIENT_ID"]
client_secret = os.environ["NAVER_HUB_CLIENT_SECRET"]
folder = Path("datalab_first_result")
if folder.exists():
raise FileExistsError("기존 결과 폴더를 확인한 뒤 새 폴더 이름으로 실행합니다.")
body = {
"startDate": "2026-06-01", "endDate": "2026-08-31",
"timeUnit": "month",
"keywordGroups": [
{"groupName": "텀블러", "keywords": ["텀블러"]},
{"groupName": "머그컵", "keywords": ["머그컵"]},
],
}
request = Request(
"https://naverapihub.apigw.ntruss.com/search-trend/v1/search",
data=json.dumps(body, ensure_ascii=False).encode("utf-8"),
headers={"X-NCP-APIGW-API-KEY-ID": client_id,
"X-NCP-APIGW-API-KEY": client_secret,
"Content-Type": "application/json"},
method="POST",
)
try:
with urlopen(request, timeout=30) as response:
result = json.load(response)
except HTTPError as error:
raise RuntimeError(f"조회 실패: HTTP {error.code}") from None
if not isinstance(result, dict):
raise ValueError("예상한 응답 객체가 아닙니다.")
for field in ("startDate", "endDate", "timeUnit"):
if result.get(field) != body[field]:
raise ValueError(f"응답의 {field}가 요청 조건과 다릅니다.")
groups = result.get("results")
if not isinstance(groups, list):
raise ValueError("응답의 results가 목록이 아닙니다.")
expected = {g["groupName"]: g["keywords"] for g in body["keywordGroups"]}
rows = []
for group in groups:
if not isinstance(group, dict) or not isinstance(group.get("data"), list):
raise ValueError("검색어 묶음의 응답 형식이 다릅니다.")
if group.get("title") not in expected or group.get("keywords") != expected[group["title"]]:
raise ValueError("응답의 검색어 묶음이 요청과 다릅니다.")
for row in group["data"]:
if not isinstance(row, dict) or not row.get("period"):
raise ValueError("구간의 날짜를 확인할 수 없습니다.")
rows.append([group.get("title"), row["period"], row.get("ratio")])
folder.mkdir()
record = {"request": body, "response": result,
"collected_at_utc": datetime.now(timezone.utc).isoformat()}
with (folder / "record.json").open("x", encoding="utf-8") as handle:
json.dump(record, handle, ensure_ascii=False, indent=2)
with (folder / "trend.csv").open("x", newline="", encoding="utf-8-sig") as handle:
writer = csv.writer(handle)
writer.writerow(["주제어", "구간_시작일", "상대_지수"])
writer.writerows(rows)
print(f"{len(rows)}행 저장: {folder}")python3 datalab_first.py로 실행하면 datalab_first_result 폴더에 record.json과 trend.csv가 생깁니다. 앞 파일에는 인증값을 제외한 요청 조건과 응답, 수집 시각이 남고, CSV에는 표가 저장됩니다. 실제 지수는 실행 결과를 확인하며 위 가상 표의 숫자가 나와야 하는 것은 아닙니다. period는 구간 시작일이므로 2026-06-01 행은 6월의 월별 지수입니다. 수집 시각의 UTC는 세계 표준시로, 한국 시간보다 9시간 느립니다.
CSV에서 주제어와 구간이 요청과 맞는지 확인합니다. 누락된 지수는 빈 칸으로 남고 반환된 0은 0으로 저장됩니다. 0행이면 검색이 없었다고 바로 결론내리지 말고 기록 파일의 응답과 조회 조건부터 확인합니다. 네이버 데이터랩 화면과 대조할 때도 검색어 묶음, 날짜와 필터를 같게 맞춥니다.
쇼핑인사이트로 확장할 때
쇼핑 자료를 조회하려면 주소뿐 아니라 요청 본문도 바꿔야 합니다. 검색어 트렌드의 keywordGroups를 그대로 복사하지 않습니다.
| 목적 | HUB 경로와 확인할 입력 |
|---|---|
| 분야 비교 | /shopping/v1/categories, category 목록 |
| 특정 분야 안의 키워드 비교 | /shopping/v1/category/keywords, 분야 코드와 keyword 목록 |
| 기기, 성별 또는 연령별 확인 | 각각의 전용 API에서 요청 조건 확인 |
분야별 비교는 최대 3개 분야를 넣으며, 분야 코드는 공식 문서가 안내하는 네이버쇼핑 주소의 cat_id로 확인합니다. 예시 코드가 현재 원하는 세부 분야를 뜻하는지도 대조합니다. 분야별 요청 명세
키워드별 요청은 최대 5개 묶음이고 각 묶음의 param에는 검색어 하나를 넣습니다. 검색어 트렌드의 단어 묶음 규칙과 다릅니다. 기기와 성별, 연령별 세부 조회도 제공되므로 목적에 맞는 항목을 고릅니다. 키워드별 명세, 전체 API 목록
같은 ‘20대’ 조건으로 맞출 수 있나요?
검색어 트렌드의 연령 코드 3과 4를 함께 쓰면 19~29세입니다. 쇼핑의 20은 20~29세이므로 정확히 같지 않습니다. 코드 두 개를 합친다고 19세가 빠지는 것은 아닙니다.
30~39세처럼 구간을 맞출 수 있더라도 검색과 클릭이라는 행동의 차이는 남습니다. 연령별 지수도 서로 다른 요청 결과를 단순 합산해서는 안 됩니다. 검색어 연령 조건, 쇼핑 연령별 명세
지수를 실제 검색 횟수로 환산해도 될까요?
이 글의 연습에서는 환산하지 않습니다. 다른 도구에서 얻은 검색 횟수 하나를 기준으로 비례식을 만들더라도, 기간과 기기, 단어 묶음 및 집계 대상이 다르면 실제 검색 횟수를 복원했다고 볼 수 없습니다.
가령 월별 지수와 최근 일정 기간의 검색수는 날짜 범위부터 다를 수 있습니다. 추정이라고 표시하는 것만으로 맞지 않는 기준이 해결되지는 않습니다. 검색 횟수가 필요한 보고서는 별도 자료의 정의를 확인해 사용하고 데이터랩 열에는 ‘상대 지수’라고 적습니다.
브랜드 A 지수가 높다는 이유로 구매가 더 많거나 광고 효율이 좋다고 판단하지 않습니다. 광고 성과는 네이버 검색광고 API와 같이 목적에 맞는 별도 자료로 확인합니다.
실행이 막히면 어디를 확인하나요?
| 증상 | 다음 확인 |
|---|---|
python3 명령을 찾지 못함 | Python 3 실행 환경을 준비하고, 그 전에는 가상 표로 연습 |
KeyError에 환경 변수 이름이 나옴 | 현재 실행 환경에 HUB 인증 정보가 설정됐는지 |
| 인증 실패 또는 권한 오류 | 새 HUB 키와 헤더, Application의 사용 API 선택 |
| 주소 오류 | 기존 개발자센터 주소와 HUB 경로가 섞였는지 |
| 요청 형식 오류 | 날짜와 필수 필드, JSON 형식 |
| 429 또는 한도 초과 | 콘솔 사용량과 요청 빈도, 반복 실행 중지 |
| 시간 초과 또는 연결 실패 | 네트워크와 서비스 상태 |
| 기존 폴더 오류 | 이전 결과를 보존하고 새 폴더 이름 사용 |
HUB는 기존 서비스와 오류 응답 형식이 다를 수 있습니다. ‘403이면 무조건 같은 설정 문제’라고 단정하지 않습니다. 인증값이 없는 오류 코드와 메시지를 기준으로 공식 오류 안내를 확인합니다. 공통 응답과 오류 명세
첫 조회를 이해했다면 기간을 한 달 늘려 새 폴더에 저장합니다. 이전 표에 새 행만 붙이지 말고 같은 요청으로 받은 전체 결과를 비교합니다. 지수가 달라진 이유가 관심 변화인지 기준 기간 변경인지 먼저 구분하는 것이 다음 연습입니다.
3줄 요약
-
데이터랩의 검색과 쇼핑 클릭 지수는 상대적인 추이를 보여 주며 실제 검색 횟수나 구매수를 뜻하지 않습니다.
-
신규 이용자는 NAVER API HUB를 사용하고 기존 개발자센터 이용자는 키와 주소 및 지원 종료 일정을 구분합니다.
-
한 번의 요청 조건과 응답을 함께 보관하고 같은 기준의 지수끼리 비교한 뒤 수집 범위를 늘립니다.

제대로 이해했는지 한 문제로 확인해 볼까요?
답을 고르면 바로 풀이가 나와요.
같은 요청의 두 월 지수가 50과 100이면 무엇을 알 수 있나요?
이 글이 도움이 되었나요?
메일, 회의록, 리포트처럼 반복되는 일을 AI로 자동화하는 순서와 안전장치를 다룹니다
코스 전체 보기 →
새 글과 AI 소식을 메일로 받아 보세요
AI가 바꾸는 일과 도구, 측정 실무 이야기를 매주 한 번 보내 드려요.
