Academic business periods
Fetches which business is allowed in which period (course registration, grade lookup and so on) the way the “학사일정조회” screen of the student’s own student information system (SIS) does. Login is required.
This is a different data set from the public academic calendar (Academic calendar). The public calendar lists school events; this one is the per-business allowed periods that the signed-in student’s own SIS provides.
Request parameters
Section titled “Request parameters”| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
student_id |
string | yes | Student ID. If blank, INVALID_INPUT |
|
password |
string | yes | Portal password. If blank, INVALID_INPUT |
|
year |
4-digit number or string | yes | Year to look up. A malformed value is INVALID_INPUT without any request |
|
month |
1-12 or empty | no | empty (whole year) | Month to look up. A malformed value is INVALID_INPUT without any request |
Method and year/month form per language:
| Language | Method | Year / month |
|---|---|---|
| Java | fetchSisBusinessPeriods(id, pw, year, month) |
strings ("" month means the whole year) |
| Python | fetch_sis_business_periods(id, pw, year, month="") |
number or string |
| Node.js | fetchSisBusinessPeriods(id, pw, { year, month }) |
number or string, month optional |
Response data structure
Section titled “Response data structure”One item is one row of the list. The example uses Python snake_case names; Java and Node.js use camelCase.
[ { "business_name": "business name", "schedule_name": "schedule name", "period": "yyyy-MM-dd ∼ yyyy-MM-dd", "start_date": "yyyyMMdd", "end_date": "yyyyMMdd", "extra": {} }]Values are the school’s text, and a missing value is an empty string. One odd row never fails the whole list, and an empty list is a valid answer.
| Field (Python) | School key | Note |
|---|---|---|
period |
PERIOD |
Text in the form yyyy-MM-dd ∼ yyyy-MM-dd |
startDate (start_date), endDate (end_date) |
START_DT, TO_DT |
yyyyMMdd as is. An open-ended period ends 29991231 |
scheduleName |
SCHEDULE |
Schedule name |
courseGroupName |
CORS_SCHE_GRP_CD_NM |
|
target |
TARGET_AUTH |
Target |
businessName |
SYS_NM |
Business name |
yearSemester |
YEAR_SMT |
|
timeText |
TMS |
|
categoryCode |
ORGN_CLSF_CD |
|
sortOrder |
PRT_ORD |
String |
extra |
other scalar keys | Same exclusion pattern as the SIS extra (Raw response and extra options) |
When it fails
Section titled “When it fails”If any step fails, it throws without retry.
| Situation | Code |
|---|---|
| Malformed year or month, blank input | INVALID_INPUT |
| Non-200 or empty answer, empty organization, user classification or menu code | DATA_FETCH_FAILED |
| 401 | AUTHENTICATION_FAILED |
| The school answers a logout error | SESSION_ERROR |
| Any other school error | DATA_FETCH_FAILED |
| Missing period info or a list that is not the expected structure | PARSE_ERROR |
All codes are in Error codes.
What happens inside
Section titled “What happens inside”The school ends the session when it receives a malformed request. The library therefore sends requests only in the same order as the browser.
- Portal login (with the SIS return address), SSO, and the SIS user info lookup
- Menu list request: puts the menu permission into the server session
- Open-the-screen request
- Period list request: carries the student’s own organization and user classification codes plus the year and month
Everything runs in one session with one login. If any step fails, it stops without retry. The exact order and values are in step 2d of spec/PORTAL_FLOW.md.
If the school changes the screen, values or structure can change.
Example code
Section titled “Example code”// one month (an empty month "" returns the whole year)List<SisBusinessPeriod> periods = sejongAuthEngine.fetchSisBusinessPeriods(studentId, password, "2026", "10");for (SisBusinessPeriod period : periods) { System.out.println(period.businessName() + " " + period.scheduleName() + " " + period.period());}from sejongpeia import fetch_sis_business_periods
# one month (an empty month returns the whole year)periods = fetch_sis_business_periods(student_id, password, 2026, 10)for period in periods: print(period.business_name, period.schedule_name, period.period)import { fetchSisBusinessPeriods } from 'pro-sejongpeia';
// one month (omit month to get the whole year)const periods = await fetchSisBusinessPeriods(studentId, password, { year: 2026, month: 10 });for (const period of periods) console.log(period.businessName, period.scheduleName, period.period);