API заметок
Обновлено 27.10.2026
В ВИШ два вида заметок: заметки к занятию, которые преподаватель или сотрудник оставляет для всей группы, и личные заметки, которые человек пишет только для себя. Через API они доступны по-разному. Сверено со стендом d1 23 октября 2026 года; методы этой страницы есть и на production.
Заметки к занятию
Материал для группы: домашнее задание, ссылка, файл. Читать их может любой, кто видит занятие, — без ключа.
| Метод | Что делает | Кто может |
|---|---|---|
GET /schedule/{id}/notes | Заметки одного занятия | Все |
POST /schedule/{id}/notes | Добавить заметку | Право schedule:note:create |
POST /schedule/{id}/notes/attachments | Загрузить файл для заметки (до 10 МБ, по одному) | Право schedule:note:create |
PATCH /schedule/notes/{noteId} | Изменить заметку | Право schedule:note:update |
DELETE /schedule/notes/{noteId} | Удалить заметку | Право schedule:note:delete |
У заметки: id, lessonId, content (Markdown как написан), contentL10n (переводы), attachments, author, createdAt, updatedAt. Сколько заметок у занятия, видно и в самом расписании — поле notesCount.
Писать заметки ключом можно: ключ преподавателя с отмеченными правами schedule:note:* действует как сам преподаватель. Файл сначала загружают отдельным запросом, а в заметку передают то, что вернула загрузка. Картинки сохраняются в WebP; PDF, офисные документы и текст — как файлы для скачивания; другое не принимается (415).
Такой запрос публикует настоящую заметку, которую увидит вся группа, — пробуйте на занятии своей группы на d1:
curl -X POST "$VISH_API/schedule/$LESSON_ID/notes" \
-H "X-Api-Key: $VISH_API_KEY" -H "Content-Type: application/json" \
-d '{"content": "Homework: exercises 1–5, page 42"}'Токен «Входа через ВИШ» с разрешением notes:read читает только GET /schedule/{id}/notes.
Личные заметки
Заметка, которую видит только её автор: GET, POST /personal-notes, GET, PATCH, DELETE /personal-notes/{noteId} и загрузка файлов POST /personal-notes/attachments.
Проверить это своим ключом — запрос ничего не меняет и должен получить отказ:
// Personal notes belong to the person in the app: a key is refused with 403 SESSION_REQUIRED.
const API = process.env.VISH_API ?? 'https://d1.vish-app.ru/api/v1'
const KEY = process.env.VISH_API_KEY
if (!KEY) throw new Error('set VISH_API_KEY')
const response = await fetch(`${API}/personal-notes`, { headers: { 'X-Api-Key': KEY } })
const body = await response.json()
if (response.status !== 403 || body.error?.code !== 'SESSION_REQUIRED') {
throw new Error(`expected 403 SESSION_REQUIRED, got ${response.status} ${JSON.stringify(body)}`)
}
console.log('refused as designed:', body.error.code)Пример: заметки к занятиям группы
Пример находит занятия группы с заметками (notesCount > 0) и читает заметки первого из них. Группа — в VISH_GROUP, по умолчанию ШАД-111.
// Find a group's lessons that carry notes and read the notes of one; no key needed.
const API = process.env.VISH_API ?? 'https://d1.vish-app.ru/api/v1'
const GROUP = process.env.VISH_GROUP ?? 'ШАД-111'
const get = async (path) => {
const response = await fetch(`${API}${path}`)
if (!response.ok) throw new Error(`${path}: HTTP ${response.status}`)
return response.json()
}
const lessons = (await get(`/schedule?group=${encodeURIComponent(GROUP)}&all=1`)).list
if (lessons.length === 0) throw new Error(`no lessons for ${GROUP}`)
const withNotes = lessons.filter((lesson) => lesson.notesCount > 0)
const lesson = withNotes[0] ?? lessons[0]
const notes = await get(`/schedule/${lesson.id}/notes`)
if (!Array.isArray(notes.list) || notes.list.some((note) => note.lessonId !== lesson.id)) {
throw new Error('unexpected notes answer')
}
console.log(`${GROUP}: ${lessons.length} lessons, ${withNotes.length} with notes`)
console.log(`${lesson.date.slice(0, 10)} ${lesson.subject.ru}: ${notes.list.length} notes`)
for (const note of notes.list) console.log('-', note.content.slice(0, 80), `(${note.attachments.length} files)`)Реакции
GET /schedule/{id}/reactions — реакции на занятие, открыто всем; GET /reactions/config — какие реакции разрешены. Поставить или снять свою реакцию (POST /schedule/{id}/reactions) можно только после входа — ключом тоже, особого права не нужно.
Попробовать
Подставьте id занятия из GET /schedule:
Попробовать запрос
Ключ нужен только методам с замком. Он живёт только на этой странице: не сохраняется, уходит лишь заголовком этого запроса и забывается, когда вы её покинете. Где взять ключ
Проверено: 2026-10, PWA aa337c45, platform bff65fce.