New: see the walk between your classes on the timetable

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/SC1004

You 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.json

Class 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#

Found something wrong?

NTUMods is built and maintained by one person, so a short note goes a long way. Pick what fits, add the details, and I will look at it.

I'll use this to follow up with you.

Attaches your saved timetables and settings to help debug the issue. On by default, turn off to exclude it.

Developer? Open an issue or PR.