
Express Bus Booking
Wire Korean KOBUS intercity bus search, timetable, and seat selection into an agent or script using documented POST endpoints instead of brittle browser automation.
Overview
express-bus-booking is an agent skill for the Build phase that documents KOBUS.co.kr HTTP/API endpoints for route lookup, timetable search, and seat selection without browser automation.
Install
npx skills add https://github.com/nomadamas/k-skill --skill express-bus-bookingWhat is this skill?
- Documents kobus.co.kr base URL, desktop User-Agent, cookie jar, and referer patterns for reliable HTTP/1.1 calls
- POST /mrs/readRotLinInf.ajax for route/terminal candidates with rotInfList-scale result sets (~1,208 routes observed)
- POST /mrs/alcnSrch.do timetable flow with deprCd/arvlCd/deprDtm fields and parsing fnSatsChc(...) onclick arguments
- POST /mrs/satschc.do seat/fare stage merging alcnSrchFrm hidden fields with selected allocation values
- Explicit goal: avoid browser automation where the public AJAX/DO endpoints suffice
- Observed ~1,208 route records in rotInfList from readRotLinInf.ajax
- Example timetable probe returned 42 schedule links and 25 selectable seat snippets
Adoption & trust: 646 installs on skills.sh; 5.4k GitHub stars; 2/3 security scanners passed (skills.sh audits).
What problem does it solve?
You need reliable Korean intercity bus availability and seat flow in code but only have fragile scraping or manual browser steps.
Who is it for?
Solo builders shipping a Korea-focused travel bot, MCP tool, or backend job that must query KOBUS schedules and seats over HTTP.
Skip if: Teams needing official merchant APIs, guaranteed SLAs, or workflows outside the documented kobus.co.kr web flow.
When should I use this skill?
Implementing or researching KOBUS bus lookup, timetable, or seat selection via HTTP instead of browser automation.
What do I get? / Deliverables
You get a repeatable POST sequence (readRotLinInf → alcnSrch → satschc) with parsable parameters and hidden form fields your agent can implement or extend.
- Working HTTP client or agent steps for route → schedule → seat POST chain
- Parsed allocation parameters from fnSatsChc for satschc.do
Recommended Skills
Journey fit
Canonical shelf is Build because the skill is session-proven HTTP/API contract notes for implementing a third-party booking integration. Integrations subphase fits external service probing, cookie jars, referers, and multi-step form POST chains (route list → schedule → fnSatsChc → satschc.do).
How it compares
Use as procedural API-map notes for one operator—not a generic multi-carrier bus MCP or official partner SDK.
Common Questions / FAQ
Who is express-bus-booking for?
Indie developers and agent authors automating Korean KOBUS search and seat selection who want HTTP-first integration notes instead of full browser drivers.
When should I use express-bus-booking?
During Build/integrations when implementing route lists, date-based timetable queries, or seat-choice handoffs; also during Idea/research when validating whether KOBUS can be automated without a browser.
Is express-bus-booking safe to install?
Review the Security Audits panel on this Prism page for install risk and repo signals; treat live booking automation as high-compliance—verify terms of use and never commit user payment credentials in skills.
SKILL.md
READMESKILL.md - Express Bus Booking
# KOBUS HTTP/API Probe Notes Session-proven on 2026-05-08. Goal: avoid browser automation where possible. ## Base ```text https://www.kobus.co.kr ``` Use a desktop User-Agent, HTTP/1.1 if needed, a cookie jar, and referers. ## Tested Flow ### Route / Terminal Candidates ```text POST /mrs/readRotLinInf.ajax ``` Observed JSON keys: ```text tfrLen tfrInfList len codeYn rotInfList ``` One probe returned about 1,208 route records in `rotInfList`. ### Timetable ```text POST /mrs/alcnSrch.do ``` Example tested route/date: ```text 서울경부(010) -> 부산(700), 2026-05-09 ``` Observed result: ```text 42 schedule links/cards 25 selectable seat snippets first selectable: 00:30 / 천일고속 / 심야우등 / 10 seats ``` Typical POST fields: ```text deprCd=010 arvlCd=700 pathDvs=sngl pathStep=1 deprDtm=YYYYMMDD busClsCd=0 rtrpChc=1 timeLinkMin=00 timeLinkMax=23 ``` Parse `fnSatsChc(...)` onclick values for the next step. Example: ```text fnSatsChc('20260509','003000','003000','010','700','3','07','0','Y','N','010','700','N','N','N','N') ``` ### Seat / Fare Stage ```text POST /mrs/satschc.do ``` Send the original `alcnSrchFrm` hidden fields plus selected values from `fnSatsChc(...)`, including values such as: ```text deprTime=003000 alcnDeprTime=003000 alcnDeprTrmlNo=010 alcnArvlTrmlNo=700 indVBusClsCd=3 cacmCd=07 dcDvsCd=0 prvtBbizEmpAcmtRt=N chldSftySatsYn=N dsprSatsYn=N ``` Observed response contained `form#satsChcFrm` and hidden values: ```json { "deprTime": "003000", "alcnDeprTrmlNo": "010", "alcnArvlTrmlNo": "700", "adltFee": "47600", "rmnSatsNum": "10", "totSatsNum": "28" } ``` ### Temporary Hold ```text POST /mrs/setPcpy.ajax ``` Observed successful response markers: ```text MSG_CD=S0000 pcpyNoAll satsNoAll ESTM_AMT DC_AMT TISSU_AMT ``` ### Hold Cancellation ```text POST /mrs/cancPcpy.ajax ``` Observed success marker: ```text MSG_CD=S0000 ``` 2026-05-13 서울→광주 re-verification: `센트럴시티(서울)(021) -> 광주(유·스퀘어)(500)`, 2026-05-20 00:45 중앙고속 심야우등, seat 1. `/mrs/setPcpy.ajax` returned `MSG_CD=S0000`, `pcpyNoAll`, `satsNoAll=01`, `TISSU_AMT=36900`; `/mrs/stplcfmpym.do?keep=/mrs/pay` rendered the official payment-information page; `/mrs/cancPcpy.ajax` returned `MSG_CD=S0000`. ### Checkout Entry ```text POST /mrs/stplcfmpym.do ``` The POST body must include the selected schedule/seat form values plus temporary hold identifiers and fare amounts. A helper page can auto-submit this form to the official KOBUS endpoint. For mobile browsers, use: ```text POST /mrs/stplcfmpym.do?keep=/mrs/pay ``` This preserves the POST body while placing `/mrs/pay` in `location.href`, which avoids a KOBUS client-side mobile redirect condition observed in the common JavaScript. ## Interpretation - Login was not required for route lookup, timetable lookup, seat-selection-page entry, temporary hold, or checkout-entry page display in the tested flow. - Page HTML can include login or `grecaptchaToken` forms, but these did not block the tested lookup/seat-stage path. - Final payment should remain a manual, explicitly confirmed stage. - KOBUS mobile behavior is less stable than desktop because common JavaScript can redirect narrow screens to the mobile main page. #!/usr/bin/env python3 """KOBUS timetable lookup and temporary hold helper. Default mode searches timetables. With --hold-first-seat or --hold-seat it creates a temporary seat hold through /mrs/setPcpy.ajax and saves a local auto-submit HTML helper for the official KOBUS payment-information page. It never submits card fields or final payment. """ from __future__ import annotations import argparse import html import http.cookiejar import json import re import ssl import sys import tempfile import urllib.parse import urllib.request from dataclasses import asdict, dataclass from pathlib import Path from typing import Iterable BASE_URL = "https://www.kobus.co.kr" UA = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 Chrome/125 Safari/537.36" FN_SATS_RE = re.compil