Build with the data
Data freshness
Where the data comes from, how current it is, and what it leaves out.
What is covered#
- 4,383 modules, every code offered since AY2014 Semester 1.
- Class indexes for every semester since then. The latest isAY2026 Semester 2 (
2026_2), with 1,089 modules and 4,307 indexes. - Exams for each semester once NTU publishes the timetable. The latest is
2026_1, with 387 exams.
Where it comes from#
Everything is taken from NTU's public course content, class schedule and exam timetable pages. NTUMods is not affiliated with NTU, and the data is not official. When it disagrees with STARS, STARS is right.
How often it changes#
The data is refreshed by hand, not on a timer. It usually changes a few times a semester: when NTU publishes the next semester's courses and class schedule, again when the exam timetable comes out, and when NTU corrects something. There is no fixed schedule and no daily update.
Two things follow. A new semester can have classes before it has exams, so an exam file can be empty. And NTU can change a class after it is published, which the data only picks up at the next refresh.
How it reaches you#
| Source | Where the data comes from | Caching |
|---|---|---|
Data files, /data/api/* | Rebuilt with the site when the data is refreshed. | Browsers and the edge keep a copy for a day, and may serve an older one for up to a week while it refreshes. |
Module API, /api/modules/{code} | Read from the database, which is updated with the files. | Browsers keep it for an hour. The edge keeps it for up to a week, and the copy is cleared after each refresh. |
| MCP server | Search, exams and the latest class indexes read the files. Module records and older class indexes read the database. | The two can disagree for a few minutes after a refresh. Every answer names its semester. |
Check how fresh your copy is#
- Every row in
modules.jsonhaslatestYear,latestSemesterandisCurrentSemester. A module record has the same facts underlatestOffering. - The semester is in every file name, so you know which one you hold. Store it next to your copy and show it to your users.
- Over MCP,
list_semesterssays which semester is current.
What is not in the data#
- Seat vacancies, bidding results and waitlists. Those live in STARS.
- Exam venues and seats.
- Grades, past papers and student reviews.
- Anything personal. The API and the MCP server never see your timetable.
Check STARS before you register, bid or drop anything. For caching, rate limits and error codes, see status and limits.