Academic calendar (undergraduate and graduate)
Give a date range and get the academic calendar with titles, start dates and end dates. No login is needed. Undergraduate and graduate schedules come from different school sources, so there are two methods. calendar reads the homepage calendar (undergraduate 0001, graduate 0002 to 0007); graduate_calendar reads the per-site graduate school calendars. Both return the same result model (CalendarEvent), but the date formats differ. For a widget that shows the next 30 days, see Academic calendar widget. Common rules are on Common rules.
Request parameters
Section titled “Request parameters”| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
start (calendar) |
string yyyy-MM-dd |
required | none | Start of the range |
end (calendar) |
string yyyy-MM-dd |
required | none | End of the range. Several months can be read in one call |
category_code (calendar) |
string | optional | 0001 |
Selects the category: 0001 undergraduate, 0002 to 0007 graduate. Check the category name in the result’s category_name |
site_id (graduate_calendar) |
string | required | none | The graduate school’s site name (for example graduate, gsi, mba). The caller passes it, so a newly created graduate school needs no release. It becomes a host name, so it must match [a-z0-9][a-z0-9-]{0,30}, otherwise INVALID_INPUT with no request |
year (graduate_calendar) |
integer | required | none | Year (Node.js accepts a number or a string) |
month (graduate_calendar) |
integer | required | none | Month (Node.js accepts a number or a string) |
- Naming: Python uses
snake_case, Node.js and Java usecamelCase(categoryCode,siteId). Node.js takes one object:calendar({ start, end, categoryCode? }),graduateCalendar({ siteId, year, month }). Java iscalendar(startDate, endDate),calendar(startDate, endDate, categoryCode)andgraduateCalendar(siteId, year, month); the two-argument version uses0001. calendarschool request:GET https://www.sejong.ac.kr/kor/academics/academic-calendar.do?mode=getCalendarData&start=<yyyy-MM-dd>&end=<yyyy-MM-dd>&collDiv=<code>, answer arraydata.graduate_calendarschool request:GET https://<site_id>.sejong.ac.kr/_custom/sejong/_app/calendar-graduate/proc/getCalendarData.jsp?year=<yyyy>&month=<m>&siteId=<site_id>.itemsin the answer is a JSON string, so the library parses it once more (an array is accepted too). Ifsuccessis not true oritemsis missing, it counts as a school-side failure. A month with no events is a normal answer.
Response data structure
Section titled “Response data structure”Example of calendar (field names in Python style; Node.js and Java use camelCase). School data changes, so the values are examples.
[ { "year": "2026", "month": "3", "category_code": "0001", "category_name": "Undergraduate", "title": "Start of classes", "title_en": "Start of classes", "start_date": "2026-03-02", "end_date": "2026-03-02", "extra": {} }]Example of graduate_calendar. Dates are MM.dd, and extra carries the day of the week.
[ { "year": "2026", "month": "3", "category_code": "0002", "category_name": "Graduate school", "title": "Thesis submission", "title_en": "Thesis submission", "start_date": "03.04", "end_date": "03.10", "extra": { "frDtKo": "Wed", "toDtKo": "Tue" } }]All fields are strings, and a missing value is an empty string.
| Field | School key | Meaning |
|---|---|---|
year, month |
scmYear, scmMonth |
Year and month the event belongs to |
category_code, category_name |
collDiv, collDivNm |
Category code and name (for example 0001) |
title |
scmSubject |
Title (school’s own text) |
title_en |
scmSubjectEng |
English title |
start_date, end_date |
frDt, toDt |
Start and end date |
extra |
other fields | For example frDtKo, toDtKo of graduate_calendar (day of the week of each date) |
Date format difference
Section titled “Date format difference”| Method | start_date / end_date format |
Note |
|---|---|---|
calendar |
yyyy-MM-dd |
String order equals date order |
graduate_calendar |
MM.dd |
The year comes from the row’s year; a range crossing year end is not expanded |
Convert them yourself when merging both into one list. The library does not convert.
Failure behaviour
Section titled “Failure behaviour”- Cached for one day (86400 seconds by default) per method, category or site, and range. One call sends one request.
- A school failure (connection, timeout, bad answer, missing expected key) returns the last cached value or an empty list. With no cache, it returns an empty list without a request for 60 seconds (default).
- The only exception is a malformed site name in
graduate_calendar(INVALID_INPUT).calendarnever raises. - An empty list cannot tell “no events in that range” from “a problem on the school side”.
Known limits
Section titled “Known limits”- Titles are the school’s own text. If the school changes wording they change, so do not branch on titles.
graduate_calendarreturns onlyMM.dd, so the end year of an event crossing year end is unknown.- Which graduate school each
calendarcode0002to0007stands for, check in the result’scategory_name. - The sites share a similar screen, but answers can differ per site, so try your own
site_id. - Business periods that need login are not part of these methods (Business periods).
- Contract source: spec/PUBLIC_DATA.md
Example code
Section titled “Example code”// Undergraduate calendar (yyyy-MM-dd)List<CalendarEvent> events = publicData.calendar("2026-10-30", "2026-11-30");
// Graduate site calendar (site name, year, month)List<CalendarEvent> graduateEvents = publicData.graduateCalendar("graduate", 2026, 10);events = public_data.calendar("2026-10-30", "2026-11-30") # undergraduate (category_code defaults to 0001)
# Graduate site calendar (site name, year, month)graduate_events = public_data.graduate_calendar("graduate", 2026, 10)const events = await publicData.calendar({ start: '2026-10-30', end: '2026-11-30' }); // undergraduate
// Graduate site calendar (site name, year, month)const graduateEvents = await publicData.graduateCalendar({ siteId: 'graduate', year: 2026, month: 10 });