트레이딩노하우

자동매매 필수! 키움 REST API 처음 시작할 때90%가 실수하는 5가지

najubutv.com 2026. 5. 6. 21:16
나주부TV 리서치팀 시장분석 · 자동매매
키움 REST API 처음 시작할 때
90%가 실수하는 5가지
신청부터 토큰 발급, 첫 주문까지 안전하게 — OpenAPI+와의 차이부터 실전 체크리스트까지
2026년 5월
💡 키움 REST API는 자동매매의 문턱을 낮춰줬지만, 실전 키 발급 한도·중복 주문·토큰 만료 같은 함정이 곳곳에 있다. 신청 → 토큰 → 첫 호출까지 실수 없이 통과하는 핵심만 정리.

키움증권 REST API를 처음 알아보면 가장 먼저 부딪히는 벽이 있다.

"OpenAPI+랑 REST API, 도대체 뭐가 다른 건가?"

그리고 그다음 벽은 더 위험하다. 신청은 했는데 어디서부터 손대야 할지 모르겠다는 막막함. 이 단계에서 잘못 시작하면 실전 키 발급 횟수 제한에 걸리거나, 최악의 경우 첫 주문에서 중복 매수 사고가 난다.

이 글은 그 두 벽을 한 번에 정리하는 가이드다. 신청 → 토큰 발급 → 첫 호출 → 모의투자 검증까지의 전 과정을 핵심만 추려본다.

01OpenAPI+와 REST API, 뭐가 다른가

키움증권은 두 가지 자동매매 API를 운영한다. 둘은 완전히 다른 시스템이다.

구분 OpenAPI+ (기존) REST API (신규)
방식 OCX 기반, OS 의존 HTTP 요청 기반
실행 환경 Windows + 32bit + HTS 실행 필수 Windows·Mac·Linux·서버 모두 가능
개발 구조 PyQt·이벤트 루프·콜백 토큰 발급 → JSON 호출 → 응답 파싱
인증 방식 로그인 프로그램 연동 AppKey + SecretKey + Access Token
주요 활용 HTS 연동 자동매매 서버·웹·자동화 봇

핵심 차이는 한 줄로 요약된다.

OpenAPI+는 "내 PC에 설치해서 돌리는 자동매매", REST API는 "인터넷으로 키움 서버와 직접 대화하는 자동매매"다.

서버에서 24시간 돌리는 자동매매·퀀트 시스템을 만들 거라면 REST API가 정답이다. 다만 현재 시점 기준 REST API의 주력은 국내주식 중심이고, 해외주식 등 일부 상품은 여전히 OpenAPI+ 병행이 필요하다는 점은 감안해야 한다.

02신청 전에 반드시 갖춰야 할 4가지

REST API 사용 신청 전에 다음 4가지가 준비되어야 한다.

1
키움증권 위탁계좌 (국내주식 거래 가능 계좌)
2
HTS/홈페이지 ID (공동인증서 또는 간편인증 연동 완료)
3
모의투자/실전 결정 — 처음에는 무조건 모의 먼저
4
Python 개발환경 (Python 3.10 이상, VS Code 권장)
⚠️ 특히 세 번째가 가장 중요하다. 실전용 AppKey·SecretKey는 발급 횟수가 제한되어 있다. 처음부터 실전 키로 시작했다가 코드 구조 잡기 전에 발급 한도를 다 써버리는 사례가 흔하다. 모의 환경에서 전략과 코드 구조를 90% 이상 완성한 뒤 실전 키를 발급하는 게 정답이다.
03REST API 신청 절차

신청은 키움 REST API 전용 포털에서 진행한다.

1
포털 접속 — 브라우저에서 openapi.kiwoom.com 접속 후 키움증권 ID로 로그인
2
모의투자 신청 (먼저) — 약관 동의 → 모의계좌 선택 → "REST API 모의투자 사용 신청"
3
모의용 AppKey · SecretKey 발급 — 모의는 비교적 빠르게 승인됨
4
실전 신청 — 모의 검증 완료 후 실전 신청 + 이용 목적 동의
5
실전 AppKey · SecretKey 발급 — 발급 직후 즉시 안전한 곳에 저장
가장 중요한 주의점: 실전 키는 발급/재발급 횟수가 제한되고, 보안 이슈로 발급 직후가 아니면 다시 안 보여줄 수 있다. 발급 직후 안전한 곳에 즉시 저장해야 한다.
04AppKey와 SecretKey, 절대 하지 말아야 할 것

발급된 두 키의 역할은 다음과 같다.

AppKey: 서비스 식별자 (ID 같은 느낌)
SecretKey: 비밀키 (비밀번호 같은 느낌)

이 두 키를 코드에 직접 적는 순간 사고의 절반은 시작된 셈이다.

❌ 나쁜 예 (절대 금지):

python
APPKEY    = "내진짜앱키"
SECRETKEY = "내진짜시크릿키"

✅ 올바른 방식: .env 파일을 쓰고 .gitignore.env를 추가한다.

.env
KIWOOM_APPKEY=발급받은_앱키
KIWOOM_SECRETKEY=발급받은_시크릿키
KIWOOM_HOST=https://mockapi.kiwoom.com
python
from dotenv import load_dotenv
import os

load_dotenv()

APPKEY    = os.getenv("KIWOOM_APPKEY")
SECRETKEY = os.getenv("KIWOOM_SECRETKEY")

자동매매는 투자 실력만큼 보안 실력이 중요하다. GitHub에 SecretKey가 그대로 올라간 사례는 매년 반복적으로 발생한다.

05접근 토큰 발급 — 첫 번째 호출

키움 REST API의 모든 요청은 접근 토큰(Access Token) 기반으로 돌아간다. 흐름은 단순하다.

1
AppKey + SecretKey 준비
2
토큰 발급 요청 (POST)
3
access_token 수신
4
이후 모든 API 호출 헤더에 Authorization: Bearer {token} 포함

토큰 발급 정보:

Method POST
실전 URL https://api.kiwoom.com/oauth2/token
모의 URL https://mockapi.kiwoom.com/oauth2/token
Content-Type application/json;charset=UTF-8

Python 코드 예시:

get_token.py
import os
import requests
from dotenv import load_dotenv

load_dotenv()

APPKEY    = os.getenv("KIWOOM_APPKEY")
SECRETKEY = os.getenv("KIWOOM_SECRETKEY")
HOST      = os.getenv("KIWOOM_HOST", "https://mockapi.kiwoom.com")

url     = f"{HOST}/oauth2/token"
headers = {"Content-Type": "application/json;charset=UTF-8"}
data    = {
    "grant_type": "client_credentials",
    "appkey":     APPKEY,
    "secretkey":  SECRETKEY
}

response = requests.post(url, headers=headers, json=data)
result   = response.json()

print(result)
# {"token": "...", "token_type": "Bearer", "expires_dt": "..."}

응답 JSON의 token 값을 이후 모든 API 호출 헤더에 다음과 같이 붙인다.

python
"authorization": f"Bearer {token}"
여기서 발생하는 가장 흔한 사고: 토큰 만료 처리를 미흡하게 했다가 갑자기 401/403 에러로 주문이 안 나가는 케이스. 응답의 expires_dt를 기록해두고 만료 전 자동 갱신, 또는 401 응답 시 자동 재발급 로직을 코드에 넣어두는 게 필수다.
06첫 주문 호출 — 헤더와 바디 구조

토큰 발급에 성공했다면 다음은 실제 API 호출이다. 키움 REST API의 요청 구조는 항상 3개 요소로 나뉜다.

① URL — 기능별 엔드포인트 (예: 주문은 /api/dostk/ordr)

② Header — 인증 + API 식별값

headers
headers = {
    "Content-Type":  "application/json;charset=UTF-8",
    "authorization": f"Bearer {token}",
    "cont-yn":       "N",         # 연속조회 여부
    "next-key":      "",          # 다음 조회 키
    "api-id":       "kt10000"    # 요청 API의 TR ID
}

③ Body — 실제 요청 내용

body
data = {
    "dmst_stex_tp": "KRX",    # 국내 거래소 구분
    "stk_cd":       "039490", # 종목코드
    "ord_qty":      "1",      # 주문수량
    "ord_uv":       "",       # 주문단가 (시장가는 빈값)
    "trde_tp":      "3",      # 거래구분
    "cond_uv":      ""        # 조건단가
}
api-id가 가장 중요하다. 키움 API는 기능마다 고유한 TR ID가 있다. 주문(kt10000), 추정자산조회(kt00003), 계좌평가현황(kt00004) 등 기능마다 ID가 다르다. 한 글자라도 틀리면 정상 응답이 안 온다.
07가장 흔한 4가지 실수와 대응

처음 REST API를 다루는 사람이 반복적으로 빠지는 함정이다.

⚠️ 실수 1: 모의/실전 URL 혼동
mockapi.kiwoom.comapi.kiwoom.com을 섞어 쓰면서 "왜 주문이 안 되지?" 하는 경우가 가장 많다.
환경별 Base URL을 상수로 분리해서 관리
⚠️ 실수 2: 모의 키로 실전 서버 호출
실전 키를 가지고 모의 서버에 요청하거나, 그 반대를 하면 인증 실패가 난다.
AppKey·SecretKey도 환경별로 분리
⚠️ 실수 3: 토큰 만료 무시
주문 코드는 멀쩡한데 갑자기 401이 뜨면 99% 토큰 만료다.
만료 시간 기록 + 자동 재발급 로직 필수
⚠️ 실수 4: 중복 주문 (가장 위험)
네트워크가 끊겨서 응답을 못 받았는데 실제 주문은 들어간 경우, 프로그램이 "주문 실패인가?" 하고 다시 주문을 넣으면 중복 매수가 발생한다.
주문 후 반드시 주문번호·체결 여부·미체결 수량 확인 로직
08실전 연결 전 체크리스트

자동매매에서 가장 무서운 건 손실이 아니라 중복 주문과 의도하지 않은 주문이다. 실전 키 연결 전에 다음을 반드시 점검한다.

✅ 실전 연결 전 9가지 체크
모의투자에서 최소 1주일 이상 테스트했는가?
주문 수량을 1주로 제한해 테스트했는가?
실전/모의 HOST를 코드에서 명확히 분리했는가?
AppKey와 SecretKey를 코드에 직접 적지 않았는가?
손절·익절·주문 취소 로직을 테스트했는가?
장 시작 전, 장 마감 후 예외 처리를 넣었는가?
네트워크 오류 발생 시 중복 주문이 안 나가게 했는가?
로그 파일을 남기고 있는가?
API 오류 응답을 무시하지 않고 처리하고 있는가?

코드는 감정이 없다. 조건이 맞으면 망설임 없이 주문을 넣는다. 그래서 실전 연결은 개발의 영역이 아니라 리스크 관리의 영역이다.

09정리 — 키움 REST API의 핵심은 단순하다

긴 가이드였지만 핵심은 한 줄로 요약된다.

AppKey와 SecretKey로 토큰을 받고, 그 토큰으로 원하는 API를 호출한다.

이 구조만 이해하면 시세 조회·잔고 조회·주문·체결 조회·실시간 시세까지 하나씩 확장할 수 있다.

다만 실전 계좌에 연결하는 순간 게임이 바뀐다는 점은 잊지 말아야 한다. 키움 REST API는 자동매매의 문턱을 낮춰줬지만, 실전 연결 후에는 코드보다 운영·로그·예외 처리·보안이 더 중요한 영역이 된다.

처음 시작하는 사람이라면 다음 순서로 가는 걸 권한다.

1
모의투자 신청 + 토큰 발급 성공
2
조회 API 1~2개로 JSON 응답 파싱 패턴 익히기
3
모의 환경에서 주문 → 체결 → 잔고 확인 루프 완성
4
실전 키 발급, 소액으로 시작
5
운영·모니터링 체계 안정화 후 전략 확장

이 순서를 지키면 실전 키 발급 한도에 걸리거나 첫 주문에서 사고가 나는 일은 거의 없다.

한 줄 정리
키움 REST API는 자동매매의 문턱을 낮춰줬지만,
실전 계좌 연결 후엔 개발보다 리스크 관리의 영역이다.
모의투자에서 90% 검증 → 실전은 소액으로.
이 한 가지 원칙이 첫 사고를 막는다.
본 글은 정보 제공 목적이며, 자동매매·투자에 따른 손익은 본인 책임입니다. API 스펙은 키움증권 정책에 따라 변경될 수 있으니 큰 금액 운용 전 공식 문서(openapi.kiwoom.com)를 함께 확인하시기 바랍니다.