๐Ÿš„ rail-api

Korail gateway API โ€” agent-oriented docs. This same content is at /llms.txt (plain) and /openapi.json (spec).

โ›” Payment: card-number only. Easy-pay / points / bank transfer / pass / integrated settlements are NOT supported (return HTTP 501).

# rail-api โ€” Korail gateway API (agent guide)

A systematized pass-through over the Korail (์ฝ”๋ ˆ์ผ) mobile API. 159 operations,
all reachable through one generic endpoint. This service handles anti-macro (m-token),
login/session reuse, cookies, form-encoding and error mapping for you.

Base URL: https://rail-api.coderyn.com

## How to call
- Generic (any operation):  POST https://rail-api.coderyn.com/v1/op/{operationId}   body = JSON of raw korail fields
- Named aliases:            POST /v1/sessions (login), GET /v1/trains (=trains.search)
- List operations:          GET  https://rail-api.coderyn.com/v1/ops        (id, kind, auth, mToken, charge, note)
- Machine spec:             GET  https://rail-api.coderyn.com/openapi.json
- Health:                   GET  https://rail-api.coderyn.com/v1/health

## Auth model
- This service has its OWN users. Each user stores ONE set of korail credentials (encrypted).
- Send: Authorization: Bearer <apiKey>  on member operations.
- Admin (needs ADMIN_TOKEN):
    POST https://rail-api.coderyn.com/admin/users {"name":"..."}                         -> {userId, apiKey}
    POST https://rail-api.coderyn.com/admin/users/{userId}/credentials {"member_no","password"[,"model","os"]}
    POST https://rail-api.coderyn.com/admin/users/{userId}/card {"no","exp":"YYMM","pwd2","auth","type":"personal"}   (encrypted at rest)
- auth levels per op:  none (reference), member (needs Bearer), nonmember (send name+phone+ticket-pw in body).

## โ›” A card on file is REQUIRED to reserve
Every reservation path checks the user's stored card first. With NO card on file, these return
HTTP 402 CARD_REQUIRED: /v1/book, /v1/purchase, /v1/pay, /v1/watches (action=reserve), /v1/openrun,
and the raw reserve ops (reservation.ticketReserve, nonMember.ticketReserve, reservation.seatAssign).
Register a card once (admin endpoint above); after that pay/purchase use the STORED card automatically โ€”
you do NOT pass card details per request (you may still pass "card":{...} to override for one call).

## Rules
- It is a PASS-THROUGH: you supply the raw korail field names (txt*, hid*, h_*) in the JSON body.
  The gateway adds Device/Version/Key/Lang, the m-token (for 6 protected paths), and the session cookie.
- Mutations (kind write/pay/refund) REQUIRE an Idempotency-Key header.
- pay/refund move real money โ€” treat as gated.
- Reservation window: boarding date <= 31 days ahead, else NOT_YET_OPEN.

## โ›” Payment support โ€” CARD-NUMBER ONLY
Card-number payment ONLY. Pay via pay.reservationPayment with card fields (STL_CR_CRD_NO / CRD_VLID_TRM / VAN_PWD). NOT supported: easy-pay (PAYCO, KakaoPay, Samsung Pay, Naver Pay, Toss), points, real-time bank transfer, and pass/integrated settlements.
- Supported: pay.reservationPayment (card fields STL_CR_CRD_NO / CRD_VLID_TRM / VAN_PWD).
- NOT supported (these ops return HTTP 501 UNSUPPORTED_PAYMENT_METHOD):
  easy-pay (PAYCO / KakaoPay / Samsung Pay / Naver Pay / Toss), points, real-time bank transfer,
  pass payment, integrated/cart settlement. See the op list โ€” unsupported ops are marked โ›”.

## Recipes (concrete field maps)

### A. Reference read (no auth)
POST https://rail-api.coderyn.com/v1/op/global.stations   body: {"stnLang":"ko"}
POST https://rail-api.coderyn.com/v1/op/codes.get         body: {"code":"app.login.cphd"}

### B. Establish session (member)
POST https://rail-api.coderyn.com/v1/sessions   header: Authorization: Bearer <apiKey>
โ†’ {ok, custNo, mbCrdNo}. A session is also auto-established on the first member op.

### C. Search trains (op: trains.search โ€” m-token handled for you)
POST https://rail-api.coderyn.com/v1/op/trains.search
body: {
  "radJobId":"1","srtCheckYn":"N",
  "txtGoAbrdDt":"YYYYMMDD",          // boarding date, <= 31 days ahead
  "txtGoStart":"์„œ์šธ","txtGoEnd":"๋ถ€์‚ฐ",
  "txtGoHour":"060000",              // from-time HHMMSS
  "txtTrnGpCd":"100",               // 100=KTX 101=ITX/์ƒˆ๋งˆ์„ 102=๋ฌด๊ถํ™” 109=all
  "txtPsgFlg_1":"1"
}
โ†’ data.trn_infos.trn_info[]: each has h_trn_no, h_trn_clsf_cd, h_trn_gp_cd, h_run_dt,
  h_dpt_dt, h_dpt_tm, h_dpt_rs_stn_cd, h_dpt_stn_cons_ordr, h_dpt_stn_run_ordr,
  h_arv_rs_stn_cd, h_arv_stn_cons_ordr, h_arv_stn_run_ordr,
  h_gen_rsv_cd ("00"=seats available, "13"=sold out), h_spe_rsv_cd (special/first class).

### D. Reserve a seat hold (op: reservation.ticketReserve โ€” WRITE, needs Idempotency-Key)
Pick a train t from search where h_gen_rsv_cd=="00". 1 adult, auto general seat, one-way:
POST https://rail-api.coderyn.com/v1/op/reservation.ticketReserve
header: Idempotency-Key: <uuid>
body: {
  "txtMenuId":"11","txtJobId":"1101","hidFreeFlg":"N","txtStndFlg":"N",
  "txtTotPsgCnt":"1","txtJrnyCnt":"1",
  "txtSeatAttCd1":"000","txtSeatAttCd2":"000","txtSeatAttCd3":"000","txtSeatAttCd4":"015","txtSeatAttCd5":"000",
  "txtCompaCnt1":"1","txtPsgTpCd1":"1","txtDiscKndCd1":"000",
  "txtJrnyTpCd1":"11","txtJrnySqno1":"001",
  "txtTrnNo1":t.h_trn_no,"txtTrnClsfCd1":t.h_trn_clsf_cd,"txtTrnGpCd1":t.h_trn_gp_cd,
  "txtRunDt1":t.h_run_dt,"txtDptDt1":t.h_dpt_dt,"txtDptTm1":t.h_dpt_tm,
  "txtDptRsStnCd1":t.h_dpt_rs_stn_cd,"txtDptStnConsOrdr1":pad6(t.h_dpt_stn_cons_ordr),"txtDptStnRunOrdr1":pad6(t.h_dpt_stn_run_ordr),
  "txtArvRsStnCd1":t.h_arv_rs_stn_cd,"txtArvStnConsOrdr1":pad6(t.h_arv_stn_cons_ordr),"txtArvStnRunOrdr1":pad6(t.h_arv_stn_run_ordr),
  "txtChgFlg1":"N","txtPsrmClCd1":"1"
}
(pad6 = left-pad numeric to 6 digits, e.g. 1 -> "000001")
โ†’ data.h_pnr_no (reservation id), data.h_jrny_cnt, data.h_ntisu_lmt_dt + h_ntisu_lmt_tm (payment deadline).
The hold auto-cancels if unpaid by the deadline.

### E. Cancel the hold (op: reservation.cancelCheck โ€” this actually performs the cancel)
POST https://rail-api.coderyn.com/v1/op/reservation.cancelCheck
body: {"txtPnrNo":<h_pnr_no>,"txtJrnySqno":"001","txtJrnyCnt":<h_jrny_cnt>,"hidRsvChgNo":"000"}
โ†’ h_msg_cd "IRG000000" on success. Verify with op reservation.view -> data.jrny_infos empty.

### F. My tickets / reservation view
POST https://rail-api.coderyn.com/v1/op/myTicket.list       body: {}
POST https://rail-api.coderyn.com/v1/op/reservation.view    body: {"timeStamp":"<epoch-ms>"}

### F2. Composed flows (multi-step sequences collapsed into ONE clean call)
The raw ops mirror the app 1:1, so multi-step sequences (and their handshake values / error-prone
extras) would otherwise be the caller's problem. These composed endpoints handle the whole sequence
internally โ€” you send only the essentials, never the raw korail fields:

  POST https://rail-api.coderyn.com/v1/book
    body: { "from":"์„œ์šธ", "to":"๋ถ€์‚ฐ", "ymd":"YYYYMMDD", "trnNo":"001"(optional), "psrm":"1" }
    โ†’ search โ†’ reserve โ†’ stores the pay-handshake. Returns a HOLD (no charge).
    โ†’ { ok, pnr, seat, fare, deadline, train }
    (omit trnNo to grab the first available train.)

  POST https://rail-api.coderyn.com/v1/pay
    body: { "pnr":"<PNR>", "dryRun":true }
          real charge: { "pnr":"<PNR>", "dryRun":false } + Idempotency-Key   (uses your STORED card)
    โ†’ settles a HOLD by CARD (card-number only โ€” see payment policy). dryRun:true returns the amount, no charge.
      Card comes from the user's stored card; pass "card":{no,exp,pwd2,auth,type} only to override.
    โ†’ { ok, pnr, amount, approvalNo, ticketNo, korail }

  POST https://rail-api.coderyn.com/v1/cancel
    body: { "pnr":"<PNR>" }
    โ†’ releases an unpaid HOLD (reservationCancel). โ†’ { ok, pnr, korail }

  POST https://rail-api.coderyn.com/v1/refund
    body: { "pnr":"<PNR>", "dryRun":true }
    โ†’ myTicket โ†’ SelTicketInfo โ†’ CommissionView โ†’ RefundsRequest, in one call.
      dryRun:true (default) returns only the quote { fee, amount, tkRetTmsDvCd } โ€” no money moves.
      dryRun:false + Idempotency-Key actually refunds.
    โ†’ { ok, pnr, quote:{fee,amount,tkRetTmsDvCd}, refunded, korail }
    (You never send ctlDvCd / h_comp_nm / the wct-key rename โ€” the flow builds the exact fields the app sends.)

  POST https://rail-api.coderyn.com/v1/purchase   (book + pay in ONE call โ€” the simple "just buy it")
    body: { "from":"์„œ์šธ","to":"๋ถ€์‚ฐ","ymd":"YYYYMMDD","trnNo":"001"(optional) } + Idempotency-Key
    โ†’ search โ†’ reserve โ†’ settle with your STORED card. If payment fails, the hold is auto-cancelled (no orphan).
      (requires a card on file โ€” HTTP 402 CARD_REQUIRED otherwise. Pass "card":{...} to override.)
    โ†’ { ok, pnr, seat, amount, approvalNo, ticketNo }

  Lifecycle: /v1/purchase (one-shot buy)  โ€”orโ€”  /v1/book (hold) โ†’ /v1/pay (card) โ†’ later /v1/refund.
  Split book/pay = grab a seat now (hold), pay later (used by open-run/monitor). Unpaid hold โ†’ /v1/cancel.
  (์—ฌ์ •๋ณ€๊ฒฝ /v1/change is not yet available โ€” the raw ops exist but the composed flow is unverified.)

### G. Payment & refund โ€” GATED (real money). Not executed by default.
Payment (op: pay.reservationPayment) and refund (op: refund.request / refund.commission)
move real money. Build them the same way (pass-through fields) but only fire with explicit intent.


## Response envelope & error codes
Every op returns: {ok, code, data, korail:{strResult,h_msg_cd,h_msg_txt}, requestId}
- ok=true  โ†’ success (or benign "no data"). HTTP 200.
- ok=false โ†’ code tells you why; korail.h_msg_cd is the upstream reason.

Gateway codes (HTTP status):
  OK                 success
  MTOKEN_REJECTED    429  anti-macro tripped; the gateway auto-regenerates the token & retries once
  NOT_YET_OPEN       409  WRD000058 โ€” reservation window not open (>31 days out)
  SESSION_EXPIRED    401  handled internally: the gateway re-logs-in and retries
  KORAIL_FAIL        409  upstream strResult:FAIL (usually input error; see korail.h_msg_txt)
  UPSTREAM_ERROR     502  korail 5xx; retried once for reads/idempotent
  AUTH_REQUIRED      401  member op without a valid Bearer apiKey
  LOCK_TIMEOUT       409  another mutation for the same user is in flight
  NO_CREDENTIALS     400  user has no korail credentials registered

Common upstream h_msg_cd you'll see:
  IRG000000 = success (generic)      IRR000018 = reserve success (hold created)
  IRZ000001 = query success          WRT300005 = "no data" (benign)
  WRR000100 = input error (you omitted/mis-typed a required field)
  WRD000058 = reservation not yet open


## All operations (159)
refund.executeOnline  [refund,charge]  auth=member  refunds.executeOnlineRefunds  โ€” ์˜จ๋ผ์ธ ํ™˜๋ถˆ ์‹คํ–‰ โ€” ๊ตฌ๋งค์ด๋ ฅ ๋ถˆ์š”(pnrNo+์›๊ถŒํŠœํ”Œ๋งŒ).
goods.cacheRead  [read]  auth=none  goods.cacheRead.do
research.commutationInfo  [read]  auth=member  research.cmtrInfo.do
push.crewCallList  [read]  auth=member  push.crwCallRq.do
global.stations  [read]  auth=none  /ebizcom/com.korail.mobile.global.stations.do
maas.cancelFee  [read]  auth=member  maas.cncFee.do
copt.maasDetailList  [read]  auth=member  copt.gdReqQry.do
ncard.history  [read]  auth=member  ticket.dcntCrdUseQry.do
product.detail  [read]  auth=member  product.ReservationDetail
product.list  [read]  auth=member  product.ReservationList
goods.meta  [read]  auth=none  goods.meta.do
pass.seatInfo  [read]  auth=member  pass.seatInfo.do  โ€” ํŒจ์Šค ์ขŒ์„์ง€์ • ๋Œ€์ƒ ์กฐํšŒ(wctNo/saleDt/saleSqno/tkRetPwd ํŽ˜์ด์ง•).
tripChange.originalTicket  [read]  auth=member  research.tripChgOgtk.do  โ€” ์—ฌ์ •๋ณ€๊ฒฝ์šฉ ์›๊ถŒ(์›์Šน์ฐจ๊ถŒ) ์กฐํšŒ.
tripChange.dates  [read]  auth=member  reservation.tripChgDate.do  โ€” ๋ณ€๊ฒฝ๊ฐ€๋Šฅ ๋‚ ์งœ ์กฐํšŒ(GET).
pass.otrReserve  [write]  auth=member  pass.passOtrReserve  โ€” OTR(์ขŒ์„์—†๋Š” ํŒจ์Šค๊ถŒ) ์˜ˆ์•ฝ, passOtrPayIssue ๋กœ ์ด์–ด์ง.
product.payInfo  [read]  auth=member  product.payInfo  โ€” ์—ฌํ–‰์ƒํ’ˆ ๊ฒฐ์ œ ์‚ฌ์ „ํ™•์ธ(strLumpStlTgtNo ํš๋“).
maas.reserveStatus  [read]  auth=member  maas.rsvStt.do  โ€” ์‘๋‹ต empty(๋ด‰ํˆฌ๋งŒ).
mileage.accompanySave  [write]  auth=member  mileage.acpnMlgSave.do
delay.acceptProcess  [write]  auth=member  delay.acptPrs.do  โ€” ์ง€์—ฐ๋ฐฐ์ƒ๊ธˆ ์ˆ˜๋ฝ์ฒ˜๋ฆฌ.
research.actualSchedule  [read]  auth=member  research.actualTrainSchedule.do
cart.add  [write]  auth=member  cart.addCartList
seats.airportBusResidual  [read]  auth=member  lms.TResidualSeatsResearch.do  โ€” ๊ณตํ•ญ๋ฒ„์Šค ์ขŒ์„๋งต โ€” research.TResidualSeatsResearch ์™€ ๋™์ผ ์Šคํ‚ค๋งˆ.
mileage.amountSpec  [read]  auth=member  mlg.amtSpec.do
research.assignScheduleView  [read]  auth=member  research.assignScheduleView.do
addService.buyConfirm  [write]  auth=member  addService.buyConfirm.do
goods.cacheCheck  [read]  auth=none  goods.cacheCheck.do
checkin.cancel  [write]  auth=member  checkin.cnc.do  โ€” ํ•„๋“œ๋ช… saleDt(psbFlg/reg ๋Š” saleDd).
addService.wheelchairCancel  [write]  auth=member  addService.reserve.do  โ€” addService.reserve.do ๋Š” ๋‹ค๊ธฐ๋Šฅ ๊ฒฝ๋กœ(postRequestWheelchairWithHistory ์™€ ๊ณต์œ ), jobDvCd ๋กœ ๋ถ„๊ธฐ.
cashReceipt.issue  [write]  auth=member  cashReceipt.issue.do
delay.cashRefund  [write]  auth=member  dlay.cashRfn.do  โ€” ๋ช…์‹œ์  @Field ๋ฐ”๋””(In ๋ชจ๋ธ ์—†์Œ) โ€” ๊ณ„์ขŒํ™˜๋ถˆ(dmnPrsDvCd/dptnBankCd/dptnAcntNo).
cert.congressperson  [read]  auth=member  certification.assemblyCert  โ€” ๊ตญํšŒ์˜์› ๋ฌด์ž„(GET).
cert.merit  [read]  auth=member  certification.MeritCert  โ€” ๊ตญ๊ฐ€์œ ๊ณต์ž ์ธ์ฆ.
qry.transferStation  [read]  auth=member  qry.chtnStn.do
codes.get  [read]  auth=none  common.code.do  โ€” common.code.do ๊ณต์œ  โ€” ๋‹จ์ผ ์ฝ”๋“œ์…‹.
codes.getMulti  [read]  auth=none  common.code.do  โ€” common.code.do ๊ณต์œ  โ€” ๋ณต์ˆ˜ ์ฝ”๋“œ์…‹ ๋ณ€ํ˜•.
crypto.encrypt  [read]  auth=none  common.encrypt.do  โ€” common.encrypt.do ๊ณต์œ (postKBPayEncrypt ์™€ ๋™์ผ ๊ฒฝ๋กœ).
passCard.coupons  [read]  auth=member  passCard.CouponView
research.custTripInfo  [read]  auth=member  research.custTripInfo.do
research.ncardInfo  [read]  auth=member  research.dcntCrdInfo.do
research.ncardScheduleView  [read]  auth=member  research.dcntCrdScheduleView.do
crypto.decrypt  [read]  auth=none  common.decrypt.do
delay.certificate  [read]  auth=member  dlay.athnIsu.do  โ€” ์ง€์—ฐ์ฆ๋ช…์„œ ๋ฐœ๊ธ‰์กฐํšŒ.
passCard.delayDiscount  [read]  auth=member  passCard.DelayDiscountView  โ€” ํŽ˜์ด์ง• Query h_page_no.
delay.returnReceipt  [read]  auth=member  dlay.pymtRcet.do
account.delete  [write]  auth=member  login.mbSced.do  โ€” ํšŒ์›ํƒˆํ‡ด โ€” login.mbSced.do ์ด์ง€๋งŒ ๋กœ๊ทธ์ธ ์„ธ์…˜ ํ•„์š”.
addSrv.wheelchairHistoryDelete  [write]  auth=member  addSrv.helpSrvCust.do  โ€” helpSrvCust.do ๋‹ค๊ธฐ๋Šฅ ๊ฒฝ๋กœ(qryDvCd/addSrvDvCd ๋ถ„๊ธฐ).
tk.receivedTicketHistory  [read]  auth=member  tk.pbpAcepSpec.do  โ€” ๋ฐ›์€์Šน์ฐจ๊ถŒ ๋‚ด์—ญ.
tk.deliveryReceiver  [read]  auth=member  tk.dlvRcvCust.do
gift.send  [write]  auth=member  giftInfo.GiftSend  โ€” ์Šน์ฐจ๊ถŒ ์„ ๋ฌผ ๋ฐœ์†ก(+presentMap) โ†’ ๋ณ€๊ฒฝ ์˜ˆ์•ฝ๋ฒˆํ˜ธ chgePbpRsvNo.
tk.deviceReset  [write]  auth=member  tk.dvcInfoInit.do  โ€” ๊ธฐ๊ธฐ์ •๋ณด ์ดˆ๊ธฐํ™”(๋””๋ฐ”์ด์Šค ๋ฐ”์ธ๋”ฉ ๋ฆฌ์…‹).
cert.disability  [read]  auth=member  certification.disabled.do
passCard.discountCheck  [read]  auth=member  passCard.DiscountCheck
delay.depositBankList  [read]  auth=member  dlay.dptnBank.do  โ€” ๋ช…์‹œ์  @Field(Device/Version/Key๋งŒ) โ€” ๊ณ„์ขŒํ™˜๋ถˆ์šฉ ์€ํ–‰๋ชฉ๋ก.
ebizcross.uuid  [read]  auth=none  /ebizcross/getUUID.do  โ€” ํฌ๋กœ์Šค์„œ๋น„์Šค UUID ๋ฐœ๊ธ‰ ์œ ํ‹ธ(์ธ์ฆ ์ „).
trn.freeSeatCar  [read]  auth=member  trn.fresScar.do
copt.stationConvenienceMenu  [read]  auth=member  copt.gdMenuLt.do  โ€” ์—ญํŽธ์˜ URL ๋ฉ”๋‰ด(์—˜๋ฆฌ๋ฒ ์ดํ„ฐ/์ฃผ์ฐจ/BIS).
refund.ticketDetail  [read]  auth=member  refunds.SelTicketInfo  โ€” refunds.* ์ด์ง€๋งŒ ์กฐํšŒ(๋ฐ˜ํ™˜๋Œ€์ƒ ์ƒ์„ธ).
tk.guardianSms  [write]  auth=member  tk.gurdSmsSnd.do  โ€” ๋ณดํ˜ธ์ž SMS ๋ฐœ์†ก(์‚ฌ์ด๋“œ์ดํŽ™ํŠธ ์•ก์…˜).
reservation.guideSeatCondition  [read]  auth=member  reservation.guideSeatCnd.do
login.inquiryIsMember  [read]  auth=none  login.joinCfm.do  โ€” joinCfm โ€” ํšŒ์›์กด์žฌ ํ™•์ธ(์ธ์ฆ ์ „).
reservation.ticketRsvInquiry  [read]  auth=member  certification.ReservationList  โ€” certification.ReservationList ๊ณต์œ  โ€” ๊ฒฝ๋Ÿ‰๋ณ€ํ˜•(hidPnrNo๋งŒ).
pay.integratedSettlement  [pay,charge]  auth=member  pay.intgStl.do  โ›”UNSUPPORTED: integrated/cart settlement not supported โ€” use card via pay.reservationPayment  โ€” ํ†ตํ•ฉ(์žฅ๋ฐ”๊ตฌ๋‹ˆ) ์ •์‚ฐ(+PaymentMethod ๊ทธ๋ฆฌ๋“œ).
crypto.kbPayEncrypt  [read]  auth=none  common.encrypt.do  โ€” common.encrypt.do ๊ณต์œ (postCommonEncrypt ์™€ ๋™์ผ ๊ฒฝ๋กœ) โ€” KBํŽ˜์ด ๋ณ€ํ˜•.
krPass.list  [read]  auth=nonmember  /ebizcom/krPassLstDtl.do  โ€” ์™ธ๊ตญ์ธ ์ฝ”๋ ˆ์ผํŒจ์Šค ์กฐํšŒ(์—ฌ๊ถŒ/์ด๋ฉ”์ผ/๋น„๋ฒˆ).
krPass.changeStartDate  [write]  auth=nonmember  /ebizcom/krPassChgStDt.do
krPass.flexiDateFix  [write]  auth=nonmember  /ebizcom/krPassFxDateFix.do  โ€” Flexi ์ด์šฉ์ผ ํ™•์ •.
krPass.payment  [pay,charge]  auth=nonmember  /ebizcom/krPassPayment.do  โ›”UNSUPPORTED: KORAIL PASS payment not supported โ€” card-number payment only  โ€” enc ์นด๋“œํ•„๋“œ+3DS, ์™ธ๊ตญ์ธ ๊ฒฐ์ œ.
mileage.lpointAuth  [read]  auth=member  mlg.lpotAthn.do  โ€” Lํฌ์ธํŠธ ์ธ์ฆ(auth/cert ์„ฑ๊ฒฉ).
qr.localRailwayAuth  [read]  auth=member  qr.bchTripSv.do  โ€” ๋ฒฝ์ง€๋…ธ์„  ์—ฌํ–‰ QR ์ธ์ฆ.
session.login  [write,mtoken]  auth=none  login.Login  โ€” ๐Ÿ”’ m-token ๊ฒŒ์ดํŠธ โ€” ์„ธ์…˜ ํ™•๋ฆฝ(JSESSIONID).
login.authRegister  [write]  auth=member  login.loginAthnReg.do  โ€” ๋กœ๊ทธ์ธ ์ธ์ฆ(์ƒ์ฒด ๋“ฑ) ๋“ฑ๋ก.
login.authRemove  [write]  auth=member  login.loginAthnRmv.do  โ€” ๋กœ๊ทธ์ธ ์ธ์ฆ ํ•ด์ œ.
session.logout  [write]  auth=none  login.Logout  โ€” ์„ธ์…˜ ํŒŒ๊ธฐ.
ebizcom.lostCenterSearch  [read]  auth=none  /ebizcom/cs/guide/lost/srchLostCenter.do  โ€” ๋ถ„์‹ค๋ฌผ์„ผํ„ฐ ๊ฒ€์ƒ‰(๊ณต๊ฐœ).
addService.maasCancelPay  [write]  auth=member  addService.cancelPay.do
addService.maasServiceCancel  [write]  auth=member  addService.coptCnc.do  โ€” addService.coptCnc.do.
ebizmaas.stationList  [read]  auth=none  /ebizmaas/EbizMaasStationList.do  โ€” MaaS ์—ญ๋ชฉ๋ก(์ฐธ์กฐ๋ฐ์ดํ„ฐ).
cust.matchedDiscountTarget  [read]  auth=member  cust.mchdDcntTgt.do
member.verify  [read]  auth=none  member.verify.do
research.mergeSeats  [read]  auth=member  research.mergeSeatsC.do  โ€” ์ค‘๊ฐ„์Šน์ฐจ์—ญ ์ขŒ์„์—ฐ์† ์กฐํšŒ.
file.mobilePlusMain  [read]  auth=none  /file/CACHE/prdMobilePlusMain.cache  โ€” ์ •์  ์บ์‹œ ํŒŒ์ผ.
file.mobileService  [read]  auth=none  /file/CACHE/MobileService.cache  โ€” ์ •์  ์บ์‹œ ํŒŒ์ผ.
myTicket.list  [read]  auth=member  myTicket.MyTicketNewList.do
xPoint.myView  [read]  auth=member  xPoint.MyXPointView
reservation.ncardExtension  [write]  auth=member  reservation.dcntCrdExtn.do  โ€” N์นด๋“œ ์—ฐ์žฅ(์ƒํƒœ๋ณ€๊ฒฝ).
pay.naverPayMoney  [pay,charge]  auth=member  pay.naverPayMoneyRsv.do  โ›”UNSUPPORTED: Naver Pay Money not supported โ€” card-number payment only
pay.naverPay  [pay,charge]  auth=member  pay.naverPayRsv.do  โ›”UNSUPPORTED: Naver Pay not supported โ€” card-number payment only  โ€” stlScnUrl(๊ฒฐ์ œํ™”๋ฉด URL) ๋ฐ˜ํ™˜ โ€” ์›น๋ทฐ ๋ฆฌ๋‹ค์ด๋ ‰ํŠธ.
nonMember.ticketReserve  [write,mtoken]  auth=nonmember  nonMember.NonMemTicket  โ€” ๐Ÿ”’ m-token โ€” ๋น„ํšŒ์› ์˜ˆ๋งค(์ด๋ฆ„+์ „ํ™”+๋น„๋ฒˆ), PNR ์ƒ์„ฑ, ์„ธ์…˜ ์—†์Œ.
nonMember.ticketList  [read]  auth=nonmember  nonMember.NonMemTicketList
xPoint.okCashbagCert  [read]  auth=member  xPoint.OkCashbagCertView
pass.infoList  [read]  auth=member  pass.passInfoList
pass.menu  [read]  auth=member  pass.passMenu.do
pass.otrPayIssue  [pay,charge]  auth=member  pass.passOtrPayIssue  โ›”UNSUPPORTED: pass payment not supported โ€” card-number payment only  โ€” OTR ๋ฐœ๊ถŒ(๊ฒฐ์ œ+๋ฐœ๊ถŒ, 3 map).
pass.payIssue  [pay,charge]  auth=member  pass.passPayIssue  โ›”UNSUPPORTED: pass payment not supported โ€” card-number payment only  โ€” ํŒจ์Šค ๊ฒฐ์ œ+๋ฐœ๊ถŒ(fromPassReserveInfo ๋กœ ์˜ˆ์•ฝ๊ฐ์ฒดโ†’๊ฒฐ์ œ์š”์ฒญ).
pass.reserve  [write]  auth=member  pass.passReserve
pass.scheduleInfoList  [read]  auth=member  pass.passScheduleInfoList
pay.payco  [pay,charge]  auth=member  payment.reserve.payco.do  โ›”UNSUPPORTED: PAYCO not supported โ€” card-number payment only
delay.pnrQuery  [read]  auth=member  delay.pnrQry.do
login.popupConfirmRecord  [write]  auth=member  login.poppCfmRec.do  โ€” ํŒ์—… ํ™•์ธ ๊ธฐ๋ก ์ €์žฅ.
trn.priceFare  [read,mtoken]  auth=member  trn.prcFare.do  โ€” ๐Ÿ”’ m-token ๊ฒŒ์ดํŠธ โ€” ์šด์ž„๊ณ„์‚ฐ(์กฐํšŒ).
reservation.priceReCalculation  [write]  auth=member  certification.PriceReCalculation  โ€” PNR ์žฌ๊ณ„์‚ฐ(6๊ฐœ ๋ณ‘๋ ฌ @Field ์Šน๊ฐํ–‰) โ€” ๋งˆ์Šคํ„ฐํ‘œ W.
push.update  [write]  auth=member  push.update  โ€” ํ‘ธ์‹œ ๋“ฑ๋ก/ํ† ํฐ ๊ฐฑ์‹ .
railplus.autoCharge  [write]  auth=member  railplus.autoCharge.do
tk.recentDeliveryHistory  [read]  auth=member  tk.rcntDlvHst.do
refund.commission  [read]  auth=member  refunds.CommissionView  โ€” CommonIn ๋ฏธ์ƒ์† โ€” Device/Version/Key/Lang + h_comp_nm/h_comp_cert_no/ctlDvCd ๋ช…์‹œ ์ „์†ก.
refund.request  [refund,charge]  auth=member  refunds.RefundsRequest  โ€” CommonIn ๋ฏธ์ƒ์† โ€” ํ™˜๋ถˆ ์‹คํ–‰.
addSrv.wheelchairRequest  [write]  auth=member  addSrv.helpSrvCust.do  โ€” helpSrvCust.do ๋‹ค๊ธฐ๋Šฅ ๊ฒฝ๋กœ.
addService.wheelchairReRequest  [write]  auth=member  addService.reserve.do  โ€” addService.reserve.do ๋‹ค๊ธฐ๋Šฅ ๊ฒฝ๋กœ(postCancelWheelchair ์™€ ๊ณต์œ ) โ€” ์ด๋ ฅ ์žฌ์‹ ์ฒญ.
reservation.cancel  [write]  auth=member  reservationCancel.ReservationCancel  โ€” ์‹ค์ œ ์ทจ์†Œ ์‹คํ–‰(txtPnrNo/txtJrnySqno/txtJrnyCnt).
reservation.cancelCheck  [read]  auth=member  reservationCancel.ReservationCancelChk  โ€” ์ทจ์†Œ ์‚ฌ์ „ํ™•์ธ(์ˆ˜์ˆ˜๋ฃŒ/addSrvRetList ๋ฐ˜ํ™˜) โ€” ์‹ค์ œ ์ทจ์†Œ๋Š” ReservationCancel ์ด ์ˆ˜ํ–‰.
reservation.change  [write]  auth=member  reservation.reservationChange.do
reservation.list  [read]  auth=member  certification.ReservationList  โ€” certification.ReservationList ๊ณต์œ  โ€” ์ „์ฒด๋ณ€ํ˜•(psgDisc0019List).
pay.reservationPayment  [pay,charge]  auth=member  payment.ReservationPayment  โ€” payment.ReservationPayment ๊ณต์œ (postRsvPayment ์™€ ๋™์ผ ๊ฒฝ๋กœ) +PaymentMethod ๊ทธ๋ฆฌ๋“œ โ€” ํ‰๋ฌธ PAN/VAN_PWD.
reservation.view  [read]  auth=member  reservation.ReservationView  โ€” timeStamp ์บ์‹œ๋ฒ„์Šคํ„ฐ.
reservationWait.register  [write]  auth=member  reservationWait.ReservationWait  โ€” ๋ช…์ ˆ ๋Œ€๊ธฐ์˜ˆ์•ฝ(๊ธฐ์กด PNR์— ๋“ฑ๋ก).
tk.retrieveTicket  [write]  auth=member  tk.pbpWdrw.do  โ€” ๋ณด๋‚ธ์Šน์ฐจ๊ถŒ ์ฒ ํšŒ(withdraw).
pay.rsvPayment  [pay,charge]  auth=member  payment.ReservationPayment  โ€” payment.ReservationPayment ๊ณต์œ (postReservationPayment ์™€ ๋™์ผ ๊ฒฝ๋กœ) โ€” RsvPaymentIn ๋ณ€ํ˜•(hidRsvChgNo).
schedule.runDate  [read]  auth=member  schedule.runDt
lmu.scheduleQuery  [read]  auth=member  lmu.scdlQry.do
trains.search  [read,mtoken]  auth=member  seatMovie.ScheduleView  โ€” ๐Ÿ”’ m-token โ€” ์—ด์ฐจ์กฐํšŒ, ํŽ˜์ด์ง• h_next_pg_flg + qryStNo/qryStTrnNo.
trains.searchSpecial  [read,mtoken]  auth=member  seatMovie.ScheduleViewSpecial  โ€” ๐Ÿ”’ m-token โ€” ํŠน๋ณ„์—ด์ฐจ ์กฐํšŒ.
ebizcom.travelProductSearch  [read]  auth=member  /ebizcom/gdLstDtl.do
reservation.seatAssign  [write]  auth=member  reservation.seatAssign.do  โ€” ์ขŒ์„์ง€์ • ์˜ˆ์•ฝ โ†’ ReservationOut(PNR ์ƒ์„ฑ).
checkin.info  [read]  auth=member  checkin.info.do  โ€” ํ•„๋“œ๋ช… saleDt(psbFlg/reg ๋Š” saleDd).
checkin.possible  [read]  auth=member  checkin.psbFlg.do  โ€” ํ•„๋“œ๋ช… saleDd + qrcode.
checkin.register  [write]  auth=member  checkin.reg.do  โ€” ํ•„๋“œ๋ช… saleDd + ๋ฌผ๋ฆฌ์ขŒ์„(scarNo/seatNo).
crypto.shinhanEncrypt  [read]  auth=member  shinhan.Encrypt.do  โ€” ์‹ ํ•œ์นด๋“œ ์•”ํ˜ธํ™” ์œ ํ‹ธ.
cart.show  [read]  auth=member  cart.showCartList
pay.samsungPayDecrypt  [pay,charge]  auth=member  pay.spayCphdDatVal.do  โ›”UNSUPPORTED: Samsung Pay not supported โ€” card-number payment only  โ€” ์‚ผ์„ฑํŽ˜์ด โ€” ์„œ๋ฒ„๋ณตํ˜ธ๋กœ stlCrCrdNo ๋ฐ˜ํ™˜.
pay.monimoDecrypt  [pay,charge]  auth=member  pay.monimoDecrypt.do  โ›”UNSUPPORTED: Monimo (Samsung) pay not supported โ€” card-number payment only  โ€” ๋ชจ๋‹ˆ๋ชจ โ€” ์„œ๋ฒ„๋ณตํ˜ธ stlCrCrdNo.
pay.samsungPayOrderNo  [pay,charge]  auth=member  pay.spayOrdNo.do  โ›”UNSUPPORTED: Samsung Pay not supported โ€” card-number payment only  โ€” encTotTxnAmt AES-256-CBC(ํ‚ค=AppLoginCphd).
common.specificDateData  [read]  auth=none  common.specificDateData.do
integrate.srCheck  [read]  auth=none  integrate.srCheck.do
integrate.srJoin  [write]  auth=member  integrate.srJoin.do  โ€” SR ํ†ตํ•ฉํšŒ์› ๊ฐ€์ž…(join).
common.stationData  [read]  auth=none  common.stationdata
common.stationInfo  [read]  auth=none  common.stationinfo
pay.realtimeAccount  [pay,charge]  auth=member  pay.stbkAcnt.do  โ›”UNSUPPORTED: real-time bank transfer not supported โ€” card-number payment only  โ€” ์‹ค์‹œ๊ฐ„๊ณ„์ขŒ์ด์ฒด โ€” ์˜ˆ๊ธˆ์ฃผ ์กฐํšŒ(pay.* ๊ฒฝ๋กœ๋ผ kind=pay).
pay.stbkBankList  [pay,charge]  auth=member  pay.stbkRegBank.do  โ›”UNSUPPORTED: real-time bank transfer not supported โ€” card-number payment only  โ€” ์€ํ–‰๋ชฉ๋ก ์กฐํšŒ(pay.* ๊ฒฝ๋กœ๋ผ kind=pay).
pay.settlementKeyProcess  [pay,charge]  auth=member  pay.stlKeyPrs.do  โ›”UNSUPPORTED: easy-pay settlement key not supported โ€” card-number payment only  โ€” ์ •์‚ฐํ‚ค ๋“ฑ๋ก.
pay.settlementKeyQuery  [pay,charge]  auth=member  pay.stlKeyQry.do  โ›”UNSUPPORTED: easy-pay settlement key not supported โ€” card-number payment only  โ€” ๋“ฑ๋ก ์ •์‚ฐํ‚ค ๋ชฉ๋ก ์กฐํšŒ(pay.* ๊ฒฝ๋กœ๋ผ kind=pay).
seats.residual  [read]  auth=member  research.TResidualSeatsResearch.do  โ€” ์ขŒ์„๋งต(์ž”์—ฌ์„).
ticket.dupCheck  [read]  auth=member  ticket.ticketDupCheck.do
receipt.info  [read]  auth=member  receipt.ReceiptInfo
reservation.ticketReserve  [write,mtoken]  auth=member  certification.TicketReservation  โ€” ๐Ÿ”’ m-token โ€” ๋ฐœ๊ถŒ์š”์ฒญ(์ž๋™/์ž…์„), PNR ์ƒ์„ฑ.
myTicket.widget  [read]  auth=member  myTicket.MyTicketWidget.do  โ€” encMbCrdNo(์•”ํ˜ธ ํšŒ์›์นด๋“œ).
pay.tossBillingKey  [pay,charge]  auth=member  pay.tossautoC.do  โ›”UNSUPPORTED: Toss pay not supported โ€” card-number payment only  โ€” ํ† ์Šค ๋นŒ๋งํ‚ค.
trainsInfo.tourTrainSpecialRoom  [read]  auth=member  trainsInfo.TourTrainSpecialRoom
pass.travelGoodsMenu  [read]  auth=member  pass.trGdMenuLt.do
research.trainResearch  [read]  auth=member  research.TrainResearch
tripChange.handleCancel  [write]  auth=member  ticket.tripChgHndgCnc.do  โ€” ๋ณ€๊ฒฝ ์ˆ˜๊ธฐ์ทจ์†Œ(+lumpStlTgtMap ๋™์ ).
tripChange.process  [write]  auth=member  reservation.tripChgPrsC.do  โ€” ์—ฌ์ •๋ณ€๊ฒฝ ํ™•์ • โ†’ ์‹ ๊ทœ PNR(ReservationOut).
login.userCheck  [read]  auth=none  login.userCheck
addSrv.wheelchairHistory  [read]  auth=member  addSrv.helpSrvCust.do  โ€” helpSrvCust.do ๋‹ค๊ธฐ๋Šฅ ๊ฒฝ๋กœ(์กฐํšŒ ๋ณ€ํ˜•).
addSrv.wheelchairResult  [read]  auth=member  addSrv.helpSrvTk.do
xPoint.view  [read]  auth=member  xPoint.XPointView
product.cancel  [write]  auth=member  product.ReservationCancel  โ€” GET ๋ฉ”์„œ๋“œ์ด์ง€๋งŒ ์ทจ์†Œ ์‹คํ–‰.
push.crewCall  [write]  auth=member  push.callCrew.do  โ€” ์Šน๋ฌด์› ํ˜ธ์ถœ(์‚ฌ์ด๋“œ์ดํŽ™ํŠธ ์•ก์…˜).
self.seatChangeInfo  [read]  auth=member  self.seatChgInfo.do  โ€” ์ขŒ์„๋ณ€๊ฒฝ ๊ฐ€๋Šฅ์กฐํšŒ.
refund.verifyOnline  [read]  auth=member  refunds.verifyOnlineRefunds  โ€” refunds.* ์ด์ง€๋งŒ ์กฐํšŒ(๊ฒ€์ฆ) โ€” CommonOut ๋ฏธ์ƒ์†.