Прогресс
Чтение учебного прогресса пользователя: практика (по задачам), обучение (по сценариям) и активные задания. Все эндпоинты только для чтения и требуют области progress:read. Гранулярность намеренно тонкая — большинство пайплайнов LMS-синхронизации и BI просто опрашивают эти три эндпоинта на пользователя.
Конечные точки
| Метод | Путь | Область действия | Назначение |
|---|---|---|---|
GET | /users/{'{'}userId{'}'}/practice-progress | progress:read | Завершённые практические задачи с оценками и временными метками. |
GET | /users/{'{'}userId{'}'}/learn-progress | progress:read | Сценарии learn-режима со статусом. |
GET | /users/{'{'}userId{'}'}/assignments | progress: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.completedAt—null, пока сценарий не завершён.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
}
]contentArea—practiceилиlearn.targetType— для практики:category,module,topicилиcustom-course. Для обучения:course,scenarioилиcustom-course.isOverdue—true, если срок прошёл и задание ещё не завершено.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 — опрашивайте эти эндпоинты для этого.