API расписания
Обновлено 27.10.2026
Расписание — главное, что отдаёт API ВИШ: занятия групп и преподавателей РУТ (МИИТ) с аудиториями, типами занятий, отменами и правками. Читать его может кто угодно, без ключа. Сверено со стендом d1 23 октября 2026 года; методы этой страницы есть и на production.
Методы
Занятия: GET /schedule
Главный метод. Без фильтров отдаёт все занятия постранично; обычно его спрашивают про одну группу или одного преподавателя за период.
| Параметр | Что значит |
|---|---|
group | Код группы ровно как в /groups, например ШАД-111. Тогда в ответе есть и поле group |
groupId | То же по идентификатору группы |
teacher, teacherId | Полное имя преподавателя (по-русски) или его идентификатор |
scope | С группой и преподавателем вместе: group (по умолчанию) — только занятия этого преподавателя у этой группы, all — всё расписание преподавателя |
date | Один день, ГГГГ-ММ-ДД; заменяет dateFrom и dateTo |
dateFrom, dateTo | Период; по умолчанию — с начала семестра до конца расписания |
lessonType | lecture, practice, lab, seminar, consultation, exam, credit, other |
room | Аудитория, например 8412 |
status | scheduled или cancelled |
page, perPage, all | Постраничный вывод (по умолчанию 20 на страницу, не больше 200; all=1 — до 2000 сразу) |
Что есть у занятия: id, date, startAt, endAt, number (номер пары, null вне сетки звонков), subject (название на трёх языках), lessonType (объект: code из списка выше и label на трёх языках), room и roomLabel (название, если аудитория названа словами), subgroup, status, weekParity (1 или 2), teachers, groups, extraGroups (группы на том же занятии, которых нет в ВИШ), notesCount, reactions, isSubscribed и subscribersCount (подписки на занятие), isOverridden (занятие правили в институте), updatedAt.
Что ещё есть
GET /app-config— семестр (semester.startDate,endDate,scheduleEndsAt), текущая неделя и её чётность (currentWeek.number,currentWeek.parity), сетка звонков (schedule.lessonSlots).GET /schedule/changes— что недавно изменилось в расписании группы или преподавателя (groupIdилиteacherId);period=weeks— изменения занятий этой и следующей недели. Удобно для опроса — см. Уведомления и календари.GET /session— экзамены, зачёты и консультации группы или преподавателя;hasUpcoming— есть ли экзамен или зачёт в ближайшие 30 дней.GET /schedule/filters,GET /schedule/lesson-types,GET /schedule/subjects,GET /schedule/courses— значения для фильтров: типы занятий, предметы, курсы.GET /schedule/export.pdf— расписание для печати (те же фильтры), не больше 10 запросов в минуту.GET /calendar/schedule.icsиGET /session.ics— то же в формате календаря.
Изменять расписание (POST, PATCH, DELETE на /schedule…) могут только сотрудники с правами schedule:lesson:*, и только в своих группах и институтах.
Пример: неделя группы
Пример берёт занятия группы на текущую неделю и сверяет время каждой пары с сеткой звонков из /app-config. Группа задаётся переменной VISH_GROUP (по умолчанию ШАД-111).
// This week's lessons of one group, checked against the bell schedule.
const API = process.env.VISH_API ?? 'https://d1.vish-app.ru/api/v1'
const GROUP = process.env.VISH_GROUP ?? 'ШАД-111'
const get = async (path, params = {}) => {
const url = new URL(`${API}${path}`)
for (const [name, value] of Object.entries(params)) url.searchParams.set(name, String(value))
const response = await fetch(url)
if (!response.ok) throw new Error(`${url}: HTTP ${response.status}`)
return response.json()
}
// Monday to Sunday of the current week, on the Moscow calendar.
const moscowToday = new Date(Date.now() + 3 * 60 * 60 * 1000)
const monday = new Date(moscowToday)
monday.setUTCDate(moscowToday.getUTCDate() - ((moscowToday.getUTCDay() + 6) % 7))
const sunday = new Date(monday)
sunday.setUTCDate(monday.getUTCDate() + 6)
const day = (date) => date.toISOString().slice(0, 10)
const config = await get('/app-config')
const slots = new Map(config.schedule.lessonSlots.map((slot) => [slot.number, slot]))
const week = await get('/schedule', { group: GROUP, dateFrom: day(monday), dateTo: day(sunday), all: 1 })
if (week.group?.name !== GROUP) throw new Error(`group ${GROUP} not found`)
console.log(`${GROUP}, week ${config.currentWeek.number} (parity ${config.currentWeek.parity}): ${week.list.length} lessons`)
for (const lesson of week.list) {
// Wall-clock Moscow time in a UTC field: read the digits as they are.
const start = lesson.startAt.slice(11, 16)
const slot = slots.get(lesson.number)
if (slot && slot.startTime !== start) throw new Error(`lesson ${lesson.id} starts ${start}, pair ${lesson.number} at ${slot.startTime}`)
const cancelled = lesson.status === 'cancelled' ? ' (cancelled)' : ''
console.log(`${lesson.date.slice(0, 10)} ${start} ${lesson.subject.ru} — ${lesson.room ?? 'no room'}${cancelled}`)
}Попробовать
Попробовать запрос
Ключ нужен только методам с замком. Он живёт только на этой странице: не сохраняется, уходит лишь заголовком этого запроса и забывается, когда вы её покинете. Где взять ключ
Если что-то не так
- Пустой
list— в этот период у группы нет занятий (каникулы, сессия). - 404
NOT_FOUND— группы с таким кодом нет. Код должен совпадать сnameиз/groupsпосимвольно (кириллица, дефис); найти его можно через/groups?search=…. - 400
VALIDATION_ERROR— неверный формат параметра; вerror.details.issuesсказано, какого. - 400 при
all=1— под фильтр попало больше 2000 занятий: сузьте период или идите по страницам.
Проверено: 2026-10, PWA aa337c45, platform bff65fce.