키움 REST API에는 예약 주문이 없다

매매를 자동화해 보려고 마음먹으면 곧바로 막히는 질문이 있다. 판단에 필요한 데이터는 어디서 받아 오는지, 퇴근 뒤에 세운 계획은 다음 날 장중에 누가 대신 주문해 주는지.

2026년 9월, 나는 한국거래소(KRX)와 금융감독원 전자공시(DART), 키움증권 REST API의 키를 받아 데이터를 하나씩 불러 봤다. 그러다 가장 기대했던 기능이 없다는 걸 알게 됐다. 키움 REST API에는 예약 주문이 없었다.

어떤 데이터를 어느 창구에 물어야 하는지, 문서에 없어 직접 확인한 함정, 예약 주문 없이 주문을 내는 설계까지 적었다. 키를 받기 전에 읽으면 헛걸음 몇 번은 줄일 수 있을 것이다.

결론부터…

오늘 하루치 전종목과 지수는 KRX에, 한 종목의 과거 차트와 종목 상태는 키움에, 재무와 권리락은 DART에 묻는다.

키움 REST API의 주식 주문은 매수·매도·정정·취소가 전부고, 예약 주문과 자동감시주문은 걸 수도 조회할 수도 없다.

그래서 계획은 내 쪽에 두고 매일 아침 그날 치 주문을 새로 내며, 파는 일은 내 프로그램이 시세를 보다가 직접 주문한다.

판단에 필요한 데이터는 한 창구에서 다 오지 않는다

[장세 판단 화면을 만든 이야기]에서 적었듯, 내 매매는 저녁에 시장을 판정하고, 종목을 고르고, 다음 날 주문 계획을 세우는 순서로 돈다. 그 순서마다 필요한 데이터를 늘어놓고 보니 한 곳에서 다 주는 창구는 없었다. 인터넷에 가장 많이 도는 KRX 정보데이터시스템 예제는 로그인 체제로 바뀌어 “LOGOUT”만 돌려주니, 남은 길은 기관마다 여는 공식 API였다.

필요한 것창구묻는 방식2026년 9월 상태
코스피 지수 일봉KRX OpenAPI날짜 하나 → 그날 지수 전부6년 9개월치 받아 봄
오늘 전종목 시세·거래대금KRX OpenAPI날짜 하나 → 전종목확인 (2,765종목 · 3.7초)
한 종목의 일·주·월·년봉, 분봉키움 REST API종목 하나 → 기간확인
관리종목·거래정지·투자경고키움 REST API시장 하나 → 전종목확인
테마와 구성종목키움 REST API테마 목록 → 종목확인 (142개 테마)
재무 주요계정·권리락 공시DART OpenAPI회사 코드 / 접수일확인
시황·칼럼텔레그램 · 블로그 RSS대화방 / 피드수집기로 12일치 적재
예수금·잔고·미체결키움 REST API계좌아직 (모의투자 키 필요)

키를 받아 오고 무엇을 확인할지 정하는 일은 내가 했다. 수천 번의 호출을 돌리고 결과를 표로 정리하는 일은 Claude Code가 맡았다.

장세 판단 재료는 날짜로 묻고, 시황은 대화방에서 읽어 온다

[KRX OpenAPI]는 날짜로 묻는 창구다. 주소 뒤에 기준일(`basDd`) 하나를 붙이고 `AUTH_KEY` 헤더에 인증키를 넣으면 그날 하루치가 통째로 온다. 코스피 지수는 `idx/kospi_dd_trd`, 유가증권 전종목은 `sto/stk_bydd_trd`에서 받는다.

처음엔 인증키를 받았는데도 “Unauthorized API Call”만 돌아왔다. 알고 보니 인증키 발급과 서비스별 활용 신청이 따로였다. 헤더가 틀리면 “Unauthorized Key”로 답이 갈리니, 오류 문구만 보고도 어느 쪽인지 가릴 수 있다.

지수 응답에는 업종 지수까지 수십 줄이 함께 오고, 그중 이름이 정확히 ‘코스피’인 줄이 본지수다. 이름으로 고르는 방식이 과거에도 통하는지 궁금해서 2020년 1월부터 2026년 9월까지 평일 1,748일을 전부 불러 봤다. 영업일마다 그 줄은 정확히 하나씩 있었고, 1분 동안 실패는 한 번도 없었다. 휴장일에는 빈 응답이 와서 영업일 달력도 덤으로 생겼다.

시황은 사람이 골라 보내는 글이다. 아버지가 매일 보내 주시는 메시지와 파일은 텔레그램 개인 계정 API로 읽기만 하고, 블로그는 RSS로 받는다. RSS에는 요약만 오니 글 주소를 한 번 더 열어 본문을 채우는 식이다.

종목 고르기 재료는 오늘은 거래소에, 과거는 증권사에 묻는다

처음엔 KRX 하나로 끝낼 생각이었다. 그런데 KRX에는 종목을 지정해 기간을 묻는 길이 없어서, 한 종목의 5년 차트를 그리려면 날짜마다 전종목을 받아 340만 행을 쌓아야 했다.

[키움 REST API]는 반대로 종목으로 묻는 창구다. 주봉·월봉·년봉까지 완성품으로 주니 한 종목 5년 차트가 1초면 오고, 쌓아 두는 설계는 통째로 지웠다. 오늘 전종목은 KRX에서 한 번, 과거 차트는 볼 때 키움에서 받는다.

키움 쪽 기본은 단순하다.

POST https://api.kiwoom.com/oauth2/token

{ "grant_type": "client_credentials", "appkey": "<앱키>", "secretkey": "<시크릿키>" }

→ token, expires_dt            (유효기간은 정확히 24시간)

# 그 뒤 모든 조회에 붙는 헤더

authorization: Bearer <token>

api-id: ka10081                 (주식 일봉 차트)

cont-yn / next-key              (한 번에 다 안 오면 이어 받기)

호출 한도는 초당 5회이고, 넘기면 초과했다는 답이 올 뿐 막히지는 않았다. 실전 앱키와 모의투자 앱키는 따로 받아야 한다.

재무는 DART다. 인증키를 `crtfc_key` 파라미터로 넘기고, 종목코드를 DART 회사 코드로 바꾸는 매핑 파일(ZIP)을 먼저 받아 둔다. 권리락은 뜻밖에도 시세 API가 아니라 공시 목록에 있었다.

문서에 없는 답은 데이터로 확인했다

막힌 곳은 대개 문서가 침묵하는 자리였다.

키움 차트 요청에는 수정주가 구분(`upd_stkpc_tp`) 파라미터가 있는데, 문서는 0과 1이 각각 무슨 뜻인지 밝히지 않는다. 그래서 액면분할이 있었던 날로 확인했다. 삼성전자는 2018년 5월 4일에 50:1로 분할했는데, 그 전날 종가가 0으로 부르면 2,650,000원, 1로 부르면 53,000원이었다. 1이 수정주가다.

종목 상태는 더 교묘했다. 종목 정보 리스트(`ka10099`)는 시장마다 한 번씩 부르면 4,304종목의 관리종목·거래정지·투자경고를 준다. 그런데 `auditInfo` 칸은 상태를 하나만 담아서, 거래정지이면서 관리종목인 종목은 관리종목 표시가 `state` 칸에만 남는다. 두 칸을 합쳐 읽지 않으면 80종목을 놓친다.

DART 재무는 이름에서 걸렸다. 적자 여부를 보려고 ‘당기순이익’ 계정을 찾았더니 표본 50종목에서 한 번도 나오지 않았다. 실제 이름은 ‘당기순이익(손실)’이었고, 결국 이름 대신 표준 계정 ID로 찾기로 했다.

KRX 원본 시세는 수정주가가 아니라서 액면분할한 종목은 그날을 경계로 가격이 끊긴다. 다행히 거래소 등락률이 권리락 기준가로 계산돼 있어, 전날 종가와 등락률로 구한 값이 실제 종가와 어긋나는 비율이 곧 보정 계수였다.

증권사 앱에 있는 예약 주문이 키움 REST API에는 없다

나는 원래 증권사 앱으로 밤에 예약 매수를 걸어 두곤 했다. 문제는 그다음이었다. 장중에 매수가 체결되면 곧바로 매도 주문을 걸어야 하는데, 일하다 보면 그 순간을 번번이 놓쳤다. 자동화에서 가장 먼저 기대한 것도 이 부분이었다.

그런데 키움 REST API의 국내 주식 주문은 매수(`kt10000`)·매도(`kt10001`)·정정(`kt10002`)·취소(`kt10003`)가 전부였다. 예약 주문도, 기간 예약 주문도, 손절을 걸어 두는 자동감시주문도 없었다.

기능 자체가 없는 건 아니다. 영웅문의 주식 자동감시주문 화면은 증권사 서버가 90일 동안 대신 감시해 준다. 다만 그 주문을 걸 API도, 걸렸는지 확인할 API도 없다. 확인할 수 없는 방어는 없는 것과 같다고 보고, 서버에 기대는 설계를 접었다.

게다가 국내 주식 지정가 주문은 당일에만 유효하다. 기간 예약 주문도 증권사가 매일 아침 대신 내 주는 기능일 뿐, 주문 하나가 밤을 넘기지는 않는다.

그래서 계획은 내 쪽에 두고, 파는 일은 프로그램이 지켜본다

주문이 밤을 넘기지 못한다면, 넘길 것은 계획이다. 저녁에 확정한 계획은 내 데이터베이스에 남기고, 매일 아침 9시에 그날 치 지정가 매수를 새로 낸다. 마감 동시호가가 시작되는 15시 20분에는 체결되지 않은 주문을 거둔다. 며칠째 다시 확정하지 않은 계획은 주문을 멈춘다. 내가 다시 보지 않은 계획이 끝없이 나가면 안 되니까.

파는 쪽은 프로그램이 직접 지켜본다. 집행기라고 부르는 이 프로그램은 체결되는 순간 익절·본전·손절 가격을 감시 목록에 올리고, 실시간 시세가 그 가격에 닿으면 매도 주문을 낸다.

대가는 분명하다. 집행기가 멈추면 지켜 주는 것이 아무것도 없다. 그래서 작업용 PC가 아니라 24시간 켜 둘 자리에 두고, 1분마다 살아 있다는 신호를 보내게 했다. 신호가 끊기면 집 밖의 감시자가 폰으로 “지금 지켜 주는 것이 없으니 증권사 앱으로 직접 파세요”라고 알리고, 프로그램은 살아 있는데 시세만 끊긴 경우도 따로 알린다.

권리락도 챙겨야 한다. 손절 가격은 고정값이라, 무상증자로 기준가가 크게 내려간 날 그대로 두면 개장 첫 체결에 보유 수량이 전부 팔린다. 다행히 DART에 ‘권리락’ 공시가 올라오고, 최근 90일의 무상증자 권리락 일곱 건은 전부 전 거래일에 접수됐다. 저녁에 공시로 미리 알아 손절 가격을 새 기준가에 맞춰 환산하고, 아침에는 키움이 주는 기준가로 개장 전에 한 번 더 확인한다.

다만 2026년 9월 지금까지 이 방식으로 나간 주문은 한 건도 없다. 모의투자 앱키를 받아 처음 주문을 내 보는 날, 여기 적은 설계가 어디서 틀리는지 다시 쓸 생각이다.

KRX OpenAPI · DART · 키움 REST API 가운데 어느 창구에서 어떤 데이터를 받는지

저녁에 확정한 계획이 아침 발주와 집행기 감시로 이어지는 주문의 길

결과와 한계

2026년 9월 기준으로 조회 쪽은 확인이 끝났다. 세 창구 모두 실제 키로 응답을 받았고, 다음 날 주문 계획에 필요한 데이터 18종 가운데 12종이 실제로 온다. 무엇을 어디까지 만들었는지는 [RichRich 프로젝트 페이지]에 정리해 두고 있다.

주문·정정·취소는 모의투자 키가 없어 한 번도 보내지 않았고, 웹소켓 실시간 시세와 계좌 조회도 확인 전이다. 투자자별 수급·선물옵션 포지션·환율·미국채 금리는 창구를 아직 두드리지 않았다. 공시 없이 권리락이 되는 경우가 있는지도 세어 보지 않았다. 시황 수집기는 명령하면 돌지만 매일 저녁 스스로 돌지는 않고, KRX OpenAPI의 하루 호출 한도는 공식 문서에서 찾지 못했다.

증권사 앱에 있는 기능이 API에도 있을 거라고 가정하지 않는다. 불러 보고, 없으면 그 자리를 무엇이 대신할지부터 정한다.

이 글의 요약

오늘 하루치 전종목과 지수는 KRX OpenAPI에 날짜로 묻고, 한 종목의 과거 차트와 종목 상태는 키움 REST API에 종목으로 묻는다.

재무와 권리락 공시는 DART에서 받는다.

수정주가 구분값, 두 칸에 나뉜 종목 상태, 계정 이름처럼 문서가 밝히지 않는 자리는 실제 데이터로 확인해야 한다.

키움 REST API에는 예약 주문과 자동감시주문이 없어서, 계획은 내 쪽에 두고 매일 아침 주문을 새로 내며 매도는 프로그램이 시세를 보고 직접 낸다.

그 프로그램이 멈추면 지켜 주는 것이 없으므로 24시간 상주와 생존 알림이 안전장치가 된다.

자주 묻는 것

  • 키움 REST API로 예약 주문이나 스탑로스를 걸 수 있나?

2026년 9월 기준 국내 주식 주문 API는 매수·매도·정정·취소뿐이다. 영웅문의 자동감시주문은 증권사 서버가 감시해 주지만 API로는 걸 수도 조회할 수도 없어서, 조건 감시는 내 프로그램이 직접 한다.

  • 주식 데이터는 KRX와 키움 중 어디서 받아야 하나?**

묻는 방식이 다르다. 하루치 전종목은 KRX가 한 번에 주고, 한 종목의 긴 차트는 키움이 종목 단위로 수정주가를 적용해 준다. 나는 둘을 나눠 쓴다.

  • 이 방식으로 실제 매매를 하고 있나?**

아직이다. 데이터 조회까지 확인했고, 주문은 모의투자 키를 받은 뒤 처음 내 볼 예정이다.

이 기록을 쓰는 사람에 대해서는 [소개]에 적어두었다.

  • 이 글은 개인의 학습·개발 기록이며 투자 권유가 아닙니다.
  • 투자 판단과 그 결과는 투자자 본인에게 있습니다.