Skip to content

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.

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

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)

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.

The school ends the session when it receives a malformed request. The library therefore sends requests only in the same order as the browser.

  1. Portal login (with the SIS return address), SSO, and the SIS user info lookup
  2. Menu list request: puts the menu permission into the server session
  3. Open-the-screen request
  4. 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.

// 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());
}