Get started
Quickstart
Make your first request in a minute. There is no key and no sign-up, and everything is a plain GET.
Get one module#
Ask for a module by its code. Use capital letters, with no query string.
curl https://ntumods.com/api/modules/SC1004You get one JSON object with the title, AU, description, prerequisites, the semesters it was offered and its exam. Or in JavaScript:
const res = await fetch("https://ntumods.com/api/modules/SC1004")const module = await res.json()console.log(module.title, module.au)Download all modules#
For many modules, download the whole list once and search it yourself. Do not call the module API in a loop.
curl -O https://ntumods.com/data/api/modules.json
# every module from one schooljq '.modules[] | select(.faculty == "CSC") | .code' modules.jsonClass indexes and exams#
Class indexes and exams are one file per semester, named year_semester. The latest semester with classes is 2026_2, and the latest with an exam timetable is 2026_1.
# every class index of SC1004 this semestercurl -s https://ntumods.com/data/api/indexes/2026_2.json | jq '.SC1004'
# its examcurl -s https://ntumods.com/data/api/exams/2026_1.json | jq '.SC1004'What each field means, such as day and duration, is in the data reference.
Ask an AI assistant instead#
If you would rather ask questions than write code, add the MCP server to Claude, ChatGPT, Cursor or another assistant. It reads the same data.
Before you ship#
- Read the terms of use. There is no opt out.
- Cache what you fetch, and back off when you get a
429. See status and limits. - The data is NTU public course data and can be out of date. See data freshness.