{
  "openapi": "3.0.3",
  "info": {
    "title": "rail-api",
    "version": "0.1.0",
    "description": "Korail gateway API. Pass-through over the Korail mobile API. See /llms.txt for the agent guide."
  },
  "servers": [
    {
      "url": "https://rail-api.coderyn.com"
    }
  ],
  "components": {
    "securitySchemes": {
      "bearer": {
        "type": "http",
        "scheme": "bearer"
      }
    },
    "schemas": {
      "OpResult": {
        "type": "object",
        "properties": {
          "ok": {
            "type": "boolean"
          },
          "code": {
            "type": "string"
          },
          "data": {
            "type": "object",
            "additionalProperties": true
          },
          "korail": {
            "type": "object",
            "properties": {
              "strResult": {},
              "h_msg_cd": {},
              "h_msg_txt": {}
            }
          },
          "requestId": {
            "type": "string"
          }
        }
      }
    }
  },
  "paths": {
    "/v1/health": {
      "get": {
        "summary": "Health",
        "responses": {
          "200": {
            "description": "ok"
          }
        }
      }
    },
    "/v1/ops": {
      "get": {
        "summary": "List operations",
        "responses": {
          "200": {
            "description": "array of ops"
          }
        }
      }
    },
    "/v1/sessions": {
      "post": {
        "summary": "Establish korail session",
        "security": [
          {
            "bearer": []
          }
        ],
        "responses": {
          "200": {
            "description": "session"
          }
        }
      }
    },
    "/v1/op/{operationId}": {
      "post": {
        "summary": "Invoke any korail operation (pass-through)",
        "security": [
          {
            "bearer": []
          }
        ],
        "parameters": [
          {
            "name": "operationId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string",
              "enum": [
                "refund.executeOnline",
                "goods.cacheRead",
                "research.commutationInfo",
                "push.crewCallList",
                "global.stations",
                "maas.cancelFee",
                "copt.maasDetailList",
                "ncard.history",
                "product.detail",
                "product.list",
                "goods.meta",
                "pass.seatInfo",
                "tripChange.originalTicket",
                "tripChange.dates",
                "pass.otrReserve",
                "product.payInfo",
                "maas.reserveStatus",
                "mileage.accompanySave",
                "delay.acceptProcess",
                "research.actualSchedule",
                "cart.add",
                "seats.airportBusResidual",
                "mileage.amountSpec",
                "research.assignScheduleView",
                "addService.buyConfirm",
                "goods.cacheCheck",
                "checkin.cancel",
                "addService.wheelchairCancel",
                "cashReceipt.issue",
                "delay.cashRefund",
                "cert.congressperson",
                "cert.merit",
                "qry.transferStation",
                "codes.get",
                "codes.getMulti",
                "crypto.encrypt",
                "passCard.coupons",
                "research.custTripInfo",
                "research.ncardInfo",
                "research.ncardScheduleView",
                "crypto.decrypt",
                "delay.certificate",
                "passCard.delayDiscount",
                "delay.returnReceipt",
                "account.delete",
                "addSrv.wheelchairHistoryDelete",
                "tk.receivedTicketHistory",
                "tk.deliveryReceiver",
                "gift.send",
                "tk.deviceReset",
                "cert.disability",
                "passCard.discountCheck",
                "delay.depositBankList",
                "ebizcross.uuid",
                "trn.freeSeatCar",
                "copt.stationConvenienceMenu",
                "refund.ticketDetail",
                "tk.guardianSms",
                "reservation.guideSeatCondition",
                "login.inquiryIsMember",
                "reservation.ticketRsvInquiry",
                "pay.integratedSettlement",
                "crypto.kbPayEncrypt",
                "krPass.list",
                "krPass.changeStartDate",
                "krPass.flexiDateFix",
                "krPass.payment",
                "mileage.lpointAuth",
                "qr.localRailwayAuth",
                "session.login",
                "login.authRegister",
                "login.authRemove",
                "session.logout",
                "ebizcom.lostCenterSearch",
                "addService.maasCancelPay",
                "addService.maasServiceCancel",
                "ebizmaas.stationList",
                "cust.matchedDiscountTarget",
                "member.verify",
                "research.mergeSeats",
                "file.mobilePlusMain",
                "file.mobileService",
                "myTicket.list",
                "xPoint.myView",
                "reservation.ncardExtension",
                "pay.naverPayMoney",
                "pay.naverPay",
                "nonMember.ticketReserve",
                "nonMember.ticketList",
                "xPoint.okCashbagCert",
                "pass.infoList",
                "pass.menu",
                "pass.otrPayIssue",
                "pass.payIssue",
                "pass.reserve",
                "pass.scheduleInfoList",
                "pay.payco",
                "delay.pnrQuery",
                "login.popupConfirmRecord",
                "trn.priceFare",
                "reservation.priceReCalculation",
                "push.update",
                "railplus.autoCharge",
                "tk.recentDeliveryHistory",
                "refund.commission",
                "refund.request",
                "addSrv.wheelchairRequest",
                "addService.wheelchairReRequest",
                "reservation.cancel",
                "reservation.cancelCheck",
                "reservation.change",
                "reservation.list",
                "pay.reservationPayment",
                "reservation.view",
                "reservationWait.register",
                "tk.retrieveTicket",
                "pay.rsvPayment",
                "schedule.runDate",
                "lmu.scheduleQuery",
                "trains.search",
                "trains.searchSpecial",
                "ebizcom.travelProductSearch",
                "reservation.seatAssign",
                "checkin.info",
                "checkin.possible",
                "checkin.register",
                "crypto.shinhanEncrypt",
                "cart.show",
                "pay.samsungPayDecrypt",
                "pay.monimoDecrypt",
                "pay.samsungPayOrderNo",
                "common.specificDateData",
                "integrate.srCheck",
                "integrate.srJoin",
                "common.stationData",
                "common.stationInfo",
                "pay.realtimeAccount",
                "pay.stbkBankList",
                "pay.settlementKeyProcess",
                "pay.settlementKeyQuery",
                "seats.residual",
                "ticket.dupCheck",
                "receipt.info",
                "reservation.ticketReserve",
                "myTicket.widget",
                "pay.tossBillingKey",
                "trainsInfo.tourTrainSpecialRoom",
                "pass.travelGoodsMenu",
                "research.trainResearch",
                "tripChange.handleCancel",
                "tripChange.process",
                "login.userCheck",
                "addSrv.wheelchairHistory",
                "addSrv.wheelchairResult",
                "xPoint.view",
                "product.cancel",
                "push.crewCall",
                "self.seatChangeInfo",
                "refund.verifyOnline"
              ]
            }
          },
          {
            "name": "Idempotency-Key",
            "in": "header",
            "required": false,
            "schema": {
              "type": "string"
            },
            "description": "required for write/pay/refund"
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "additionalProperties": true,
                "description": "raw korail fields for this operation"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "result",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/OpResult"
                }
              }
            }
          }
        }
      }
    },
    "/admin/users": {
      "post": {
        "summary": "Create user (admin)",
        "responses": {
          "200": {
            "description": "{userId, apiKey}"
          }
        }
      }
    },
    "/admin/users/{userId}/credentials": {
      "post": {
        "summary": "Register korail credentials (admin)",
        "parameters": [
          {
            "name": "userId",
            "in": "path",
            "required": true,
            "schema": {
              "type": "string"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "ok"
          }
        }
      }
    }
  },
  "x-operations": [
    {
      "id": "refund.executeOnline",
      "korailPath": "refunds.executeOnlineRefunds",
      "kind": "refund",
      "auth": "member",
      "mToken": false,
      "charge": true,
      "note": "온라인 환불 실행 — 구매이력 불요(pnrNo+원권튜플만)."
    },
    {
      "id": "goods.cacheRead",
      "korailPath": "goods.cacheRead.do",
      "kind": "read",
      "auth": "none",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "research.commutationInfo",
      "korailPath": "research.cmtrInfo.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "push.crewCallList",
      "korailPath": "push.crwCallRq.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "global.stations",
      "korailPath": "/ebizcom/com.korail.mobile.global.stations.do",
      "kind": "read",
      "auth": "none",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "maas.cancelFee",
      "korailPath": "maas.cncFee.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "copt.maasDetailList",
      "korailPath": "copt.gdReqQry.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "ncard.history",
      "korailPath": "ticket.dcntCrdUseQry.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "product.detail",
      "korailPath": "product.ReservationDetail",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "product.list",
      "korailPath": "product.ReservationList",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "goods.meta",
      "korailPath": "goods.meta.do",
      "kind": "read",
      "auth": "none",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "pass.seatInfo",
      "korailPath": "pass.seatInfo.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "패스 좌석지정 대상 조회(wctNo/saleDt/saleSqno/tkRetPwd 페이징)."
    },
    {
      "id": "tripChange.originalTicket",
      "korailPath": "research.tripChgOgtk.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "여정변경용 원권(원승차권) 조회."
    },
    {
      "id": "tripChange.dates",
      "korailPath": "reservation.tripChgDate.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "변경가능 날짜 조회(GET)."
    },
    {
      "id": "pass.otrReserve",
      "korailPath": "pass.passOtrReserve",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "OTR(좌석없는 패스권) 예약, passOtrPayIssue 로 이어짐."
    },
    {
      "id": "product.payInfo",
      "korailPath": "product.payInfo",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "여행상품 결제 사전확인(strLumpStlTgtNo 획득)."
    },
    {
      "id": "maas.reserveStatus",
      "korailPath": "maas.rsvStt.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "응답 empty(봉투만)."
    },
    {
      "id": "mileage.accompanySave",
      "korailPath": "mileage.acpnMlgSave.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "delay.acceptProcess",
      "korailPath": "delay.acptPrs.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "지연배상금 수락처리."
    },
    {
      "id": "research.actualSchedule",
      "korailPath": "research.actualTrainSchedule.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "cart.add",
      "korailPath": "cart.addCartList",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "seats.airportBusResidual",
      "korailPath": "lms.TResidualSeatsResearch.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "공항버스 좌석맵 — research.TResidualSeatsResearch 와 동일 스키마."
    },
    {
      "id": "mileage.amountSpec",
      "korailPath": "mlg.amtSpec.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "research.assignScheduleView",
      "korailPath": "research.assignScheduleView.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "addService.buyConfirm",
      "korailPath": "addService.buyConfirm.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "goods.cacheCheck",
      "korailPath": "goods.cacheCheck.do",
      "kind": "read",
      "auth": "none",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "checkin.cancel",
      "korailPath": "checkin.cnc.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "필드명 saleDt(psbFlg/reg 는 saleDd)."
    },
    {
      "id": "addService.wheelchairCancel",
      "korailPath": "addService.reserve.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "addService.reserve.do 는 다기능 경로(postRequestWheelchairWithHistory 와 공유), jobDvCd 로 분기."
    },
    {
      "id": "cashReceipt.issue",
      "korailPath": "cashReceipt.issue.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "delay.cashRefund",
      "korailPath": "dlay.cashRfn.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "명시적 @Field 바디(In 모델 없음) — 계좌환불(dmnPrsDvCd/dptnBankCd/dptnAcntNo)."
    },
    {
      "id": "cert.congressperson",
      "korailPath": "certification.assemblyCert",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "국회의원 무임(GET)."
    },
    {
      "id": "cert.merit",
      "korailPath": "certification.MeritCert",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "국가유공자 인증."
    },
    {
      "id": "qry.transferStation",
      "korailPath": "qry.chtnStn.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "codes.get",
      "korailPath": "common.code.do",
      "kind": "read",
      "auth": "none",
      "mToken": false,
      "charge": false,
      "note": "common.code.do 공유 — 단일 코드셋."
    },
    {
      "id": "codes.getMulti",
      "korailPath": "common.code.do",
      "kind": "read",
      "auth": "none",
      "mToken": false,
      "charge": false,
      "note": "common.code.do 공유 — 복수 코드셋 변형."
    },
    {
      "id": "crypto.encrypt",
      "korailPath": "common.encrypt.do",
      "kind": "read",
      "auth": "none",
      "mToken": false,
      "charge": false,
      "note": "common.encrypt.do 공유(postKBPayEncrypt 와 동일 경로)."
    },
    {
      "id": "passCard.coupons",
      "korailPath": "passCard.CouponView",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "research.custTripInfo",
      "korailPath": "research.custTripInfo.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "research.ncardInfo",
      "korailPath": "research.dcntCrdInfo.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "research.ncardScheduleView",
      "korailPath": "research.dcntCrdScheduleView.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "crypto.decrypt",
      "korailPath": "common.decrypt.do",
      "kind": "read",
      "auth": "none",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "delay.certificate",
      "korailPath": "dlay.athnIsu.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "지연증명서 발급조회."
    },
    {
      "id": "passCard.delayDiscount",
      "korailPath": "passCard.DelayDiscountView",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "페이징 Query h_page_no."
    },
    {
      "id": "delay.returnReceipt",
      "korailPath": "dlay.pymtRcet.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "account.delete",
      "korailPath": "login.mbSced.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "회원탈퇴 — login.mbSced.do 이지만 로그인 세션 필요."
    },
    {
      "id": "addSrv.wheelchairHistoryDelete",
      "korailPath": "addSrv.helpSrvCust.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "helpSrvCust.do 다기능 경로(qryDvCd/addSrvDvCd 분기)."
    },
    {
      "id": "tk.receivedTicketHistory",
      "korailPath": "tk.pbpAcepSpec.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "받은승차권 내역."
    },
    {
      "id": "tk.deliveryReceiver",
      "korailPath": "tk.dlvRcvCust.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "gift.send",
      "korailPath": "giftInfo.GiftSend",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "승차권 선물 발송(+presentMap) → 변경 예약번호 chgePbpRsvNo."
    },
    {
      "id": "tk.deviceReset",
      "korailPath": "tk.dvcInfoInit.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "기기정보 초기화(디바이스 바인딩 리셋)."
    },
    {
      "id": "cert.disability",
      "korailPath": "certification.disabled.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "passCard.discountCheck",
      "korailPath": "passCard.DiscountCheck",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "delay.depositBankList",
      "korailPath": "dlay.dptnBank.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "명시적 @Field(Device/Version/Key만) — 계좌환불용 은행목록."
    },
    {
      "id": "ebizcross.uuid",
      "korailPath": "/ebizcross/getUUID.do",
      "kind": "read",
      "auth": "none",
      "mToken": false,
      "charge": false,
      "note": "크로스서비스 UUID 발급 유틸(인증 전)."
    },
    {
      "id": "trn.freeSeatCar",
      "korailPath": "trn.fresScar.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "copt.stationConvenienceMenu",
      "korailPath": "copt.gdMenuLt.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "역편의 URL 메뉴(엘리베이터/주차/BIS)."
    },
    {
      "id": "refund.ticketDetail",
      "korailPath": "refunds.SelTicketInfo",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "refunds.* 이지만 조회(반환대상 상세)."
    },
    {
      "id": "tk.guardianSms",
      "korailPath": "tk.gurdSmsSnd.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "보호자 SMS 발송(사이드이펙트 액션)."
    },
    {
      "id": "reservation.guideSeatCondition",
      "korailPath": "reservation.guideSeatCnd.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "login.inquiryIsMember",
      "korailPath": "login.joinCfm.do",
      "kind": "read",
      "auth": "none",
      "mToken": false,
      "charge": false,
      "note": "joinCfm — 회원존재 확인(인증 전)."
    },
    {
      "id": "reservation.ticketRsvInquiry",
      "korailPath": "certification.ReservationList",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "certification.ReservationList 공유 — 경량변형(hidPnrNo만)."
    },
    {
      "id": "pay.integratedSettlement",
      "korailPath": "pay.intgStl.do",
      "kind": "pay",
      "auth": "member",
      "mToken": false,
      "charge": true,
      "note": "통합(장바구니) 정산(+PaymentMethod 그리드)."
    },
    {
      "id": "crypto.kbPayEncrypt",
      "korailPath": "common.encrypt.do",
      "kind": "read",
      "auth": "none",
      "mToken": false,
      "charge": false,
      "note": "common.encrypt.do 공유(postCommonEncrypt 와 동일 경로) — KB페이 변형."
    },
    {
      "id": "krPass.list",
      "korailPath": "/ebizcom/krPassLstDtl.do",
      "kind": "read",
      "auth": "nonmember",
      "mToken": false,
      "charge": false,
      "note": "외국인 코레일패스 조회(여권/이메일/비번)."
    },
    {
      "id": "krPass.changeStartDate",
      "korailPath": "/ebizcom/krPassChgStDt.do",
      "kind": "write",
      "auth": "nonmember",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "krPass.flexiDateFix",
      "korailPath": "/ebizcom/krPassFxDateFix.do",
      "kind": "write",
      "auth": "nonmember",
      "mToken": false,
      "charge": false,
      "note": "Flexi 이용일 확정."
    },
    {
      "id": "krPass.payment",
      "korailPath": "/ebizcom/krPassPayment.do",
      "kind": "pay",
      "auth": "nonmember",
      "mToken": false,
      "charge": true,
      "note": "enc 카드필드+3DS, 외국인 결제."
    },
    {
      "id": "mileage.lpointAuth",
      "korailPath": "mlg.lpotAthn.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "L포인트 인증(auth/cert 성격)."
    },
    {
      "id": "qr.localRailwayAuth",
      "korailPath": "qr.bchTripSv.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "벽지노선 여행 QR 인증."
    },
    {
      "id": "session.login",
      "korailPath": "login.Login",
      "kind": "write",
      "auth": "none",
      "mToken": true,
      "charge": false,
      "note": "🔒 m-token 게이트 — 세션 확립(JSESSIONID)."
    },
    {
      "id": "login.authRegister",
      "korailPath": "login.loginAthnReg.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "로그인 인증(생체 등) 등록."
    },
    {
      "id": "login.authRemove",
      "korailPath": "login.loginAthnRmv.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "로그인 인증 해제."
    },
    {
      "id": "session.logout",
      "korailPath": "login.Logout",
      "kind": "write",
      "auth": "none",
      "mToken": false,
      "charge": false,
      "note": "세션 파기."
    },
    {
      "id": "ebizcom.lostCenterSearch",
      "korailPath": "/ebizcom/cs/guide/lost/srchLostCenter.do",
      "kind": "read",
      "auth": "none",
      "mToken": false,
      "charge": false,
      "note": "분실물센터 검색(공개)."
    },
    {
      "id": "addService.maasCancelPay",
      "korailPath": "addService.cancelPay.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "addService.maasServiceCancel",
      "korailPath": "addService.coptCnc.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "addService.coptCnc.do."
    },
    {
      "id": "ebizmaas.stationList",
      "korailPath": "/ebizmaas/EbizMaasStationList.do",
      "kind": "read",
      "auth": "none",
      "mToken": false,
      "charge": false,
      "note": "MaaS 역목록(참조데이터)."
    },
    {
      "id": "cust.matchedDiscountTarget",
      "korailPath": "cust.mchdDcntTgt.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "member.verify",
      "korailPath": "member.verify.do",
      "kind": "read",
      "auth": "none",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "research.mergeSeats",
      "korailPath": "research.mergeSeatsC.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "중간승차역 좌석연속 조회."
    },
    {
      "id": "file.mobilePlusMain",
      "korailPath": "/file/CACHE/prdMobilePlusMain.cache",
      "kind": "read",
      "auth": "none",
      "mToken": false,
      "charge": false,
      "note": "정적 캐시 파일."
    },
    {
      "id": "file.mobileService",
      "korailPath": "/file/CACHE/MobileService.cache",
      "kind": "read",
      "auth": "none",
      "mToken": false,
      "charge": false,
      "note": "정적 캐시 파일."
    },
    {
      "id": "myTicket.list",
      "korailPath": "myTicket.MyTicketNewList.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "xPoint.myView",
      "korailPath": "xPoint.MyXPointView",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "reservation.ncardExtension",
      "korailPath": "reservation.dcntCrdExtn.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "N카드 연장(상태변경)."
    },
    {
      "id": "pay.naverPayMoney",
      "korailPath": "pay.naverPayMoneyRsv.do",
      "kind": "pay",
      "auth": "member",
      "mToken": false,
      "charge": true,
      "note": null
    },
    {
      "id": "pay.naverPay",
      "korailPath": "pay.naverPayRsv.do",
      "kind": "pay",
      "auth": "member",
      "mToken": false,
      "charge": true,
      "note": "stlScnUrl(결제화면 URL) 반환 — 웹뷰 리다이렉트."
    },
    {
      "id": "nonMember.ticketReserve",
      "korailPath": "nonMember.NonMemTicket",
      "kind": "write",
      "auth": "nonmember",
      "mToken": true,
      "charge": false,
      "note": "🔒 m-token — 비회원 예매(이름+전화+비번), PNR 생성, 세션 없음."
    },
    {
      "id": "nonMember.ticketList",
      "korailPath": "nonMember.NonMemTicketList",
      "kind": "read",
      "auth": "nonmember",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "xPoint.okCashbagCert",
      "korailPath": "xPoint.OkCashbagCertView",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "pass.infoList",
      "korailPath": "pass.passInfoList",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "pass.menu",
      "korailPath": "pass.passMenu.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "pass.otrPayIssue",
      "korailPath": "pass.passOtrPayIssue",
      "kind": "pay",
      "auth": "member",
      "mToken": false,
      "charge": true,
      "note": "OTR 발권(결제+발권, 3 map)."
    },
    {
      "id": "pass.payIssue",
      "korailPath": "pass.passPayIssue",
      "kind": "pay",
      "auth": "member",
      "mToken": false,
      "charge": true,
      "note": "패스 결제+발권(fromPassReserveInfo 로 예약객체→결제요청)."
    },
    {
      "id": "pass.reserve",
      "korailPath": "pass.passReserve",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "pass.scheduleInfoList",
      "korailPath": "pass.passScheduleInfoList",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "pay.payco",
      "korailPath": "payment.reserve.payco.do",
      "kind": "pay",
      "auth": "member",
      "mToken": false,
      "charge": true,
      "note": null
    },
    {
      "id": "delay.pnrQuery",
      "korailPath": "delay.pnrQry.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "login.popupConfirmRecord",
      "korailPath": "login.poppCfmRec.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "팝업 확인 기록 저장."
    },
    {
      "id": "trn.priceFare",
      "korailPath": "trn.prcFare.do",
      "kind": "read",
      "auth": "member",
      "mToken": true,
      "charge": false,
      "note": "🔒 m-token 게이트 — 운임계산(조회)."
    },
    {
      "id": "reservation.priceReCalculation",
      "korailPath": "certification.PriceReCalculation",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "PNR 재계산(6개 병렬 @Field 승객행) — 마스터표 W."
    },
    {
      "id": "push.update",
      "korailPath": "push.update",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "푸시 등록/토큰 갱신."
    },
    {
      "id": "railplus.autoCharge",
      "korailPath": "railplus.autoCharge.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "tk.recentDeliveryHistory",
      "korailPath": "tk.rcntDlvHst.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "refund.commission",
      "korailPath": "refunds.CommissionView",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "CommonIn 미상속 — Device/Version/Key/Lang + h_comp_nm/h_comp_cert_no/ctlDvCd 명시 전송."
    },
    {
      "id": "refund.request",
      "korailPath": "refunds.RefundsRequest",
      "kind": "refund",
      "auth": "member",
      "mToken": false,
      "charge": true,
      "note": "CommonIn 미상속 — 환불 실행."
    },
    {
      "id": "addSrv.wheelchairRequest",
      "korailPath": "addSrv.helpSrvCust.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "helpSrvCust.do 다기능 경로."
    },
    {
      "id": "addService.wheelchairReRequest",
      "korailPath": "addService.reserve.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "addService.reserve.do 다기능 경로(postCancelWheelchair 와 공유) — 이력 재신청."
    },
    {
      "id": "reservation.cancel",
      "korailPath": "reservationCancel.ReservationCancel",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "실제 취소 실행(txtPnrNo/txtJrnySqno/txtJrnyCnt)."
    },
    {
      "id": "reservation.cancelCheck",
      "korailPath": "reservationCancel.ReservationCancelChk",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "취소 사전확인(수수료/addSrvRetList 반환) — 실제 취소는 ReservationCancel 이 수행."
    },
    {
      "id": "reservation.change",
      "korailPath": "reservation.reservationChange.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "reservation.list",
      "korailPath": "certification.ReservationList",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "certification.ReservationList 공유 — 전체변형(psgDisc0019List)."
    },
    {
      "id": "pay.reservationPayment",
      "korailPath": "payment.ReservationPayment",
      "kind": "pay",
      "auth": "member",
      "mToken": false,
      "charge": true,
      "note": "payment.ReservationPayment 공유(postRsvPayment 와 동일 경로) +PaymentMethod 그리드 — 평문 PAN/VAN_PWD."
    },
    {
      "id": "reservation.view",
      "korailPath": "reservation.ReservationView",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "timeStamp 캐시버스터."
    },
    {
      "id": "reservationWait.register",
      "korailPath": "reservationWait.ReservationWait",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "명절 대기예약(기존 PNR에 등록)."
    },
    {
      "id": "tk.retrieveTicket",
      "korailPath": "tk.pbpWdrw.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "보낸승차권 철회(withdraw)."
    },
    {
      "id": "pay.rsvPayment",
      "korailPath": "payment.ReservationPayment",
      "kind": "pay",
      "auth": "member",
      "mToken": false,
      "charge": true,
      "note": "payment.ReservationPayment 공유(postReservationPayment 와 동일 경로) — RsvPaymentIn 변형(hidRsvChgNo)."
    },
    {
      "id": "schedule.runDate",
      "korailPath": "schedule.runDt",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "lmu.scheduleQuery",
      "korailPath": "lmu.scdlQry.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "trains.search",
      "korailPath": "seatMovie.ScheduleView",
      "kind": "read",
      "auth": "member",
      "mToken": true,
      "charge": false,
      "note": "🔒 m-token — 열차조회, 페이징 h_next_pg_flg + qryStNo/qryStTrnNo."
    },
    {
      "id": "trains.searchSpecial",
      "korailPath": "seatMovie.ScheduleViewSpecial",
      "kind": "read",
      "auth": "member",
      "mToken": true,
      "charge": false,
      "note": "🔒 m-token — 특별열차 조회."
    },
    {
      "id": "ebizcom.travelProductSearch",
      "korailPath": "/ebizcom/gdLstDtl.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "reservation.seatAssign",
      "korailPath": "reservation.seatAssign.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "좌석지정 예약 → ReservationOut(PNR 생성)."
    },
    {
      "id": "checkin.info",
      "korailPath": "checkin.info.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "필드명 saleDt(psbFlg/reg 는 saleDd)."
    },
    {
      "id": "checkin.possible",
      "korailPath": "checkin.psbFlg.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "필드명 saleDd + qrcode."
    },
    {
      "id": "checkin.register",
      "korailPath": "checkin.reg.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "필드명 saleDd + 물리좌석(scarNo/seatNo)."
    },
    {
      "id": "crypto.shinhanEncrypt",
      "korailPath": "shinhan.Encrypt.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "신한카드 암호화 유틸."
    },
    {
      "id": "cart.show",
      "korailPath": "cart.showCartList",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "pay.samsungPayDecrypt",
      "korailPath": "pay.spayCphdDatVal.do",
      "kind": "pay",
      "auth": "member",
      "mToken": false,
      "charge": true,
      "note": "삼성페이 — 서버복호로 stlCrCrdNo 반환."
    },
    {
      "id": "pay.monimoDecrypt",
      "korailPath": "pay.monimoDecrypt.do",
      "kind": "pay",
      "auth": "member",
      "mToken": false,
      "charge": true,
      "note": "모니모 — 서버복호 stlCrCrdNo."
    },
    {
      "id": "pay.samsungPayOrderNo",
      "korailPath": "pay.spayOrdNo.do",
      "kind": "pay",
      "auth": "member",
      "mToken": false,
      "charge": true,
      "note": "encTotTxnAmt AES-256-CBC(키=AppLoginCphd)."
    },
    {
      "id": "common.specificDateData",
      "korailPath": "common.specificDateData.do",
      "kind": "read",
      "auth": "none",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "integrate.srCheck",
      "korailPath": "integrate.srCheck.do",
      "kind": "read",
      "auth": "none",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "integrate.srJoin",
      "korailPath": "integrate.srJoin.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "SR 통합회원 가입(join)."
    },
    {
      "id": "common.stationData",
      "korailPath": "common.stationdata",
      "kind": "read",
      "auth": "none",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "common.stationInfo",
      "korailPath": "common.stationinfo",
      "kind": "read",
      "auth": "none",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "pay.realtimeAccount",
      "korailPath": "pay.stbkAcnt.do",
      "kind": "pay",
      "auth": "member",
      "mToken": false,
      "charge": true,
      "note": "실시간계좌이체 — 예금주 조회(pay.* 경로라 kind=pay)."
    },
    {
      "id": "pay.stbkBankList",
      "korailPath": "pay.stbkRegBank.do",
      "kind": "pay",
      "auth": "member",
      "mToken": false,
      "charge": true,
      "note": "은행목록 조회(pay.* 경로라 kind=pay)."
    },
    {
      "id": "pay.settlementKeyProcess",
      "korailPath": "pay.stlKeyPrs.do",
      "kind": "pay",
      "auth": "member",
      "mToken": false,
      "charge": true,
      "note": "정산키 등록."
    },
    {
      "id": "pay.settlementKeyQuery",
      "korailPath": "pay.stlKeyQry.do",
      "kind": "pay",
      "auth": "member",
      "mToken": false,
      "charge": true,
      "note": "등록 정산키 목록 조회(pay.* 경로라 kind=pay)."
    },
    {
      "id": "seats.residual",
      "korailPath": "research.TResidualSeatsResearch.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "좌석맵(잔여석)."
    },
    {
      "id": "ticket.dupCheck",
      "korailPath": "ticket.ticketDupCheck.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "receipt.info",
      "korailPath": "receipt.ReceiptInfo",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "reservation.ticketReserve",
      "korailPath": "certification.TicketReservation",
      "kind": "write",
      "auth": "member",
      "mToken": true,
      "charge": false,
      "note": "🔒 m-token — 발권요청(자동/입석), PNR 생성."
    },
    {
      "id": "myTicket.widget",
      "korailPath": "myTicket.MyTicketWidget.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "encMbCrdNo(암호 회원카드)."
    },
    {
      "id": "pay.tossBillingKey",
      "korailPath": "pay.tossautoC.do",
      "kind": "pay",
      "auth": "member",
      "mToken": false,
      "charge": true,
      "note": "토스 빌링키."
    },
    {
      "id": "trainsInfo.tourTrainSpecialRoom",
      "korailPath": "trainsInfo.TourTrainSpecialRoom",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "pass.travelGoodsMenu",
      "korailPath": "pass.trGdMenuLt.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "research.trainResearch",
      "korailPath": "research.TrainResearch",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "tripChange.handleCancel",
      "korailPath": "ticket.tripChgHndgCnc.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "변경 수기취소(+lumpStlTgtMap 동적)."
    },
    {
      "id": "tripChange.process",
      "korailPath": "reservation.tripChgPrsC.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "여정변경 확정 → 신규 PNR(ReservationOut)."
    },
    {
      "id": "login.userCheck",
      "korailPath": "login.userCheck",
      "kind": "read",
      "auth": "none",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "addSrv.wheelchairHistory",
      "korailPath": "addSrv.helpSrvCust.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "helpSrvCust.do 다기능 경로(조회 변형)."
    },
    {
      "id": "addSrv.wheelchairResult",
      "korailPath": "addSrv.helpSrvTk.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "xPoint.view",
      "korailPath": "xPoint.XPointView",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": null
    },
    {
      "id": "product.cancel",
      "korailPath": "product.ReservationCancel",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "GET 메서드이지만 취소 실행."
    },
    {
      "id": "push.crewCall",
      "korailPath": "push.callCrew.do",
      "kind": "write",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "승무원 호출(사이드이펙트 액션)."
    },
    {
      "id": "self.seatChangeInfo",
      "korailPath": "self.seatChgInfo.do",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "좌석변경 가능조회."
    },
    {
      "id": "refund.verifyOnline",
      "korailPath": "refunds.verifyOnlineRefunds",
      "kind": "read",
      "auth": "member",
      "mToken": false,
      "charge": false,
      "note": "refunds.* 이지만 조회(검증) — CommonOut 미상속."
    }
  ]
}