비개발자를 위한 네이버 데이터랩 API: 상대 지수와 첫 조회
네이버 데이터랩 API의 숫자는 검색 횟수가 아니라 상대 지수입니다. NAVER API HUB 신규 이용 절차와 기존 키 전환 일정, 검색어 트렌드를 Python으로 한 번 조회해 저장하는 방법, 쇼핑인사이트로 넓힐 때 달라지는 요청 조건을 설명합니다.

세 줄로 먼저 읽기
- 데이터랩 API의 검색어 트렌드와 쇼핑인사이트는 한 요청 안에서 가장 큰 값을 100으로 둔 상대 지수를 돌려주며 실제 검색 횟수나 구매수가 아닙니다.
- 2026년 7월 31일부터 신규 신청은 NAVER API HUB에서 받고, 기존 개발자센터 키는 2027년 6월 30일까지 지원되며 HUB 키와 서로 바꿔 쓸 수 없습니다.
- HUB는 두 API를 각각 월 최대 50,000건까지 제공하고, 요청 조건과 응답을 함께 저장해 두어야 같은 기준의 지수끼리 비교할 수 있습니다.
“우리 상품을 찾는 관심이 지난달보다 늘었을까요?” 네이버 데이터랩은 이런 질문에 쓸 수 있는 검색과 클릭의 추이 자료를 제공합니다. API는 프로그램으로 이 자료를 요청하는 기능입니다.
이 글은 검색어 두 개의 석 달 치 지수를 API로 한 번 받아 저장하고, 그 숫자로 무엇을 말할 수 있는지까지 다룹니다. 광고 계정은 필요 없지만 API 이용 신청과 인증은 필요합니다.
먼저 확인할 변경: 신규 신청은 NAVER API HUB에서
2026년 7월 31일부터 검색어 트렌드와 쇼핑인사이트 API의 신규 이용 경로가 NAVER API HUB로 바뀌었고, 기존 네이버 개발자센터는 신규 신청을 받지 않습니다. NAVER API HUB는 네이버 클라우드 플랫폼이 API 이용과 키, 사용량을 관리하는 서비스입니다. 7월 31일 전에 개발자센터에서 신청한 이용자는 전환 기간 동안 기존 키를 계속 씁니다.
데이터랩 API 이용 경로가 바뀌는 일정
2026년 7월 31일신규 신청은
NAVER API HUB에서
전환 기간기존 개발자센터 키로
계속 조회
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에서 새로 발급한 키 |
헤더는 요청에 붙이는 인증 정보 같은 부가 정보입니다. 이관할 때는 주소만 바꾸지 않고 키와 헤더 이름, 경로, 응답 형식까지 모두 HUB 기준으로 바꿉니다. 예전 키를 HUB 주소로 보내면 인증이 되지 않습니다.
검색과 쇼핑 클릭은 다른 자료입니다
검색어 트렌드는 검색한 행동을, 쇼핑인사이트는 쇼핑 검색 결과를 클릭한 행동을 집계합니다. 두 자료 모두 ratio라는 상대 지수로 돌려줍니다.
두 API가 보여 주는 것
| 자료 | ||
|---|---|---|
| 네이버 통합검색에서 검색한 추이 | 제공 | 제공하지 않음 |
| 네이버쇼핑과 통합검색 쇼핑 영역의 클릭 추이 | 제공하지 않음 | 제공 |
| 전체 인터넷 검색량 | 제공하지 않음 | 제공하지 않음 |
| 우리 매출, 구매 완료 건수, 구매자 수 | 제공하지 않음 | 제공하지 않음 |
검색이 늘었다면 관심이 바뀌었다는 단서로 볼 수 있지만, 그것만으로 매출이 늘었다고 말할 수는 없습니다.
그림은 기존 개발자센터 문서의 응답 속성 표로, ratio를 상대 비율이라고 설명합니다. 새로 요청할 주소와 필드 형식은 HUB 문서를 따릅니다.
지수 100은 그 요청 안의 최댓값입니다
지수 100은 그 조회 안에서 가장 큰 값을 기준으로 나타낸 숫자입니다. 예를 들어 같은 요청에서 6월이 50, 7월이 100으로 나왔다면 7월의 관심이 6월의 두 배라는 뜻입니다. 실제 검색 횟수와 시장 점유율은 이 숫자로 알 수 없습니다.
지수로 말할 수 있는 것
| 비교하려는 것 | ||
|---|---|---|
| 월별 증감률 | 제공 | 제공하지 않음 |
| 두 검색어 묶음의 상대 크기 | 제공 | 제공하지 않음 |
| 실제 검색 횟수 | 제공하지 않음 | 제공하지 않음 |
| 시장 점유율 | 제공하지 않음 | 제공하지 않음 |
다른 요청에서 받은 80과 80도 같은 크기로 볼 수 없습니다. 조회한 날짜만 다를 때는 숫자가 그대로일 수도 있지만, 조건이 다른 표를 이어 붙이면 실제 변화와 기준 변경을 구분하기 어렵습니다.
지수를 실제 검색 횟수로 환산하는 것도 피합니다. 다른 도구에서 얻은 검색 횟수 하나를 기준으로 비례식을 만들더라도, 기간과 기기, 단어 묶음, 집계 대상이 다르면 그 결과는 실제 검색 횟수가 되지 않습니다. 예를 들어 월별 지수와 최근 일정 기간의 검색수는 날짜 범위부터 다를 수 있습니다. 검색 횟수가 필요한 보고서에는 그 정의가 분명한 별도 자료를 쓰고, 데이터랩 열에는 ‘상대 지수’라고 적습니다.
같은 이유로 브랜드 A의 지수가 높다고 구매가 더 많거나 광고 효율이 좋다고 판단하지 않습니다. 광고 성과는 네이버 검색광고 API처럼 목적에 맞는 자료로 봅니다.
신규 이용자가 준비할 것
HUB에서 키를 받기까지는 네이버 클라우드 플랫폼 콘솔에서 다섯 단계를 거칩니다.
NAVER API HUB에서 키를 받는 순서
1. 이용 신청네이버 클라우드 플랫폼 콘솔에서
NAVER API HUB 신청
2. Application 등록쓸 API와 인증 정보를
묶어 관리하는 항목
3. API 선택검색어 트렌드
필요하면 쇼핑인사이트도
4. 키 확인Client ID와
Client Secret
5. 실행 환경에 저장환경 변수로 설정
코드와 대화에는 적지 않음
Client Secret은 비밀 인증값입니다. AI 대화나 코드, 공개 저장소에 적지 않고, 회사의 비밀값 관리 방식에 따라 실행 환경에 설정합니다. 어느 계정에서 키를 관리할지도 담당자와 미리 정합니다.
HUB의 월 호출 한도
50,000건검색어 트렌드월 최대
50,000건쇼핑인사이트월 최대, 검색어 트렌드와 별도
실행하기 전에 콘솔에서 현재 요금과 남은 한도를 봅니다.
검색어 트렌드의 요청 조건
검색어를 묶는 keywordGroups에는 표시 이름인 groupName과 실제로 검색할 단어 목록인 keywords를 넣습니다. 조회 대상을 정하는 것은 keywords이고, groupName은 결과에 붙는 이름일 뿐입니다.
아래 조회는 ‘텀블러’와 ‘머그컵’이라는 단어 하나씩을 비교합니다. 브랜드 비교로 바꿀 때는 양쪽에 같은 원칙으로 표기 변형을 넣고, 한쪽에만 관련 상품어를 많이 추가하지 않습니다. 묶음에 넣은 단어가 달라지면 비교하는 대상도 달라집니다.
이 글의 첫 조회에 넣는 값
1. 기간startDate, endDate
2026-06-01부터 2026-08-31
2. 구간 단위timeUnit
month, 월별
3. 검색어 묶음keywordGroups
텀블러, 머그컵 각 한 단어
4. 필터device, gender, ages
생략해 전체 조건
조회는 JSON 형식의 조건을 요청 본문에 담아 보내는 POST 방식입니다. JSON은 항목 이름과 값을 정해진 형식으로 적는 방법입니다. 이 API의 POST는 검색 추이를 조회할 뿐 광고를 만들거나 바꾸지 않습니다. 처음에는 묶음마다 한 단어만 넣고, 대량 조회로 늘릴 때 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를 실행합니다. 두 묶음의 석 달 치가 모두 들어오면 마지막 줄에 6행이 저장됐다고 나옵니다.
datalab_first_result 폴더에는 record.json과 trend.csv가 생깁니다. record.json에는 인증값을 뺀 요청 조건과 응답, 수집 시각이 남고, trend.csv에는 주제어별 구간과 지수가 표로 저장됩니다. period는 구간 시작일이므로 2026-06-01 행은 6월의 지수입니다. 수집 시각의 UTC는 세계 표준시로, 한국 시간보다 9시간 느립니다.
CSV를 열어 주제어와 구간이 요청과 맞는지 봅니다. 누락된 지수는 빈 칸으로, 반환된 0은 0으로 저장됩니다. 0행이 나오면 검색이 없었다고 결론 내리기 전에 record.json의 응답과 조회 조건부터 봅니다. 네이버 데이터랩 웹 화면과 숫자를 대조할 때도 검색어 묶음, 날짜, 필터를 똑같이 맞춥니다.
기간을 늘려 다시 받을 때는 새 폴더에 저장하고, 이전 표에 새 달의 행만 붙이지 않습니다. 같은 요청으로 받은 전체 결과끼리 비교해야 지수가 달라진 이유가 관심 변화인지 기준 기간이 바뀐 탓인지 구분됩니다.
실행이 막히면
| 증상 | 다음 확인 |
|---|---|
python3 명령을 찾지 못함 | Python 3 실행 환경 준비 |
KeyError에 환경 변수 이름이 나옴 | 현재 실행 환경에 HUB 인증 정보가 설정됐는지 |
| 인증 실패 또는 권한 오류 | 새 HUB 키와 헤더, Application에서 고른 API |
| 주소 오류 | 기존 개발자센터 주소와 HUB 경로가 섞였는지 |
| 요청 형식 오류 | 날짜와 필수 필드, JSON 형식 |
| 429 또는 한도 초과 | 콘솔 사용량과 요청 빈도, 반복 실행 중지 |
| 시간 초과 또는 연결 실패 | 네트워크와 서비스 상태 |
| 기존 폴더 오류 | 이전 결과를 보존하고 새 폴더 이름 사용 |
HUB의 오류 응답 형식은 기존 서비스와 다를 수 있으므로, 같은 403이라도 원인을 하나로 정하지 않고 오류 코드와 메시지를 공식 오류 명세와 대조합니다. 오류를 공유할 때는 인증값을 지운 코드와 메시지만 보냅니다.
쇼핑인사이트로 확장할 때
쇼핑 자료를 조회하려면 주소뿐 아니라 요청 본문도 바꿔야 합니다. 검색어 트렌드의 keywordGroups 구조는 쇼핑 API에 그대로 쓸 수 없습니다.
API별 요청 본문 규칙
| 규칙 | |||
|---|---|---|---|
| 넣는 값 | 검색어 묶음 keywordGroups | 분야 코드 목록 category | 분야 코드와 keyword 목록 |
| 한 번에 넣는 최대 개수 | – | 분야 3개 | 묶음 5개 |
| 묶음 하나의 검색어 수 | 여러 단어 | – | 하나 |
분야 코드는 공식 문서가 안내하는 대로 네이버쇼핑 주소의 cat_id에서 찾습니다. 문서의 예시 코드가 지금 원하는 세부 분야와 같은지도 대조합니다. 키워드별 요청은 각 묶음의 param에 검색어를 하나만 넣으므로, 여러 단어를 한 묶음에 넣는 검색어 트렌드와 규칙이 다릅니다.
같은 ‘20대’ 조건으로 맞출 수 있나요?
정확히 같게 맞출 수는 없습니다. 두 API의 연령 코드가 가리키는 범위가 다릅니다.
두 API의 20대 범위
19~29세검색어 트렌드연령 코드 3과 4를 함께 사용
20~29세쇼핑인사이트연령 코드 20
코드 두 개를 합쳐도 검색어 트렌드에서 19세는 빠지지 않습니다. 30~39세처럼 구간이 같은 연령대도 검색과 클릭이라는 행동의 차이는 남습니다. 서로 다른 요청에서 받은 연령별 지수는 100의 기준이 달라 더하지 않습니다.
Sources
- 네이버 데이터랩 API 서비스 이관 공지
- NAVER API HUB 이관 가이드
- 데이터랩 기능과 지수 설명
- NAVER API HUB Application 등록 절차
- NAVER API HUB 요금과 한도 안내
- HUB 검색어 트렌드 명세
- HUB 쇼핑인사이트 분야별 명세
- HUB 쇼핑인사이트 키워드별 명세
- HUB 쇼핑인사이트 연령별 명세
- HUB 전체 API 목록과 공통 오류 명세
3줄 요약
-
데이터랩 API의 검색어 트렌드와 쇼핑인사이트는 한 요청 안에서 가장 큰 값을 100으로 둔 상대 지수를 돌려주며 실제 검색 횟수나 구매수가 아닙니다.
-
2026년 7월 31일부터 신규 신청은 NAVER API HUB에서 받고, 기존 개발자센터 키는 2027년 6월 30일까지 지원되며 HUB 키와 서로 바꿔 쓸 수 없습니다.
-
HUB는 두 API를 각각 월 최대 50,000건까지 제공하고, 요청 조건과 응답을 함께 저장해 두어야 같은 기준의 지수끼리 비교할 수 있습니다.

제대로 이해했는지 한 문제로 확인해 볼까요?
답을 고르면 바로 풀이가 나와요.
같은 요청의 두 월 지수가 50과 100이면 무엇을 알 수 있나요?

새 글과 AI 소식을 메일로 받아 보세요
AI가 바꾸는 일과 도구, 측정 실무 이야기를 매주 한 번 보내 드려요.
이 글이 도움이 되었나요?
메일, 회의록, 리포트처럼 반복되는 일을 AI로 자동화하는 순서와 안전장치를 다룹니다
코스 전체 보기 →