Документация/API и Webhook'и/Прогресс

Прогресс

Чтение учебного прогресса пользователя: практика (по задачам), обучение (по сценариям) и активные задания. Все эндпоинты только для чтения и требуют области progress:read. Гранулярность намеренно тонкая — большинство пайплайнов LMS-синхронизации и BI просто опрашивают эти три эндпоинта на пользователя.

Конечные точки

МетодПутьОбласть действияНазначение
GET/users/{'{'}userId{'}'}/practice-progressprogress:readЗавершённые практические задачи с оценками и временными метками.
GET/users/{'{'}userId{'}'}/learn-progressprogress:readСценарии learn-режима со статусом.
GET/users/{'{'}userId{'}'}/assignmentsprogress:readАктивные задания пользователя с процентом прогресса.

Заметьте, что эти маршруты находятся на корневом уровне API — /api/public/v1/users/{'{'}userId{'}'}/…, не под /progress/. {'{'}userId{'}'} — это id пользователя SecureCodingHub, возвращаемый API пользователей и полезными нагрузками webhook'ов.

Практический прогресс

Одна строка на задачу, которую пользователь завершил. Практические темы состоят из нескольких задач (индексируемых с 0), и каждая задача проходит через две фазы — идентификация уязвимости и выбор патча — оцениваемых независимо.

GET /api/public/v1/users/{userId}/practice-progress
Authorization: Bearer scs_live_…

Ответ

[
  {
    "topicId": "sql-injection",
    "challengeIndex": 0,
    "language": "python",
    "score": 100,
    "phase1Score": 50,
    "phase2Score": 50,
    "phase1HintUsed": false,
    "phase2HintUsed": false,
    "completedAt": "2026-05-20T14:32:08Z"
  },
  {
    "topicId": "sql-injection",
    "challengeIndex": 1,
    "language": "python",
    "score": 80,
    "phase1Score": 30,
    "phase2Score": 50,
    "phase1HintUsed": true,
    "phase2HintUsed": false,
    "completedAt": "2026-05-21T09:14:55Z"
  },
  {
    "topicId": "xss",
    "challengeIndex": 0,
    "language": "javascript",
    "score": 100,
    "phase1Score": 50,
    "phase2Score": 50,
    "phase1HintUsed": false,
    "phase2HintUsed": false,
    "completedAt": "2026-05-22T11:48:31Z"
  }
]
  • topicId — каталожный id практической темы (например, sql-injection, xss, ssrf).
  • challengeIndex — индекс задачи внутри темы с нуля.
  • language — язык, на котором пользователь решил задачу.
  • score — итого из 100. phase1Score и phase2Score в сумме дают score; каждая из 50.
  • phase1HintUsed / phase2HintUsed — булево; клиент решает, сколько стоит использование подсказки, сервер только записывает флаг и результирующую оценку.
  • completedAt — ISO 8601 UTC временная метка самого недавнего завершения.

В этом списке появляются только завершённые задачи. Попытки в процессе не раскрываются.

Пример

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/users/1a2b3c4d-5e6f-7081-9203-4d5e6f708192/practice-progress

Учебный прогресс

Одна строка на сценарий learn-режима, который пользователь открыл. Учебные сценарии — это направляемые прохождения, отслеживаемые по количеству шагов и грубому полю status.

GET /api/public/v1/users/{userId}/learn-progress
Authorization: Bearer scs_live_…

Ответ

[
  {
    "scenarioId": "auth-bypass-walkthrough",
    "currentStep": 8,
    "totalSteps": 8,
    "status": "completed",
    "startedAt": "2026-05-18T13:02:11Z",
    "completedAt": "2026-05-18T13:41:07Z",
    "lastAccessAt": "2026-05-18T13:41:07Z"
  },
  {
    "scenarioId": "jwt-tampering",
    "currentStep": 3,
    "totalSteps": 7,
    "status": "started",
    "startedAt": "2026-05-23T16:20:00Z",
    "completedAt": null,
    "lastAccessAt": "2026-05-24T10:08:42Z"
  }
]
  • scenarioId — каталожный id сценария.
  • currentStep / totalSteps — прогресс внутри сценария. Когда равны, сценарий завершён.
  • status — один из started или completed.
  • completedAtnull, пока сценарий не завершён.
  • lastAccessAt — последний раз, когда пользователь открыл сценарий, независимо от того, продвинулся ли он.

Пример

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/users/1a2b3c4d-5e6f-7081-9203-4d5e6f708192/learn-progress

Задания

Активные задания для пользователя с предвычисленным процентом завершения, чтобы Вам не нужно было самостоятельно объединять с практическим и учебным прогрессом. Включает задания на уровне пользователя, команды и организации, разрешённые до этого индивида.

GET /api/public/v1/users/{userId}/assignments
Authorization: Bearer scs_live_…

Ответ

[
  {
    "id": "f1a2b3c4-d5e6-4708-8192-03405e6f7081",
    "contentArea": "practice",
    "targetType": "topic",
    "targetId": "sql-injection",
    "targetTitle": "SQL Injection",
    "deadline": "2026-06-15T00:00:00Z",
    "isMandatory": true,
    "isOverdue": false,
    "isCompleted": false,
    "totalItems": 5,
    "completedItems": 2,
    "progressPercent": 40.0,
    "note": "Assigned after CodeQL finding in payments-api."
  },
  {
    "id": "a2b3c4d5-e6f7-4081-9203-405e6f708192",
    "contentArea": "learn",
    "targetType": "scenario",
    "targetId": "auth-bypass-walkthrough",
    "targetTitle": "Auth Bypass Walkthrough",
    "deadline": "2026-05-31T00:00:00Z",
    "isMandatory": false,
    "isOverdue": false,
    "isCompleted": true,
    "totalItems": 1,
    "completedItems": 1,
    "progressPercent": 100.0,
    "note": null
  }
]
  • contentAreapractice или learn.
  • targetType — для практики: category, module, topic или custom-course. Для обучения: course, scenario или custom-course.
  • isOverduetrue, если срок прошёл и задание ещё не завершено.
  • progressPercent — соотношение завершения, масштабированное к 0–100.

Пример

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/users/1a2b3c4d-5e6f-7081-9203-4d5e6f708192/assignments

Шаблоны опроса

Для LMS- или BI-пайплайнов пакетный опрос раз в час обычно достаточен — практический и учебный прогресс изменяются только когда пользователь заканчивает работу. Для более плотных живых панелей со стороны заданий подписывайтесь на webhook assignment.completed вместо опроса; см. Webhook'и. В v1 нет события practice.completed или learn.completed — опрашивайте эти эндпоинты для этого.