AlgoLab Blog · 키움 REST API 실무 · 2026

키움 REST API 주식 주문 — kt10000과 trde_tp

키움증권 · 주문 2026-08-18 · 약 7분 읽기 · 알고랩 AlgoLab
한 줄 요약 키움 REST API는 주문 엔드포인트가 /api/dostk/ordr 하나이고, 무엇을 할지는 api-id 헤더가 정합니다매수 kt10000 · 매도 kt10001 · 정정 kt10002 · 취소 kt10003. 바디에는 dmst_stex_tp(KRX·NXT·SORstk_cd(종목코드)· ord_qty(수량)·ord_uv(단가)·trde_tp(매매구분)를 넣습니다. 지정가는 trde_tp 0, 시장가는 3이고 시장가일 때는 ord_uv를 채우지 않습니다. 응답의 return_code0이면 접수이고 ord_no가 주문번호입니다. 실전은 api.kiwoom.com, 모의는 mockapi.kiwoom.com입니다.

키움 REST API 자동매매 완전 가이드에서 OpenAPI+를 벗어나 토큰을 받고 시세까지 붙였다면, 남은 건 하나입니다. 주문을 실제로 내보내는 것.

그런데 여기서 많이 헤맵니다. KIS처럼 기능마다 URL이 다를 거라고 예상하고 문서를 뒤지기 때문입니다. 키움 REST는 구조가 다릅니다. 주문은 경로 하나로 끝나고, 무엇을 하는지는 헤더가 정합니다. 이 글은 주문 한 건을 내보내는 것만 다룹니다.

이 글에서 다루는 것

  1. 구조 — 경로 하나 + api-id 헤더
  2. api-id 목록 (현금·신용)
  3. 요청 바디 5개 필드
  4. trde_tp — 지정가·시장가·IOC·FOK
  5. dmst_stex_tp — KRX·NXT·SOR
  6. 실제 요청과 응답
  7. 정정·취소는 ord_no가 있어야 한다
  8. 자주 막히는 자리 4곳

1. 구조 — 경로 하나 + api-id 헤더

키움 REST API의 주식 주문은 POST /api/dostk/ordr 하나입니다. 매수인지 매도인지, 현금인지 신용인지는 api-id 요청 헤더로 지정합니다.

POST https://api.kiwoom.com/api/dostk/ordr api-id 헤더 kt10000 · 매수 kt10001 · 매도 kt10002 · 정정 (원주문번호 필요) kt10003 · 취소 (원주문번호 필요) kt10006~kt10009 · 신용
키움 REST 주문 구조 — URL은 하나, 기능은 api-id가 결정 (2026-08-18 기준)

이 구조는 조회 API도 동일합니다. 그래서 키움 REST 클라이언트를 만들 때는 "경로별 함수"가 아니라 "api-id를 인자로 받는 공통 호출 함수" 하나를 두고 그 위에 얇은 래퍼를 얹는 편이 훨씬 짧아집니다. 연속조회의 cont-yn·next-key도 같은 헤더 계층에서 처리되기 때문입니다.

2. api-id 목록 (현금·신용)

기능현금신용
매수주문kt10000kt10006
매도주문kt10001kt10007
정정주문kt10002kt10008
취소주문kt10003kt10009

자동매매 봇이 신용을 쓰는 것은 권하지 않습니다. 반대매매·이자·증거금 조건이 얽히면 봇이 판단해야 할 상태의 가짓수가 급격히 늘어나기 때문입니다. 현금 주문 kt10000·kt10001만으로 시작하는 편이 안전합니다.

3. 요청 바디 5개 필드

필드의미예시
dmst_stex_tp국내 거래소 구분KRX / NXT / SOR
stk_cd종목코드005930
ord_qty주문 수량10
ord_uv주문 단가75000 (시장가면 비움)
trde_tp매매구분0 보통 / 3 시장가

KIS와 비교하면 감이 옵니다. KIS 국내 현금주문은 CANO·ACNT_PRDT_CD계좌를 바디에 직접 실어 보내지만, 키움 REST 주문 바디에는 계좌 필드가 보이지 않습니다. 두 증권사의 차이는 키움과 KIS API 비교에서 더 다룹니다.

4. trde_tp — 지정가·시장가·IOC·FOK

trde_tp어떤 방식으로 체결시킬지를 정하는 값입니다. 실무에서 실제로 쓰는 것들만 추리면 다음과 같습니다.

의미ord_uv쓰이는 상황
0보통(지정가)필요기본값. 봇 주문의 대부분
3시장가비움즉시 청산·손절
5조건부지정가필요미체결 시 종가 처리
6 / 7최유리 / 최우선 지정가비움호가 추적 없이 붙이기
10 / 13보통(IOC) / 시장가(IOC)10만 필요즉시 체결분만, 나머지 취소
20 / 23보통(FOK) / 시장가(FOK)20만 필요전량 아니면 전부 취소
61 / 81장시작전 / 장마감후 시간외필요정규장 밖 주문
62시간외단일가 삭제됨2026-09-12 삭제 · 애프터마켓 전환
40 / 46 / 47보통 / 최유리 / 최우선 (GTP)40만 필요NXT 프리마켓 한정 · 2026-09-12 추가

⚠ 2026-09-12 21시부터 62(시간외단일가)는 삭제됐습니다. KRX 시간외단일가 시장이 2026-09-14 폐지되고 애프터마켓(16:00~20:00)이 신설되면서 키움 오픈API에서도 해당 주문유형과 시세 TR(ka10087·ka10098)이 함께 삭제됐습니다. 61(장시작전시간외)·81(장마감후시간외)은 그대로 남아 있습니다. 대신 NXT 프리마켓 전용 GTP 주문유형 40·46·47이 추가됐습니다. 자세한 것은 시간외단일가 TR 삭제 정리에서 다룹니다. (변경 항목은 공지 후 다시 바뀔 수 있으므로 공식 가이드의 현재 trde_tp 목록으로 대조하십시오.)

가장 흔한 사고는 trde_tpord_uv의 불일치입니다. 지정가로 만들어 둔 요청 바디를 재사용하면서 trde_tp3(시장가)으로 바꾸면 ord_uv에 이전 가격이 그대로 남습니다. 반대로 시장가 코드에서 지정가로 바꾸면서 ord_uv를 채우지 않으면 주문이 거부됩니다. 주문 바디는 매번 새로 만드는 것이 원칙입니다.

IOC·FOK는 부분체결을 허용할 것인가의 문제입니다. IOC는 즉시 체결되는 수량만 체결하고 나머지를 자동 취소하고, FOK는 전량 체결이 안 되면 전부 취소합니다. 분할매수 로직을 짤 때 미체결 잔량을 봇이 직접 관리할지, 거래소에 맡길지를 여기서 결정하게 됩니다.

5. dmst_stex_tp — KRX·NXT·SOR

OpenAPI+ 시절 코드를 옮겨 오면 이 필드가 없어서 가장 자주 빠뜨립니다. 국내 시장이 한국거래소(KRX)와 넥스트레이드(NXT)로 나뉘면서 주문마다 어디로 보낼지를 명시하게 됐기 때문입니다. SOR은 둘 중 유리한 쪽으로 자동 라우팅하는 방식입니다.

어느 값이 유리한지는 종목·시간대·호가 상황에 따라 달라지므로 코드에 상수로 박지 말고 설정 파일로 빼 두는 것을 권합니다. 시장별 차이와 판단 기준은 NXT·KRX 주문 라우팅에서 따로 다뤘습니다.

6. 실제 요청과 응답

삼성전자를 지정가 1주 매수하는 최소 형태입니다. token은 접속 토큰이고, api-id만 바꾸면 매도·정정·취소가 됩니다.

import requests

HOST = "https://api.kiwoom.com"        # 모의: https://mockapi.kiwoom.com

def order(token, api_id, body):
    url = HOST + "/api/dostk/ordr"
    headers = {
        "Content-Type": "application/json;charset=UTF-8",
        "authorization": f"Bearer {token}",
        "api-id": api_id,              # kt10000 매수 / kt10001 매도
        "cont-yn": "N",
        "next-key": "",
    }
    r = requests.post(url, headers=headers, json=body, timeout=10)
    return r.json()

buy = {
    "dmst_stex_tp": "KRX",             # KRX / NXT / SOR
    "stk_cd": "005930",
    "ord_qty": "1",
    "ord_uv": "75000",                 # 시장가(trde_tp=3)면 비움
    "trde_tp": "0",                    # 0 보통(지정가), 3 시장가
}
res = order(TOKEN, "kt10000", buy)

정상 접수되면 return_code0이고 ord_no에 주문번호가 옵니다. 아래는 필드 구조를 보이기 위해 값을 임의로 채운 예시입니다.

{
  "ord_no": "0000455",
  "dmst_stex_tp": "KRX",
  "return_code": 0,
  "return_msg": "KRX 매수주문이 완료되었습니다"
}

return_code0이어도 "샀다"는 뜻이 아닙니다. 이것은 주문이 접수됐다는 응답입니다. 지정가 주문은 체결되지 않은 채 남을 수 있으므로, 체결 확인은 별도 조회나 실시간 체결통보로 해야 합니다. 접수 응답만 보고 "보유 중"으로 상태를 바꾸는 봇이 다음 매도 로직에서 없는 물량을 팔려고 시도하게 됩니다.

7. 정정·취소는 ord_no가 있어야 한다

정정(kt10002)·취소(kt10003)는 원주문번호를 함께 보냅니다. 즉 ord_no를 저장하지 않으면 그 주문은 API로 손댈 수 없습니다.

봇을 만들 때 실수가 나오는 지점은 재시작입니다. 주문번호를 메모리에만 들고 있으면 프로세스가 죽는 순간 미체결 주문이 고아가 됩니다. 주문번호는 발급 즉시 파일이나 DB에 남기는 편이 안전합니다. 같은 문제를 KIS 쪽에서 다룬 글은 KIS 주문 취소·정정과 원주문번호입니다.

8. 자주 막히는 자리 4곳

  1. 토큰 만료 — 401 계열이 뜨면 대개 접속 토큰 문제입니다. 만료 시각을 보고 미리 갱신하는 규칙은 키움 REST 토큰 유효기간과 폐기에 정리해 뒀습니다.
  2. 유량 초과 — 주문 루프를 간격 없이 돌리면 허용된 요청 개수를 넘겨 거부됩니다. 대응은 429 허용 요청 개수 초과 글과 같습니다.
  3. 모의 도메인 혼동 — 모의투자는 mockapi.kiwoom.com입니다. 도메인만 바꾸고 토큰은 실전 것을 그대로 쓰면 인증에서 막힙니다.
  4. 종목코드 형식stk_cd는 6자리 문자열입니다. 숫자로 처리하면 005930의 앞 0이 사라져 존재하지 않는 종목이 됩니다.

조건검색식으로 종목을 고른 뒤 그 결과를 바로 주문으로 넘기는 구성이라면 조건검색 실시간 편입과 이 글을 이어 붙이면 됩니다. "편입 신호 → 주문 → 주문번호 저장 → 체결 확인"이 한 사이클입니다.

🛠️
주문까지는 되는데 그 다음이 막히셨다면

미체결 관리·재시작 복구·유량 제어까지 붙여 실제로 도는 상태로 만들어 드립니다.

제작 상담하기 →

자주 묻는 질문

Q. OpenAPI+의 SendOrder를 그대로 옮기면 되나요?

개념은 비슷하지만 필드 이름과 거래소 구분이 다릅니다. 특히 dmst_stex_tp는 OpenAPI+ 시절에 없던 값이라 그대로 옮기면 빠집니다. 윈도우·ActiveX 의존에서 벗어나는 전체 그림은 허브 글을 참고하십시오.

Q. 시장가 주문에 ord_uv를 0으로 넣어도 되나요?

비우는 것이 원칙입니다. 값이 남아 있으면 거부되거나 의도와 다르게 접수될 수 있으므로, trde_tp에 따라 바디를 분기해서 만드는 편이 안전합니다.

Q. 하나의 계정으로 전략을 여러 개 돌려도 되나요?

가능하지만 유량은 계정 단위로 합산됩니다. 전략별로는 여유가 있어도 합쳐서 한도를 넘기면 전부 거부되므로, 주문 호출을 하나의 큐로 모으는 구조를 권합니다.

Q. 체결 확인은 어떻게 하나요?

접수 응답으로는 알 수 없습니다. 미체결·체결 조회를 주기적으로 부르거나 실시간 체결통보를 구독해야 합니다. 봇의 포지션 상태는 접수가 아니라 체결로만 바꿔야 합니다.

확인 캐치. 이 글의 경로·api-id·필드명·trde_tp 값은 2026년 8월 18일 기준 키움증권이 공개한 REST API 안내와 공개 구현 사례에서 확인한 내용입니다. 본문의 응답 예시는 필드 구조를 보이기 위해 값을 임의로 채운 것이며 실제 주문 내역이 아닙니다. API 스펙·주문 유형·시장 운영 방식은 변경될 수 있으므로 구현 전 키움 REST API 공식 문서(openapi.kiwoom.com)에서 직접 확인하십시오. 본 글은 특정 종목이나 수익률에 대한 어떠한 예측이나 권유도 담고 있지 않습니다.

마무리

한 줄로 줄이면 이렇습니다. 키움 REST 주문은 /api/dostk/ordr 하나에 api-id로 기능을 지정하고, trde_tpord_uv의 짝만 틀리지 않으면 나간다.

그리고 진짜 일은 그다음입니다. ord_no를 어디에 저장할 것인가 — 이걸 정하지 않은 봇은 재시작 한 번에 미체결 주문을 놓칩니다.

키움 자동매매, 맡기고 싶다면

키움 REST API 연동부터 미체결·재시작 복구까지 실제로 도는 상태로 만들어 드립니다. 24시간 빠른 답변 가능합니다.

무료 상담 시작하기