Перейти к содержимому

Документация API

REST API v1: рейтинг, исследователи, работы и поиск; ключи, лимиты и примеры для портала и журнальных платформ.

Общее

REST API возвращает JSON; все пути начинаются с префикса /v1/.

  • Базовый адрес: https://research.milliykengash.com/v1
  • Формат: запросы и ответы в JSON (Accept: application/json).
  • Язык: ?lang=uz|ru|en — названия вузов и подразделений на выбранном языке (по умолчанию uz).
  • Время — ISO-8601 UTC (2026-09-16T09:10:00Z), даты — YYYY-MM-DD.
  • Пагинация: ?page=&page_size= (page_size ≤ 200); в ответе items, total, page, page_size, next.
Постраничный ответjson
{
  "items": [ ... ],
  "total": 1234,
  "page": 1,
  "page_size": 50,
  "next": "/v1/rating/researchers?institution=12&page=2"
}

Аутентификация и ключи

Публичные эндпоинты чтения работают без входа. Для интеграций выдаются API-ключи.

Типы доступа
ДоступДля когоЛимит
публичныйДля всех: эндпоинты рейтинга, исследователей, работ и поиска120 запросов в минуту с одного IP
rating:readГлавный портал milliykengash.com — рейтинг и его состав (2-й столбец)Без ограничений
usage:writeПлатформы journal.* и conference.* — события просмотров и скачиваний≤ 1 000 событий в запросе
  • Ключ передаётся в заголовке: Authorization: Bearer RESEARCH_API_KEY.
  • Ключ выдаёт администратор research MilliyKengash; ключ показывается один раз при создании и хранится в базе в виде хеша.
  • Не храните ключ в браузерном коде или открытом репозитории — используйте его только на сервере.

Лимиты

Лимиты сохраняют стабильность сервиса для всех пользователей.

  • Публичные эндпоинты: 120 запросов в минуту с одного IP-адреса.
  • При превышении — ответ 429 с кодом ошибки throttled; повторите после времени из заголовка Retry-After.
  • С API-ключом (rating:read) запросы портала не ограничиваются.

Кэш и ETag

Ответы кэшируются — используйте ETag, чтобы быстро и дёшево получать часто запрашиваемые данные.

  • Время кэша: списки рейтинга — 60 секунд, данные страниц — 300 секунд (Cache-Control: public, max-age=…).
  • ETag: в следующем запросе отправьте заголовок If-None-Match — если данные не изменились, вернётся 304 Not Modified.
  • Живой рейтинг и снимок: без параметра date рейтинг живой (задержка ≤ 5 минут); ?date=YYYY-MM-DD — официальный снимок за этот день.
Условный запрос с ETagshell
curl -si "https://research.milliykengash.com/v1/works/20.1042/talim/2026/v12_i3/48213907"
# HTTP/1.1 200 OK
# Cache-Control: public, max-age=300
# ETag: "a1b2c3d4"

curl -si "https://research.milliykengash.com/v1/works/20.1042/talim/2026/v12_i3/48213907" -H 'If-None-Match: "a1b2c3d4"'
# HTTP/1.1 304 Not Modified

Эндпоинты

Полная схема — в документе OpenAPI. Ниже основные эндпоинты.

Рейтинг (портал и публичный доступ)

Рейтинг (портал и публичный доступ)
ЭндпоинтОписаниеДоступКэш
GET/v1/rating/institutions?region=&type=&date=&q=&lang=Рейтинг вузов: место, динамика, R, 2-й столбец, состав; с date — снимокпубличный60 с
GET/v1/rating/institutions/{id}Состав балла вуза, рейтинг подразделений, топ-10 исследователей, графики по годампубличный300 с
GET/v1/rating/institutions/{id}/history?from=&to=История рейтинга вуза (ежедневные снимки)публичный300 с
GET/v1/rating/departments?institution=&level=Рейтинг факультетов и кафедр (внутри вуза)публичный300 с
GET/v1/rating/units/{level}/{id}Данные страницы факультета или кафедрыпубличный300 с
GET/v1/rating/researchers?institution=&faculty=&department=&q=&page=Рейтинг исследователей: H-индекс ↓, цитирования ↓, работы ↓публичный60 с
GET/v1/methodologyТекущая методология: параметры, версии, источникипубличный300 с

Публичное чтение

Публичное чтение
ЭндпоинтОписаниеДоступКэш
GET/v1/stats/overviewОбщие объёмы: вузы, исследователи, работы, цитированияпубличный300 с
GET/v1/sourcesСостояние и расписание источников данныхпубличный300 с
GET/v1/filtersРегионы, типы вузов, направления, диапазон летпубличный300 с
GET/v1/search?q=&type=&year_from=&year_to=&institution=&subject=&page=Поиск работ, исследователей и вузов (латиница/кириллица, DRI)публичный300 с
GET/v1/researchers/{milliy_id}Профиль исследователя, показатели и местопубличный300 с
GET/v1/researchers/{milliy_id}/metricsПоказатели исследователя (открыты и для закрытого профиля)публичный300 с
GET/v1/researchers/{milliy_id}/works?sort=citations|year&page=Работы исследователя; закрытый профиль → 403 profile_privateпубличный300 с
GET/v1/researchers/{milliy_id}/citations-by-yearЦитирования по годампубличный300 с
GET/v1/researchers/{milliy_id}/cited-by?page=«Кто цитирует»; закрытый профиль → 403публичный300 с
GET/v1/works/{dri}Паспорт работы, показатели (по источникам), ссылкипубличный300 с
GET/v1/works/{dri}/metricsПоказатели работы и использование по месяцампубличный300 с
GET/v1/works/{dri}/citationsСписок литературы работы и статус сопоставленияпубличный300 с
GET/v1/works/{dri}/cited-by?page=Работы, цитирующие данную работупубличный300 с

Интеграция и служебные

Интеграция и служебные
ЭндпоинтОписаниеДоступКэш
POST/v1/usage/eventsПриём событий просмотров и скачиваний (пакетами)usage:write
GET/v1/openapi.jsonСпецификация OpenAPI 3публичный
GET/v1/docsИнтерактивная документация Swaggerпубличный
GET/v1/healthСостояние сервисапубличный
DRI в пути пишется со слэшами: /v1/works/20.1042/talim/2026/v12_i3/48213907 — кодировать не обязательно, можно кодировать каждый сегмент отдельно.

Портал: API рейтинга

Главный портал получает 2-й столбец из этого эндпоинта. Ключ: rating:read.

Запросshell
curl -s "https://research.milliykengash.com/v1/rating/institutions?lang=uz" \
  -H "Authorization: Bearer $RESEARCH_API_KEY" \
  -H "Accept: application/json"
Ответ (сокращён)json
{
  "method_version": "2026.1",
  "computed_at": "2026-09-16T09:10:00Z",
  "snapshot_date": null,
  "is_live": true,
  "items": [
    {
      "rank": 1,
      "delta_rank": 2,
      "institution": {
        "id": 12,
        "portal_id": "otm-12",
        "name": "Toshkent davlat pedagogika universiteti",
        "short_name": "TDPU",
        "region": "Toshkent shahri",
        "type": "university"
      },
      "R": 0.76,
      "score_33": 25.3,
      "components": {
        "avg_h": 6.0, "downloads_ps": 12.5, "views_ps": 100.0,
        "H_n": 1.0, "Y_n": 0.166667, "K_n": 0.266667,
        "contrib": { "h": 0.7, "downloads": 0.033333, "views": 0.026667 }
      },
      "staff_count": 412,
      "works_count": 1830,
      "citations": 5210,
      "downloads": 5150.5,
      "views": 41200.0
    }
  ],
  "total": 187,
  "filters": {
    "regions": ["Toshkent shahri", "Samarqand viloyati"],
    "types": [{ "code": "university", "name": "Universitet" }]
  }
}
  • rank / delta_rank — место и изменение относительно вчерашнего снимка (положительное — рост; если вчера нет — null).
  • score_33 — балл 2-го столбца (33,3 × R, 1 знак); R — исследовательский балл (0–1).
  • components — avg_h, downloads_ps, views_ps, нормированные H_n/Y_n/K_n и вклады contrib.
  • method_version / computed_at — версия методологии и время последнего расчёта; is_live — живой рейтинг или снимок.
Ежедневный официальный снимокshell
curl -s "https://research.milliykengash.com/v1/rating/institutions?date=2026-09-15" \
  -H "Authorization: Bearer $RESEARCH_API_KEY"

События использования

Платформы journal.* и conference.* пакетами отправляют просмотры страниц и скачивания PDF. Ключ: usage:write.

Запросhttp
POST https://research.milliykengash.com/v1/usage/events
Authorization: Bearer <usage:write>
Idempotency-Key: 5f0c2d1e-journal-2026-09-16T10:20
Content-Type: application/json

{
  "source": "journal",
  "events": [
    { "dri": "20.1042/talim/2026/v12_i3/48213907", "type": "view",
      "ts": "2026-09-16T10:15:00+05:00", "visitor_hash": "sha256(ip+ua+salt)",
      "referrer": "https://google.com" },
    { "dri": "20.1042/talim/2026/v12_i3/48213907", "type": "download",
      "ts": "2026-09-16T10:16:10+05:00", "visitor_hash": "sha256(ip+ua+salt)" }
  ]
}
Ответjson
HTTP/1.1 202 Accepted

{
  "accepted": 2,
  "rejected": 1,
  "duplicates": 0,
  "errors": [
    { "index": 2, "code": "too_old", "message": "Hodisa 7 kundan eski" }
  ]
}
  • Пакет: не более 1 000 событий в одном запросе; отправляйте события в течение 5 минут.
  • Повторы: одна тройка (dri, type, visitor_hash) учитывается раз в 24 часа (duplicates).
  • Время: события старше 7 дней или более чем на 10 минут в будущем отклоняются (too_old, invalid).
  • Боты отклоняются по признакам referrer и user-agent (bot).
  • Idempotency-Key: на повторный запрос с тем же ключом в течение 24 часов возвращается прежний ответ.
  • Конфиденциальность: visitor_hash вычисляется на платформе (IP не хранится) и должен быть необратимым.

Ошибки

Все ошибки в одном формате: код, сообщение, детали и идентификатор запроса.

Ответ с ошибкойjson
HTTP/1.1 403 Forbidden

{
  "error": {
    "code": "profile_private",
    "message": "Tadqiqotchi profili yopiq",
    "details": []
  },
  "request_id": "7c9e6679-7425-40de-944b-e07fc1f90ae7"
}
Коды ошибок
HTTPКодЗначение
400validation_errorНекорректный параметр; в details — поле и причина
401not_authenticatedТребуется ключ или сессия
403permission_deniedУ ключа нет нужного права (scope)
403profile_privateПрофиль исследователя закрыт — работы и цитирующие не показываются
404not_foundОбъект не найден
404profile_mergedПрофиль объединён с другим; в details — основной Milliy ID
404snapshot_not_foundСнимок за эту дату не опубликован
429throttledПревышен лимит запросов
500server_errorВнутренняя ошибка сервера

Вебхук

При публикации ежедневного снимка на портал отправляется уведомление.

Проверьте подпись: вычислите HMAC-SHA256 от тела запроса с общим секретом и сравните с заголовком X-Research-Signature.

rating.snapshot.publishedhttp
POST <PORTAL_WEBHOOK_URL>
X-Research-Signature: sha256=<HMAC(body, PORTAL_WEBHOOK_SECRET)>
Content-Type: application/json

{
  "event": "rating.snapshot.published",
  "date": "2026-09-16",
  "method_version": "2026.1",
  "url": "/v1/rating/institutions?date=2026-09-16"
}