Course listings
Search a term’s course listings by department code, course name and instructor name. No login is needed, and all three conditions are optional, so with all of them empty you get the whole term. Find department and term codes on Department and term codes. Common rules are on Common rules.
Request parameters
Section titled “Request parameters”Python uses snake_case; Node.js and Java use camelCase (for example department_code is departmentCode). In Java, pass an empty string ("") for the optional arguments you do not use.
| Parameter | Type | Required | Default | Meaning |
|---|---|---|---|---|
category_code |
string | required | - | Organization category code (undergraduate 20, general graduate school 30, …). Get the values from the code tables and pass them in |
year |
string | required | - | Year |
semester_code |
string | required | - | Term code (10, 11, 20, 21) |
department_code |
string | optional | "" |
Department code. Empty means no department limit |
course_name |
string | optional | "" |
Course name search text (partial match). Empty means no limit |
instructor_name |
string | optional | "" |
Instructor name search text. Empty means no limit |
- The three conditions are independent: combine only the ones you need. With all three empty you get the whole term.
- Returns a list of
Lecture.
School request
POST https://sjpt.sejong.ac.kr/sch/sch/ext/SueOpenTimeQ/doList.do, body{"dm_search": {...}}, response datasetdl_main.- The school answers
_SUBMIT_ERROR_if any filter key is missing, so the library sends every key you do not use as an empty value. - The school treats a single space as a search text, so values are trimmed before sending.
Response data structure
Section titled “Response data structure”Example JSON. Field names are Python snake_case; Node.js and Java use camelCase. School data changes, so the values are examples.
[ { "course_number": "011839", "section": "001", "name": "전공탐색", "course_type_code": "1E", "course_type_name": "공필", "credits": "1.0", "hours": "1.0 / 0 / 1", "total_hours": "1", "schedule": "목19:00-20:00", "room": "센B104", "instructor": "홍길동", "grade_level": "1", "department_code": "3517", "department_name": "AI로봇학과", "year": "2026", "semester_code": "20", "extra": { "PLAN_REG_YN": "Y", "YEAR_SMT_NM": "2026/2학기" } }]All fields are strings, empty when missing. extra is a string map of the school fields not listed in the table below.
| Field | School key | Meaning |
|---|---|---|
course_number |
CURI_NO |
Course number |
section |
CLASS |
Section |
name |
CURI_NM |
Course name |
course_type_code, course_type_name |
CURI_TYPE_CD, CURI_TYPE_CD_NM |
Course type code and name |
domain_code, domain_name |
SLT_DOMAIN_CD, SLT_DOMAIN_CD_NM |
Selective domain code and name |
credits |
CDT |
Credits (for example 3.0) |
hours |
TM_NUM |
Hours, as the school writes them (for example 3.0 / 3 / 0) |
total_hours |
TOT_TM_NUM |
Total hours |
schedule |
LESN_TIME |
Class time (for example 화13:00-15:00) |
room |
LESN_ROOM |
Classroom |
instructor |
LESN_EMP |
Instructor name |
grade_level |
STUDENT_YEAR |
Year level |
language_code, language_name |
CURI_LANG_CD, CURI_LANG_NM |
Teaching language |
department_code, department_name |
DEPT_CD, SCH_DEPT_ALIAS |
Offering department code and name |
managing_department |
MANAGE_DEPT_NM |
Managing department |
remark |
REMARK |
Remark |
year, semester_code |
YEAR, SMT_CD |
Year and term code |
extra |
other fields | Original school fields |
- Cached for one day (86400 seconds by default) per combination of conditions, with one school request per call.
- School-side failures (connection, timeout, bad response,
_SUBMIT_ERROR_) return the last cached value or an empty list. With no cache, the same call returns an empty list without a request forfailure_cache_seconds(default 60). lecturesnever raises because of its filter values.- An empty list cannot tell “no course matches” from “a problem on the school side”.
Known limits
Section titled “Known limits”- Unofficial endpoint. Behavior such as the filter-key requirement changes if the school changes it.
- The language filter is fixed to
LANG_CHK="KOR". - An answer with all conditions empty is several MB, and one cache entry stays in memory for
cache_ttl_seconds. If you do not need everything, query one department at a time. - The instructor syllabus is not provided. Its form carries the instructor’s name and contact lines, so it is left out of the default scope. The course overview is available as
overviewin Curriculum. - Contract source: spec/PUBLIC_DATA.md
Example code
Section titled “Example code”// Lectures of one department (term code 20 = 2nd semester, course name and instructor left empty)List<Department> departments = publicData.departments("20", "2026", "20");List<Lecture> lectures = publicData.lectures("20", "2026", "20", departments.get(0).getCode(), "", "");
// Search by course name onlyList<Lecture> byName = publicData.lectures("20", "2026", "20", "", "알고리즘", "");departments = public_data.departments("20", "2026", "20")lectures = public_data.lectures("20", "2026", "20", department_code=departments[0].code)
# Search by course name onlyby_name = public_data.lectures("20", "2026", "20", course_name="알고리즘")const departments = await publicData.departments({ categoryCode: '20', year: '2026', semesterCode: '20' });const lectures = await publicData.lectures({ categoryCode: '20', year: '2026', semesterCode: '20', departmentCode: departments[0].code });
// Search by course name onlyconst byName = await publicData.lectures({ categoryCode: '20', year: '2026', semesterCode: '20', courseName: '알고리즘' });With a lecture’s course_number and department_code you can look up the suggested year, term and course overview from that department’s curriculum (Curriculum).
