Docs/API et Webhooks/Progression

Progression

Lisez la progression de formation d'un utilisateur : pratique (par challenge), apprentissage (par scénario) et affectations actives. Tous les points de terminaison sont en lecture seule et nécessitent la portée progress:read. La granularité est intentionnellement fine — la plupart des pipelines de synchronisation LMS et BI ont juste besoin d'interroger ces trois points de terminaison par utilisateur.

Points de terminaison

MéthodeCheminPortéeObjectif
GET/users/{'{'}userId{'}'}/practice-progressprogress:readChallenges de pratique terminés avec scores et horodatages.
GET/users/{'{'}userId{'}'}/learn-progressprogress:readScénarios en mode apprentissage avec statut.
GET/users/{'{'}userId{'}'}/assignmentsprogress:readAffectations actives pour l'utilisateur avec pourcentage de progression.

Notez que ces routes se trouvent au niveau racine de l'API — /api/public/v1/users/{'{'}userId{'}'}/…, et non sous /progress/. {'{'}userId{'}'} est l'id utilisateur SecureCodingHub, renvoyé par l'API Utilisateurs et les charges utiles webhook.

Progression de pratique

Une ligne par challenge que l'utilisateur a terminé. Les sujets de pratique se composent de plusieurs challenges (indexés depuis 0), et chaque challenge passe par deux phases — identification de vulnérabilité et sélection de correctif — notées indépendamment.

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

Réponse

[
  {
    "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 catalogue du sujet de pratique (par exemple sql-injection, xss, ssrf).
  • challengeIndex — index basé sur zéro du challenge dans le sujet.
  • language — langage dans lequel l'utilisateur a résolu le challenge.
  • score — total sur 100. phase1Score et phase2Score additionnés font score ; chacun est sur 50.
  • phase1HintUsed / phase2HintUsed — booléen ; le client décide ce que coûte l'utilisation d'indice, le serveur n'enregistre que l'indicateur et le score résultant.
  • completedAt — horodatage UTC ISO 8601 de la complétion la plus récente.

Seuls les challenges terminés apparaissent dans cette liste. Les tentatives en cours ne sont pas exposées.

Exemple

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

Progression d'apprentissage

Une ligne par scénario en mode apprentissage que l'utilisateur a ouvert. Les scénarios d'apprentissage sont des parcours guidés, suivis par compteur d'étapes et un champ status grossier.

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

Réponse

[
  {
    "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 catalogue du scénario.
  • currentStep / totalSteps — progression dans le scénario. Lorsqu'ils sont égaux, le scénario est terminé.
  • status — l'un de started ou completed.
  • completedAtnull jusqu'à ce que le scénario soit terminé.
  • lastAccessAt — dernière fois que l'utilisateur a ouvert le scénario, qu'il ait fait des progrès ou non.

Exemple

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

Affectations

Affectations actives pour l'utilisateur, avec un pourcentage de complétion précalculé pour que vous n'ayez pas besoin de joindre vous-même contre la progression de pratique et d'apprentissage. Inclut les affectations au niveau utilisateur, au niveau équipe et au niveau organisation résolues jusqu'à cet individu.

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

Réponse

[
  {
    "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 ou learn.
  • targetType — pour la pratique : category, module, topic ou custom-course. Pour l'apprentissage : course, scenario ou custom-course.
  • isOverduetrue si l'échéance est passée et que l'affectation n'est pas encore terminée.
  • progressPercent — ratio de complétion mis à l'échelle de 0 à 100.

Exemple

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

Schémas d'interrogation

Pour les pipelines LMS ou BI, une interrogation par lot une fois par heure suffit normalement — la progression de pratique et d'apprentissage ne change que lorsqu'un utilisateur termine du travail. Pour des tableaux de bord en direct plus serrés du côté affectation, abonnez-vous au webhook assignment.completed au lieu d'interroger ; voir Webhooks. Il n'y a pas d'événement practice.completed ou learn.completed en v1 — interrogez ces points de terminaison pour cela.