{"openapi":"3.1.0","info":{"title":"ИС «Кредит» — API","description":"Портал образовательного кредита, МНВОИ КР. nasyya.ilim.gov.kg\n\nЧитателю этой схемы: тело любой ошибки — объект `{\"error\": \"…\"}`, перечень кодов с объяснением, что делать, отдаёт `GET /api/v1/errors`, а состояние стенда и готовые вызовы — `GET /api/v1/sandbox`. Авторизация — cookie сессии `kredit_session`; входящие вебхуки банков ходят без сессии и подписываются HMAC-SHA256 по сырому телу.","version":"0.1.0"},"paths":{"/api/v1/students/me":{"get":{"tags":["заявка"],"summary":"Данные об учёбе из Bilim API. Проверка до подачи заявки (ТЗ 3.2).","description":"Заявитель видит, что о нём знает реестр студентов, и предельную сумму по\nрегламенту (max_amount) — именно ею ограничена запрашиваемая сумма кредита.\nОбучение не на контрактной основе → 409: кредит покрывает контракт, а\nпокрывать нечего.\n\nНичего не меняет и снимок не фиксирует — это делает создание черновика.\nПризнак regulation_approved = false означает, что раздел 4.2 ТЗ заказчиком\nне утверждён и предельная сумма пока черновая.","operationId":"my_student_record_api_v1_students_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudentOut"}}}}}}},"/api/v1/banks/products":{"get":{"tags":["заявка"],"summary":"Витрина условий банков (ТЗ 3.3).","description":"Открыто без входа — витрина лендинга берёт условия отсюда. Отдаются только\nактивные продукты в порядке display_order.\n\nЗаявку принимает лишь банк с connection_status = connected. Остальные видны\nв витрине, но выбрать их в черновике нельзя: интеграция ещё проходит\nаттестацию, и обещать подачу было бы враньём. Поле grace_months — отсрочка\nпервого платежа, без неё предложения банков несравнимы.","operationId":"bank_products_api_v1_banks_products_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/BankProductOut"},"type":"array","title":"Response Bank Products Api V1 Banks Products Get"}}}}}}},"/api/v1/applications":{"get":{"tags":["заявка"],"summary":"Заявки заявителя: список с текущими статусами.","description":"Все свои заявки, включая черновики, новые сверху. Без постраничного вывода:\nу одного заявителя их единицы. Отбор идёт по владельцу сессии, а не по\nпараметру, — чужая заявка не появится здесь ни при каком запросе.\nПодробности — отдельным вызовом карточки.","operationId":"my_applications_api_v1_applications_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ApplicationListItem"},"type":"array","title":"Response My Applications Api V1 Applications Get"}}}}}},"post":{"tags":["заявка"],"summary":"Создаёт черновик и фиксирует снимок данных об учёбе.","description":"Только заявитель. Если черновик уже есть — возвращается он: у студента одна\nнезавершённая заявка, повторный вход в мастер не должен плодить пустышки.\nПоэтому ответ 201 приходит и на повторный вызов — новой сущности при этом\nне появляется.\n\nСнимок данных об учёбе фиксируется здесь и дальше не пересчитывается: банк\nдолжен видеть то, что было на момент подачи, а не то, что реестр отдаёт\nсегодня. Обучение не на контрактной основе → 409.","operationId":"create_draft_api_v1_applications_post","responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationOut"}}}}}}},"/api/v1/applications/{application_id}":{"get":{"tags":["заявка"],"summary":"Карточка заявки: данные, документы, история статусов.","description":"Видна только владельцу заявки; чужая отвечает 404, а не 403 — существование\nчужих заявок не раскрывается. История append-only, поэтому по ней видно\nвсё, что с заявкой происходило, а не только текущее состояние. Ничего не\nменяет.","operationId":"application_detail_api_v1_applications__application_id__get","parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}},"patch":{"tags":["заявка"],"summary":"Сохранение шага мастера. Отправленную заявку менять нельзя.","description":"Только заявитель и только пока заявка в статусе draft — иначе 409. Все поля\nнеобязательны: мастер пишет черновик по частям, и присланные поля заменяют\nпрежние значения.\n\nНеизвестный или снятый с витрины банковский продукт → 422; банк, у которого\nподключение ещё не завершено, заявку принять не может, и выбор его тоже\nотклоняется. Согласия фиксируются вместе с редакцией текста и её хешем —\nполе consents в ответе нужно лишь для отрисовки, источник правды отдельный.","operationId":"update_draft_api_v1_applications__application_id__patch","parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Id"}},{"name":"locale","in":"query","required":false,"schema":{"type":"string","default":"ru","title":"Locale"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DraftUpdate"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/consents":{"get":{"tags":["заявка"],"summary":"Действующие редакции текстов согласий (ТЗ 3.5).","description":"Заявитель должен видеть то, с чем соглашается, а не только название пункта.\nПараметр locale выбирает язык, по умолчанию ru.\n\nВерсия и sha256 текста фиксируются в момент согласия: по ним потом\nдоказывается, с какой именно редакцией согласился заявитель. Текст не\nправится на месте — выпускается новая редакция, старая остаётся ради уже\nподанных заявок. Ничего не меняет.","operationId":"consent_texts_api_v1_consents_get","parameters":[{"name":"locale","in":"query","required":false,"schema":{"type":"string","default":"ru","title":"Locale"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"array","items":{"$ref":"#/components/schemas/ConsentTextOut"},"title":"Response Consent Texts Api V1 Consents Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/applications/{application_id}/documents":{"post":{"tags":["заявка"],"summary":"Загрузка документа (ТЗ 8.2): до 10 МБ, PDF/JPG/PNG, хеш сохраняется.","description":"Только заявитель и только по черновику: после отправки состав документов\nзаморожен. Предел размера берётся из настроек развёрнутого приложения и\nназван в GET /api/v1/sandbox; превышение → 413, чужой формат → 415, пустой\nфайл → 400.\n\nСодержимое шифруется до записи, а sha256 считается от исходного файла — он\nдоказывает неизменность самого документа, а не шифротекста, и переживает\nсмену ключа. Поле kind различает вид документа; договор с учебным\nзаведением (contract) обязателен для отправки заявки.","operationId":"upload_document_api_v1_applications__application_id__documents_post","parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Id"}}],"requestBody":{"required":true,"content":{"multipart/form-data":{"schema":{"$ref":"#/components/schemas/Body_upload_document_api_v1_applications__application_id__documents_post"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/applications/{application_id}/guarantors":{"post":{"tags":["заявка"],"summary":"Поручитель или партнёр-должник (ТЗ 3.12). Подтверждение — на этапе 3.","description":"Только заявитель и только по черновику. Указывается ПИН; назначить\nпоручителем самого себя нельзя — 422.\n\nЗапись создаётся неподтверждённой: поручительство считается данным лишь\nпосле того, как поручитель подтвердит его в своём кабинете, и он вправе\nотозвать согласие вплоть до подписания договора. Сколько поручителей нужно,\nопределяет выбранный банковский продукт (guarantors_required).","operationId":"add_guarantor_api_v1_applications__application_id__guarantors_post","parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuarantorIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuarantorOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/applications/{application_id}/submit":{"post":{"tags":["заявка"],"summary":"Отправка в банк. Повтор возвращает прежний результат — второй кредит не создаётся.","description":"Только заявитель и только из черновика. Перед отправкой проверяется\nготовность: снимок данных об учёбе, выбранный банк, сумма в пределах\nрегламента, все согласия и приложенный договор с вузом. Чего не хватает —\nназвано в тексте ответа 422.\n\nПри успехе заявка получает номер NAS-<код вуза>-<год>-<номер>, время подачи\nи статус submitted, а сообщение банку кладётся в очередь исходящих с ключом\nидемпотентности. Дальше заявка меняется решениями банка по машине статусов.\nПовтор по уже отправленной заявке ничего не меняет и возвращает её же.","operationId":"submit_application_api_v1_applications__application_id__submit_post","parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/notifications":{"get":{"tags":["заявка"],"summary":"Лента событий по заявкам заявителя (экран «Уведомления» прототипа).","description":"Источник — история статусов: она append-only, поэтому лента не расходится с\nтем, что произошло на самом деле. Отдельной таблицы уведомлений нет\nсознательно — она была бы вторым описанием тех же событий.\n\nТолько свои заявки, новые сверху, постранично; total считает все события, а\nне поместившиеся на страницу. В channels перечислены каналы доставки, и у\nвсех connected = false с причиной: ни push, ни SMS, ни почта не подключены,\nа переключатель над неработающим каналом — обещание, которое не выполнят.","operationId":"my_notifications_api_v1_notifications_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Номер страницы, с единицы","default":1,"title":"Page"},"description":"Номер страницы, с единицы"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Размер страницы, не больше 200","default":50,"title":"Page Size"},"description":"Размер страницы, не больше 200"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/NotificationsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/applications/{application_id}/schedule":{"get":{"tags":["заявка"],"summary":"График платежей по выданному кредиту (ТЗ 3.13).","description":"Доступен владельцу заявки и только после выдачи кредита (issued, disbursed,\npayment_confirmed, closed); в остальных статусах — 409: платить ещё нечего,\nи график был бы обещанием.\n\nСчитается по условиям банка, зафиксированным в заявке при подаче, и по\nфактически перечисленной сумме — не по запрошенной: банк мог перечислить\nменьше, и график на запрошенную сумму был бы неверным с первого платежа.\nРасчёт предварительный (is_preliminary), фактический график ведёт банк.","operationId":"payment_schedule_api_v1_applications__application_id__schedule_get","parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScheduleOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/{document_id}/link":{"post":{"tags":["заявка"],"summary":"Ссылка на документ с ограниченным сроком действия (ТЗ 8.2).","description":"Ссылку получает тот, кто вправе видеть документ: владелец заявки, её банк,\nвуз этого студента, министерство и администратор. Остальным — 404.\n\nВыдача ссылки — уже обращение к персональным данным, поэтому пишется в\nжурнал: по нему видно, кто и когда получил доступ к скану. Срок жизни\nссылки в поле expires_in, в секундах; после него нужна новая.","operationId":"document_link_api_v1_documents__document_id__link_post","parameters":[{"name":"document_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Document Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DocumentLinkOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/documents/download":{"get":{"tags":["заявка"],"summary":"Скачивание документа по временной ссылке.","description":"Права проверяются заново, а не только по токену: за время жизни ссылки роль\nмогли отозвать, и старый токен не должен пережить это. Истёкший токен →\n410, чужой или подделанный → 403.\n\nФайл отдаётся вложением и с nosniff: содержимое пришло от заявителя и в\nбраузере не открывается. Каждое скачивание пишется в журнал обращений к\nперсональным данным (ТЗ 5.2).","operationId":"download_document_api_v1_documents_download_get","parameters":[{"name":"token","in":"query","required":true,"schema":{"type":"string","title":"Token"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/esia/start":{"get":{"tags":["аутентификация"],"summary":"Начало входа через ЕСИ «Түндүк».","description":"Открыт без входа. Уводит браузер на страницу ЕСИ, а признаки сеанса\n(state, nonce, верификатор PKCE) складывает в подписанную cookie на десять\nминут. При включённой заглушке (KREDIT_ESIA_STUB=1) в сеть не ходит вовсе:\nбраузер возвращается сразу на /callback и входит тестовым гражданином.","operationId":"esia_start_api_v1_auth_esia_start_get","responses":{"307":{"description":"Successful Response"}}}},"/api/v1/auth/esia/callback":{"get":{"tags":["аутентификация"],"summary":"Возврат из ЕСИ «Түндүк»: обмен кода на личность и выдача сессии.","description":"Открыт без входа, вызывается браузером гражданина. Проверяет state и nonce,\nменяет код на удостоверение личности с верификатором PKCE и заводит\nпользователя с ролью «заявитель», если такого ПИН ещё не было. Успех ставит\nту же cookie kredit_session, что обычный вход, и уводит в кабинет; отказ —\nна страницу входа с причиной. Гражданство не КР и повторно предъявленный\nкод входа не дают.","operationId":"esia_callback_api_v1_auth_esia_callback_get","parameters":[{"name":"code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code"}},{"name":"state","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"State"}},{"name":"error","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error"}},{"name":"error_description","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Error Description"}}],"responses":{"307":{"description":"Successful Response"},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bank/applications":{"get":{"tags":["банк"],"summary":"Очередь входящих заявок банка с фильтрами (ТЗ 3.8).","description":"Только роль банка; заявки отбираются по коду банка пользователя, поэтому\nчужая очередь недостижима. Без кода банка у учётной записи — 409.\n\nФильтры: статус, код вуза, признак просрочки. Предельный срок —\nиз regulation.review_days_limit, в коде число не зашито.\n\nПросрочка отбирается в SQL, а не после выборки: иначе постраничный вывод\nсчитал бы количество по одному набору, а показывал другой.","operationId":"bank_queue_api_v1_bank_applications_get","parameters":[{"name":"status","in":"query","required":false,"schema":{"anyOf":[{"$ref":"#/components/schemas/Status"},{"type":"null"}],"description":"Фильтр по статусу","title":"Status"},"description":"Фильтр по статусу"},{"name":"university_code","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Фильтр по коду вуза","title":"University Code"},"description":"Фильтр по коду вуза"},{"name":"overdue","in":"query","required":false,"schema":{"anyOf":[{"type":"boolean"},{"type":"null"}],"description":"Только просроченные","title":"Overdue"},"description":"Только просроченные"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Номер страницы, с единицы","default":1,"title":"Page"},"description":"Номер страницы, с единицы"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Размер страницы, не больше 200","default":50,"title":"Page Size"},"description":"Размер страницы, не больше 200"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_BankQueueItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bank/applications/{application_id}":{"get":{"tags":["банк"],"summary":"Карточка заявки: данные snapshot, документы с sha256, история.","description":"Всё, что банку передали при подаче: снимок данных об учёбе, документы с\nхешем каждого файла, полная история статусов и перечисления по этой заявке.\nЗаявка чужого банка отвечает 404, а не 403: банк не должен узнавать о\nзаявках конкурента. Ничего не меняет.\n\nСам файл документа скачивается отдельно: POST /api/v1/documents/{id}/link\nвыдаёт ссылку с ограниченным сроком.","operationId":"bank_application_detail_api_v1_bank_applications__application_id__get","parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/BankApplicationDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bank/applications/{application_id}/decision":{"post":{"tags":["банк"],"summary":"Решение банка. Переход проверяется машиной статусов, история дописывается.","description":"Только роль банка и только по своей заявке. Допустимость перехода решает\nмашина статусов: из submitted можно принять или отказать, из review —\nзапросить документы, одобрить или отказать, и так далее; недопустимый\nпереход → 409 с указанием, откуда и куда. Для отказа и запроса документов\nпричина обязательна (422 без неё) — её увидит заявитель.\n\nУспех дописывает запись в историю заявки и в журнал аудита; прежние записи\nне переписываются. То же самое банк может сделать вебхуком, не заходя в\nкабинет: POST /api/v1/webhooks/bank/{bank_code}.","operationId":"bank_decision_api_v1_bank_applications__application_id__decision_post","parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DecisionIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bank/applications/{application_id}/disburse":{"post":{"tags":["банк"],"summary":"Перечисление средств вузу (ТЗ 3.9).","description":"Только роль банка и только по своей заявке. Создаёт запись перечисления и\nпереводит заявку в статус disbursed — одной транзакцией: перечисление без\nсмены статуса или наоборот означало бы расхождение денег и состояния.\n\nСумма, дата, номер транзакции и счёт получателя обязательны. Дальше ход за\nвузом: он подтверждает поступление, и заявка уходит в payment_confirmed.\nРасхождение сумм видно в сверке вуза (GET /api/v1/university/reconciliation).","operationId":"disburse_api_v1_bank_applications__application_id__disburse_post","parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisbursementIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/DisbursementOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bank/credentials":{"get":{"tags":["банк"],"summary":"Реквизиты доступа банка к API (ТЗ 6.2).","description":"Только роль банка, только свои реквизиты. При первом обращении они заводятся\nавтоматически. Секрет не отдаётся: показывается только хвост, чтобы сверить,\nтот ли ключ настроен на стороне банка.\n\nЗдесь же назван адрес, на который банк шлёт события, имя заголовка подписи\nи алгоритм. Полный сценарий подписи — в примерах GET /api/v1/sandbox.","operationId":"bank_credentials_api_v1_bank_credentials_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialsOut"}}}}}},"patch":{"tags":["банк"],"summary":"Адрес, на который портал шлёт события банку.","description":"Только роль банка, только свои реквизиты. Адрес обязан начинаться с\nhttps:// — событие несёт персональные данные заявителя, и по http их\nотправлять нельзя (422). Пустая строка снимает адрес: события перестанут\nуходить, очередь исходящих их не потеряет.\n\nСмена пишется в журнал аудита. В ответе — те же реквизиты, что отдаёт\nGET /api/v1/bank/credentials.","operationId":"update_credentials_api_v1_bank_credentials_patch","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialsUpdate"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CredentialsOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/bank/credentials/rotate":{"post":{"tags":["банк"],"summary":"Выдаёт новый секрет подписи. Показывается один раз.","description":"Только роль банка, только свой секрет. Прежний перестаёт действовать сразу:\nдва живых секрета означают, что утёкший продолжает работать. Промежуточного\nпериода нет — переключать подпись на стороне банка нужно тем же действием.\n\nСекрет возвращается один раз, в этом ответе, и больше нигде не показывается.\nСобытие пишется в журнал аудита.","operationId":"rotate_credentials_api_v1_bank_credentials_rotate_post","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssuedSecretOut"}}}}}}},"/api/v1/guarantor/requests":{"get":{"tags":["поручитель"],"summary":"Список запросов на поручительство для вошедшего пользователя.","description":"Отбор идёт по ПИН вошедшего: поручитель видит только те заявки, где назван\nон сам. По каждому запросу видны заявка, сумма, банк, статус заявки и\nсостояние самого поручительства — pending, confirmed или declined.\n\nЗаявитель добавляет поручителя при заполнении черновика, отдельного\nприглашения по SMS или почте нет: каналы не подключены.","operationId":"requests_api_v1_guarantor_requests_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/GuarantorRequestOut"},"type":"array","title":"Response Requests Api V1 Guarantor Requests Get"}}}}}}},"/api/v1/guarantor/requests/{guarantor_id}/confirm":{"post":{"tags":["поручитель"],"summary":"Подтверждение поручительства. Повтор не меняет первое время.","description":"Только роль поручителя и только по своему запросу; чужой отвечает 404.\nПроставляется время подтверждения, событие уходит в журнал аудита. Повтор\nвозвращает ту же запись и не сдвигает время — оно доказательство, а не\nотметка последнего нажатия.\n\nРанее отклонённый запрос подтвердить нельзя (409): решение отозвано, и\nзаявитель должен добавить поручителя заново.","operationId":"confirm_api_v1_guarantor_requests__guarantor_id__confirm_post","parameters":[{"name":"guarantor_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Guarantor Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuarantorRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/guarantor/requests/{guarantor_id}/decline":{"post":{"tags":["поручитель"],"summary":"Отказ или отзыв согласия.","description":"ТЗ 3.12 прямо разрешает отзыв согласия до момента подписания договора —\nв том числе уже подтверждённого. Поручитель, передумавший на этапе\nрассмотрения, не должен оставаться связанным. Запрет наступает только с\nподписанием договора: с этого момента поручительство — часть сделки.","operationId":"decline_api_v1_guarantor_requests__guarantor_id__decline_post","parameters":[{"name":"guarantor_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Guarantor Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuarantorDeclineIn"}}}},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/GuarantorRequestOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/university/students":{"get":{"tags":["вуз"],"summary":"Список студентов-заёмщиков своего вуза (ТЗ 3.10).","description":"Только роль вуза (и администратор). Вуз видит только своих: отбор по коду\nучебного заведения в снимке заявки, равному коду организации пользователя.\nБез кода организации у учётной записи — 409.\n\nЧерновики не показываются: пока заявка не подана, вуза она не касается.\nПо каждой строке видно, перечислил ли банк деньги и подтвердил ли вуз их\nполучение. Постранично, total считает всех, а не строку на странице.","operationId":"university_students_api_v1_university_students_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Номер страницы, с единицы","default":1,"title":"Page"},"description":"Номер страницы, с единицы"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Размер страницы, не больше 200","default":50,"title":"Page Size"},"description":"Размер страницы, не больше 200"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_UniversityStudentOut_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/university/applications/{application_id}":{"get":{"tags":["вуз"],"summary":"Карточка заявки: данные, перечисление, подтверждение.","description":"Только роль вуза (и администратор), только по своему студенту; чужая заявка\nотвечает 404, а не 403 — существование заявок другого вуза не раскрывается.\n\nПоказывает сумму контракта из снимка, перечисление банка (сумма, дата,\nномер транзакции, счёт получателя) и подтверждение оплаты, если оно уже\nвнесено. Ничего не меняет.","operationId":"university_application_detail_api_v1_university_applications__application_id__get","parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Id"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UniversityApplicationDetail"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/university/applications/{application_id}/confirm":{"post":{"tags":["вуз"],"summary":"Подтверждение оплаты контракта (ТЗ 3.9).","description":"Только роль вуза (и администратор), только по своему студенту. Действие\nпризнаёт, что деньги дошли: заявка переходит из disbursed в\npayment_confirmed, и это единственный способ закрыть расхождение в сверке.\n\nИдемпотентность: повторное подтверждение не создаёт вторую запись и\nвозвращает первую. Сумма должна совпадать с суммой перечисления —\nрасхождение → 422 с обеими суммами в тексте. Подтверждение до перечисления\nневозможно: 409 с текущим статусом.","operationId":"confirm_payment_api_v1_university_applications__application_id__confirm_post","parameters":[{"name":"application_id","in":"path","required":true,"schema":{"type":"string","format":"uuid","title":"Application Id"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ConfirmPaymentIn"}}}},"responses":{"201":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UniversityPaymentOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/university/reconciliation":{"get":{"tags":["вуз"],"summary":"Сверка перечислений с признанием вуза (ТЗ 3.9).","description":"Прототип сверяет платформу с системой вуза (AVN). Контура AVN нет, поэтому\nвторая сторона здесь — подтверждение оплаты оператором вуза: оно и есть\nпризнание, что деньги дошли, независимо от того, откуда его внесли.\n\nРасхождение — либо разошлись суммы, либо перечисление не подтверждено\nдольше срока регламента. Второе на практике и означает, что вуз денег не\nвидит; счётчик, который этого не показывает, бесполезен.\n\nТолько роль вуза (и администратор), только свои заявки и только дошедшие до\nденег — до перечисления сверять нечего. Вердикт строки: matched — суммы\nсошлись, mismatch — разошлись, awaiting — ждём подтверждения в пределах\nсрока, overdue — срок вышел, pending — банк ещё не перечислял. Счётчики\nсчитаются по всему вузу, а не по видимой странице.","operationId":"reconciliation_api_v1_university_reconciliation_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Номер страницы, с единицы","default":1,"title":"Page"},"description":"Номер страницы, с единицы"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Размер страницы, не больше 200","default":50,"title":"Page Size"},"description":"Размер страницы, не больше 200"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReconciliationOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ministry/summary":{"get":{"tags":["министерство"],"summary":"Сводка по заявкам: счётчики, сумма выданного, разрезы по банкам и вузам.","description":"Министерству и администратору. Считает все заявки, кроме черновиков:\nнезавершённая заявка ещё ничья и в статистику не входит. Сумма выданного —\nсумма фактических перечислений банков, а не запрошенных сумм.\n\nВсё считается агрегатами SQL, без выгрузки заявок в память, поэтому ответ\nне растёт вместе с приёмной кампанией. Ничего не меняет.","operationId":"summary_api_v1_ministry_summary_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/SummaryStats"}}}}}}},"/api/v1/ministry/overdue":{"get":{"tags":["министерство"],"summary":"Заявки, у которых банк превысил предельный срок (regulation.review_days_limit).","description":"Министерству и администратору. Попадают только заявки, по которым банк ещё\nне вынес решение: поданные, принятые, на рассмотрении и с запросом\nдокументов. Старые сверху, days_overdue — на сколько дней превышен срок.\n\nПросрочка считается календарными днями от submitted_at — до утверждения\nраздела 4.2 ТЗ рабочие дни не утверждены (см. regulation.py). Ничего не\nменяет: это наблюдение, а не воздействие на банк.","operationId":"overdue_api_v1_ministry_overdue_get","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Номер страницы, с единицы","default":1,"title":"Page"},"description":"Номер страницы, с единицы"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Размер страницы, не больше 200","default":50,"title":"Page Size"},"description":"Размер страницы, не больше 200"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_OverdueItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ministry/integration-log":{"get":{"tags":["министерство"],"summary":"Журнал обмена с фильтрами и постраничным выводом (ТЗ 3.14).","description":"Министерству и администратору. Здесь видно каждое обращение к внешней\nсистеме и каждое входящее событие банка: направление, операция, заявка,\nкод ответа, длительность, тела запроса и ответа. По нему разбирается спор\n«мы присылали — вы не приняли».\n\nФильтры: system (код системы), direction (in или out), from и to по времени.\nЗаписи не редактируются и не удаляются. Ничего не меняет.","operationId":"integration_log_api_v1_ministry_integration_log_get","parameters":[{"name":"system","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Код внешней системы","title":"System"},"description":"Код внешней системы"},{"name":"direction","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"in или out","title":"Direction"},"description":"in или out"},{"name":"from","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"From"}},{"name":"to","in":"query","required":false,"schema":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"To"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"default":1,"title":"Page"}},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"default":50,"title":"Page Size"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/IntegrationLogPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ministry/users":{"get":{"tags":["министерство"],"summary":"Список пользователей — только администратор.","description":"Раньше отдавались первые двести без единого признака, что список обрезан:\nадминистратор искал пользователя, не находил и считал, что его нет.\n\nВместе с постраничным выводом нужен поиск: пролистывать тысячи страниц\nради одного ПИН — то же самое отсутствие ответа, только дольше.","operationId":"user_list_api_v1_ministry_users_get","parameters":[{"name":"q","in":"query","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"description":"Поиск по ПИН или ФИО","title":"Q"},"description":"Поиск по ПИН или ФИО"},{"name":"page","in":"query","required":false,"schema":{"type":"integer","minimum":1,"description":"Номер страницы, с единицы","default":1,"title":"Page"},"description":"Номер страницы, с единицы"},{"name":"page_size","in":"query","required":false,"schema":{"type":"integer","maximum":200,"minimum":1,"description":"Размер страницы, не больше 200","default":50,"title":"Page Size"},"description":"Размер страницы, не больше 200"}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Page_UserListItem_"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ministry/users/change-role":{"post":{"tags":["министерство"],"summary":"Смена роли пользователя. Только администратор.","description":"Свою роль администратор изменить не может (409): иначе система осталась бы\nбез администратора, и вернуть его было бы некому.\n\nРоли банка и вуза без кода организации нерабочи — кабинет не знает, чьи\nзаявки показывать, и отвечает 409 на каждый запрос. Поэтому смена на такую\nроль без кода отклоняется (422), а при уходе с неё код очищается. Смена\nпишется в журнал аудита вместе с прежней ролью.","operationId":"change_role_api_v1_ministry_users_change_role_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ChangeRoleIn"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserListItem"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ministry/monthly-statuses":{"get":{"tags":["министерство"],"summary":"Ежемесячная передача статусов студентов в банки (ТЗ 3.11).","description":"Показываем и число тех, по кому статус за период ещё не ушёл: передача,\nкоторую нельзя проверить, ничем не отличается от отсутствующей.","operationId":"monthly_statuses_api_v1_ministry_monthly_statuses_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"anyOf":[{"type":"string","pattern":"^\\d{4}-\\d{2}$"},{"type":"null"}],"title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/MonthlyStatusPage"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ministry/reports":{"get":{"tags":["министерство"],"summary":"Каталог отчётов и что попадёт в выгрузку за выбранный период.","description":"Министерству и администратору. Период — month, quarter или year; год\nсчитается учебным и начинается 1 сентября, потому что по нему живёт\nприёмная кампания. В counts видно, сколько строк даст выгрузка, — прежде\nчем её заказывать.\n\nРаздел unavailable перечисляет отчёты прототипа, для которых нет данных, и\nназывает причину: пустая форма хуже отсутствующей. Ничего не меняет.","operationId":"reports_catalogue_api_v1_ministry_reports_get","parameters":[{"name":"period","in":"query","required":false,"schema":{"type":"string","pattern":"^(month|quarter|year)$","default":"month","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Reports Catalogue Api V1 Ministry Reports Get"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ministry/reports/{report}.csv":{"get":{"tags":["министерство"],"summary":"Выгрузка отчёта в CSV.","description":"Министерству и администратору. Ключ отчёта — из каталога\nGET /api/v1/ministry/reports; неизвестный → 404. Период задаётся тем же\nпараметром, что и в каталоге. Разделитель — точка с запятой.\n\nФормат простой и переносимый; когда нужны считаемые суммы и даты — берите\nXLSX по тому же пути с расширением .xlsx. PDF из ТЗ пока нет: он требует\nшрифтов под кириллицу. Выгрузка пишется в журнал аудита: отчёт содержит\nперсональные данные.","operationId":"download_report_api_v1_ministry_reports__report__csv_get","parameters":[{"name":"report","in":"path","required":true,"schema":{"type":"string","title":"Report"}},{"name":"period","in":"query","required":false,"schema":{"type":"string","pattern":"^(month|quarter|year)$","default":"month","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ministry/reports/{report}.xlsx":{"get":{"tags":["министерство"],"summary":"Выгрузка отчёта в XLSX.","description":"Права, ключи отчётов и период — те же, что у выгрузки CSV; отличие в том,\nчто суммы и даты приходят значениями своего типа, а не текстом, поэтому в\nкниге их можно складывать и сортировать. Заголовок закреплён при прокрутке.\n\nВыгрузка пишется в журнал аудита: отчёт содержит персональные данные, и\nкто его забрал — часть требований к обращению с ними.","operationId":"download_report_xlsx_api_v1_ministry_reports__report__xlsx_get","parameters":[{"name":"report","in":"path","required":true,"schema":{"type":"string","title":"Report"}},{"name":"period","in":"query","required":false,"schema":{"type":"string","pattern":"^(month|quarter|year)$","default":"month","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/ministry/reports/{report}.pdf":{"get":{"tags":["министерство"],"summary":"Выгрузка отчёта в PDF.","description":"Права, ключи и период — те же, что у CSV и XLSX. PDF берут, когда выгрузку\nприкладывают к документу: он не редактируется случайно и выглядит одинаково\nу всех. Считать в нём нельзя — для этого XLSX.\n\nНа странице печатается период и момент сборки: распечатанный отчёт без даты\nсреза невозможно ни оспорить, ни подтвердить. Выгрузка пишется в журнал\nаудита: отчёт содержит персональные данные.","operationId":"download_report_pdf_api_v1_ministry_reports__report__pdf_get","parameters":[{"name":"report","in":"path","required":true,"schema":{"type":"string","title":"Report"}},{"name":"period","in":"query","required":false,"schema":{"type":"string","pattern":"^(month|quarter|year)$","default":"month","title":"Period"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/webhooks/bank/{bank_code}":{"post":{"tags":["интеграции"],"summary":"Событие банка: решение, подписание договора, выдача, перечисление.","description":"Открыт наружу и защищён подписью, а не сессией: банковская система ходит\nбез пользователя. Подпись — HMAC-SHA256 по СЫРОМУ телу в заголовке\nX-Signature; пересобранный из модели JSON дал бы другие байты и другую\nподпись. Секрет выдаёт кабинет банка. В песочнице подпись не проверяется.\n\nТело: event_id, event_type, application_id и comment. Типы событий —\napplication.accepted, application.review, application.docs_required,\napplication.approved, application.rejected, contract.signed, loan.issued,\nfunds.disbursed; для funds.disbursed нужен ещё объект payment с суммой,\nдатой, номером транзакции и счётом получателя.\n\nСобытие двигает заявку по машине статусов: недопустимый переход → 409, а\nотказ и запрос документов без причины → 422. Повторная доставка с тем же\nevent_id заявку второй раз не двигает и возвращает результат первой\nобработки с признаком duplicate. Чужая заявка → 404. Каждое событие\nостаётся в журнале обмена.","operationId":"bank_event_api_v1_webhooks_bank__bank_code__post","parameters":[{"name":"bank_code","in":"path","required":true,"schema":{"type":"string","title":"Bank Code"}},{"name":"X-Signature","in":"header","required":false,"schema":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"X-Signature"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"type":"object","additionalProperties":true,"title":"Response Bank Event Api V1 Webhooks Bank  Bank Code  Post"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/healthz":{"get":{"tags":["служебные"],"summary":"Состояние сервиса: база и режим внешних контуров.","description":"Открыт без входа — это проба для оркестратора и балансировщика. status=ok,\nкогда база отвечает; degraded означает, что отвечать данными сервис уже не\nможет, и любой маршрут вернёт ошибку. Поля tunduk и bilim показывают, что\nстоит на месте внешнего контура: stub — заглушка стенда, live — настоящее\nподключение. На стенде это единственный способ узнать, что данные об учёбе\nи личности ненастоящие.","operationId":"healthz_healthz_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Health"}}}}}}},"/api/v1/auth/login":{"post":{"tags":["аутентификация"],"summary":"Вход через ЕСИ «Түндүк». На стенде — заглушка, см. app/tunduk.py.","description":"Открыт без входа, принимает ПИН из четырнадцати цифр. Личность проверяется\nв регистре населения; ПИН, встреченный впервые, заводит пользователя с\nролью «заявитель» — остальные роли назначает администратор. В ответ\nставится cookie kredit_session (httponly), ей и авторизуются все\nпоследующие вызовы.\n\nСчитаются только НЕУДАЧНЫЕ попытки — по адресу и по ПИН отдельно; при\nисчерпании лимита приходит 429 с Retry-After. Недоступность ЕСИ (503) в\nсчётчик не идёт: за чужую аварию заявителя не наказывают.","operationId":"login_api_v1_auth_login_post","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"400":{"description":"ПИН не прошёл проверку формата","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"429":{"description":"Слишком много неудачных попыток входа. Заголовок Retry-After содержит число секунд до следующей попытки.","headers":{"Retry-After":{"description":"Секунд до снятия ограничения","schema":{"type":"integer"}}},"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"503":{"description":"ЕСИ «Түндүк» недоступен","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ErrorResponse"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/auth/logout":{"post":{"tags":["аутентификация"],"summary":"Выход: сессия отзывается в базе, а не только чистится cookie.","description":"Отвечает 204 без тела и не считается ошибкой, даже если cookie не было или\nона уже недействительна: выход обязан быть идемпотентным. Отозванная\nсессия не оживает — сохранённый идентификатор больше не подойдёт.","operationId":"logout_api_v1_auth_logout_post","responses":{"204":{"description":"Successful Response"}}}},"/api/v1/auth/demo":{"get":{"tags":["аутентификация"],"summary":"Список демонстрационных ролей. Вне стенда маршрута нет вовсе.","description":"Роль выдаёт администратор, а показать нужно все шесть кабинетов — этот\nсписок размыкает круг. Открыт без входа, пока включена заглушка ЕСИ\n(KREDIT_TUNDUK_STUB=1). При выключенной заглушке отвечает 404, а не 403:\nна боевом контуре не должно быть видно даже того, что такой вход есть.\nКлюч каждой записи подставляется в POST /api/v1/auth/demo/{key}.","operationId":"demo_accounts_api_v1_auth_demo_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/DemoAccountOut"},"type":"array","title":"Response Demo Accounts Api V1 Auth Demo Get"}}}}}}},"/api/v1/auth/demo/{key}":{"post":{"tags":["аутентификация"],"summary":"Вход в демонстрационной роли.","description":"Ключ роли берётся из GET /api/v1/auth/demo; неизвестный ключ — 404.\nДоступен только при включённой заглушке ЕСИ, иначе маршрута нет вовсе.\nРоль и код организации переустанавливаются при КАЖДОМ входе: предыдущий\nпоказ мог оставить учётную запись изменённой, и следующий начинался бы не\nс чистого состояния. Ответ ставит ту же cookie сессии, что обычный вход.","operationId":"demo_login_api_v1_auth_demo__key__post","parameters":[{"name":"key","in":"path","required":true,"schema":{"type":"string","title":"Key"}}],"responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}},"422":{"description":"Validation Error","content":{"application/json":{"schema":{"$ref":"#/components/schemas/HTTPValidationError"}}}}}}},"/api/v1/sandbox":{"get":{"tags":["интеграторам"],"summary":"Состояние песочницы: какие контуры заглушены и как их дёргать.","description":"Открыт без входа: интегратору нужно понять контур до того, как он получит\nдоступ. Отдаёт базовый адрес, предел размера документа, имя и алгоритм\nзаголовка подписи, состояние каждого внешнего контура (заглушка или живой\nс адресом), перечень кодов ошибок и готовые вызовы curl — уже с\nподставленным адресом этого стенда, чтобы работали копированием.\n\nСостояние читается из настроек развёрнутого приложения, а не из текста\nстраницы, поэтому разойтись с действительностью не может.","operationId":"sandbox_state_api_v1_sandbox_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"additionalProperties":true,"type":"object","title":"Response Sandbox State Api V1 Sandbox Get"}}}}}}},"/api/v1/errors":{"get":{"tags":["интеграторам"],"summary":"Перечень кодов ошибок: что пришло, почему и что делать.","description":"Открыт без входа. Собирается разбором самого кода приложения и прогоном\nкодов X-Road через настоящий разбор ошибок Түндүк — переписанная руками\nтаблица разошлась бы с кодом за неделю, а интегратор узнал бы об этом на\nбоевом контуре.\n\nГлавное различие, ради которого перечень существует: 403 с кодом\nServer.ServerProxy.AccessDenied означает, что ведомство не внесло нашу\nподсистему в свой ACL, и лечится заявкой, а не повтором; 502 — что отказал\nсам регистр, и повтор бесполезен; 503 — что обмена не было вовсе, и\nповторить нужно. Поле retryable называет это прямо.","operationId":"error_catalogue_api_v1_errors_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/ErrorCatalogueItem"},"type":"array","title":"Response Error Catalogue Api V1 Errors Get"}}}}}}},"/api/v1/me":{"get":{"tags":["аутентификация"],"summary":"Текущий пользователь и его роль.","description":"Первый вызов после входа: по role клиент выбирает кабинет, по org_code —\nчьи заявки показывать (код банка или код вуза). Без действующей сессии\nотвечает 401 — на нём же удобно проверять, не истекла ли cookie.","operationId":"me_api_v1_me_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"$ref":"#/components/schemas/UserOut"}}}}}}},"/api/v1/admin/users":{"get":{"tags":["администрирование"],"summary":"Пользователи системы. Доступно министерству и администратору.","description":"Последние сто по дате создания, без поиска и постраничного вывода —\nкороткая сводка «кто вообще завёлся в системе». Для работы со списком есть\nGET /api/v1/ministry/users: там и поиск по ПИН и ФИО, и страницы, и общее\nколичество. Ничего не меняет.","operationId":"list_users_api_v1_admin_users_get","responses":{"200":{"description":"Successful Response","content":{"application/json":{"schema":{"items":{"$ref":"#/components/schemas/UserOut"},"type":"array","title":"Response List Users Api V1 Admin Users Get"}}}}}}}},"components":{"schemas":{"ApplicationListItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","examples":["9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e"]},"number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Number","examples":["NAS-KNU-2026-0000042"]},"status":{"$ref":"#/components/schemas/Status"},"bank_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Code","examples":["eldik"]},"bank_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Name","examples":["«Элдик Банк»"]},"requested_amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Requested Amount","examples":["60000.00"]},"submitted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Submitted At","examples":["2026-08-05T10:30:00Z"]},"created_at":{"type":"string","format":"date-time","title":"Created At","examples":["2026-08-05T09:15:00Z"]}},"type":"object","required":["id","number","status","bank_code","requested_amount","submitted_at","created_at"],"title":"ApplicationListItem","examples":[{"bank_code":"eldik","bank_name":"«Элдик Банк»","created_at":"2026-08-05T09:15:00Z","id":"9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e","number":"NAS-KNU-2026-0000042","requested_amount":"60000.00","status":"review","submitted_at":"2026-08-05T10:30:00Z"}]},"ApplicationOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","examples":["9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e"]},"number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Number","examples":["NAS-KNU-2026-0000042"]},"status":{"$ref":"#/components/schemas/Status"},"bank_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Code","examples":["eldik"]},"bank_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Name","examples":["«Элдик Банк»"]},"requested_amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Requested Amount","examples":["60000.00"]},"consents":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Consents","examples":[{"personal_data":true,"transfer_to_bank":true}]},"submitted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Submitted At","examples":["2026-08-05T10:30:00Z"]},"created_at":{"type":"string","format":"date-time","title":"Created At","examples":["2026-08-05T09:15:00Z"]},"snapshot":{"anyOf":[{"$ref":"#/components/schemas/StudentSnapshotOut"},{"type":"null"}],"examples":[{"academic_score":"3.60","contract_amount":"65000.00","contract_date":"2026-08-15","contract_number":"KNU-990101","course":2,"full_name":"Асанов Азамат Бакытович","pin":"10101199000101","speciality":"Программная инженерия","study_form":"очная","university_code":"KNU","university_name":"Кыргызский национальный университет им. Ж. Баласагына"}]},"documents":{"items":{"$ref":"#/components/schemas/DocumentOut"},"type":"array","title":"Documents","default":[],"examples":[[{"content_type":"application/pdf","created_at":"2026-08-05T09:15:00Z","filename":"contract.pdf","id":"4d5e6f70-8192-43a4-b5c6-d7e8f9012345","kind":"contract","sha256":"9f2c1d0b7a5e4c3b2a1908f7e6d5c4b3a2918070f6e5d4c3b2a1908f7e6d5c4b3","size":248512}]]},"guarantors":{"items":{"$ref":"#/components/schemas/GuarantorOut"},"type":"array","title":"Guarantors","default":[],"examples":[[{"confirmed_at":"2026-08-06T08:00:00Z","full_name":"Токтосунов Эрлан Мирбекович","id":"3c4d5e6f-7081-4293-a4b5-c6d7e8f90123","kind":"guarantor","pin":"10202199100202"}]]},"history":{"items":{"$ref":"#/components/schemas/StatusEntryOut"},"type":"array","title":"History","default":[],"examples":[[{"comment":"Заявка принята к рассмотрению","created_at":"2026-08-05T10:30:00Z","source":"bank","status":"review"}]]}},"type":"object","required":["id","number","status","bank_code","requested_amount","consents","submitted_at","created_at"],"title":"ApplicationOut","examples":[{"bank_code":"eldik","bank_name":"«Элдик Банк»","consents":{"personal_data":true,"transfer_to_bank":true},"created_at":"2026-08-05T09:15:00Z","documents":[{"content_type":"application/pdf","created_at":"2026-08-05T09:15:00Z","filename":"contract.pdf","id":"4d5e6f70-8192-43a4-b5c6-d7e8f9012345","kind":"contract","sha256":"9f2c1d0b7a5e4c3b2a1908f7e6d5c4b3a2918070f6e5d4c3b2a1908f7e6d5c4b3","size":248512}],"guarantors":[{"confirmed_at":"2026-08-06T08:00:00Z","full_name":"Токтосунов Эрлан Мирбекович","id":"3c4d5e6f-7081-4293-a4b5-c6d7e8f90123","kind":"guarantor","pin":"10202199100202"}],"history":[{"comment":"Заявка принята к рассмотрению","created_at":"2026-08-05T10:30:00Z","source":"bank","status":"review"}],"id":"9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e","number":"NAS-KNU-2026-0000042","requested_amount":"60000.00","snapshot":{"academic_score":"3.60","contract_amount":"65000.00","contract_date":"2026-08-15","contract_number":"KNU-990101","course":2,"full_name":"Асанов Азамат Бакытович","pin":"10101199000101","speciality":"Программная инженерия","study_form":"очная","university_code":"KNU","university_name":"Кыргызский национальный университет им. Ж. Баласагына"},"status":"review","submitted_at":"2026-08-05T10:30:00Z"}]},"BankApplicationDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","examples":["9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e"]},"number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Number","examples":["NAS-KNU-2026-0000042"]},"status":{"$ref":"#/components/schemas/Status"},"bank_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Code","examples":["eldik"]},"bank_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Name","examples":["«Элдик Банк»"]},"requested_amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Requested Amount","examples":["60000.00"]},"consents":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Consents","examples":[{"personal_data":true,"transfer_to_bank":true}]},"submitted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Submitted At","examples":["2026-08-05T10:30:00Z"]},"created_at":{"type":"string","format":"date-time","title":"Created At","examples":["2026-08-05T09:15:00Z"]},"snapshot":{"anyOf":[{"$ref":"#/components/schemas/StudentSnapshotOut"},{"type":"null"}],"examples":[{"academic_score":"3.60","contract_amount":"65000.00","contract_date":"2026-08-15","contract_number":"KNU-990101","course":2,"full_name":"Асанов Азамат Бакытович","pin":"10101199000101","speciality":"Программная инженерия","study_form":"очная","university_code":"KNU","university_name":"Кыргызский национальный университет им. Ж. Баласагына"}]},"documents":{"items":{"$ref":"#/components/schemas/DocumentOut"},"type":"array","title":"Documents","default":[],"examples":[[{"content_type":"application/pdf","created_at":"2026-08-05T09:15:00Z","filename":"contract.pdf","id":"4d5e6f70-8192-43a4-b5c6-d7e8f9012345","kind":"contract","sha256":"9f2c1d0b7a5e4c3b2a1908f7e6d5c4b3a2918070f6e5d4c3b2a1908f7e6d5c4b3","size":248512}]]},"history":{"items":{"$ref":"#/components/schemas/StatusEntryOut"},"type":"array","title":"History","default":[],"examples":[[{"comment":"Заявка принята к рассмотрению","created_at":"2026-08-05T10:30:00Z","source":"bank","status":"review"}]]},"disbursements":{"items":{"$ref":"#/components/schemas/DisbursementOut"},"type":"array","title":"Disbursements","default":[],"examples":[[]]}},"type":"object","required":["id","number","status","bank_code","requested_amount","consents","submitted_at","created_at"],"title":"BankApplicationDetail","description":"Карточка заявки для банка: всё, что передано, включая перечисления.","examples":[{"bank_code":"eldik","bank_name":"«Элдик Банк»","consents":{"personal_data":true,"transfer_to_bank":true},"created_at":"2026-08-05T09:15:00Z","disbursements":[],"documents":[{"content_type":"application/pdf","created_at":"2026-08-05T09:15:00Z","filename":"contract.pdf","id":"4d5e6f70-8192-43a4-b5c6-d7e8f9012345","kind":"contract","sha256":"9f2c1d0b7a5e4c3b2a1908f7e6d5c4b3a2918070f6e5d4c3b2a1908f7e6d5c4b3","size":248512}],"history":[{"comment":"Заявка принята к рассмотрению","created_at":"2026-08-05T10:30:00Z","source":"bank","status":"review"}],"id":"9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e","number":"NAS-KNU-2026-0000042","requested_amount":"60000.00","snapshot":{"academic_score":"3.60","contract_amount":"65000.00","contract_date":"2026-08-15","contract_number":"KNU-990101","course":2,"full_name":"Асанов Азамат Бакытович","pin":"10101199000101","speciality":"Программная инженерия","study_form":"очная","university_code":"KNU","university_name":"Кыргызский национальный университет им. Ж. Баласагына"},"status":"review","submitted_at":"2026-08-05T10:30:00Z"}]},"BankProductOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","examples":["2b3c4d5e-6f70-4182-93a4-b5c6d7e8f901"]},"bank_code":{"type":"string","title":"Bank Code","examples":["eldik"]},"bank_name":{"type":"string","title":"Bank Name","examples":["«Элдик Банк»"]},"version":{"type":"integer","title":"Version","examples":[1]},"interest_rate":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Interest Rate","examples":["13.50"]},"women_rate":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Women Rate","examples":["0.00"]},"term_months":{"type":"integer","title":"Term Months","examples":[84]},"grace_months":{"type":"integer","title":"Grace Months","examples":[12]},"guarantors_required":{"type":"integer","title":"Guarantors Required","examples":[1]},"review_days":{"type":"integer","title":"Review Days","examples":[5]},"early_repayment":{"type":"boolean","title":"Early Repayment","examples":[true]},"documents_note":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Documents Note","examples":["Договор с учебным заведением, паспорт поручителя"]},"logo_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Logo Url","examples":["/banks/eldik.webp"]},"connection_status":{"type":"string","title":"Connection Status","examples":["connected"]},"tagline":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Tagline","examples":["Государственный банк · онлайн-оформление"]},"display_order":{"type":"integer","title":"Display Order","examples":[1]}},"type":"object","required":["id","bank_code","bank_name","version","interest_rate","women_rate","term_months","grace_months","guarantors_required","review_days","early_repayment","documents_note","logo_url","connection_status","tagline","display_order"],"title":"BankProductOut","examples":[{"bank_code":"eldik","bank_name":"«Элдик Банк»","connection_status":"connected","display_order":1,"documents_note":"Договор с учебным заведением, паспорт поручителя","early_repayment":true,"grace_months":12,"guarantors_required":1,"id":"2b3c4d5e-6f70-4182-93a4-b5c6d7e8f901","interest_rate":"13.50","logo_url":"/banks/eldik.webp","review_days":5,"tagline":"Государственный банк · онлайн-оформление","term_months":84,"version":1,"women_rate":"0.00"}]},"BankQueueItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","examples":["9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e"]},"number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Number","examples":["NAS-KNU-2026-0000042"]},"status":{"$ref":"#/components/schemas/Status"},"bank_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Code","examples":["eldik"]},"bank_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Name","examples":["«Элдик Банк»"]},"requested_amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Requested Amount","examples":["60000.00"]},"submitted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Submitted At","examples":["2026-08-05T10:30:00Z"]},"created_at":{"type":"string","format":"date-time","title":"Created At","examples":["2026-08-05T09:15:00Z"]},"student_name":{"type":"string","title":"Student Name","examples":["Асанов Азамат Бакытович"]},"university_name":{"type":"string","title":"University Name","examples":["Кыргызский национальный университет им. Ж. Баласагына"]},"deadline":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Deadline","examples":["2026-08-10"]},"overdue":{"type":"boolean","title":"Overdue","default":false,"examples":[false]}},"type":"object","required":["id","number","status","bank_code","requested_amount","submitted_at","created_at","student_name","university_name"],"title":"BankQueueItem","description":"Элемент очереди банка: расширен данными snapshot и признаком просрочки.","examples":[{"bank_code":"eldik","bank_name":"«Элдик Банк»","created_at":"2026-08-05T09:15:00Z","deadline":"2026-08-10","id":"9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e","number":"NAS-KNU-2026-0000042","overdue":false,"requested_amount":"60000.00","status":"review","student_name":"Асанов Азамат Бакытович","submitted_at":"2026-08-05T10:30:00Z","university_name":"Кыргызский национальный университет им. Ж. Баласагына"}]},"Body_upload_document_api_v1_applications__application_id__documents_post":{"properties":{"kind":{"type":"string","title":"Kind","default":"contract"},"file":{"type":"string","contentMediaType":"application/octet-stream","title":"File"}},"type":"object","required":["file"],"title":"Body_upload_document_api_v1_applications__application_id__documents_post"},"BreakdownItem":{"properties":{"code":{"type":"string","title":"Code","examples":["eldik"]},"name":{"type":"string","title":"Name","examples":["«Элдик Банк»"]},"count":{"type":"integer","title":"Count","examples":[128]},"amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Amount","examples":["7680000.00"]}},"type":"object","required":["code","name","count"],"title":"BreakdownItem","description":"Разрез по банку или вузу: код + счётчик + сумма.","examples":[{"amount":"7680000.00","code":"eldik","count":128,"name":"«Элдик Банк»"}]},"ChangeRoleIn":{"properties":{"user_id":{"type":"string","format":"uuid","title":"User Id","examples":["708192a3-b4c5-46d7-a8e9-f01234567890"]},"role":{"$ref":"#/components/schemas/Role"},"org_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Code","examples":["eldik"]}},"type":"object","required":["user_id","role"],"title":"ChangeRoleIn","description":"Смена роли: админ не может изменить свою — система останется без админа.\n\nКод организации обязателен для банка и вуза: без него их кабинеты не знают,\nчьи заявки показывать, и отвечают отказом.","examples":[{"org_code":"eldik","role":"bank","user_id":"708192a3-b4c5-46d7-a8e9-f01234567890"}]},"ConfirmPaymentIn":{"properties":{"amount":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Amount","examples":["60000.00"]},"source":{"type":"string","title":"Source","default":"portal","examples":["portal"]}},"type":"object","required":["amount"],"title":"ConfirmPaymentIn","description":"Подтверждение оплаты. Сумма должна совпадать с перечислением (ТЗ 3.9).","examples":[{"amount":"60000.00","source":"portal"}]},"ConsentTextOut":{"properties":{"code":{"type":"string","title":"Code","examples":["transfer_to_bank"]},"version":{"type":"integer","title":"Version","examples":[1]},"locale":{"type":"string","title":"Locale","examples":["ru"]},"body":{"type":"string","title":"Body","examples":["Я даю согласие на передачу выбранному банку сведений, необходимых…"]},"sha256":{"type":"string","title":"Sha256","examples":["c1b2a3948576e5d4c3b2a1908f7e6d5c4b3a2918070f6e5d4c3b2a1908f7e6d5"]}},"type":"object","required":["code","version","locale","body","sha256"],"title":"ConsentTextOut","description":"Текст согласия в действующей редакции (ТЗ 3.5).","examples":[{"body":"Я даю согласие на передачу выбранному банку сведений, необходимых…","code":"transfer_to_bank","locale":"ru","sha256":"c1b2a3948576e5d4c3b2a1908f7e6d5c4b3a2918070f6e5d4c3b2a1908f7e6d5","version":1}]},"CredentialsOut":{"properties":{"client_id":{"type":"string","title":"Client Id","examples":["BANK-ELDIK-01"]},"secret_masked":{"type":"string","title":"Secret Masked","examples":["••••••••••••••••7f3a"]},"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url","examples":["https://api.eldik.kg/nasyya/events"]},"rotated_at":{"type":"string","format":"date-time","title":"Rotated At","examples":["2026-08-01T07:00:00Z"]},"endpoint":{"type":"string","title":"Endpoint","examples":["/api/v1/webhooks/bank/eldik"]},"signature_header":{"type":"string","title":"Signature Header","examples":["X-Signature"]},"signature_algorithm":{"type":"string","title":"Signature Algorithm","examples":["HMAC-SHA256 по сырому телу запроса"]}},"type":"object","required":["client_id","secret_masked","webhook_url","rotated_at","endpoint","signature_header","signature_algorithm"],"title":"CredentialsOut","description":"Реквизиты доступа. Секрет — только хвостом (ТЗ 6.2).","examples":[{"client_id":"BANK-ELDIK-01","endpoint":"/api/v1/webhooks/bank/eldik","rotated_at":"2026-08-01T07:00:00Z","secret_masked":"••••••••••••••••7f3a","signature_algorithm":"HMAC-SHA256 по сырому телу запроса","signature_header":"X-Signature","webhook_url":"https://api.eldik.kg/nasyya/events"}]},"CredentialsUpdate":{"properties":{"webhook_url":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Webhook Url","examples":["https://api.eldik.kg/nasyya/events"]}},"type":"object","title":"CredentialsUpdate","description":"Адрес, на который портал шлёт события банку. Только https.","examples":[{"webhook_url":"https://api.eldik.kg/nasyya/events"}]},"DecisionIn":{"properties":{"status":{"$ref":"#/components/schemas/Status"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment","examples":["Одобрено на запрошенную сумму"]}},"type":"object","required":["status"],"title":"DecisionIn","description":"Решение банка (ТЗ 3.8). Для отказа и запроса документов причина обязательна.","examples":[{"comment":"Одобрено на запрошенную сумму","status":"approved"}]},"DemoAccountOut":{"properties":{"key":{"type":"string","title":"Key","examples":["bank"]},"role":{"$ref":"#/components/schemas/Role"},"full_name":{"type":"string","title":"Full Name","examples":["Демо · сотрудник банка"]},"scope":{"type":"string","title":"Scope","examples":["решения, платежи"]},"home":{"type":"string","title":"Home","examples":["/bank"]}},"type":"object","required":["key","role","full_name","scope","home"],"title":"DemoAccountOut","description":"Демонстрационная роль для стенда. Вне стенда список пуст (404).","examples":[{"full_name":"Демо · сотрудник банка","home":"/bank","key":"bank","role":"bank","scope":"решения, платежи"}]},"DisbursementIn":{"properties":{"amount":{"anyOf":[{"type":"number"},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"}],"title":"Amount","examples":["60000.00"]},"paid_at":{"type":"string","format":"date","title":"Paid At","examples":["2026-08-20"]},"transaction_number":{"type":"string","title":"Transaction Number","examples":["TRX-2026-0000815"]},"recipient_account":{"type":"string","title":"Recipient Account","examples":["1234567890123456"]}},"type":"object","required":["amount","paid_at","transaction_number","recipient_account"],"title":"DisbursementIn","description":"Данные перечисления от банка (ТЗ 3.9).","examples":[{"amount":"60000.00","paid_at":"2026-08-20","recipient_account":"1234567890123456","transaction_number":"TRX-2026-0000815"}]},"DisbursementOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","examples":["5e6f7081-92a3-44b5-86c7-d8e9f0123456"]},"application_id":{"type":"string","format":"uuid","title":"Application Id","examples":["9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e"]},"amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Amount","examples":["60000.00"]},"paid_at":{"type":"string","format":"date","title":"Paid At","examples":["2026-08-20"]},"transaction_number":{"type":"string","title":"Transaction Number","examples":["TRX-2026-0000815"]},"recipient_account":{"type":"string","title":"Recipient Account","examples":["1234567890123456"]},"created_at":{"type":"string","format":"date-time","title":"Created At","examples":["2026-08-20T11:05:00Z"]}},"type":"object","required":["id","application_id","amount","paid_at","transaction_number","recipient_account","created_at"],"title":"DisbursementOut","examples":[{"amount":"60000.00","application_id":"9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e","created_at":"2026-08-20T11:05:00Z","id":"5e6f7081-92a3-44b5-86c7-d8e9f0123456","paid_at":"2026-08-20","recipient_account":"1234567890123456","transaction_number":"TRX-2026-0000815"}]},"DocumentLinkOut":{"properties":{"url":{"type":"string","title":"Url","examples":["/api/v1/documents/download?token=Ijk4NzY1NDMyIg.aB1cD2.6Xq…"]},"filename":{"type":"string","title":"Filename","examples":["contract.pdf"]},"expires_in":{"type":"integer","title":"Expires In","examples":[600]}},"type":"object","required":["url","filename","expires_in"],"title":"DocumentLinkOut","description":"Временная ссылка на документ (ТЗ 8.2).","examples":[{"expires_in":600,"filename":"contract.pdf","url":"/api/v1/documents/download?token=Ijk4NzY1NDMyIg.aB1cD2.6Xq…"}]},"DocumentOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","examples":["4d5e6f70-8192-43a4-b5c6-d7e8f9012345"]},"kind":{"type":"string","title":"Kind","examples":["contract"]},"filename":{"type":"string","title":"Filename","examples":["contract.pdf"]},"content_type":{"type":"string","title":"Content Type","examples":["application/pdf"]},"size":{"type":"integer","title":"Size","examples":[248512]},"sha256":{"type":"string","title":"Sha256","examples":["9f2c1d0b7a5e4c3b2a1908f7e6d5c4b3a2918070f6e5d4c3b2a1908f7e6d5c4b3"]},"created_at":{"type":"string","format":"date-time","title":"Created At","examples":["2026-08-05T09:15:00Z"]}},"type":"object","required":["id","kind","filename","content_type","size","sha256","created_at"],"title":"DocumentOut","examples":[{"content_type":"application/pdf","created_at":"2026-08-05T09:15:00Z","filename":"contract.pdf","id":"4d5e6f70-8192-43a4-b5c6-d7e8f9012345","kind":"contract","sha256":"9f2c1d0b7a5e4c3b2a1908f7e6d5c4b3a2918070f6e5d4c3b2a1908f7e6d5c4b3","size":248512}]},"DraftUpdate":{"properties":{"bank_product_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Bank Product Id","examples":["2b3c4d5e-6f70-4182-93a4-b5c6d7e8f901"]},"requested_amount":{"anyOf":[{"type":"number","exclusiveMinimum":0.0},{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Requested Amount","examples":["60000.00"]},"consents":{"anyOf":[{"additionalProperties":{"type":"boolean"},"type":"object"},{"type":"null"}],"title":"Consents","examples":[{"credit_terms":true,"notifications":true,"personal_data":true,"transfer_to_bank":true}]}},"type":"object","title":"DraftUpdate","description":"Сохранение шага мастера. Все поля необязательны — черновик пишется по частям.","examples":[{"bank_product_id":"2b3c4d5e-6f70-4182-93a4-b5c6d7e8f901","consents":{"credit_terms":true,"notifications":true,"personal_data":true,"transfer_to_bank":true},"requested_amount":"60000.00"}]},"ErrorCatalogueItem":{"properties":{"kind":{"type":"string","title":"Kind","description":"http — ошибка портала, tunduk — сбой обмена через Түндүк","examples":["tunduk"]},"http_status":{"type":"integer","title":"Http Status","examples":[403]},"code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Code","description":"Машинный код X-Road, если он есть","examples":["Server.ServerProxy.AccessDenied"]},"message":{"type":"string","title":"Message","description":"Текст ответа; {…} — подстановка, зависящая от случая","examples":["Владелец сервиса не добавил подсистему в ACL"]},"retryable":{"type":"boolean","title":"Retryable","description":"Осмыслен ли повтор того же запроса без изменений","examples":[false]},"action":{"type":"string","title":"Action","description":"Что делать интегратору","examples":["Подать заявку владельцу сервиса на доступ: кодом не лечится."]},"source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Source","description":"Где в коде поднимается","examples":["app/xroad.py"]}},"type":"object","required":["kind","http_status","message","retryable","action"],"title":"ErrorCatalogueItem","description":"Строка перечня ошибок (KRD-15).\n\nПеречень собирается из кода: `http_status` и текст — с места, где ошибка\nподнимается, `code` — машинный код Түндүк. Переписанный руками перечень\nразошёлся бы с кодом на первой правке, и интегратор разбирал бы ответы по\nнесуществующим признакам.","examples":[{"action":"Подать заявку владельцу сервиса на доступ: кодом не лечится.","code":"Server.ServerProxy.AccessDenied","http_status":403,"kind":"tunduk","message":"Владелец сервиса не добавил подсистему в ACL","retryable":false,"source":"app/xroad.py"}]},"ErrorResponse":{"properties":{"error":{"type":"string","title":"Error","examples":["Отправленную заявку изменить нельзя"]}},"type":"object","required":["error"],"title":"ErrorResponse","description":"Тело любой ошибки.\n\nОбработчик приводит все HTTPException к этому виду. FastAPI по умолчанию\nотдаёт `detail`, поэтому без явной модели интегратор пишет разбор под\nнесуществующее поле и узнаёт правду только в бою.","examples":[{"error":"Отправленную заявку изменить нельзя"}]},"GuarantorDeclineIn":{"properties":{"reason":{"type":"string","maxLength":1000,"minLength":1,"title":"Reason","examples":["Не располагаю возможностью поручиться на эту сумму"]}},"type":"object","required":["reason"],"title":"GuarantorDeclineIn","description":"Причина отказа обязательна: она остаётся в журнале аудита.","examples":[{"reason":"Не располагаю возможностью поручиться на эту сумму"}]},"GuarantorIn":{"properties":{"pin":{"type":"string","maxLength":14,"minLength":14,"title":"Pin","examples":["10202199100202"]},"kind":{"type":"string","pattern":"^(guarantor|co_debtor)$","title":"Kind","default":"guarantor","examples":["guarantor"]}},"type":"object","required":["pin"],"title":"GuarantorIn","examples":[{"kind":"guarantor","pin":"10202199100202"}]},"GuarantorOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","examples":["3c4d5e6f-7081-4293-a4b5-c6d7e8f90123"]},"pin":{"type":"string","title":"Pin","examples":["10202199100202"]},"full_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Full Name","examples":["Токтосунов Эрлан Мирбекович"]},"kind":{"type":"string","title":"Kind","examples":["guarantor"]},"confirmed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Confirmed At","examples":["2026-08-06T08:00:00Z"]},"declined_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Declined At","examples":[null]}},"type":"object","required":["id","pin","full_name","kind","confirmed_at","declined_at"],"title":"GuarantorOut","examples":[{"confirmed_at":"2026-08-06T08:00:00Z","full_name":"Токтосунов Эрлан Мирбекович","id":"3c4d5e6f-7081-4293-a4b5-c6d7e8f90123","kind":"guarantor","pin":"10202199100202"}]},"GuarantorRequestOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","examples":["3c4d5e6f-7081-4293-a4b5-c6d7e8f90123"]},"application_id":{"type":"string","format":"uuid","title":"Application Id","examples":["9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e"]},"application_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Application Number","examples":["NAS-KNU-2026-0000042"]},"student_full_name":{"type":"string","title":"Student Full Name","examples":["Асанов Азамат Бакытович"]},"amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Amount","examples":["60000.00"]},"bank_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Name","examples":["«Элдик Банк»"]},"application_status":{"$ref":"#/components/schemas/Status"},"kind":{"type":"string","title":"Kind","examples":["guarantor"]},"confirmation_status":{"type":"string","title":"Confirmation Status","examples":["pending"]},"confirmed_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Confirmed At","examples":[null]},"declined_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Declined At","examples":[null]}},"type":"object","required":["id","application_id","application_number","student_full_name","amount","bank_name","application_status","kind","confirmation_status","confirmed_at","declined_at"],"title":"GuarantorRequestOut","description":"Запрос на поручительство со сведениями заявки для кабинета.","examples":[{"amount":"60000.00","application_id":"9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e","application_number":"NAS-KNU-2026-0000042","application_status":"review","bank_name":"«Элдик Банк»","confirmation_status":"pending","id":"3c4d5e6f-7081-4293-a4b5-c6d7e8f90123","kind":"guarantor","student_full_name":"Асанов Азамат Бакытович"}]},"HTTPValidationError":{"properties":{"detail":{"items":{"$ref":"#/components/schemas/ValidationError"},"type":"array","title":"Detail"}},"type":"object","title":"HTTPValidationError"},"Health":{"properties":{"status":{"type":"string","title":"Status","examples":["ok"]},"database":{"type":"string","title":"Database","examples":["ok"]},"tunduk":{"type":"string","title":"Tunduk","examples":["stub"]},"bilim":{"type":"string","title":"Bilim","examples":["stub"]}},"type":"object","required":["status","database","tunduk","bilim"],"title":"Health","examples":[{"bilim":"stub","database":"ok","status":"ok","tunduk":"stub"}]},"IntegrationLogItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","examples":["6f708192-a3b4-45c6-97d8-e9f012345678"]},"system":{"type":"string","title":"System","examples":["eldik"]},"direction":{"type":"string","title":"Direction","examples":["in"]},"operation":{"type":"string","title":"Operation","examples":["application.approved"]},"application_id":{"anyOf":[{"type":"string","format":"uuid"},{"type":"null"}],"title":"Application Id","examples":["9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e"]},"request":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Request","examples":[{"event_id":"evt-0001","event_type":"application.approved"}]},"response":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Response","examples":[{"application_number":"NAS-KNU-2026-0000042","status":"approved"}]},"status_code":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Status Code","examples":[200]},"duration_ms":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Duration Ms","examples":[42]},"created_at":{"type":"string","format":"date-time","title":"Created At","examples":["2026-08-05T09:15:00Z"]}},"type":"object","required":["id","system","direction","operation","application_id","status_code","duration_ms","created_at"],"title":"IntegrationLogItem","description":"Запись журнала обмена (ТЗ 3.14).","examples":[{"application_id":"9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e","created_at":"2026-08-05T09:15:00Z","direction":"in","duration_ms":42,"id":"6f708192-a3b4-45c6-97d8-e9f012345678","operation":"application.approved","request":{"event_id":"evt-0001","event_type":"application.approved"},"response":{"application_number":"NAS-KNU-2026-0000042","status":"approved"},"status_code":200,"system":"eldik"}]},"IntegrationLogPage":{"properties":{"items":{"items":{"$ref":"#/components/schemas/IntegrationLogItem"},"type":"array","title":"Items","examples":[[{"application_id":"9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e","created_at":"2026-08-05T09:15:00Z","direction":"in","duration_ms":42,"id":"6f708192-a3b4-45c6-97d8-e9f012345678","operation":"application.approved","request":{"event_id":"evt-0001","event_type":"application.approved"},"response":{"application_number":"NAS-KNU-2026-0000042","status":"approved"},"status_code":200,"system":"eldik"}]]},"total":{"type":"integer","title":"Total","examples":[1843]},"page":{"type":"integer","title":"Page","examples":[1]},"page_size":{"type":"integer","title":"Page Size","examples":[50]}},"type":"object","required":["items","total","page","page_size"],"title":"IntegrationLogPage","description":"Страница журнала обмена с постраничным выводом.","examples":[{"items":[{"application_id":"9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e","created_at":"2026-08-05T09:15:00Z","direction":"in","duration_ms":42,"id":"6f708192-a3b4-45c6-97d8-e9f012345678","operation":"application.approved","request":{"event_id":"evt-0001","event_type":"application.approved"},"response":{"application_number":"NAS-KNU-2026-0000042","status":"approved"},"status_code":200,"system":"eldik"}],"page":1,"page_size":50,"total":1843}]},"IssuedSecretOut":{"properties":{"client_id":{"type":"string","title":"Client Id","examples":["BANK-ELDIK-01"]},"secret":{"type":"string","title":"Secret","examples":["qN8v2Kx1cV0sT7wR4pL6yH3bG5nM9jD2fA0eZ1uQ8kI"]}},"type":"object","required":["client_id","secret"],"title":"IssuedSecretOut","description":"Секрет показывается один раз — при выдаче.","examples":[{"client_id":"BANK-ELDIK-01","secret":"qN8v2Kx1cV0sT7wR4pL6yH3bG5nM9jD2fA0eZ1uQ8kI"}]},"LoginRequest":{"properties":{"pin":{"type":"string","maxLength":14,"minLength":14,"title":"Pin","examples":["10101199000101"]}},"type":"object","required":["pin"],"title":"LoginRequest","examples":[{"pin":"10101199000101"}]},"MonthlyStatusItem":{"properties":{"application_id":{"type":"string","format":"uuid","title":"Application Id","examples":["9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e"]},"number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Number","examples":["NAS-KNU-2026-0000042"]},"student_name":{"type":"string","title":"Student Name","examples":["Асанов Азамат Бакытович"]},"bank_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Code","examples":["eldik"]},"period":{"type":"string","title":"Period","examples":["2026-09"]},"study_status":{"type":"string","title":"Study Status","examples":["studying"]},"sent_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Sent At","examples":["2026-09-01T03:10:00Z"]},"created_at":{"type":"string","format":"date-time","title":"Created At","examples":["2026-09-01T03:00:00Z"]}},"type":"object","required":["application_id","number","student_name","bank_code","period","study_status","sent_at","created_at"],"title":"MonthlyStatusItem","description":"Строка ежемесячной передачи статуса студента в банк (ТЗ 3.11).","examples":[{"application_id":"9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e","bank_code":"eldik","created_at":"2026-09-01T03:00:00Z","number":"NAS-KNU-2026-0000042","period":"2026-09","sent_at":"2026-09-01T03:10:00Z","student_name":"Асанов Азамат Бакытович","study_status":"studying"}]},"MonthlyStatusPage":{"properties":{"period":{"type":"string","title":"Period","examples":["2026-09"]},"periods":{"items":{"type":"string"},"type":"array","title":"Periods","examples":[["2026-09","2026-08"]]},"pending":{"type":"integer","title":"Pending","examples":[4]},"items":{"items":{"$ref":"#/components/schemas/MonthlyStatusItem"},"type":"array","title":"Items","examples":[[{"application_id":"9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e","bank_code":"eldik","created_at":"2026-09-01T03:00:00Z","number":"NAS-KNU-2026-0000042","period":"2026-09","sent_at":"2026-09-01T03:10:00Z","student_name":"Асанов Азамат Бакытович","study_status":"studying"}]]}},"type":"object","required":["period","periods","pending","items"],"title":"MonthlyStatusPage","examples":[{"items":[{"application_id":"9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e","bank_code":"eldik","created_at":"2026-09-01T03:00:00Z","number":"NAS-KNU-2026-0000042","period":"2026-09","sent_at":"2026-09-01T03:10:00Z","student_name":"Асанов Азамат Бакытович","study_status":"studying"}],"pending":4,"period":"2026-09","periods":["2026-09","2026-08"]}]},"NotificationChannel":{"properties":{"key":{"type":"string","title":"Key","examples":["sms"]},"connected":{"type":"boolean","title":"Connected","examples":[false]},"reason":{"type":"string","title":"Reason","examples":["SMS-шлюз не подключён: провайдер и оплата рассылки не определены."]}},"type":"object","required":["key","connected","reason"],"title":"NotificationChannel","description":"Канал доставки. connected=False с причиной — честнее пустого переключателя.","examples":[{"connected":false,"key":"sms","reason":"SMS-шлюз не подключён: провайдер и оплата рассылки не определены."}]},"NotificationItem":{"properties":{"application_id":{"type":"string","format":"uuid","title":"Application Id","examples":["9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e"]},"number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Number","examples":["NAS-KNU-2026-0000042"]},"status":{"$ref":"#/components/schemas/Status"},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment","examples":["Заявка принята к рассмотрению"]},"source":{"type":"string","title":"Source","examples":["bank"]},"created_at":{"type":"string","format":"date-time","title":"Created At","examples":["2026-08-05T10:30:00Z"]}},"type":"object","required":["application_id","number","status","source","created_at"],"title":"NotificationItem","description":"Событие по заявке заявителя — то, о чём его извещали бы каналы.","examples":[{"application_id":"9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e","comment":"Заявка принята к рассмотрению","created_at":"2026-08-05T10:30:00Z","number":"NAS-KNU-2026-0000042","source":"bank","status":"review"}]},"NotificationsOut":{"properties":{"items":{"items":{"$ref":"#/components/schemas/NotificationItem"},"type":"array","title":"Items","examples":[[{"application_id":"9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e","comment":"Заявка принята к рассмотрению","created_at":"2026-08-05T10:30:00Z","number":"NAS-KNU-2026-0000042","source":"bank","status":"review"}]]},"channels":{"items":{"$ref":"#/components/schemas/NotificationChannel"},"type":"array","title":"Channels","examples":[[{"connected":false,"key":"sms","reason":"SMS-шлюз не подключён: провайдер и оплата рассылки не определены."}]]},"total":{"type":"integer","title":"Total","examples":[7]},"page":{"type":"integer","title":"Page","examples":[1]},"page_size":{"type":"integer","title":"Page Size","examples":[50]}},"type":"object","required":["items","channels","total","page","page_size"],"title":"NotificationsOut","description":"Лента событий. total — сколько всего, а не сколько поместилось на страницу.","examples":[{"channels":[{"connected":false,"key":"sms","reason":"SMS-шлюз не подключён: провайдер и оплата рассылки не определены."}],"items":[{"application_id":"9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e","comment":"Заявка принята к рассмотрению","created_at":"2026-08-05T10:30:00Z","number":"NAS-KNU-2026-0000042","source":"bank","status":"review"}],"page":1,"page_size":50,"total":7}]},"OverdueItem":{"properties":{"application_id":{"type":"string","format":"uuid","title":"Application Id","examples":["9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e"]},"application_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Application Number","examples":["NAS-KNU-2026-0000042"]},"student_full_name":{"type":"string","title":"Student Full Name","examples":["Асанов Азамат Бакытович"]},"bank_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Name","examples":["«Элдик Банк»"]},"submitted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Submitted At","examples":["2026-08-05T10:30:00Z"]},"days_overdue":{"type":"integer","title":"Days Overdue","examples":[3]}},"type":"object","required":["application_id","application_number","student_full_name","bank_name","submitted_at","days_overdue"],"title":"OverdueItem","description":"Заявка, у которой банк превысил срок рассмотрения (reg.review_days_limit).","examples":[{"application_id":"9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e","application_number":"NAS-KNU-2026-0000042","bank_name":"«Элдик Банк»","days_overdue":3,"student_full_name":"Асанов Азамат Бакытович","submitted_at":"2026-08-05T10:30:00Z"}]},"Page_BankQueueItem_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/BankQueueItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"}},"type":"object","required":["items","total","page","page_size"],"title":"Page[BankQueueItem]"},"Page_OverdueItem_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/OverdueItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"}},"type":"object","required":["items","total","page","page_size"],"title":"Page[OverdueItem]"},"Page_UniversityStudentOut_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/UniversityStudentOut"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"}},"type":"object","required":["items","total","page","page_size"],"title":"Page[UniversityStudentOut]"},"Page_UserListItem_":{"properties":{"items":{"items":{"$ref":"#/components/schemas/UserListItem"},"type":"array","title":"Items"},"total":{"type":"integer","title":"Total"},"page":{"type":"integer","title":"Page"},"page_size":{"type":"integer","title":"Page Size"}},"type":"object","required":["items","total","page","page_size"],"title":"Page[UserListItem]"},"ReconciliationOut":{"properties":{"matched":{"type":"integer","title":"Matched","examples":[84]},"diverged":{"type":"integer","title":"Diverged","examples":[3]},"pending":{"type":"integer","title":"Pending","examples":[11]},"limit_days":{"type":"integer","title":"Limit Days","examples":[5]},"total":{"type":"integer","title":"Total","examples":[98]},"page":{"type":"integer","title":"Page","examples":[1]},"page_size":{"type":"integer","title":"Page Size","examples":[50]},"rows":{"items":{"$ref":"#/components/schemas/ReconciliationRow"},"type":"array","title":"Rows","examples":[[{"application_id":"9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e","days_waiting":2,"number":"NAS-KNU-2026-0000042","platform_amount":"60000.00","platform_date":"2026-08-20","student_name":"Асанов Азамат Бакытович","verdict":"awaiting"}]]}},"type":"object","required":["matched","diverged","pending","limit_days","total","page","page_size","rows"],"title":"ReconciliationOut","description":"Сводка сверки. Счётчики считает сервер — на клиенте они бы разъехались.","examples":[{"diverged":3,"limit_days":5,"matched":84,"page":1,"page_size":50,"pending":11,"rows":[{"application_id":"9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e","days_waiting":2,"number":"NAS-KNU-2026-0000042","platform_amount":"60000.00","platform_date":"2026-08-20","student_name":"Асанов Азамат Бакытович","verdict":"awaiting"}],"total":98}]},"ReconciliationRow":{"properties":{"application_id":{"type":"string","format":"uuid","title":"Application Id","examples":["9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e"]},"number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Number","examples":["NAS-KNU-2026-0000042"]},"student_name":{"type":"string","title":"Student Name","examples":["Асанов Азамат Бакытович"]},"platform_amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Platform Amount","examples":["60000.00"]},"platform_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Platform Date","examples":["2026-08-20"]},"university_amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"University Amount","examples":[null]},"university_date":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"University Date","examples":[null]},"university_source":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"University Source","examples":[null]},"verdict":{"type":"string","title":"Verdict","examples":["awaiting"]},"days_waiting":{"anyOf":[{"type":"integer"},{"type":"null"}],"title":"Days Waiting","examples":[2]}},"type":"object","required":["application_id","number","student_name","verdict"],"title":"ReconciliationRow","description":"Строка сверки: что платформа перечислила против того, что признал вуз.","examples":[{"application_id":"9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e","days_waiting":2,"number":"NAS-KNU-2026-0000042","platform_amount":"60000.00","platform_date":"2026-08-20","student_name":"Асанов Азамат Бакытович","verdict":"awaiting"}]},"Role":{"type":"string","enum":["student","guarantor","university","bank","ministry","admin"],"title":"Role","description":"Роли раздела 2.1 ТЗ."},"ScheduleOut":{"properties":{"is_preliminary":{"type":"boolean","title":"Is Preliminary","default":true,"examples":[true]},"amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Amount","examples":["60000.00"]},"interest_rate":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Interest Rate","examples":["13.50"]},"term_months":{"type":"integer","title":"Term Months","examples":[84]},"grace_months":{"type":"integer","title":"Grace Months","examples":[12]},"first_payment_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"First Payment Date","examples":["2026-10-05"]},"monthly_payment":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Monthly Payment","examples":["1250.00"]},"total_payable":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Payable","examples":["87500.00"]},"total_interest":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total Interest","examples":["27500.00"]},"bank_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Name","examples":["«Элдик Банк»"]},"payments":{"items":{"$ref":"#/components/schemas/SchedulePayment"},"type":"array","title":"Payments","examples":[[{"balance":"59285.71","due_date":"2026-10-05","interest":"535.71","number":1,"principal":"714.29","total":"1250.00"}]]}},"type":"object","required":["amount","interest_rate","term_months","grace_months","first_payment_date","monthly_payment","total_payable","total_interest","bank_name","payments"],"title":"ScheduleOut","description":"Предварительный график платежей (ТЗ 3.13).\n\nРасчёт портала по условиям банка, зафиксированным в заявке, — не выписка по\nкредиту. Фактический график ведёт банк; поле is_preliminary существует\nзатем, чтобы интерфейс не выдал расчёт за обязательство.","examples":[{"amount":"60000.00","bank_name":"«Элдик Банк»","first_payment_date":"2026-10-05","grace_months":12,"interest_rate":"13.50","is_preliminary":true,"monthly_payment":"1250.00","payments":[{"balance":"59285.71","due_date":"2026-10-05","interest":"535.71","number":1,"principal":"714.29","total":"1250.00"}],"term_months":84,"total_interest":"27500.00","total_payable":"87500.00"}]},"SchedulePayment":{"properties":{"number":{"type":"integer","title":"Number","examples":[1]},"due_date":{"type":"string","format":"date","title":"Due Date","examples":["2026-10-05"]},"total":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Total","examples":["1250.00"]},"principal":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Principal","examples":["714.29"]},"interest":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Interest","examples":["535.71"]},"balance":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Balance","examples":["59285.71"]}},"type":"object","required":["number","due_date","total","principal","interest","balance"],"title":"SchedulePayment","examples":[{"balance":"59285.71","due_date":"2026-10-05","interest":"535.71","number":1,"principal":"714.29","total":"1250.00"}]},"Status":{"type":"string","enum":["draft","submitted","accepted","review","docs_required","approved","rejected","contract_signed","issued","disbursed","payment_confirmed","closed"],"title":"Status","description":"12 статусов заявки, раздел 3.7 ТЗ. Порядок объявления — порядок процесса."},"StatusEntryOut":{"properties":{"status":{"$ref":"#/components/schemas/Status"},"source":{"type":"string","title":"Source","examples":["bank"]},"comment":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Comment","examples":["Заявка принята к рассмотрению"]},"created_at":{"type":"string","format":"date-time","title":"Created At","examples":["2026-08-05T10:30:00Z"]}},"type":"object","required":["status","source","comment","created_at"],"title":"StatusEntryOut","examples":[{"comment":"Заявка принята к рассмотрению","created_at":"2026-08-05T10:30:00Z","source":"bank","status":"review"}]},"StudentOut":{"properties":{"pin":{"type":"string","title":"Pin","examples":["10101199000101"]},"full_name":{"type":"string","title":"Full Name","examples":["Асанов Азамат Бакытович"]},"university_code":{"type":"string","title":"University Code","examples":["KNU"]},"university_name":{"type":"string","title":"University Name","examples":["Кыргызский национальный университет им. Ж. Баласагына"]},"speciality":{"type":"string","title":"Speciality","examples":["Программная инженерия"]},"course":{"type":"integer","title":"Course","examples":[2]},"study_form":{"type":"string","title":"Study Form","examples":["очная"]},"contract_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Contract Amount","examples":["65000.00"]},"contract_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Number","examples":["KNU-990101"]},"contract_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Contract Date","examples":["2026-08-15"]},"academic_score":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Academic Score","examples":["3.60"]},"max_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Max Amount","examples":["65000.00"]},"regulation_approved":{"type":"boolean","title":"Regulation Approved","description":"Утверждён ли заказчиком раздел 4.2 ТЗ. Пока false — предельная сумма черновая.","examples":[false]}},"type":"object","required":["pin","full_name","university_code","university_name","speciality","course","study_form","contract_amount","contract_number","contract_date","academic_score","max_amount","regulation_approved"],"title":"StudentOut","description":"Данные об учёбе из Bilim API (ТЗ 3.2) плюс предельная сумма по регламенту.","examples":[{"academic_score":"3.60","contract_amount":"65000.00","contract_date":"2026-08-15","contract_number":"KNU-990101","course":2,"full_name":"Асанов Азамат Бакытович","max_amount":"65000.00","pin":"10101199000101","regulation_approved":false,"speciality":"Программная инженерия","study_form":"очная","university_code":"KNU","university_name":"Кыргызский национальный университет им. Ж. Баласагына"}]},"StudentSnapshotOut":{"properties":{"pin":{"type":"string","title":"Pin","examples":["10101199000101"]},"full_name":{"type":"string","title":"Full Name","examples":["Асанов Азамат Бакытович"]},"university_code":{"type":"string","title":"University Code","examples":["KNU"]},"university_name":{"type":"string","title":"University Name","examples":["Кыргызский национальный университет им. Ж. Баласагына"]},"speciality":{"type":"string","title":"Speciality","examples":["Программная инженерия"]},"course":{"type":"integer","title":"Course","examples":[2]},"study_form":{"type":"string","title":"Study Form","examples":["очная"]},"contract_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Contract Amount","examples":["65000.00"]},"contract_number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Contract Number","examples":["KNU-990101"]},"contract_date":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Contract Date","examples":["2026-08-15"]},"academic_score":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Academic Score","examples":["3.60"]}},"type":"object","required":["pin","full_name","university_code","university_name","speciality","course","study_form","contract_amount","contract_number","contract_date","academic_score"],"title":"StudentSnapshotOut","examples":[{"academic_score":"3.60","contract_amount":"65000.00","contract_date":"2026-08-15","contract_number":"KNU-990101","course":2,"full_name":"Асанов Азамат Бакытович","pin":"10101199000101","speciality":"Программная инженерия","study_form":"очная","university_code":"KNU","university_name":"Кыргызский национальный университет им. Ж. Баласагына"}]},"SummaryStats":{"properties":{"total":{"type":"integer","title":"Total","examples":[412]},"approved":{"type":"integer","title":"Approved","examples":[193]},"rejected":{"type":"integer","title":"Rejected","examples":[48]},"in_work":{"type":"integer","title":"In Work","examples":[171]},"issued_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Issued Amount","examples":["11580000.00"]},"by_bank":{"items":{"$ref":"#/components/schemas/BreakdownItem"},"type":"array","title":"By Bank","examples":[[{"amount":"7680000.00","code":"eldik","count":128,"name":"«Элдик Банк»"}]]},"by_university":{"items":{"$ref":"#/components/schemas/BreakdownItem"},"type":"array","title":"By University","examples":[[{"code":"KNU","count":96,"name":"Кыргызский национальный университет им. Ж. Баласагына"}]]}},"type":"object","required":["total","approved","rejected","in_work","issued_amount","by_bank","by_university"],"title":"SummaryStats","description":"Сводка: считается агрегатами SQL, не выгружая все заявки в память.","examples":[{"approved":193,"by_bank":[{"amount":"7680000.00","code":"eldik","count":128,"name":"«Элдик Банк»"}],"by_university":[{"code":"KNU","count":96,"name":"Кыргызский национальный университет им. Ж. Баласагына"}],"in_work":171,"issued_amount":"11580000.00","rejected":48,"total":412}]},"UniversityApplicationDetail":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","examples":["9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e"]},"number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Number","examples":["NAS-KNU-2026-0000042"]},"status":{"$ref":"#/components/schemas/Status"},"bank_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Name","examples":["«Элдик Банк»"]},"requested_amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Requested Amount","examples":["60000.00"]},"submitted_at":{"anyOf":[{"type":"string","format":"date-time"},{"type":"null"}],"title":"Submitted At","examples":["2026-08-05T10:30:00Z"]},"student_name":{"type":"string","title":"Student Name","examples":["Асанов Азамат Бакытович"]},"university_name":{"type":"string","title":"University Name","examples":["Кыргызский национальный университет им. Ж. Баласагына"]},"speciality":{"type":"string","title":"Speciality","examples":["Программная инженерия"]},"course":{"type":"integer","title":"Course","examples":[2]},"contract_amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Contract Amount","examples":["65000.00"]},"disbursement":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Disbursement","examples":[{"amount":"60000.00","paid_at":"2026-08-20","recipient_account":"1234567890123456","transaction_number":"TRX-2026-0000815"}]},"payment":{"anyOf":[{"additionalProperties":true,"type":"object"},{"type":"null"}],"title":"Payment","examples":[null]}},"type":"object","required":["id","number","status","requested_amount","submitted_at","student_name","university_name","speciality","course","contract_amount"],"title":"UniversityApplicationDetail","description":"Карточка заявки для вуза: данные заявки, перечисление, подтверждение.","examples":[{"bank_name":"«Элдик Банк»","contract_amount":"65000.00","course":2,"disbursement":{"amount":"60000.00","paid_at":"2026-08-20","recipient_account":"1234567890123456","transaction_number":"TRX-2026-0000815"},"id":"9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e","number":"NAS-KNU-2026-0000042","requested_amount":"60000.00","speciality":"Программная инженерия","status":"disbursed","student_name":"Асанов Азамат Бакытович","submitted_at":"2026-08-05T10:30:00Z","university_name":"Кыргызский национальный университет им. Ж. Баласагына"}]},"UniversityPaymentOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","examples":["8192a3b4-c5d6-47e8-a9f0-123456789012"]},"application_id":{"type":"string","format":"uuid","title":"Application Id","examples":["9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e"]},"source":{"type":"string","title":"Source","examples":["portal"]},"amount":{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$","title":"Amount","examples":["60000.00"]},"confirmed_at":{"type":"string","format":"date-time","title":"Confirmed At","examples":["2026-08-22T09:40:00Z"]}},"type":"object","required":["id","application_id","source","amount","confirmed_at"],"title":"UniversityPaymentOut","examples":[{"amount":"60000.00","application_id":"9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e","confirmed_at":"2026-08-22T09:40:00Z","id":"8192a3b4-c5d6-47e8-a9f0-123456789012","source":"portal"}]},"UniversityStudentOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","examples":["9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e"]},"number":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Number","examples":["NAS-KNU-2026-0000042"]},"student_name":{"type":"string","title":"Student Name","examples":["Асанов Азамат Бакытович"]},"speciality":{"type":"string","title":"Speciality","examples":["Программная инженерия"]},"course":{"type":"integer","title":"Course","examples":[2]},"requested_amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Requested Amount","examples":["60000.00"]},"bank_name":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Bank Name","examples":["«Элдик Банк»"]},"status":{"$ref":"#/components/schemas/Status"},"disbursement_amount":{"anyOf":[{"type":"string","pattern":"^(?!^[-+.]*$)[+-]?0*\\d*\\.?\\d*$"},{"type":"null"}],"title":"Disbursement Amount","examples":["60000.00"]},"disbursement_paid_at":{"anyOf":[{"type":"string","format":"date"},{"type":"null"}],"title":"Disbursement Paid At","examples":["2026-08-20"]},"payment_confirmed":{"type":"boolean","title":"Payment Confirmed","default":false,"examples":[false]}},"type":"object","required":["id","number","student_name","speciality","course","requested_amount","status"],"title":"UniversityStudentOut","description":"Элемент списка студентов-заёмщиков вуза.","examples":[{"bank_name":"«Элдик Банк»","course":2,"disbursement_amount":"60000.00","disbursement_paid_at":"2026-08-20","id":"9d6f1c40-3a2b-4e51-8c7d-1f2a3b4c5d6e","number":"NAS-KNU-2026-0000042","payment_confirmed":false,"requested_amount":"60000.00","speciality":"Программная инженерия","status":"disbursed","student_name":"Асанов Азамат Бакытович"}]},"UserListItem":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","examples":["708192a3-b4c5-46d7-a8e9-f01234567890"]},"pin":{"type":"string","title":"Pin","examples":["10101199000101"]},"full_name":{"type":"string","title":"Full Name","examples":["Асанов Азамат Бакытович"]},"role":{"$ref":"#/components/schemas/Role"},"org_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Code","examples":[null]},"created_at":{"type":"string","format":"date-time","title":"Created At","examples":["2026-08-05T09:15:00Z"]}},"type":"object","required":["id","pin","full_name","role","org_code","created_at"],"title":"UserListItem","description":"Пользователь для администрирования.","examples":[{"created_at":"2026-08-05T09:15:00Z","full_name":"Асанов Азамат Бакытович","id":"708192a3-b4c5-46d7-a8e9-f01234567890","pin":"10101199000101","role":"student"}]},"UserOut":{"properties":{"id":{"type":"string","format":"uuid","title":"Id","examples":["1a2b3c4d-5e6f-4071-8213-9a0b1c2d3e4f"]},"pin":{"type":"string","title":"Pin","examples":["10101199000101"]},"full_name":{"type":"string","title":"Full Name","examples":["Асанов Азамат Бакытович"]},"role":{"$ref":"#/components/schemas/Role"},"org_code":{"anyOf":[{"type":"string"},{"type":"null"}],"title":"Org Code","examples":[null]},"created_at":{"type":"string","format":"date-time","title":"Created At","examples":["2026-08-05T09:15:00Z"]}},"type":"object","required":["id","pin","full_name","role","org_code","created_at"],"title":"UserOut","examples":[{"created_at":"2026-08-05T09:15:00Z","full_name":"Асанов Азамат Бакытович","id":"1a2b3c4d-5e6f-4071-8213-9a0b1c2d3e4f","pin":"10101199000101","role":"student"}]},"ValidationError":{"properties":{"loc":{"items":{"anyOf":[{"type":"string"},{"type":"integer"}]},"type":"array","title":"Location"},"msg":{"type":"string","title":"Message"},"type":{"type":"string","title":"Error Type"},"input":{"title":"Input"},"ctx":{"type":"object","title":"Context"}},"type":"object","required":["loc","msg","type"],"title":"ValidationError"}}},"tags":[{"name":"аутентификация","description":"Вход, выход, текущий пользователь. С этого начинается любой сценарий."},{"name":"заявка","description":"Кабинет заявителя: данные об учёбе, черновик, документы, отправка, график."},{"name":"поручитель","description":"Подтверждение и отзыв поручительства онлайн (ТЗ 3.12)."},{"name":"вуз","description":"Кабинет учебного заведения: свои студенты-заёмщики, оплата, сверка."},{"name":"банк","description":"Кабинет банка: очередь заявок, решения, перечисления, реквизиты доступа."},{"name":"министерство","description":"Сводка, контроль сроков, журнал обмена, отчёты, ежемесячные статусы."},{"name":"интеграции","description":"Входящие события банковских систем. Защита — подпись, не сессия."},{"name":"интеграторам","description":"Песочница, перечень кодов ошибок и готовые примеры вызовов."},{"name":"администрирование","description":"Пользователи и роли."},{"name":"служебные","description":"Проба состояния сервиса для оркестратора."}]}