Files
nomadamas__k-skill/kosis-stats/references/kosis-openapi-guide.md
설코딩 -SeolCoding 4ba9876a57 feat: 국가데이터처 KOSIS 통계 조회(kosis-stats) 스킬 추가 (#216)
* feat: 국가데이터처 KOSIS 통계 조회(kosis-stats) 스킬 추가

KOSIS Open API 4개 endpoint(statisticsSearch / statisticsData getMeta /
statisticsParameterData / statisticsBigData) read-only 호출을 단일 Python
helper로 묶었다. 인증키는 KSKILL_KOSIS_API_KEY 환경변수(또는 기본
secrets.env)로 사용자별 발급한다 — proxy 미사용.

- kosis-stats/SKILL.md, scripts/run_kosis_stats.py: stdlib only,
  search/meta/data/bigdata 서브커맨드, --json/--text/--dry-run
- kosis-stats/references/kosis-openapi-guide.md: 인증키 발급, 호출 한도
  (분당 1000건/40k cells), 에러 코드, HTTPS 전용 정책 정리
- kosis-stats/tests/: stdlib unittest 36개, mock 기반 (네트워크 X) +
  KSKILL_KOSIS_API_KEY 가 있을 때만 도는 라이브 smoke 1개
- docs/features/kosis-stats.md, README, install/setup/security-and-secrets/
  sources, examples/secrets.env.example, package.json lint/test 등록

* fix(kosis-stats): 사용자 시나리오 e2e 검증 기반 UX 보강

4개 sonnet 서브에이전트 병렬 시나리오(단일수치/시계열/지역비교/실패회복)
검증에서 발견된 P1/P2 UX 부족함 보강. 4개 회복 시나리오 친절도 평균 2.75
→ 4.5 (S4c 코드 20 막힘 P1 해결).

- ERROR_CODE_HINTS: 코드 20/21/30/31 모두 next-step 명령 예시 포함
  (코드 20은 ITM 메타 우선 안내 — 실제 표 다수에서 OBJ 비어 있음)
- render_search_text: Next 액션 흐름 안내 추가
- render_meta_text: 빈 결과 시 다른 --meta-type 시도 안내
- render_data_text: 빈 결과 시 필터/meta 재확인 안내,
  새 [summary] 라인(rows/period/unit, UNIT_NM 누락 명시)
- SKILL.md Workflow: 코드 20 회복 절차, 행정구역 코드(시도 2자리/시군구
  5자리) 관례 명시
- SKILL.md Failure modes: 코드 20 추가, meta 30 분기, UNIT_NM 누락 처리,
  코드 20/31 회복 시나리오 예시
- docs/features/kosis-stats.md "흔한 문제 해결"에 코드 20 회복 절차 추가
- tests: 8개 회귀 테스트 추가 (hint 키워드/render 메시지/[summary] 라인)

* fix(kosis-stats): drop xls bigdata format and detect json error envelope in non-json formats

Reviewer follow-up on PR #216:

- Removes `xls` from bigdata --format choices. KOSIS returns xls as a
  binary Excel payload, but the helper streams text-only output, which
  would corrupt the file. json/sdmx/csv (text) remain supported.
- Detects KOSIS `{err, errMsg}` envelopes even when --format is csv/sdmx,
  so non-json bigdata responses surface auth/limit errors instead of
  printing a misleading error envelope as raw success output.
- Updates SKILL.md, references/kosis-openapi-guide.md, and
  docs/features/kosis-stats.md so the advertised contract matches the
  helper's actual capabilities.
- Adds 3 unit tests: xls rejection, json error envelope detection in csv
  mode, and clean csv passthrough when no error envelope is present.

---------

Co-authored-by: Jeffrey (Dongkyu) Kim <vkehfdl1@gmail.com>
2026-05-08 23:06:19 +09:00

7.3 KiB
Raw Permalink Blame History

KOSIS Open API 가이드

이 문서는 국가데이터처(구 통계청)가 운영하는 KOSIS(국가통계포털, https://kosis.kr) Open API의 인증키 발급 절차, 호출 한도, 주요 endpoint 사용법, 응답 포맷, 에러 코드를 한국어로 정리한 reference이다. 영문 명칭은 기존 KOSIS / Statistics Korea 그대로 사용된다.

출처:

  • KOSIS Open API 공식 진입: https://kosis.kr/openapi/
    • 회원가입·활용신청·개발 가이드·내 신청 현황은 사이트 좌측 메뉴에서 진입한다.
    • deep-link(devGuide/..., serviceUse/...)는 SSO/SPA 라우팅에 따라 직접 접근 시 빈 화면이 뜰 수 있으니, 위 진입 URL에서 메뉴를 따라간다.
  • KOSIS 공식 공지(2026-03-05 시행, HTTPS 전용·rate limit) — 활용신청 페이지 공지사항에서 확인.
  • 본 가이드는 kosis-mcp 프로젝트의 KOSIS_API_REFERENCE.md 문서를 참고했다.

1. 인증키 발급 절차

KOSIS Open API는 무료다. 발급 단계:

  1. KOSIS 회원가입 — https://kosis.kr/ 우측 상단 "회원가입"
  2. 활용신청 — https://kosis.kr/openapi/serviceUse/serviceUseUnityReg_01Detail.do
    • 활용 목적, 호출 빈도, 사용 서비스 종류를 입력한다
    • 신청 후 인증키가 즉시 발급된다 (관리자 승인 불필요)
  3. 인증키 확인 — https://kosis.kr/openapi/serviceUse/myMain_01List.do
  4. KSKILL_KOSIS_API_KEY 환경변수에 저장
  5. (선택) 활용 사례 등록 — 작성한 어플리케이션 정보를 등록할 수 있다

발급된 키는 apiKey=<KEY> 형태로 모든 endpoint 호출에 포함한다.


2. 호출 한도와 프로토콜 (2026-03-05 적용)

항목 제한 비고
Rate limit 분당 1,000건 / 키 초과 시 에러 코드 40
1회 호출당 최대 결과 40,000셀 초과 시 에러 코드 31 또는 41
대용량 SDMX 40,000셀 초과 시 SDMX 불가 → XLS 사용 statisticsBigData.do
대용량 XLS 200,000셀 초과 시 XLS 불가 → 쿼리 분할
프로토콜 HTTPS 전용 (HTTP 차단) 모든 URL은 https://

40,000셀이란 1회 응답에 포함되는 데이터 셀(수치 값) 수다. 예를 들어 100개 지역 × 10개 항목 × 50년 = 50,000셀 → 1회 호출 불가 → 기간/지역/항목으로 분할.


3. 주요 Endpoint

3.1 통계 검색 (statisticsSearch.do)

키워드로 통계표를 검색한다.

GET https://kosis.kr/openapi/statisticsSearch.do
  ?method=getList&apiKey={KEY}&format=json&jsonVD=Y
  &searchNm=인구&resultCount=20&startCount=1

응답 필드(주요): ORG_ID, ORG_NM, TBL_ID, TBL_NM, STAT_ID, STAT_NM, VW_CD, MT_ATITLE, STRT_PRD_DE, END_PRD_DE, LINK_URL.

데이터 조회는 ORG_ID + TBL_ID 조합을 다음 단계에서 사용한다.

3.2 통계표 메타데이터 (statisticsData.do?method=getMeta)

통계표의 분류·항목·단위·국문/영문명 등을 조회한다.

GET https://kosis.kr/openapi/statisticsData.do
  ?method=getMeta&type=TBL&apiKey={KEY}&format=json
  &orgId=101&tblId=DT_1IN0001

type 값:

  • TBL — 통계표 명칭(국/영문)
  • ITM — 항목(item) 메타
  • OBJ — 분류(classifier) 메타

3.3 통계 데이터 조회 (statisticsParameterData.do)

실제 통계 데이터 셀을 조회한다. 가장 많이 쓰는 endpoint다.

GET https://kosis.kr/openapi/Param/statisticsParameterData.do
  ?method=getList&apiKey={KEY}&format=json&jsonVD=Y
  &orgId=101&tblId=DT_1YL20631
  &objL1=ALL&itmId=ALL
  &prdSe=Y&startPrdDe=2020&endPrdDe=2024

수록주기(prdSe)와 기간 형식:

코드 설명 기간 형식
M 월간/격월 YYYYMM (202401)
Q 분기 YYYYQQ (202401 = 1분기)
S 반기 YYYYHH (202401 = 상반기)
Y 연간 YYYY (2024)
F 다년(2,3,4,5,10년) YYYY
IR 부정기 YYYY 또는 YYYYMMDD

분류 파라미터는 objL1 ~ objL8 (필요한 만큼만), 항목은 itmId (ALL 또는 특정 ID).

응답 셀 필드: PRD_DE (기간), ITM_NM (항목), UNIT_NM (단위), DT (값), C1_NM~C8_NM (분류명).

3.4 대용량 통계자료 (statisticsBigData.do)

40,000셀 초과 데이터를 한 번에 받기 위한 endpoint. userStatsId 사전 등록 필요.

GET https://kosis.kr/openapi/statisticsBigData.do
  ?method=getList&apiKey={KEY}&format=sdmx
  &userStatsId=openapisample/101/DT_1IN1502/2/1/20191106094026_1
  &prdSe=Y&newEstPrdCnt=5

userStatsId 발급:

  1. KOSIS 로그인 → "개발 가이드 > 대용량 통계자료 > URL생성"
  2. 통계표 ID, 항목, 분류, 기간을 선택해 자료 등록
  3. 발급된 userStatsId 를 위 URL에 사용

응답 형식: json, sdmx (DSD/Generic/StructureSpecific), csv, xls.

run_kosis_stats.py bigdata --format 은 텍스트 응답인 json, sdmx, csv 만 지원한다. xls 는 KOSIS가 바이너리 Excel 파일로 응답하므로 helper의 텍스트 출력 경로로 다루지 않는다. xls가 필요하면 KOSIS 웹 화면에서 직접 다운로드하거나, 추후 --output PATH 바이너리 모드가 추가되면 그때 사용한다.


4. 응답 포맷 주의

KOSIS API는 가끔 비표준 JSON을 반환한다. 키에 따옴표가 없는 경우가 있다.

// 비표준 (KOSIS 원본)
{ORG_ID:"101", TBL_ID:"DT_1YL20631"}

// 표준 JSON으로 보정
{"ORG_ID":"101", "TBL_ID":"DT_1YL20631"}

run_kosis_stats.py 의 fix_unquoted_keys() 가 자동으로 보정한다.

format=json&jsonVD=Y 조합을 권장한다 (jsonVD=Y 는 verbatim 응답).


5. 에러 코드

KOSIS는 에러 시 {"err": "<코드>", "errMsg": "<메시지>"} 또는 {"errCode": "<코드>", "errMsg": "<메시지>"} 형태로 응답한다.

코드 KOSIS 메시지 카테고리 권장 액션
10 인증키 누락 auth URL의 ?apiKey= 확인
11 인증키 기간만료 auth https://kosis.kr/openapi/ 에서 갱신
20 필수요청변수 누락 input 필수 파라미터 확인
21 잘못된 요청변수 input orgId/tblId/기간 형식 재확인
30 조회결과 없음 query 키워드/기간/분류 완화
31 조회결과 초과 query 기간·지역·항목을 분할
40 호출가능건수 제한 rate_limit 분당 1,000건 한도 — 잠시 대기
41 호출가능ROW수 제한 rate_limit 1회 40,000셀 한도 — 쿼리 분할
42 사용자별 이용 제한 rate_limit KOSIS 운영팀 문의
50 서버오류 server 1~2초 대기 후 재시도

run_kosis_stats.py 는 위 코드를 감지해 사람용 힌트와 함께 stderr로 출력하고 exit 2 로 종료한다.


6. 안전 사용 가이드

  • 인증키는 절대 저장소에 커밋하지 않는다. examples/secrets.env.example 참고.
  • 호출은 분당 1,000건 한도 안에서 한다. 반복 폴링이 필요한 경우 호출 간 sleep을 둔다.
  • 대용량 자료를 받을 때는 userStatsId 등록부터 사용자에게 안내한다. 자동 등록·웹 자동화는 하지 않는다.
  • 응답에 개인식별정보가 포함될 일은 없지만, 비공개 검토 자료에 인증키가 echo되지 않도록 --dry-run 출력에서도 키는 <DRY-RUN> 으로 대체한다.