Docs/APIとWebhook/進捗

進捗

ユーザーのトレーニング進捗を読み取ります: 練習 (チャレンジごと)、学習 (シナリオごと)、アクティブな課題。すべてのエンドポイントは読み取り専用で、progress:readスコープが必要です。粒度は意図的に細かくなっています — ほとんどのLMS同期およびBIパイプラインは、ユーザーごとにこれらの3つのエンドポイントをポーリングするだけで済みます。

エンドポイント

メソッドパススコープ目的
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とWebhookペイロードから返されるSecureCodingHubユーザーIDです。

練習進捗

ユーザーが完了した各チャレンジにつき1行。練習トピックは複数のチャレンジ (0からインデックス) で構成され、各チャレンジは2つのフェーズ — 脆弱性特定とパッチ選択 — を通過し、独立してスコア付けされます。

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-injectionxssssrf)。
  • challengeIndex — トピック内のチャレンジのゼロベースインデックス。
  • language — ユーザーがチャレンジを解いた言語。
  • score — 100点満点の合計。phase1Scorephase2Scorescoreに加算され、それぞれ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

学習進捗

ユーザーが開いた学習モードシナリオにつき1行。学習シナリオはガイド付きウォークスルーで、ステップ数と粗粒度の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 — 練習の場合: categorymoduletopic、またはcustom-course。学習の場合: coursescenario、または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パイプラインの場合、1時間に1回のバッチポーリングが通常で十分です — 練習と学習の進捗はユーザーが作業を終えたときにのみ変化します。課題側のよりタイトなライブダッシュボードの場合、ポーリングの代わりにassignment.completed Webhookを購読してください。Webhookを参照してください。v1にはpractice.completedlearn.completedイベントはありません — それらにはこれらのエンドポイントをポーリングしてください。