Dokumente/API & Webhooks/Fortschritt

Fortschritt

Lesen Sie den Schulungsfortschritt eines Benutzers: Übung (pro Challenge), Lernen (pro Szenario) und aktive Zuweisungen. Alle Endpunkte sind read-only und erfordern den progress:read-Geltungsbereich. Die Granularität ist absichtlich fein — die meisten LMS-Sync- und BI-Pipelines müssen nur diese drei Endpunkte pro Benutzer abfragen.

Endpunkte

MethodePfadGeltungsbereichZweck
GET/users/{'{'}userId{'}'}/practice-progressprogress:readAbgeschlossene Übungs-Challenges mit Punktzahlen und Zeitstempeln.
GET/users/{'{'}userId{'}'}/learn-progressprogress:readLern-Modus-Szenarien mit Status.
GET/users/{'{'}userId{'}'}/assignmentsprogress:readAktive Zuweisungen für den Benutzer mit Fortschrittsprozent.

Beachten Sie, dass diese Routen auf der Root-Ebene der API sitzen — /api/public/v1/users/{'{'}userId{'}'}/…, nicht unter /progress/. {'{'}userId{'}'} ist die SecureCodingHub-Benutzer-ID, die von der Users-API und Webhook-Payloads zurückgegeben wird.

Übungsfortschritt

Eine Zeile pro Challenge, die der Benutzer abgeschlossen hat. Übungs-Topics bestehen aus mehreren Challenges (indiziert ab 0), und jede Challenge läuft durch zwei Phasen — Schwachstellenidentifikation und Patch-Auswahl — die unabhängig bewertet werden.

GET /api/public/v1/users/{userId}/practice-progress
Authorization: Bearer scs_live_…

Antwort

[
  {
    "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 — Katalog-ID des Übungs-Topics (z.B. sql-injection, xss, ssrf).
  • challengeIndex — null-basierter Index der Challenge innerhalb des Topics.
  • language — Sprache, in der der Benutzer die Challenge gelöst hat.
  • score — Gesamt aus 100. phase1Score und phase2Score ergeben zusammen score; jede ist aus 50.
  • phase1HintUsed / phase2HintUsed — boolesch; der Client entscheidet, was die Hinweis-Nutzung kostet, der Server zeichnet nur das Flag und die resultierende Punktzahl auf.
  • completedAt — ISO 8601 UTC-Zeitstempel des letzten Abschlusses.

Nur abgeschlossene Challenges erscheinen in dieser Liste. In-Flight-Versuche werden nicht offengelegt.

Beispiel

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/users/1a2b3c4d-5e6f-7081-9203-4d5e6f708192/practice-progress

Lernfortschritt

Eine Zeile pro Lern-Modus-Szenario, das der Benutzer geöffnet hat. Lern-Szenarien sind geführte Walkthroughs, verfolgt nach Schrittzahl und einem groben status-Feld.

GET /api/public/v1/users/{userId}/learn-progress
Authorization: Bearer scs_live_…

Antwort

[
  {
    "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 — Katalog-ID des Szenarios.
  • currentStep / totalSteps — Fortschritt innerhalb des Szenarios. Wenn gleich, ist das Szenario beendet.
  • status — eines von started oder completed.
  • completedAtnull bis das Szenario beendet ist.
  • lastAccessAt — letztes Mal, dass der Benutzer das Szenario geöffnet hat, unabhängig davon, ob er Fortschritte gemacht hat.

Beispiel

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/users/1a2b3c4d-5e6f-7081-9203-4d5e6f708192/learn-progress

Zuweisungen

Aktive Zuweisungen für den Benutzer, mit einem vorberechneten Abschlussprozentsatz, sodass Sie sich nicht selbst gegen Übungs- und Lernfortschritt joinen müssen. Beinhaltet Zuweisungen auf Benutzer-, Team- und Organisationsebene, die auf diese Person heruntergebrochen sind.

GET /api/public/v1/users/{userId}/assignments
Authorization: Bearer scs_live_…

Antwort

[
  {
    "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 oder learn.
  • targetType — für Übung: category, module, topic oder custom-course. Für Lernen: course, scenario oder custom-course.
  • isOverduetrue, wenn die Frist abgelaufen ist und die Zuweisung noch nicht abgeschlossen ist.
  • progressPercent — Abschlussquote skaliert auf 0–100.

Beispiel

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/users/1a2b3c4d-5e6f-7081-9203-4d5e6f708192/assignments

Polling-Muster

Für LMS- oder BI-Pipelines ist eine stündliche Batch-Abfrage normalerweise ausreichend — Übungs- und Lernfortschritt ändert sich nur, wenn ein Benutzer Arbeit abschließt. Für engere Live-Dashboards auf der Zuweisungsseite abonnieren Sie das assignment.completed-Webhook anstelle von Polling; siehe Webhooks. Es gibt kein practice.completed- oder learn.completed-Ereignis in v1 — fragen Sie diese Endpunkte dafür ab.