{"openapi":"3.1.0","info":{"title":"API Научной библиотеки ЧувГУ","version":"1.0.0","summary":"Гостевая часть портала: каталог, новости, события, услуги, справочные сведения.","description":"Портал Научной библиотеки ЧувГУ им. И. Н. Ульянова отдаёт часть сведений без входа –\nих можно использовать в своих приложениях.\n\n**Что здесь есть.** Поиск и карточки электронного каталога, наличие экземпляров по пунктам\nвыдачи, новости, события и выставки, услуги, подписные базы, справочные сведения\nо библиотеке и её подразделениях.\n\n**Чего здесь нет.** Всего, что относится к конкретному читателю: кабинета, корзины, заказов,\nполных текстов. Эти обращения выполняются по сессии сайта – сторонним клиентом в них\nне попасть. Если такая интеграция нужна, напишите в библиотеку: доступ к сведениям читателя\nтребует его согласия и отдельного клиента в системе «ЧувГУ Ключ».\n\n**О нагрузке.** Каталог отвечает из библиотечной системы «МегаПро», которая выдерживает ограниченное число одновременных обращений. Портал держит очередь и кеширует ответы; со стороны клиента разумно не превышать одно обращение в секунду и повторять неудачу с задержкой.\n\n**Об ответах.** Все ответы – JSON в кодировке UTF-8. Отсутствующее значение приходит как\n`null`: портал не подставляет вместо него выдуманное. Ошибка приходит с кодом состояния\nи телом `{ \"statusCode\", \"statusMessage\", \"data\": { \"code\", \"detail\" } }`.","contact":{"name":"Научная библиотека ЧувГУ","email":"bibliotekachgu@mail.ru","url":"https://library.chuvsu.online/contacts"},"license":{"name":"Сведения библиотеки; условия использования – по договорённости с библиотекой","url":"https://library.chuvsu.online/contacts"}},"servers":[{"url":"https://library.chuvsu.ru","description":"Портал библиотеки"}],"tags":[{"name":"Каталог","description":"Электронный каталог «МегаПро». Каталог отвечает из библиотечной системы «МегаПро», которая выдерживает ограниченное число одновременных обращений. Портал держит очередь и кеширует ответы; со стороны клиента разумно не превышать одно обращение в секунду и повторять неудачу с задержкой."},{"name":"Материалы","description":"Новости, события и выставки, услуги."},{"name":"Справочные сведения","description":"Подразделения, контакты, часы работы, подписные базы."},{"name":"Поиск по порталу","description":"Поиск по материалам самого сайта."}],"paths":{"/api/megapro/search":{"get":{"tags":["Каталог"],"operationId":"searchCatalog","summary":"Поиск изданий","description":"Ищет по электронному каталогу. Область поиска задаётся либо видом изданий (`scope`),\nлибо номером базы (`db`); вместе их указывать нельзя – ответ будет `400`.\nВид удобнее: он объединяет несколько баз и не зависит от их нумерации.\n\nСтрока выдачи несёт всё, чем показывают издание списком: заглавие, библиографическое\nописание, год, международный номер и адрес обложки. Запрашивать карточку ради этого\nне нужно – она нужна за экземплярами и аннотацией.\n\nКогда область охватывает несколько баз, они обходятся по кругу: каждая база даёт свои\nстроки по очереди, иначе первая выбрала бы весь предел. Часть баз может не ответить –\nтогда выдача приходит без них, а `count` считается по ответившим.","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":200},"description":"Что искать.","example":"программирование"},{"name":"scope","in":"query","required":false,"schema":{"$ref":"#/components/schemas/CatalogScope"},"description":"Вид изданий. По умолчанию ищется по всем базам."},{"name":"db","in":"query","required":false,"schema":{"type":"integer","minimum":0,"maximum":8},"description":"Номер базы каталога, когда нужна одна конкретная. Несовместим со `scope`."},{"name":"match","in":"query","required":false,"schema":{"type":"string","enum":["exect_match","right_truncate"],"default":"exect_match"},"description":"`exect_match` – «включает» (по умолчанию), `right_truncate` – «начинается с». Написание `exect_match` – из библиотечной системы, оно оставлено как есть."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":30},"description":"Сколько строк вернуть."}],"responses":{"200":{"description":"Найденные издания.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SearchResult"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"502":{"$ref":"#/components/responses/UpstreamUnavailable"}}}},"/api/megapro/record/{db}/{id}":{"get":{"tags":["Каталог"],"operationId":"getRecord","summary":"Карточка издания","description":"Полное описание издания: библиографическая запись, авторы, аннотация, шифры,\nэкземпляры по местам хранения и ссылки на электронные ресурсы.\n\nНаличие полного текста видно по `hasFullText`, но сам файл гостю не выдаётся:\nон доступен читателю по подписанной ссылке со сроком жизни. Признак\n`fulltextUnknown` означает, что установка библиотечной системы не сообщает\nо файле гостю, – «неизвестно» и «файла нет» здесь разные вещи.","parameters":[{"$ref":"#/components/parameters/RecordDb"},{"$ref":"#/components/parameters/RecordId"}],"responses":{"200":{"description":"Карточка издания.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Record"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"404":{"$ref":"#/components/responses/NotFound"},"502":{"$ref":"#/components/responses/UpstreamUnavailable"}}}},"/api/megapro/record/{db}/{id}/pickups":{"get":{"tags":["Каталог"],"operationId":"getRecordPickups","summary":"Где получить издание","description":"Пункты книговыдачи с числами: сколько экземпляров всего, сколько свободно,\nсколько на руках, сколько заказано и сколько можно заказать.\n\nПризнак `orderable` у гостя всегда ложь, а `personalised` – `false`: право заказа\nзависит от читателя, и портал не выдаёт догадку за ответ библиотеки.\n\nАдрес, кабинет и точку на карте портал добавляет из своего справочника подразделений –\nв библиотечной системе их нет. У пункта без соответствия `branch` приходит `null`,\nа `name` может остаться пустым: расшифровку кода портал не сочиняет.","parameters":[{"$ref":"#/components/parameters/RecordDb"},{"$ref":"#/components/parameters/RecordId"}],"responses":{"200":{"description":"Пункты книговыдачи.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Pickups"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"502":{"$ref":"#/components/responses/UpstreamUnavailable"}}}},"/api/megapro/recommendations":{"get":{"tags":["Каталог"],"operationId":"getReadingSelection","summary":"Подборка «что почитать»","description":"Небольшая подборка изданий из фонда – для витрины, где нечего искать: читатель\nещё не знает, что ему нужно. Строки те же, что в выдаче поиска, поэтому карточку\nкаждого издания запрашивать не требуется.\n\n**Чем собрана подборка, сказано в ответе, и это важнее самой подборки.**\n`basis: \"topic\"` – по теме направления: издания в фонде есть, но порядок отражает\nпоиск, а не спрос. `basis: \"popularity\"` – по числу выдач. Пока приходит `topic`,\nподписывать подборку «самым читаемым» нельзя: это была бы неправда.\n\nНаправление подбора портал берёт из сведений вошедшего, а не из параметра запроса.\nСтороннему клиенту приходит общая подборка – и это рабочий ответ, а не отказ.","parameters":[{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":20,"default":6},"description":"Сколько изданий вернуть."}],"responses":{"200":{"description":"Подборка изданий.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReadingSelection"}}}},"400":{"$ref":"#/components/responses/BadRequest"},"502":{"$ref":"#/components/responses/UpstreamUnavailable"}}}},"/api/covers/isbn/{isbn}":{"get":{"tags":["Каталог"],"operationId":"getCoverByIsbn","summary":"Обложка по международному номеру","description":"Запасная обложка для изданий, у которых её нет в каталоге. Портал ходит к внешнему\nисточнику сам и кеширует ответ, поэтому читатель не раскрывает стороннему сайту,\nчто он смотрит.\n\nОтсутствие обложки – обычный исход, а не ошибка: приходит `204` без тела.\nТем же `204` отвечает недоступность источника.","parameters":[{"name":"isbn","in":"path","required":true,"schema":{"type":"string"},"description":"ISBN-10 или ISBN-13. Дефисы и пробелы допускаются – они отбрасываются.","example":"9785534086812"}],"responses":{"200":{"description":"Изображение обложки.","content":{"image/jpeg":{"schema":{"type":"string","format":"binary"}}}},"204":{"description":"Обложки нет либо источник недоступен."},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/api/news":{"get":{"tags":["Материалы"],"operationId":"listNews","summary":"Новости библиотеки","description":"Список без текста материала – текст приходит только у отдельной новости.","parameters":[{"name":"tag","in":"query","required":false,"schema":{"type":"string","enum":["resource","acquisition","announcement","event"]},"description":"Рубрика первичного наполнения. Редактор заводит и свои рубрики: в ответе `tag` – произвольное адресное имя, а `tagLabel` – его название."},{"$ref":"#/components/parameters/Limit50"},{"$ref":"#/components/parameters/Offset"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","enum":["ru","en"]},"description":"Язык ответа. Без него язык берётся из заголовка `accept-language`, по умолчанию русский. Тексты материалов ведутся на русском: для `en` приходит русский текст, переводится оформление портала."}],"responses":{"200":{"description":"Новости, свежие первыми.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NewsList"}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/api/news/{id}":{"get":{"tags":["Материалы"],"operationId":"getNewsItem","summary":"Новость целиком","description":"Материал с текстом и тремя похожими новостями – сначала из той же рубрики.","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Адресное имя новости. Кириллические имена сравниваются с учётом разных способов процентного кодирования."},{"name":"lang","in":"query","required":false,"schema":{"type":"string","enum":["ru","en"]},"description":"Язык ответа. Без него язык берётся из заголовка `accept-language`, по умолчанию русский. Тексты материалов ведутся на русском: для `en` приходит русский текст, переводится оформление портала."}],"responses":{"200":{"description":"Новость и похожие материалы.","content":{"application/json":{"schema":{"type":"object","required":["item","related"],"properties":{"item":{"$ref":"#/components/schemas/NewsItem"},"related":{"type":"array","items":{"$ref":"#/components/schemas/NewsItem"}}}}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/events":{"get":{"tags":["Материалы"],"operationId":"listEvents","summary":"События и виртуальные выставки","description":"Предстоящие события, прошедшие или виртуальные выставки – по значению `type`.","parameters":[{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["upcoming","past","exhibition"],"default":"upcoming"},"description":"`upcoming` – предстоящие, `past` – прошедшие, `exhibition` – выставки."},{"$ref":"#/components/parameters/Limit50"},{"$ref":"#/components/parameters/Offset"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","enum":["ru","en"]},"description":"Язык ответа. Без него язык берётся из заголовка `accept-language`, по умолчанию русский. Тексты материалов ведутся на русском: для `en` приходит русский текст, переводится оформление портала."}],"responses":{"200":{"description":"События или выставки без текста материала.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/EventList"}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/api/events/{id}":{"get":{"tags":["Материалы"],"operationId":"getEventItem","summary":"Событие или выставка целиком","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Адресное имя."},{"name":"lang","in":"query","required":false,"schema":{"type":"string","enum":["ru","en"]},"description":"Язык ответа. Без него язык берётся из заголовка `accept-language`, по умолчанию русский. Тексты материалов ведутся на русском: для `en` приходит русский текст, переводится оформление портала."}],"responses":{"200":{"description":"Материал с текстом и похожими.","content":{"application/json":{"schema":{"type":"object","required":["item","related"],"properties":{"item":{"$ref":"#/components/schemas/EventItem"},"related":{"type":"array","items":{"$ref":"#/components/schemas/EventItem"}}}}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/services":{"get":{"tags":["Материалы"],"operationId":"listServices","summary":"Услуги библиотеки","description":"Краткие описания. Порядок действий, требования и контакты приходят у отдельной услуги.","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","enum":["ru","en"]},"description":"Язык ответа. Без него язык берётся из заголовка `accept-language`, по умолчанию русский. Тексты материалов ведутся на русском: для `en` приходит русский текст, переводится оформление портала."}],"responses":{"200":{"description":"Перечень услуг.","content":{"application/json":{"schema":{"type":"object","required":["services","total"],"properties":{"services":{"type":"array","items":{"$ref":"#/components/schemas/Service"}},"total":{"type":"integer"}}}}}}}}},"/api/services/{id}":{"get":{"tags":["Материалы"],"operationId":"getService","summary":"Услуга целиком","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"string"},"description":"Адресное имя услуги."},{"name":"lang","in":"query","required":false,"schema":{"type":"string","enum":["ru","en"]},"description":"Язык ответа. Без него язык берётся из заголовка `accept-language`, по умолчанию русский. Тексты материалов ведутся на русском: для `en` приходит русский текст, переводится оформление портала."}],"responses":{"200":{"description":"Услуга и похожие.","content":{"application/json":{"schema":{"type":"object","required":["service","related"],"properties":{"service":{"$ref":"#/components/schemas/Service"},"related":{"type":"array","items":{"$ref":"#/components/schemas/Service"}}}}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/databases":{"get":{"tags":["Справочные сведения"],"operationId":"listDatabases","summary":"Подписные базы и электронные ресурсы","description":"Базы, к которым у университета есть доступ. `badge` различает постоянную подписку и тестовый доступ.","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","enum":["ru","en"]},"description":"Язык ответа. Без него язык берётся из заголовка `accept-language`, по умолчанию русский. Тексты материалов ведутся на русском: для `en` приходит русский текст, переводится оформление портала."}],"responses":{"200":{"description":"Перечень баз.","content":{"application/json":{"schema":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Database"}},"total":{"type":"integer"}}}}}}}}},"/api/resources":{"get":{"tags":["Справочные сведения"],"operationId":"getResources","summary":"Удалённый доступ: порядок и частые вопросы","responses":{"200":{"description":"Шаги удалённого доступа и вопросы с ответами.","content":{"application/json":{"schema":{"type":"object","required":["remoteAccessSteps","faq"],"properties":{"remoteAccessSteps":{"type":"array","items":{"type":"object","additionalProperties":true}},"faq":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}}}},"/api/catalogs":{"get":{"tags":["Справочные сведения"],"operationId":"getCatalogs","summary":"Каталоги библиотеки","description":"Описание каталогов, которыми располагает библиотека, и порядок работы с ними.","responses":{"200":{"description":"Каталоги и порядок работы.","content":{"application/json":{"schema":{"type":"object","required":["primary","secondary","howToSteps"],"properties":{"primary":{"type":"array","items":{"type":"object","additionalProperties":true}},"secondary":{"type":"array","items":{"type":"object","additionalProperties":true}},"howToSteps":{"type":"array","items":{"type":"object","additionalProperties":true}}}}}}}}}},"/api/branches":{"get":{"tags":["Справочные сведения"],"operationId":"listBranches","summary":"Подразделения библиотеки","description":"Читальные залы, абонементы и отделы: заведующий, адрес, кабинет, телефон, часы работы\nи точка на карте.\n\nПризнака «открыто сейчас» здесь нет намеренно: он зависит от текущей минуты, а ответ\nкешируется – посчитанное сервером состояние застывало бы в разметке. Считайте его сами\nпо `hours` и `summerHours` в часовом поясе библиотеки (Europe/Moscow); летние часы\nдействуют в июле и августе, воскресенье выходной, а `sanitaryLastThursday` означает\nсанитарный день в последний четверг месяца.","responses":{"200":{"description":"Подразделения с часами работы.","content":{"application/json":{"schema":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/Branch"}},"total":{"type":"integer"}}}}}}}}},"/api/library-status":{"get":{"tags":["Справочные сведения"],"operationId":"getLibraryStatus","summary":"Часы работы главного подразделения","description":"Расписание для полосы «открыто сейчас». Само состояние считает клиент – по тем же правилам, что описаны у подразделений. `null` означает, что часы в системе не заведены.","responses":{"200":{"description":"Часы работы либо `null`.","content":{"application/json":{"schema":{"oneOf":[{"$ref":"#/components/schemas/Schedule"},{"type":"null"}]}}}}}}},"/api/contacts":{"get":{"tags":["Справочные сведения"],"operationId":"getContacts","summary":"Контакты библиотеки","description":"Адрес, телефоны, электронная почта, страницы в социальных сетях.","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","enum":["ru","en"]},"description":"Язык ответа. Без него язык берётся из заголовка `accept-language`, по умолчанию русский. Тексты материалов ведутся на русском: для `en` приходит русский текст, переводится оформление портала."}],"responses":{"200":{"description":"Контактные сведения.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/about":{"get":{"tags":["Справочные сведения"],"operationId":"getAbout","summary":"Сведения о библиотеке","parameters":[{"name":"lang","in":"query","required":false,"schema":{"type":"string","enum":["ru","en"]},"description":"Язык ответа. Без него язык берётся из заголовка `accept-language`, по умолчанию русский. Тексты материалов ведутся на русском: для `en` приходит русский текст, переводится оформление портала."}],"responses":{"200":{"description":"Содержимое раздела «О библиотеке».","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}}}}},"/api/partners":{"get":{"tags":["Справочные сведения"],"operationId":"listPartners","summary":"Партнёры библиотеки","responses":{"200":{"description":"Перечень партнёров.","content":{"application/json":{"schema":{"type":"object","required":["items","total"],"properties":{"items":{"type":"array","items":{"type":"object","additionalProperties":true}},"total":{"type":"integer"}}}}}}}}},"/api/legal/{slug}":{"get":{"tags":["Справочные сведения"],"operationId":"getLegalDocument","summary":"Правовой документ","description":"Документы, которые библиотека публикует: правила пользования, политика обработки персональных данных и подобные.","parameters":[{"name":"slug","in":"path","required":true,"schema":{"type":"string"},"description":"Адресное имя документа, например `privacy`."},{"name":"lang","in":"query","required":false,"schema":{"type":"string","enum":["ru","en"]},"description":"Язык ответа. Без него язык берётся из заголовка `accept-language`, по умолчанию русский. Тексты материалов ведутся на русском: для `en` приходит русский текст, переводится оформление портала."}],"responses":{"200":{"description":"Документ с разделами.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"404":{"$ref":"#/components/responses/NotFound"}}}},"/api/search":{"get":{"tags":["Поиск по порталу"],"operationId":"searchSite","summary":"Поиск по материалам сайта","description":"Ищет по новостям, событиям, выставкам, услугам и подписным базам. Каталог сюда не входит – для него отдельное обращение `/api/megapro/search`. Пустой запрос возвращает пустую выдачу, а не ошибку.","parameters":[{"name":"q","in":"query","required":false,"schema":{"type":"string","maxLength":200},"description":"Что искать."},{"name":"type","in":"query","required":false,"schema":{"type":"string","enum":["all","news","event","service","database"],"default":"all"},"description":"Ограничить один вид материалов. Счётчики `countsByType` считаются по всем видам."},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":100,"default":20}},{"$ref":"#/components/parameters/Offset"},{"name":"lang","in":"query","required":false,"schema":{"type":"string","enum":["ru","en"]},"description":"Язык ответа. Без него язык берётся из заголовка `accept-language`, по умолчанию русский. Тексты материалов ведутся на русском: для `en` приходит русский текст, переводится оформление портала."}],"responses":{"200":{"description":"Найденные материалы портала.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SiteSearchResult"}}}},"400":{"$ref":"#/components/responses/BadRequest"}}}},"/api/search/suggestions":{"get":{"tags":["Поиск по порталу"],"operationId":"getSearchSuggestions","summary":"Подсказки к поисковой строке","description":"Быстрый список для выпадающей подсказки: ищет только по заглавиям и кратким описаниям. Непригодный запрос даёт пустой список, а не ошибку.","parameters":[{"name":"q","in":"query","required":true,"schema":{"type":"string","minLength":1,"maxLength":100}},{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":8,"default":6}},{"name":"lang","in":"query","required":false,"schema":{"type":"string","enum":["ru","en"]},"description":"Язык ответа. Без него язык берётся из заголовка `accept-language`, по умолчанию русский. Тексты материалов ведутся на русском: для `en` приходит русский текст, переводится оформление портала."}],"responses":{"200":{"description":"Подсказки.","content":{"application/json":{"schema":{"type":"object","required":["items"],"properties":{"items":{"type":"array","items":{"type":"object","required":["id","type","title","href"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["news","event","service"]},"title":{"type":"string"},"href":{"type":"string"}}}}}}}}}}}}},"components":{"parameters":{"RecordDb":{"name":"db","in":"path","required":true,"schema":{"type":"integer","minimum":0,"maximum":8},"description":"Номер базы каталога. Номера записей уникальны только внутри своей базы."},"RecordId":{"name":"id","in":"path","required":true,"schema":{"type":"integer","minimum":1},"description":"Номер записи внутри базы."},"Limit50":{"name":"limit","in":"query","required":false,"schema":{"type":"integer","minimum":1,"maximum":50,"default":6},"description":"Сколько материалов вернуть."},"Offset":{"name":"offset","in":"query","required":false,"schema":{"type":"integer","minimum":0,"default":0},"description":"Сколько материалов пропустить от начала."}},"schemas":{"CatalogScope":{"type":"string","enum":["all","books","articles","chguWorks","vkr","periodicals"],"description":"Вид изданий: все, книги, статьи, труды ЧувГУ, выпускные работы, периодика."},"RecordRef":{"type":"object","description":"Строка выдачи. Её достаточно, чтобы показать издание списком.","required":["id","db"],"properties":{"id":{"type":"integer","description":"Номер записи внутри базы."},"db":{"type":"integer","description":"Номер базы каталога."},"title":{"type":["string","null"],"description":"Заглавие."},"authors":{"type":"array","items":{"type":"string"},"description":"Авторы издания. Пустой список – библиотечная система авторов не сообщила."},"url":{"type":"string","description":"Адрес записи в самой библиотечной системе."},"isbn":{"type":["string","null"],"description":"Международный номер издания, если он есть в описании."},"description":{"type":["string","null"],"description":"Библиографическое описание строки целиком, составленное библиотекой."},"year":{"type":["integer","null"],"description":"Год издания."},"coverUrl":{"type":["string","null"],"description":"Адрес обложки на портале. Он подписан и живёт ограниченное время – сохранять его надолго не следует, берите заново вместе со строкой выдачи."}}},"SearchResult":{"type":"object","required":["items"],"properties":{"count":{"type":["integer","null"],"description":"Сколько записей нашлось всего. При поиске по нескольким базам – сумма по ответившим базам."},"items":{"type":"array","items":{"$ref":"#/components/schemas/RecordRef"}}}},"ReadingSelection":{"type":"object","required":["basis","faculty","topic","items"],"properties":{"basis":{"type":"string","enum":["topic","popularity"],"description":"Чем собрана подборка: `topic` – по теме направления, `popularity` – по числу выдач."},"faculty":{"type":["string","null"],"description":"Направление, по которому собрано. `null` – подборка общая."},"topic":{"type":["string","null"],"description":"Тема подбора. По ней видно, почему в подборке именно эти издания."},"items":{"type":"array","items":{"$ref":"#/components/schemas/RecordRef"}}}},"Copy":{"type":"object","description":"Экземпляр издания в месте хранения.","required":["pickup","pickupNames"],"properties":{"location":{"type":["string","null"],"description":"Место хранения (сигла)."},"locationName":{"type":["string","null"],"description":"Полное название места хранения по перечню сигл библиотеки. `null` – кода в перечне нет."},"shelfmark":{"type":["string","null"],"description":"Шифр."},"barcode":{"type":["string","null"],"description":"Штриховой код."},"status":{"type":["string","null"],"description":"Состояние экземпляра словами библиотеки."},"count":{"type":["integer","null"],"description":"Сколько экземпляров в этом месте хранения."},"pickup":{"type":"array","items":{"type":"string"},"description":"Коды пунктов книговыдачи, где экземпляр выдают."},"pickupNames":{"type":"array","items":{"type":"string"},"description":"Названия тех же пунктов: из справочника библиотечной системы, иначе из перечня сигл библиотеки. Там, где кода нет и в перечне, повторяется код: расшифровку портал не сочиняет."}}},"EResource":{"type":"object","required":["url"],"properties":{"title":{"type":["string","null"]},"url":{"type":"string"}}},"Record":{"type":"object","required":["id","db","title","authors","shelfmarks","copies","eresources","hasFullText","canOrder","fulltextUnknown"],"properties":{"id":{"type":"integer"},"db":{"type":"integer"},"format":{"type":["string","null"],"enum":["MARC21","RUSMARC",null]},"title":{"type":"string"},"description":{"type":["string","null"],"description":"Полное библиографическое описание по ГОСТ, составленное библиотекой. Портал показывает его дословно и не пересобирает из отдельных полей."},"authors":{"type":"array","items":{"type":"string"}},"year":{"type":["integer","null"]},"isbn":{"type":["string","null"]},"coverUrl":{"type":["string","null"],"description":"Подписанный адрес обложки на портале."},"shelfmarks":{"type":"array","items":{"type":"string"}},"annotation":{"type":["string","null"]},"copies":{"type":"array","items":{"$ref":"#/components/schemas/Copy"}},"eresources":{"type":"array","items":{"$ref":"#/components/schemas/EResource"}},"hasFullText":{"type":"boolean","description":"Есть ли у издания полный текст. Файл выдаётся только читателю."},"fulltextUnknown":{"type":"boolean","description":"Установка библиотечной системы не сообщает о наличии файла гостю. Истина означает «неизвестно», а не «файла нет»."},"canOrder":{"type":"boolean","description":"Принимает ли эта установка заказы. Ложь – заказать издание нельзя ни одним способом."}}},"PickupBranch":{"type":"object","description":"Подразделение библиотеки, обслуживающее пункт книговыдачи.","required":["name","address","room"],"properties":{"name":{"type":"string"},"address":{"type":"string"},"room":{"type":"string","description":"Кабинет."},"lat":{"type":"number"},"lng":{"type":"number"}}},"PickupPoint":{"type":"object","required":["code","name","total","free","onHand","ordered","availableToOrder","orderable","reason","branch"],"properties":{"code":{"type":"string","description":"Код пункта книговыдачи."},"name":{"type":["string","null"],"description":"Название пункта. `null` – название неизвестно."},"total":{"type":"integer","description":"Экземпляров всего."},"free":{"type":"integer","description":"Свободно."},"onHand":{"type":"integer","description":"На руках у читателей."},"ordered":{"type":"integer","description":"Заказано."},"availableToOrder":{"type":"integer","description":"Доступно к заказу."},"orderable":{"type":"boolean","description":"Примет ли библиотека заказ в этот пункт. У гостя всегда ложь."},"reason":{"type":["string","null"],"description":"Почему заказать нельзя."},"branch":{"description":"Подразделение библиотеки. `null` – соответствие коду не заведено.","oneOf":[{"$ref":"#/components/schemas/PickupBranch"},{"type":"null"}]}}},"Pickups":{"type":"object","required":["personalised","items"],"properties":{"personalised":{"type":"boolean","description":"Учтён ли конкретный читатель. Для стороннего клиента всегда ложь, и тогда `orderable` не заполнен по существу."},"items":{"type":"array","items":{"$ref":"#/components/schemas/PickupPoint"}}}},"ContentSection":{"type":"object","description":"Раздел текста материала: необязательный заголовок и абзацы.","required":["paragraphs"],"properties":{"heading":{"type":"string"},"paragraphs":{"type":"array","items":{"type":"string"}}},"additionalProperties":true},"NewsItem":{"type":"object","required":["id","tag","title","excerpt","date"],"properties":{"id":{"type":"string","description":"Адресное имя."},"tag":{"type":"string","description":"Адресное имя рубрики. Перечень открыт – редактор заводит свои."},"tagLabel":{"type":"string","description":"Название рубрики, когда оно приходит из CMS."},"title":{"type":"string"},"excerpt":{"type":"string","description":"Краткое изложение."},"date":{"type":"string","format":"date"},"author":{"type":"string"},"readingMinutes":{"type":"integer"},"body":{"type":"array","items":{"$ref":"#/components/schemas/ContentSection"},"description":"Текст материала. В списках не приходит."}}},"NewsList":{"type":"object","required":["items","total","hasMore"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/NewsItem"}},"total":{"type":"integer","description":"Сколько материалов подходит под запрос."},"hasMore":{"type":"boolean","description":"Есть ли что показать за пределом текущей страницы."}}},"EventItem":{"type":"object","description":"Событие или виртуальная выставка. У события есть дата и место, у выставки – дата открытия и куратор.","required":["id","title","excerpt"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"excerpt":{"type":"string"},"date":{"type":"string","format":"date"},"place":{"type":"string"},"tag":{"type":"string"},"openedAt":{"type":"string","format":"date"},"curator":{"type":"string"},"icon":{"type":"string"},"body":{"type":"array","items":{"$ref":"#/components/schemas/ContentSection"}}},"additionalProperties":true},"EventList":{"type":"object","required":["items","total","hasMore","type"],"properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/EventItem"}},"total":{"type":"integer"},"hasMore":{"type":"boolean"},"type":{"type":"string","enum":["upcoming","past","exhibition"]}}},"Service":{"type":"object","required":["id","title","desc","href"],"properties":{"id":{"type":"string"},"title":{"type":"string"},"desc":{"type":"string","description":"Краткое описание."},"href":{"type":"string","description":"Страница услуги на портале."},"icon":{"type":"string"},"badge":{"type":"string","description":"Пометка услуги, например «бесплатно»."},"cat":{"type":"string","description":"Раздел, к которому отнесена услуга."},"ctaLabel":{"type":"string","description":"Текст кнопки действия."},"requirements":{"type":"array","items":{"type":"string"},"description":"Что нужно от заявителя."},"steps":{"type":"array","items":{"type":"object","additionalProperties":true},"description":"Порядок действий. Только у отдельной услуги."},"body":{"type":"array","items":{"$ref":"#/components/schemas/ContentSection"}}},"additionalProperties":true},"Database":{"type":"object","required":["id","name","desc","href"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"desc":{"type":"string"},"href":{"type":"string","description":"Адрес базы у поставщика."},"domain":{"type":"string"},"badge":{"type":"string","enum":["permanent","trial"],"description":"Постоянная подписка или тестовый доступ."},"badgeText":{"type":"string","description":"Пометка словами, например срок тестового доступа."},"category":{"type":"string","enum":["textbooks","journals","fiction","languages","specialized"]},"files":{"type":"array","items":{"type":"object","additionalProperties":true},"description":"Приложенные документы: инструкции, договоры."}}},"HoursRange":{"type":"object","required":["open","close"],"properties":{"open":{"type":"string","description":"Время открытия «ЧЧ:ММ». Пустая строка – день нерабочий."},"close":{"type":"string","description":"Время закрытия «ЧЧ:ММ»."}}},"Hours":{"type":"object","required":["weekday","saturday"],"description":"Часы буден и субботы. Воскресенье выходное у всех подразделений.","properties":{"weekday":{"$ref":"#/components/schemas/HoursRange"},"saturday":{"$ref":"#/components/schemas/HoursRange"}}},"Schedule":{"type":"object","required":["hours"],"properties":{"hours":{"$ref":"#/components/schemas/Hours"},"summerHours":{"description":"Часы июля и августа. Отсутствуют – летом расписание обычное.","oneOf":[{"$ref":"#/components/schemas/Hours"},{"type":"null"}]},"sanitaryLastThursday":{"type":"boolean","description":"Санитарный день в последний четверг месяца."}}},"Branch":{"type":"object","required":["id","name","category","hours","sanitaryLastThursday","isMain","siglas"],"properties":{"id":{"type":"string","description":"Адресное имя подразделения."},"name":{"type":"string"},"category":{"type":"string","enum":["department","reading_room","subscription"],"description":"Отдел, читальный зал или абонемент."},"head":{"type":"string","description":"Заведующий."},"address":{"type":"string"},"room":{"type":"string","description":"Кабинет."},"phone":{"type":"string"},"email":{"type":"string"},"hours":{"$ref":"#/components/schemas/Hours"},"summerHours":{"oneOf":[{"$ref":"#/components/schemas/Hours"},{"type":"null"}]},"sanitaryLastThursday":{"type":"boolean"},"isMain":{"type":"boolean","description":"Главное подразделение библиотеки."},"lat":{"type":"number","description":"Широта. Отсутствует – подразделения нет на карте."},"lng":{"type":"number","description":"Долгота."},"siglas":{"type":"array","items":{"type":"string"},"description":"Коды мест хранения и пунктов книговыдачи каталога, которые обслуживает подразделение. По ним связываются наличие издания и адрес, куда идти."}}},"SiteSearchResult":{"type":"object","required":["items","total","hasMore","countsByType","query"],"properties":{"items":{"type":"array","items":{"type":"object","required":["id","type","title","excerpt","href"],"properties":{"id":{"type":"string"},"type":{"type":"string","enum":["news","event","service","database"]},"title":{"type":"string"},"excerpt":{"type":"string"},"href":{"type":"string","description":"Страница материала на портале."},"icon":{"type":"string"},"date":{"type":"string"},"tag":{"type":"string"}}}},"total":{"type":"integer"},"hasMore":{"type":"boolean"},"countsByType":{"type":"object","description":"Сколько нашлось материалов каждого вида – считается по всем видам независимо от `type`.","properties":{"news":{"type":"integer"},"event":{"type":"integer"},"service":{"type":"integer"},"database":{"type":"integer"}}},"query":{"type":"string","description":"Запрос, по которому получена выдача."}}},"Error":{"type":"object","required":["statusCode","statusMessage"],"properties":{"statusCode":{"type":"integer"},"statusMessage":{"type":"string"},"data":{"type":"object","description":"Подробности отказа, когда они есть.","additionalProperties":true}}}},"responses":{"BadRequest":{"description":"Запрос составлен неверно: обязательный параметр отсутствует, значение вне допустимого или заданы взаимоисключающие параметры.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"NotFound":{"description":"Такого материала нет.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"UpstreamUnavailable":{"description":"Библиотечная система не ответила. Повторите обращение позже – сведения не потеряны, недоступен источник.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}}}}