Skip to main content

Get Timetable

Retrieve one timetable in full: its bell schedule, entities, and every lesson unit.

Endpoint

GET /api/v1/timetables/{id}

Also available at GET /api/partner/v1/timetables/{id} for ERP partners. Both paths return the same payload.

Authentication

Authorization: Bearer ttm_YOUR_API_KEY

Path parameters

ParameterTypeDescription
idstringTimetable id, from List Timetables

How the response fits together

  • Bell schedule defines days and periods. A placement is a (dayId, periodIndex) pair.
  • Entities (teachers, subjects, rooms, classes) each carry a localId (an identifier scoped to this timetable) plus externalId, your own identifier, when one has been synced.
  • Lesson units are one per scheduled period and reference entities by localId.

To render a grid, walk lessonUnits, place each at its (dayId, periodIndex), and resolve its teacherIds / classIds / subjectIds / roomIds against the entity lists.

Response

{
"success": true,
"data": {
"id": "6a34108b1d16898202940188",
"name": "Term 1 2026",
"status": "published",
"schedulingMode": "standard",
"versionNumber": 3,
"effectiveFrom": 20260901,
"effectiveTo": null,

"bellSchedule": {
"scheduleType": "weekly",
"cycleLength": 1,
"name": "Standard",
"days": [
{ "id": "day_w_0_d_0", "label": "Monday", "shortLabel": "Mon", "dayOfWeek": 1, "weekInCycle": 0 }
],
"dayConfigurations": [
{
"id": "dc1",
"dayIds": ["day_w_0_d_0"],
"periods": [
{ "id": "p1", "name": "P1", "startTime": "09:00", "endTime": "09:45" },
{ "id": "p2", "name": "P2", "startTime": "09:45", "endTime": "10:30" }
],
"breaks": [
{ "id": "b1", "name": "Break", "startTime": "10:30", "endTime": "10:45", "followsPeriodIndex": 1 }
]
}
]
},

"teachers": [
{ "localId": "tch_68d0…", "externalId": "EMP-1001", "name": "Edna Krabappel",
"shortName": "EK", "color": "#3B82F6", "isActive": true }
],
"subjects": [ ],
"rooms": [ ],
"classes": [ ],

"lessons": [
{ "localId": "lsn_cecf…", "groups": [ ] }
],

"lessonUnits": [
{
"localId": "lu_0001…",
"lessonLocalId": "lsn_cecf…",
"sectionLocalId": null,
"dayId": "day_w_0_d_0",
"periodIndex": 0,
"spanId": null,
"parallelGroupId": null,
"groupName": null,
"parallelGroupName": null,
"distributionGroupId": null,
"roomGroupName": null,
"locked": false,
"lockReason": null,
"teacherIds": ["tch_68d0…"],
"classIds": ["cls_6911…"],
"subjectIds": ["sub_6923…"],
"roomIds": [],
"studentIds": []
}
]
},
"timestamp": "2026-09-14T10:00:00.000Z"
}

Entity fields

FieldNotes
localIdIdentity within this timetable. Lesson units reference this
externalIdYour identifier, when the entity was synced. null otherwise
isActivefalse for an entity removed from the organisation but still used by this timetable

Lesson unit fields

FieldNotes
dayId, periodIndexPlacement. Both null when the unit could not be scheduled
spanIdMulti-period lessons are several units sharing this id. Duration = how many share it
parallelGroupIdUnits in the same slot (options blocks, split groups)
groupNameName of one group within a parallel block
roomGroupNameWhen set and roomIds is empty, any room in that group works
lockedThe unit was placed by hand and is pinned
*IdsReferences to entities by localId

There is no length field: a double period is two units sharing a spanId.

Student-level timetables

When schedulingMode is student-level, the response also includes students and sections.

Example

curl -H "Authorization: Bearer ttm_YOUR_API_KEY" \
https://api.timetablemaster.com/api/v1/timetables/6a34108b1d16898202940188

Errors

StatusCodeMeaning
401INVALID_API_KEYMissing, invalid, expired or revoked key
404TIMETABLE_NOT_FOUNDNo such timetable, or it belongs to another organisation
500INTERNAL_ERRORUnexpected server error

See also