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éthode | Chemin | Portée | Objectif |
|---|---|---|---|
GET | /users/{'{'}userId{'}'}/practice-progress | progress:read | Challenges de pratique terminés avec scores et horodatages. |
GET | /users/{'{'}userId{'}'}/learn-progress | progress:read | Scénarios en mode apprentissage avec statut. |
GET | /users/{'{'}userId{'}'}/assignments | progress:read | Affectations 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 exemplesql-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.phase1Scoreetphase2Scoreadditionnés fontscore; 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-progressProgression 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 destartedoucompleted.completedAt—nulljusqu'à 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-progressAffectations
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
}
]contentArea—practiceoulearn.targetType— pour la pratique :category,module,topicoucustom-course. Pour l'apprentissage :course,scenariooucustom-course.isOverdue—truesi 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/assignmentsSché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.