Приложение ВИШ — расписание РУТ (МИИТ)

Расписание Российского университета транспорта для студентов и сотрудников всех институтов. Расписание своей группы и любого преподавателя на день и на неделю, свободные аудитории МИИТ прямо сейчас, загруженность аудиторий, групп и преподавателей, уведомления об изменениях в расписании и ИИ-помощник по расписанию.

Институты

Приложение РУТ (МИИТ) охватывает пять институтов: ВИШ — Высшая инженерная школа, АГА — Академия гражданской авиации, АДХ — Академия дорожного хозяйства, ПИШ — Передовая инженерная школа «Академия ВСМ» и ИМТК — Институт международных транспортных коммуникаций. Расписание группы и расписание преподавателя ищутся одинаково в любом из них.

Что умеет приложение ВИШ
Разделы
Руководство

API расписания

Обновлено 27.10.2026

Расписание — главное, что отдаёт API ВИШ: занятия групп и преподавателей РУТ (МИИТ) с аудиториями, типами занятий, отменами и правками. Читать его может кто угодно, без ключа. Сверено со стендом d1 23 октября 2026 года; методы этой страницы есть и на production.

Методы

Не удалось загрузить список методов APIОткрыть справочник API (откроется в новой вкладке)

Занятия: GET /schedule

Главный метод. Без фильтров отдаёт все занятия постранично; обычно его спрашивают про одну группу или одного преподавателя за период.

ПараметрЧто значит
groupКод группы ровно как в /groups, например ШАД-111. Тогда в ответе есть и поле group
groupIdТо же по идентификатору группы
teacher, teacherIdПолное имя преподавателя (по-русски) или его идентификатор
scopeС группой и преподавателем вместе: group (по умолчанию) — только занятия этого преподавателя у этой группы, all — всё расписание преподавателя
dateОдин день, ГГГГ-ММ-ДД; заменяет dateFrom и dateTo
dateFrom, dateToПериод; по умолчанию — с начала семестра до конца расписания
lessonTypelecture, practice, lab, seminar, consultation, exam, credit, other
roomАудитория, например 8412
statusscheduled или 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.