문서/API 및 웹훅/진행 상황

진행 상황

사용자의 교육 진행 상황을 읽어보세요: 연습(챌린지별), 학습(시나리오별) 및 활성 과제. 모든 엔드포인트는 읽기 전용이며 progress:read 범위가 필요합니다. 세분성은 의도적으로 세밀합니다 — 대부분의 LMS 동기화 및 BI 파이프라인은 사용자별로 이 세 엔드포인트를 폴링하면 됩니다.

엔드포인트

MethodPathScope용도
GET/users/{'{'}userId{'}'}/practice-progressprogress:read점수와 타임스탬프가 있는 완료된 연습 챌린지.
GET/users/{'{'}userId{'}'}/learn-progressprogress:read상태가 있는 학습 모드 시나리오.
GET/users/{'{'}userId{'}'}/assignmentsprogress: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점 만점. phase1Scorephase2Score의 합이 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 — 시나리오 내 진행 상황. 같을 때, 시나리오가 완료된 것입니다.
  • statusstarted 또는 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
  }
]
  • contentAreapractice 또는 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 이벤트가 없습니다 — 이를 위해서는 이 엔드포인트를 폴링하세요.