進捗
ユーザーのトレーニング進捗を読み取ります: 練習 (チャレンジごと)、学習 (シナリオごと)、アクティブな課題。すべてのエンドポイントは読み取り専用で、progress:readスコープが必要です。粒度は意図的に細かくなっています — ほとんどのLMS同期およびBIパイプラインは、ユーザーごとにこれらの3つのエンドポイントをポーリングするだけで済みます。
エンドポイント
| メソッド | パス | スコープ | 目的 |
|---|---|---|---|
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と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-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学習進捗
ユーザーが開いた学習モードシナリオにつき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— シナリオ内の進捗。等しい場合、シナリオは終了しています。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パイプラインの場合、1時間に1回のバッチポーリングが通常で十分です — 練習と学習の進捗はユーザーが作業を終えたときにのみ変化します。課題側のよりタイトなライブダッシュボードの場合、ポーリングの代わりにassignment.completed Webhookを購読してください。Webhookを参照してください。v1にはpractice.completedやlearn.completedイベントはありません — それらにはこれらのエンドポイントをポーリングしてください。