На главную

API расписания Raspika

Расписание больше 90 вузов и колледжей России для вашего бота, сайта или паблика. Бесплатно, по ключу. Данные те же, что видят студенты на raspika.com.
Содержание
  1. Быстрый старт
  2. Условия использования
  3. Как получить ключ
  4. Передача ключа и его защита
  5. Методы
  6. Готовый текст: пометка проставляется сама
  7. Формат данных
  8. Ошибки и ограничения
  9. Готовые рецепты
  10. Примеры кода
  11. Частые вопросы

1. Быстрый старт

Три шага до первого расписания:

  1. Получите ключ: напишите в поддержку на raspika.com.
  2. Узнайте идентификатор заведения и группы: методы /institutions и /groups.
  3. Запросите расписание: /schedule. Хотите готовый текст для поста, добавьте &format=text.
# 1. какие есть заведения
curl -H "X-Api-Key: ВАШ_КЛЮЧ" https://raspika.com/api/v1/institutions

# 2. найти свою группу (пример: ОмГТУ, группы на «ИСТ-25»)
curl -H "X-Api-Key: ВАШ_КЛЮЧ" \
  "https://raspika.com/api/v1/groups?inst=omgtu&q=ИСТ-25"

# 3. расписание группы готовым текстом
curl -H "X-Api-Key: ВАШ_КЛЮЧ" \
  "https://raspika.com/api/v1/schedule?inst=omgtu&group=421&format=text"

Базовый адрес: https://raspika.com/api/v1. Все методы это GET, ответы в JSON, кодировка UTF-8.

2. Условия использования

Рядом с расписанием должна быть пометка «Расписание взято с raspika.com».

Это единственное жёсткое требование. Оно нужно, чтобы человек понимал, откуда данные, и знал, куда идти за уведомлениями об отменах и переносах.

Где именно ставить пометку

Достаточно одной строки внизу. Ссылка на raspika.com приветствуется, но обязателен именно текст.

Проще всего не писать её самому

Добавьте format=text, и API вернёт готовый текст, в конце которого пометка уже стоит. Вам останется только опубликовать его. Подробно в разделе «Готовый текст».

Личная ссылка и как мы проверяем пометку

Вместе с ключом выдаётся личная ссылка вида raspika.com/r/ab12cd. Она приходит в каждом ответе в поле attribution_link, а в готовом тексте уже подставлена в пометку. Ведёт она на обычную главную страницу, но по переходам видно, что пометка действительно опубликована, а вы видите, сколько людей она приводит.

Кроме этого раз в сутки автоматика заходит на площадку, которую вы указали при получении ключа (паблик ВК, телеграм-канал или страницу сайта), и проверяет, есть ли там упоминание Raspika. Это не слежка, а способ держать договорённость в силе без переписки.

Если запросы идут, а пометки нигде нет, мы сначала пишем на ваш контакт. Молчание или отказ означает блокировку ключа.

Что можно

Что нельзя

Нарушение решается просто: ключ блокируется, данные перестают приходить. Перед блокировкой мы пишем на контакт, который вы оставили.

Данные собираются с официальных сайтов заведений. Мы их разбираем, храним и отдаём, но не являемся их правообладателем и не гарантируем, что вуз не поменяет расписание через пять минут после вашего запроса. Поле stale честно говорит, когда сайт заведения недоступен и отдана сохранённая копия.

3. Как получить ключ

Напишите в поддержку на raspika.com и укажите:

Ключ выдаётся вручную, обычно в тот же день. Выглядит так: rk_api_XXXXXXXXXXXXXXXXXXXXXX.

Ключ бесплатный и бессрочный. Отзывается только при нарушении условий.

4. Передача ключа и его защита

Два способа, оба рабочие:

# заголовком (рекомендуется)
curl -H "X-Api-Key: ВАШ_КЛЮЧ" https://raspika.com/api/v1/institutions

# параметром в адресе
curl "https://raspika.com/api/v1/institutions?key=ВАШ_КЛЮЧ"

Держите ключ на сервере. Не вставляйте его в код страницы, в мобильное приложение и вообще никуда, откуда его может прочитать пользователь: браузер показывает все запросы. Если данные нужны на странице, ходите за ними через свой бэкенд.

Мы со своей стороны маскируем ключи в журнале доступа, поэтому в наших логах вместо ключа остаётся key=***.

Если ключ утёк, напишите в поддержку: заблокируем старый и выдадим новый.

5. Методы

GET /api/v1/institutions

Справочник учебных заведений. Поле key каждого элемента это то, что подставляется в параметр inst остальных методов.

curl -H "X-Api-Key: ВАШ_КЛЮЧ" https://raspika.com/api/v1/institutions
{
  "data": [
    {"key": "omgtu", "name": "ОмГТУ", "short": "ОмГТУ",
     "src": "https://rasp.omgtu.ru/", "live": true},
    {"key": "omgmu", "name": "ОмГМУ", "short": "ОмГМУ", "live": true}
  ],
  "source": "raspika.com",
  "attribution": "Расписание взято с raspika.com",
  "attribution_required": true,
  "docs": "https://raspika.com/api.html"
}
GET /api/v1/groups

Группы заведения. Список большой (у ОмГТУ больше тысячи), поэтому есть фильтр.

ПараметрОбяз.Описание
instдаидентификатор заведения из /institutions
qнетфильтр по названию, подстрока без учёта регистра
curl -H "X-Api-Key: ВАШ_КЛЮЧ" \
  "https://raspika.com/api/v1/groups?inst=omgtu&q=ИСТ-25"
{
  "data": [
    {"id": "421", "name": "ИСТ-253", "course": null},
    {"id": "419", "name": "ИСТ-251", "course": null}
  ],
  "inst": "omgtu",
  "count": 2,
  "attribution": "Расписание взято с raspika.com"
}

id это то, что подставляется в параметр group. У разных заведений идентификаторы выглядят по-разному: где-то число, где-то само название группы, где-то адрес файла. Не пытайтесь их угадывать, берите из этого метода.

GET /api/v1/schedule

Расписание группы. По умолчанию отдаётся окно примерно в месяц: неделя назад и до четырёх недель вперёд, насколько хватает данных у источника.

ПараметрОбяз.Описание
instдаидентификатор заведения
groupдаid группы из /groups
date_fromнетс какой даты, формат ГГГГ-ММ-ДД
date_toнетпо какую дату включительно
subgroupнет1 или 2: оставить пары своей подгруппы и общие
formatнетtext: добавить готовый текст с пометкой
curl -H "X-Api-Key: ВАШ_КЛЮЧ" \
  "https://raspika.com/api/v1/schedule?inst=omgtu&group=421&date_from=2026-09-23&date_to=2026-09-23"
{
  "data": [
    {"date": "2026-09-23", "num": 2, "start": "09:40", "end": "11:10",
     "subject": "Физическая культура", "type": "Практика",
     "teacher": "Колтошова Т.В.", "room": "ФК-Спортзал",
     "subgroup": 0, "parity": null, "changed": false}
  ],
  "inst": "omgtu", "group": "421", "count": 1,
  "stale": false, "updated_at": "2026-09-22T13:40:11",
  "attribution": "Расписание взято с raspika.com"
}
GET /api/v1/changes

Журнал изменений: что отменили, перенесли или добавили. Мы сверяем расписание всех отслеживаемых групп каждые 20 минут и записываем отличия. Этот метод отдаёт записи журнала.

ПараметрОбяз.Описание
instнеттолько по этому заведению
groupнеттолько по этой группе
sinceнетс какого момента: unix-время или ГГГГ-ММ-ДД
limitнетсколько записей, от 1 до 500, по умолчанию 50
formatнетtext: готовый текст об изменениях с пометкой
curl -H "X-Api-Key: ВАШ_КЛЮЧ" \
  "https://raspika.com/api/v1/changes?inst=omgtu&group=421&since=2026-09-20&format=text"
{
  "data": [
    {"ts": 1790077000.5, "inst": "omgtu", "group": "421", "group_name": "ИСТ-253",
     "added": [ ... пары ... ],
     "removed": [ ... пары ... ],
     "changed": [{"lesson": { ... }, "was": { ... }, "fields": ["room"]}]}
  ],
  "count": 1,
  "text": "ИСТ-253 · изменения\n...\n\nРасписание взято с raspika.com",
  "attribution": "Расписание взято с raspika.com"
}

Журнал ведётся по группам, за которыми следит сервис: это группы наших пользователей и часть групп под наблюдением. Если по вашей группе записей нет, скорее всего, за ней пока никто не следит. Напишите в поддержку, добавим её в наблюдение.

6. Готовый текст: пометка проставляется сама

Чтобы не собирать текст руками и не забывать про пометку, добавьте format=text к /schedule или /changes. В ответе появится поле text: готовое сообщение, где последняя строка это «Расписание взято с raspika.com».

curl -H "X-Api-Key: ВАШ_КЛЮЧ" \
  "https://raspika.com/api/v1/schedule?inst=omgtu&group=421&format=text"
ИСТ-253 · Среда, 23 сентября
2 пара 09:40-11:10 · Физическая культура · ФК-Спортзал, Колтошова Т.В.
3 пара 11:35-13:05 · Стандартизация · 6-429, Андиева Е.Ю.

Расписание взято с raspika.com

Этот текст можно без изменений отправить в телеграм, ВК или опубликовать постом: условие использования будет выполнено автоматически.

Если делаете своё оформление, возьмите строку из поля attribution и добавьте её в конец, тогда текст пометки всегда совпадёт с актуальным. А чтобы пометка была кликабельной и считала переходы, используйте attribution_link или готовую строку attribution_html:

{
  "attribution": "Расписание взято с raspika.com",
  "attribution_link": "https://raspika.com/r/ab12cd",
  "attribution_html": "<a href="https://raspika.com/r/ab12cd">Расписание взято с raspika.com</a>"
}

7. Формат данных

Поля пары

ПолеТипОписание
dateстрокадата пары, ГГГГ-ММ-ДД
numчисло или nullномер пары; у части колледжей нумерации нет
start, endстрокавремя ЧЧ:ММ; бывает пустым, если источник его не даёт
subjectстроканазвание предмета как у заведения
typeстрокалекция, практика, лабораторная; бывает пустым
teacherстрокапреподаватель; бывает пустым
roomстрокааудитория; иногда ссылка на онлайн-занятие
subgroupчисло0 вся группа, 1 или 2 подгруппа
parityчисло или nullчётность недели, если она есть у источника
changedлогическоеисточник пометил пару как изменённую

Служебные поля ответа

ПолеОписание
countсколько элементов в data
staletrue: сайт заведения недоступен, отдана последняя сохранённая копия
updated_atкогда данные последний раз обновлялись
attributionстрока пометки, которую нужно показать
sourceвсегда raspika.com

Если stale равно true, покажите это и своим пользователям: расписание могло успеть измениться. У нас на сайте в таком случае выводится строка «сайт вуза недоступен, показана сохранённая версия».

8. Ошибки и ограничения

КодКогдаЧто делать
401ключ не передан, не существует или заблокированпроверьте заголовок; если блокировка, напишите в поддержку
400параметр неверного вида, например кривая дата в sinceпоправьте параметр
404нет такого заведения или группывозьмите идентификаторы из /institutions и /groups
422параметр слишком длинный или не того типапроверьте длину и тип
429превышен лимит запросовподождите минуту, добавьте кэш у себя
503сайт заведения недоступен и копии нетповторите позже, это бывает редко

Тело ошибки выглядит так: {"detail": "Группа не найдена"}.

Лимиты

Если нужен объём больше, напишите в поддержку, обсудим. Лучше всего кэшировать ответы у себя хотя бы на 10 минут: и вам быстрее, и нам спокойнее.

9. Готовые рецепты

Бот, который утром публикует расписание на сегодня

Раз в сутки дёргаете /schedule с date_from=date_to=сегодня и format=text, публикуете поле text. Пометка внутри.

Паблик, который сообщает об отменах

Раз в 20-30 минут запрашиваете /changes?inst=...&group=...&since=время_прошлого_запроса&format=text. Если count больше нуля, публикуете text. Время последнего успешного запроса храните у себя.

Расписание на своём сайте

Ходите за данными с сервера, кэшируйте на 10-15 минут, рисуйте своей вёрсткой. Под таблицей выводите строку из поля attribution.

Выбор группы для пользователя

Один раз в сутки забираете /groups нужных заведений, храните у себя и ищете по ним локально: списки меняются редко, а запросы экономятся.

10. Примеры кода

Python

import httpx, datetime

KEY = "ВАШ_КЛЮЧ"
BASE = "https://raspika.com/api/v1"
H = {"X-Api-Key": KEY}

d = (datetime.date.today() + datetime.timedelta(days=1)).isoformat()
r = httpx.get(f"{BASE}/schedule",
              params={"inst": "omgtu", "group": "421",
                      "date_from": d, "date_to": d, "format": "text"},
              headers=H, timeout=30).json()

if r["count"]:
    print(r["text"])          # пометка уже внутри текста
else:
    print("Завтра пар нет")

JavaScript (Node.js)

const KEY = process.env.RASPIKA_KEY;

const res = await fetch(
  "https://raspika.com/api/v1/schedule?inst=omgtu&group=421&format=text",
  { headers: { "X-Api-Key": KEY } }
);
const data = await res.json();

console.log(data.text);       // готовый текст с пометкой
console.log(data.count, "пар,", data.stale ? "копия" : "свежие данные");

PHP

<?php
$key = getenv('RASPIKA_KEY');
$url = 'https://raspika.com/api/v1/schedule?inst=omgtu&group=421&format=text';

$ch = curl_init($url);
curl_setopt_array($ch, [
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_HTTPHEADER => ["X-Api-Key: $key"],
  CURLOPT_TIMEOUT => 30,
]);
$data = json_decode(curl_exec($ch), true);
curl_close($ch);

echo $data['text'];           // пометка внутри

Свой формат с пометкой

r = httpx.get(f"{BASE}/schedule",
              params={"inst": "omgtu", "group": "421"},
              headers=H, timeout=30).json()

lines = []
for l in r["data"]:
    lines.append(f"{l['num']} пара · {l['subject']} · {l['room']}")
lines.append("")
lines.append(r["attribution"])   # берём строку из ответа, не пишем руками
text = "\n".join(lines)

11. Частые вопросы

Это бесплатно?

Да. Единственное условие это пометка об источнике.

Откуда данные?

С официальных сайтов и систем учебных заведений. Мы их разбираем, приводим к одному формату, храним копию на случай, если сайт заведения ляжет, и обновляем раз в 30 минут.

Какие заведения есть?

На момент написания 18: ОмГТУ, ОмГУ, ОмГМУ (и медколледж), ОмГУПС, СибАДИ, ОмГПУ, ОмГАУ, СибГУФК, ОмГА, СибИТ, СибГУОР, музпед, ОАТК, строительный колледж и другие. Актуальный список всегда в /institutions.

Можно ли добавить заведение, которого нет?

Напишите в поддержку. Если у заведения есть расписание в открытом виде, обычно подключаем за день-два.

Насколько свежие данные?

Обновление каждые 30 минут. Поле updated_at показывает время последнего обновления, stale предупреждает, если отдана сохранённая копия.

Что будет, если я уберу пометку?

Мы напишем на ваш контакт. Если ничего не изменится, ключ будет заблокирован.

Можно ли получать уведомления push, а не опрашивать?

Пока нет, вебхуков нет. Опрашивайте /changes раз в 20-30 минут, этого достаточно: чаще мы и сами не проверяем. Если нужен вебхук, напишите, посмотрим на спрос.

Есть ли ограничение на аудиторию моего проекта?

Нет. Чем больше студентов увидят расписание, тем лучше. Главное, чтобы они знали, откуда оно.

Поддержка

Вопросы, ключи, подключение новых заведений: чат поддержки на raspika.com. Отвечаем сами, без роботов.