VISH app — RUT (MIIT) timetable

The timetable of the Russian University of Transport for students and staff of every institute. The timetable of your own group and of any teacher by day and week, free MIIT rooms right now, occupancy of rooms, groups and teachers, notifications about timetable changes and an AI timetable assistant.

Institutes

The RUT (MIIT) app covers five institutes: VISH — Higher Engineering School, AGA — Civil Aviation Academy, ADKH — Road Management Academy, PISH — Advanced Engineering School “HSR Academy” and IMTK — Institute of International Transport Communications. A group’s and a teacher’s timetable are searched the same way in any of them.

What the VISH app can do
Sections
Guide

Directory API: groups, teachers, rooms

Updated 27.10.2026

Reference books are institutes, groups, teachers, and RUT (MIIT) classrooms that make up the schedule. All of them are open for reading without a key. Checked with booth d1 on October 23, 2026; the methods of this page are also available on production.

Methods

The list of API methods could not be loadedOpen the API reference (opens in a new tab)

Institutes: GET /institutes

All university institutes are: id, code (for example, АГА), name, groupsCount, university. Institutes that have left the schedule are not shown; includeRetired=1 will add them with retired: true and successorCode — the code of the successor institute.

Groups: GET /groups

  • search is the case—insensitive part of the code (шад), course is the course, instituteIds is separated by commas, facultyCode.
  • The group has: id, name (code, GET /schedule?group=… works on it), displayName in three languages, course, institute, specialty.
  • GET /groups/{id} — one group; GET /groups/filters — values for filters.

Teachers: GET /teachers

  • search — by full or short name, department — department, instituteIds — who has classes at these institutes.
  • The teacher has: id, fullName and shortName in three languages, department, photoUrl, profileUrl (page on miit.ru , if any), source.
  • GET /teachers/{id} is the teacher's card; GET /teachers/filters is the department for the filter.

Audiences: GET /audiences

  • search, building, and floor can be separated by commas (?building=8,12), instituteIds, order (desc by default).
  • For the audience: name (as in the schedule, for example 8412), fullName (“Building 8, floor 4, auditorium 12”), building, floor, room, address, buildingInfo with the coordinates of the building.
  • GET /auditories/room?name=8412 — one auditorium by designation; GET /auditories/filters — buildings and floors.

Groups, teachers, and classrooms are assigned on a page-by-page basis: page, perPage (20 by default, no more than 200), or all=1 (up to 2000 entries). Institutions come all at once, without page-by-page output. Texts in three languages come as object { ru, en, zh }.

Example: go through the directories

// Institutes, a group of the first institute, one teacher by id and one room by its name.
const API = process.env.VISH_API ?? 'https://d1.vish-app.ru/api/v1'

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()
}

const institutes = await get('/institutes')
const institute = institutes.list.find((item) => item.groupsCount > 0)
if (!institute) throw new Error('no institute with groups')

const groups = await get('/groups', { instituteIds: institute.id, perPage: 3 })
if (!groups.list.every((group) => group.institute?.id === institute.id)) throw new Error('instituteIds filter ignored')

const [firstTeacher] = (await get('/teachers', { perPage: 1 })).list
const teacher = await get(`/teachers/${firstTeacher.id}`)
if (teacher.id !== firstTeacher.id) throw new Error('teacher lookup failed')

const [firstRoom] = (await get('/auditories', { perPage: 1 })).list
const room = await get('/auditories/room', { name: firstRoom.name })
if (room.name !== firstRoom.name) throw new Error('room lookup failed')

console.log(`${institute.code}: ${institute.name.ru}, ${institute.groupsCount} groups, e.g. ${groups.list.map((g) => g.name).join(', ')}`)
console.log(`teacher: ${teacher.fullName.ru} (${teacher.department?.ru ?? 'no department'})`)
console.log(`room ${room.name}: ${room.fullName.ru}`)

To try

Try the request

Only methods with a lock need a key. It lives on this page only: it is never stored, goes out only as a header of this request and is forgotten when you leave. Where to get a key

Useful to know

  • The booth IDs are different. id groups on d1 and on production do not match. The group codes (ШАД-111), teacher names, and classroom designations are the same; keep them if integration works with both booths.
  • Groups, teachers, and classrooms come from the university's schedule to miit.ru and they are updated with it.
  • Only employees with rights (reference:groups:manage, teachers:manage) can change the directories — the manually added teacher is marked source: "manual".

Verified: 2026-10, PWA aa337c45, platform bff65fce._