TrustExam ProctoringIntegration docs
Интеграция с платформой TrustExam

Прокторинг: backend и frontend SDK

Полное руководство по подключению онлайн-прокторинга: регистрация пользователя и создание экзамена через API, запуск фронтенд-SDK на странице задания и получение отчёта о прохождении.

Обзор

Порядок действий

Четыре шага от создания экзамена на вашем backend до готового отчёта. Подробности каждого шага — в разделах ниже.

1

Ваш backend отправляет данные о студенте и экзамене на TrustExam API.

2

В ответе вы получаете external_session.token, который необходимо вставить в SDK JS.

3

Фронт запускает через SDK метод с параметрами — Proctoring.initialize({ token: external_session.token }).

4

Результаты доступны через report_url.

Схема

Последовательность взаимодействия

ПОДГОТОВКА ЗАПУСК ЭКЗАМЕН ЗАВЕРШЕНИЕ Одна страница в браузере студента Ваш backend ваша платформа TrustExam API api.trustexam.ai Proctoring SDK встроен в страницу Ваш frontend страница экзамена POST assignment.json X-Authorization: API-ключ 200 · external_session.token report_url · session_url token → на страницу экзамена <script src="…/app.js"> Proctoring.initialize({ token }) onMounted() · onConfigured() Proctoring.start() action: started POST webhook.start_url опционально видеозаписи · нарушения · onAction(action) Content Protect защищает контейнер на странице Proctoring.finish() action: finished onFinished() POST webhook.finish_url JSON-отчёт · либо просмотр по report_url
ваши системы TrustExam — сплошная: вызов - - пунктир: обратный вызов / webhook рамка: один и тот же документ в браузере
Proctoring SDK и ваш frontend — это одна и та же страница экзамена: вызовы между ними происходят внутри документа, отдельные дорожки показаны только чтобы разделить ваш код и код SDK. Токен создаётся на вашем backend и доезжает до этой страницы; дальше SDK общается с TrustExam API напрямую, а результат возвращается вам двумя путями — webhook на finish_url и внешняя ссылка report_url.
Если текущая попытка уже завершена, Proctoring.start() сам вызовет Proctoring.startNewAttempt() — отдельный шаг в схеме для этого не нужен.
Доступы

Ключ и доступы

Реальные доступы в этой публичной документации не приводятся. Запросите логин, пароль и API-ключ у команды TrustExam, вход в систему — app.trustexam.ai. Подставьте свои значения в поля ниже — они прокинутся во все примеры кода на странице и останутся только в вашем браузере.
Базовый адрес API — подставляется в запрос на создание экзамена
Заголовок X-Authorization при создании экзамена
Backend

Создание экзамена и регистрация пользователя

Запрос предназначен для создания / регистрации одного пользователя. Данный запрос вы можете встроить перед тем как пользователь откроет страницу экзамена, либо заранее, осуществить запрос на каждого пользователя и хранить значения у себя. В ответе вы получите JSON, из которого нужно использовать только — {"external_session": {"token": "…"}}.

Консоль отправляет настоящий запрос на боевой API. Каждая успешная отправка создаёт экзамен и регистрирует пользователя. Используйте тестовые external_id, либо скопируйте запрос как cURL и выполните его у себя.
POST
Свойства POST-запроса — правки сразу уходят в тело запроса
Backend

Конструктор настроек прокторинга

Соберите конфигурацию переключателями — справа собирается готовый объект proctoring_settings. Изменённые относительно значений по умолчанию параметры подсвечиваются. Результат сразу подставляется в assignment.settings.proctoring_settings тела запроса в разделе Создание экзамена.

Пресеты
proctoring_settings

          
Frontend SDK

Подключение

TrustExam Proctoring SDK предназначен для интеграции системы онлайн-прокторинга в сторонние веб-приложения. Он предоставляет методы для инициализации, запуска, завершения и повторного начала экзаменационных попыток, а также обратные вызовы для отслеживания состояния и ошибок.

Подключите скрипт SDK в HTML-страницу экзамена. После загрузки он создаёт глобальный объект Proctoring — через него вызываются все методы, описанные ниже.

HTML
<script src="https://cdn.trustexam.ai/extension/app.js"></script>
Frontend SDK

Инициализация

JavaScript
Proctoring.initialize('.wrapper', {
    language: 'en', // en / ru / kz
    token: 'YOUR_SESSION_TOKEN', // external_session.token from backend api response

    protector: {
        match: '.question-wrapper',
        textColor: '#000'
    },

    onMounted: function () { ... },
    onConfigured: function () { ... },
    onStarted: function () { ... },
    onFinished: function () { ... },
    onAction: function (action) { ... },
    onError: function (error) { ... }
})
Параметры
selectorstring
контейнер для инициализации (например, .wrapper)
languagestring
язык интерфейса
tokenstring
токен, полученный при запросе к API, в ответе — {"external_session": {"token": "…"}}
Колбэки
onMounted()
вызывается после инициализации
onConfigured()
SDK успешно сконфигурирован
onStarted()
экзамен начат
onFinished()
экзамен завершён
onAction(action)
вызывается при действиях
onError(error)
обработка ошибок
Frontend SDK

Методы

1. Proctoring.start()

Начать задание. Вы должны вызвать этот метод, после того как пользователь начал экзамен на вашей платформе. Включает логику проверки завершенности задания. В случае если задание завершено, создаст новую поптыку, метод startNewAttempt — вызовется автоматически.

JavaScript
Proctoring.start()
  .then(() => console.log('started'))
  .catch(err => console.log(err))

2. Proctoring.finish()

Завершить задание. Также завершает текущую поптыку. Вы должны вызвать этот метод, после того как пользователь завершил экзамен на вашей платформе.

JavaScript
Proctoring.finish()
  .then(() => console.log('finished'))
  .catch(err => console.log(err))

3. Proctoring.startNewAttempt()

Начать новую попытку. Данный метод вызывается автоматически при вызове start(), в случае если текущая попытка завершена.

JavaScript
Proctoring.startNewAttempt()
  .then(() => console.log('new attempt started'))
  .catch(err => console.log('cannot start new attempt'))

Дополнительные вспомогательные методы

Proctoring.isStarted()
проверяет, начато ли задание
Proctoring.isFinished()
проверяет, завершено ли задание
Proctoring.isCanStartNewAttempt()
проверяет, можно ли создать новую попытку
Frontend SDK

Content Protect

Content Protect защищает содержимое одного контейнера на странице экзамена от скриншотов, записи экрана и программ удалённого управления. Функция включается с двух сторон: на backend — параметром content_protect: true в настройках прокторинга, на frontend — объектом protector в параметрах инициализации, где match задаёт защищаемый контейнер.

Защита содержимого
  • От скриншотов
  • Записи экрана
  • Удаленного управления
Есть ли ограничения?
  • Screen Share — только запись окна (displaySurface: window)
  • На старых ПК возможно не будет работать
  • Защитить можно только один элемент на странице
Как включить?
  • Backend — Передать "content_protect: true", в параметрах прокторинга
  • Frontend — Требуется передать protector (object) в параметрах ициниализации
Параметры инициализации
{
    ...

    protector: { match: '.question-wrapper', textColor: '#000' },

    ...
}
match
Это контейнер, который необходимо защитить
textColor
Цвет шрифта в вашем контейнрере

Пример текста

После инициализации попробуйте сделать скриншот следующего текста.

Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry's standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.
Демо

Демо-песочница

Кнопки вызывают реальные методы SDK на этой странице. Токен подставляется автоматически после успешного запроса в разделе Создание экзамена — либо укажите его вручную.

Из ответа API: external_session.token
Проверка SDK…
Контейнер .wrapper для SDK — здесь появится интерфейс прокторинга.
Лог событий
Отчётность

Отчет о прохождении экзамена

По завершении попытки система прокторинга формирует отчёт: фотографии пользователя и документа, видеозаписи экзамена, время начала и завершения, список нарушений, скоринг по шкале от 0 до 100, вердикт и комментарий проктора, а также AI-сводку. Получить его можно двумя способами — по внешней ссылке report_url или JSON-запросом на ваш webhook.finish_url.

Существует два вида отчета:

1. Получение URL-ссылки на отчет
внешняя ссылка

Прокторинговая система формирует ссылку на просмотр отчета об экзамене. Данную ссылку можно получить в ответе на запрос (создание экзамена).

Фрагмент ответа
{"report_url": "https://app.trustexam.ai/report/XXXXXX"}
2. Отправка сырых данных в формате JSON
Webhook

По окончании экзамена, система прокторинга формирует отчет и отправляет POST-запрос на endpoint указанный в параметрах экзамена (webhook.finish_url) в JSON-формате.

В текущем отчете будет отображены следующие данные:
  1. Фотография пользователя
  2. Фотография документа
  3. Видеозаписи прохождения экзамена
  4. Дата и время начала и завершения экзамена
  5. Список нарушений
  6. Скоринг по шкале от 0 до 100
  7. Вердикт проктора
  8. Комментарий проктора
  9. AI-отчет. Сводка, информация об экзамене
  10. Внешняя ссылка на отчет
Отчётность

Поля отчёта

Таблица — Отчет об экзамене
ПолеТипЗначение
identificationObject {“photo_url”: “https://storage.oqylyq.kz/document.jpg”, “document_url”: “https://storage.oqylyq.kz/document.jpg”}
school_idIntИдентификатор организации
assignment_idIntИдентификатор экзамена в системе прокторинга
assignment_external_idStringИдентификатор экзамена в вашей системе
assignment_attempt_idIntИдентификатор попытки в системе прокторинга
assignment_attempt_external_idStringИдентификатор попытки в вашей системе
user_idIntИдентификатор пользователя в системе прокторинга
user_external_idStringИдентификатор пользователя в вашей системе
credibilityIntСкоринг по 100 балльной шкале
started_atString (Datetime)Время начала экзамена.
Пример — 2026-06-15T15:30:00Z
finished_atString (Datetime)Время завершения экзамена.
Пример — 2026-06-15T15:30:00Z
actionsArray Список всех действий пользователя.
[
   {“id”: 1, “action_type”: “opened”, “created_at”: “2026-06-15T15:30:00Z”},

   {“id”: 2, “action_type”: “started”, “created_at”: “2026-06-15T15:31:00Z”},

   {“id”: 3, “action_type”: “finished”, “created_at”: “2026-06-15T16:30:00Z”}
]
violationsArray Список нарушений во время экзамена. Список нарушений перечислен в следующей таблице.
[
   {“id”: 1, “action_type”: “head_mismatch”, “screenshot_url” : “URL”, “created_at”: “2026-06-15T15:45:00Z”},

   {“id”: 2, “action_type”: “head_rotate”, “screenshot_url” : “URL”,  “created_at”: “2026-06-15T15:50:00Z”},

   {“id”: 3, “action_type”: “head_empty”, “screenshot_url” : “URL”,  “created_at”: “2026-06-15T15:55:00Z”}
]
videosArray Список видеозаписей.
Типы видеозаписей:
  • main-camera — Фронтальная камера
  • second-camera — Вторая камера
  • screen — Запись экрана
[
   {“id”: 1, “session-type”: “main-camera”, “record_url”: “URL”, “thumb_url”: “URL”, “video_duration”: 300, “video_size”: 1024},

   {“id”: 2, “session-type”: “second-camera”, “record_url”: “URL”, “thumb_url”: “URL”, “video_duration”: 300, “video_size”: 1024},

   {“id”: 3, “session-type”: “screen”, “record_url”: “URL”, “thumb_url”: “URL”, “video_duration”: 300, “video_size”: 1024}
]
proctor_reviewObject Комментарии и вердикт проктора.
Где status:
  • -1 — Отчет не готов
  • 0 — Отказ
  • 1 — Одобрено
Пример — {“status”: 1, “comment”: “Все отлично!”}
ai_reportObject {“risk”: {"level":"low","score":0}, “summary_ru”: “Студент завершил задание за 12 минут. Обнаружено 3 события речи. Выявлено одно критическое нарушение.”, “summary_en”: “...”}
report_urlStringВнешняя ссылка на отчет (упомянутая выше)
Отчётность

Список нарушений

Таблица — Список нарушений
Тип Штрафной балл Описание
noise_detect1Обнаружен посторонний шум
speech_detect1Распознан голос
earphone_detected50Обнаружен микронаушник
mic_muted0Микрофон отключен
bluetooth_detected0Обнаружено Bluetooth-устройство
bluetooth_off0Bluetooth отключен
wifi_detected20Обнаружена подозрительная Wi-Fi активность
wifi_off0Wi-Fi отключен
copy_paste10Попытка скопировать / вставить текст
connection_restored15Интернет соединение восстановлено, после потери соединения
focus_down5Потерян фокус
extension_detected50Обнаружено вспомогательное расширение
fullscreen_closed2Отключен полноэкранный режим
multiple_screen50Обнаружен второй монитор
usb_device_detected0Обнаружено устройство
task_process_detected0Обнаружено запрещенное программное обеспечение
head_mismatch20Пользователь не идентифицирован
head_empty5Пользователь исчез с видоискателя
head_many5Обнаружено несколько лиц
head_rotated1Пользователь повернул голову
head_depth1Пользователь находился далеко от камеры
eye_away1Отведен взгляд
object_detected1Обнаружены запрещенные предметы
Справка

Общие вопросы

Доступы и подключение

Что нужно получить перед началом интеграции?

Три вещи от менеджера интеграции: API-ключ организации, адреса стенда (API, CDN, приложение и отчёты, медиа-сервер, ИИ-отчёты) и подтверждённый состав полей студента. Адреса впишите в разделе «Адреса стенда» — все примеры на этой странице подставят их автоматически. API-ключ подставляется отдельно: введите его в поле api_token в шапке страницы, и он появится в примерах вместо YOUR_API_TOKEN.

Сколько запросов к API нужно на один экзамен?

Один. POST /api/external-session/assignment.json создаёт задание, регистрирует студента и возвращает токен. Запрос идемпотентный по assignment.external_id и student.external_id — повторный вызов обновляет данные, а не плодит дубликаты. Токены можно подготовить заранее, пачкой на всех участников, и сохранить у себя.

Где должен храниться API-ключ и можно ли создавать сессию из браузера?

Ключ живёт только на вашем backend и не должен попадать в JS-бандл, конфиг фронтенда, репозиторий и логи запросов. Создавать сессию из браузера нельзя: API-ключ даёт доступ к данным всей организации. Во фронтенд уходит исключительно external_session.token, привязанный к конкретной попытке. Передаётся ключ либо параметром ?api_token=YOUR_API_TOKEN, либо заголовком X-Authorization — см. «Создание экзамена».

Чем token отличается от access_token?

token — токен внешней сессии, рекомендуемый режим для внешних интеграций: SDK сам определит экзамен. access_token — Bearer-токен пользователя для внутренних интеграций, и он требует дополнительно передать assignment. Если не передано ни то, ни другое, initialize выбросит Access Token is required.

Нужно ли студенту что-то устанавливать?

В режиме assignment.application: browser — нет, всё работает в обычном браузере. Режимы desktop (защищённое приложение) и tray (фоновый агент) требуют отдельного дистрибутива — состав и порядок выдачи уточняйте у менеджера интеграции.

Можно ли сначала посмотреть форматы запросов, не имея доступов?

Да. Песочница возвращает заранее подготовленные ответы (в том числе 401 и 422) без обращения к сети, а конструктор собирает готовое тело запроса. Реальный стенд для тестов выдаёт менеджер.

Данные студента

Как передавать идентификатор студента и ФИО?

Идентификатор — обязательное поле student.external_id, ваш идентификатор пользователя. Именно по нему работает идемпотентность: повторный запрос обновляет того же студента, а не заводит нового.

Персональные данные (имя, фамилия, e-mail) передаются рядом с ним. Примеры запроса на этой странице собирают их плоскими полями объекта student:

как в примерах этой страницы
{ "external_id": "user-10254", "firstname": "Иван", "lastname": "Иванов", "email": "ivan.ivanov@example.com" }
Форму полей обязательно подтвердите у менеджера интеграции. В таблице полей раздела «Создание экзамена» зафиксирован только обязательный student.external_id; состав и форма персональных полей фиксируются при выдаче доступов к вашему стенду. Выясните нужный состав до начала работы и не угадывайте.
Какие данные студента уходят на платформу?

При создании сессии — обязательный student.external_id и персональные поля (имя, фамилия, e-mail), которые нужны для отчёта; см. вопрос выше.

Как связать отчёт со своей записью о попытке?

Передайте session_data.external_id при создании сессии — он вернётся в webhook типа Default полем assignment_attempt_external_id.

Где оказывается видеозапись?

На медиа-сервере платформы, по WebRTC, по мере записи. При включённой локальной записи после finish() открывается окно догрузки файлов — вкладку до конца загрузки закрывать нельзя, предупредите об этом студента в своём интерфейсе.

Результаты и отчёты

Как получить отчёт по экзамену?

Двумя способами, они дополняют друг друга:

  • report_url — готовая страница с видеозаписями, таймлайном событий и скриншотами. Приходит в ответе на создание сессии; сохраните её у себя сразу.
  • Webhook — платформа сама сообщит вашему серверу о старте и завершении, опрашивать API не нужно (Webhooks).

Отчёты живут на стороне платформы: report_url открывается по сохранённой ссылке, адрес приложения отчётов входит в адреса стенда, которые выдают при подключении.

Потеряли report_url — как восстановить?

Только повторным запросом создания сессии. Сохраняйте report_url в своей БД сразу, вместе с attempt.id, привязанными к попытке студента.

Как узнать о завершении экзамена, не опрашивая API?

Через webhooks: assignment.settings.webhook.start_url и finish_url. Туда же можно добавить свои поля в тело (post), заголовки (headers) и параметры строки запроса (query) — например авторизацию вашего эндпоинта.

Можно ли встроить отчёт в свой интерфейс?

Да, report_url открывается и отдельной вкладкой, и в <iframe>: это готовая страница с видеозаписями, таймлайном событий и скриншотами.

Нужен ли живой проктор?

Базовый сценарий — асинхронный: платформа пишет попытку, детекторы фиксируют события, по завершении доступны отчёт и ИИ-оценка риска (low / medium / high / critical) с текстовой сводкой и интервалами для просмотра. Нужен ли ручной разбор — решаете вы по уровню риска. Синхронный (живой) прокторинг эта документация не описывает — о нём разговаривайте с менеджером интеграции.

Требования к среде студента

Обязателен ли HTTPS?

Да. Без защищённого соединения браузер не отдаёт getUserMedia и getDisplayMedia — камера, микрофон и демонстрация экрана не запустятся.

Какие браузеры поддерживаются?

Параметр browser_type ограничивает, в каком браузере можно сдавать: * (любой), chrome, edge, opera, yandex. Это настройка допуска, а не матрица совместимости — минимальные версии браузеров в документации не зафиксированы, уточняйте их у менеджера интеграции. Проверьте интеграцию именно в тех браузерах, которые разрешаете студентам, — это отдельный пункт предстартового чек-листа.

Что открыть в закрытом сетевом контуре?

Домены CDN, API, медиа-сервера, приложения и ИИ-отчётов (см. «Куда обращается SDK»), а также WebRTC (STUN/TURN) и разрешения на камеру, микрофон и захват экрана в браузере пользователя.

Можно ли взять app.js с одного стенда, а API — с другого?

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

Настройки прокторинга

Нужно ли передавать весь proctoring_settings?

Нет — только то, что отличается от значений по умолчанию, остальное подставится само. Конструктор в режиме «Только изменённое» собирает минимальное тело запроса.

Как изменить настройки уже созданного экзамена?

Повторным POST с тем же assignment.external_id: запрос идемпотентный и обновит настройки, а не создаст второй экзамен.

Включили content_protect, но защиты нет.

Нужны обе части: content_protect: true в настройках экзамена на backend и protector.match с селектором защищаемого блока в initialize. Плюс ограничения: защитить можно только один элемент, демонстрация экрана возможна лишь в режиме записи окна, а на части устройств защита не активируется — предусмотрите запасной сценарий в onError.