Reading schedules
Pull the generated timetable back into your product.
GET /api/partner/v1/timetables
GET /api/partner/v1/timetables/{id}
How a timetable is put together
Three pieces fit together:
- Bell schedule: the days and periods. A placement is a
(dayId, periodIndex)pair. - Entities: teachers, subjects, rooms, classes. Each has a
localId(this timetable) and yourexternalId. - Lesson units: one per scheduled period, referencing entities by
localId.
One request returns the whole timetable, so filtering is yours to do locally. To render "what is
Edna teaching on Monday period 3", find her localId in teachers by her externalId, then take
the units whose teacherIds contain it, with dayId Monday and periodIndex 2.
Full timetable
GET /api/partner/v1/timetables/{id}
{
"id": "6913…",
"name": "Term 1",
"status": "published",
"schedulingMode": "standard",
"bellSchedule": {
"scheduleType": "weekly",
"cycleLength": 1,
"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" } ],
"breaks": [ { "id": "b1", "name": "Break", "startTime": "10:30", "endTime": "10:45", "followsPeriodIndex": 1 } ] }
]
},
"teachers": [ { "localId": "tch_…", "externalId": "EMP-1001", "name": "Edna Krabappel", "shortName": "EK", "color": "#3B82F6", "isActive": true } ],
"subjects": [ ], "rooms": [ ], "classes": [ ],
"lessonUnits": [
{
"localId": "lu_…",
"lessonLocalId": "lsn_…",
"dayId": "day_w_0_d_0",
"periodIndex": 0,
"spanId": null,
"parallelGroupId": null,
"groupName": null,
"locked": false,
"teacherIds": ["tch_…"],
"classIds": ["cls_…"],
"subjectIds": ["sub_…"],
"roomIds": ["rom_…"],
"studentIds": []
}
]
}
status is draft or published. Only published timetables are safe to surface to staff and
students; a draft is still being worked on.
Reading lesson units
- Unscheduled units have
dayId: nullandperiodIndex: null. The system could not place them. Skip them when rendering a grid. - Multi-period lessons are several units sharing a
spanId. A double period is two units, so the duration is the number of units with thatspanId. (There is nolengthfield.) - Parallel lessons (options blocks, split groups) share a
parallelGroupIdand occupy the same slot.groupNamenames the individual group,parallelGroupNamethe whole block. - Room groups: when
roomGroupNameis set androomIdsis empty, any room in that group is acceptable.
Not yet available: date resolution
These endpoints return the timetable's repeating pattern, placements as (dayId, periodIndex),
not a resolved calendar. Mapping "14 September 2026" to a specific dayId is your side's job
today, and for a simple weekly schedule it is a straightforward weekday lookup.
For organisations on day-rotation schedules (A/B days, multi-week cycles), the mapping advances by teaching days and skips holidays, so it cannot be derived from the calendar alone. A date-resolved endpoint is planned. If you need it, tell us. It affects the priority.