진행 상황
사용자의 교육 진행 상황을 읽어보세요: 연습(챌린지별), 학습(시나리오별) 및 활성 과제. 모든 엔드포인트는 읽기 전용이며 progress:read 범위가 필요합니다. 세분성은 의도적으로 세밀합니다 — 대부분의 LMS 동기화 및 BI 파이프라인은 사용자별로 이 세 엔드포인트를 폴링하면 됩니다.
엔드포인트
| Method | Path | Scope | 용도 |
|---|---|---|---|
GET | /users/{'{'}userId{'}'}/practice-progress | progress:read | 점수와 타임스탬프가 있는 완료된 연습 챌린지. |
GET | /users/{'{'}userId{'}'}/learn-progress | progress:read | 상태가 있는 학습 모드 시나리오. |
GET | /users/{'{'}userId{'}'}/assignments | progress:read | 진행률이 있는 사용자의 활성 과제. |
이러한 라우트는 API의 루트 레벨에 있다는 점에 유의하세요 — /progress/ 아래가 아닌 /api/public/v1/users/{'{'}userId{'}'}/…입니다. {'{'}userId{'}'}는 Users API와 웹훅 페이로드가 반환하는 SecureCodingHub 사용자 id입니다.
연습 진행 상황
사용자가 완료한 챌린지당 하나의 행. 연습 주제는 여러 챌린지(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— 주제 내 챌린지의 0 기반 인덱스.language— 사용자가 챌린지를 해결한 언어.score— 100점 만점.phase1Score와phase2Score의 합이score이며, 각각은 50점 만점입니다.phase1HintUsed/phase2HintUsed— boolean. 클라이언트가 힌트 사용 비용을 결정하며, 서버는 플래그와 결과 점수만 기록합니다.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학습 진행 상황
사용자가 연 학습 모드 시나리오당 하나의 행. 학습 시나리오는 가이드 워크스루이며, 단계 수와 거친 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 파이프라인의 경우, 시간당 한 번의 배치 폴링이 일반적으로 충분합니다 — 연습 및 학습 진행 상황은 사용자가 작업을 완료할 때만 변경됩니다. 과제 측의 더 긴밀한 라이브 대시보드의 경우, 폴링 대신 assignment.completed 웹훅을 구독하세요. 웹훅 참조. v1에는 practice.completed 또는 learn.completed 이벤트가 없습니다 — 이를 위해서는 이 엔드포인트를 폴링하세요.