Docs/API et Webhooks/Affectations

Affectations

Les affectations lient un élément de formation (une catégorie, module, sujet, cours ou scénario) à un utilisateur, équipe ou à l'organisation entière avec une échéance. Les mêmes enregistrements sous-tendent le flux d'auto-attribution SARIF. Tous les points de terminaison se trouvent sous /api/public/v1/assignments.

Points de terminaison

MéthodeCheminPortéeObjectif
GET/assignmentsassignments:readLister les affectations avec la progression agrégée.
GET/assignments/{'{'}id{'}'}assignments:readAffectation unique plus progression par utilisateur.
POST/assignmentsassignments:writeCréer une affectation. Déclenche assignment.created.
PATCH/assignments/{'{'}id{'}'}assignments:writeMettre à jour l'échéance, l'indicateur obligatoire, la note ou l'état actif.
DELETE/assignments/{'{'}id{'}'}assignments:writeDésactiver. Les enregistrements de progression sont préservés.

Vocabulaire destinataire et contenu

Chaque affectation porte une paire assigneeType + assigneeId, et un triplet contentArea + targetType + targetId. Les valeurs légales :

ChampValeurs légalesSignification de targetId / assigneeId
assigneeTypeuser, team, orgPour user et team, le assigneeId est l'UUID correspondant. Pour org, l'id est l'id de votre organisation.
contentAreapractice, learnpractice est des challenges pratiques ; learn est des cours et scénarios.
targetType pour practicecategory, module, topicSlug de chaîne, par exemple web, owasp-top-10, sql-injection.
targetType pour learncourse, scenarioSlug de chaîne, par exemple owasp-top-10-2025, phishing-call-2025.
targetType pour l'une ou l'autre zonecustom-courseUUID d'un cours personnalisé (voir Cours personnalisés). Les éléments du cours dictent quels sujets de pratique et/ou scénarios d'apprentissage sont suivis pour la complétion.

Lister les affectations

Renvoie chaque affectation de l'organisation, active et inactive, avec des agrégats de progression dénormalisés.

GET /api/public/v1/assignments
Authorization: Bearer scs_live_…

Réponse

[
  {
    "id": "d7c8a1b2-3e45-4f67-89ab-cd0123456789",
    "contentArea": "practice",
    "assigneeType": "team",
    "assigneeId": "4f8d3e2a-71cb-4d09-9ad7-5b8c7e1f0a32",
    "assigneeName": "Payments",
    "targetType": "topic",
    "targetId": "sql-injection",
    "targetTitle": "SQL Injection",
    "deadline": "2026-06-12T23:59:59Z",
    "isMandatory": true,
    "isActive": true,
    "isOverdue": false,
    "avgProgress": 42.5,
    "totalAssignees": 12,
    "completedAssignees": 3,
    "createdAt": "2026-05-29T08:00:00Z"
  }
]

Exemple

curl -sS -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/assignments

Récupérer une affectation

Mêmes champs que l'entrée de liste, plus le nom d'affichage de l'attribuant, la note optionnelle et un tableau de progression par utilisateur adapté aux rapports de conformité.

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

Réponse

{
  "id": "d7c8a1b2-3e45-4f67-89ab-cd0123456789",
  "contentArea": "practice",
  "assigneeType": "team",
  "assigneeId": "4f8d3e2a-71cb-4d09-9ad7-5b8c7e1f0a32",
  "assigneeName": "Payments",
  "targetType": "topic",
  "targetId": "sql-injection",
  "targetTitle": "SQL Injection",
  "deadline": "2026-06-12T23:59:59Z",
  "isMandatory": true,
  "isActive": true,
  "isOverdue": false,
  "note": "Follow-up to the May audit finding.",
  "assignedByName": "API Key: CI Ingestion",
  "avgProgress": 42.5,
  "totalAssignees": 12,
  "completedAssignees": 3,
  "createdAt": "2026-05-29T08:00:00Z",
  "userProgress": [
    {
      "userId": "b1a4d7c2-9e58-4f3a-83cd-2c6f1a90e7b4",
      "name": "Jane Smith",
      "email": "jane.smith@acme.com",
      "totalChallenges": 8,
      "completedChallenges": 8,
      "progressPercent": 100,
      "completedAt": "2026-06-04T10:18:42Z",
      "isOverdue": false
    }
  ]
}

Exemple

curl -sS -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/assignments/d7c8a1b2-3e45-4f67-89ab-cd0123456789

Créer une affectation

Crée l'affectation et déclenche assignment.created. Si le destinataire est une équipe ou l'organisation, les lignes de progression par utilisateur sont matérialisées pour chaque membre au moment de la création, donc la réponse de GET /assignments/{id} est immédiatement complète.

POST /api/public/v1/assignments
Authorization: Bearer scs_live_…
Content-Type: application/json

Corps de requête

ChampTypeRequisSignification
assigneeTypestringouiuser, team ou org.
assigneeIduuidouiId utilisateur, id équipe ou id organisation selon le type.
contentAreastringouipractice ou learn.
targetTypestringouiVoir le tableau de vocabulaire ci-dessus.
targetIdstringouiSlug ou id de la catégorie, module, sujet, cours ou scénario.
deadlineISO 8601ouiDate et heure d'échéance en UTC.
isMandatoryboolnonPar défaut true. Les affectations non obligatoires ne bloquent pas les rapports de conformité.
notestringnonTexte libre affiché au destinataire dans le tableau de bord.

Réponse

{
  "id": "d7c8a1b2-3e45-4f67-89ab-cd0123456789",
  "contentArea": "practice",
  "assigneeType": "team",
  "assigneeId": "4f8d3e2a-71cb-4d09-9ad7-5b8c7e1f0a32",
  "assigneeName": "Payments",
  "targetType": "topic",
  "targetId": "sql-injection",
  "targetTitle": "SQL Injection",
  "deadline": "2026-06-12T23:59:59Z",
  "isMandatory": true,
  "isActive": true,
  "isOverdue": false,
  "avgProgress": 0,
  "totalAssignees": 12,
  "completedAssignees": 0,
  "createdAt": "2026-05-29T08:00:00Z"
}

Exemple

curl -sS -X POST \
  -H "Authorization: Bearer $SCH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "assigneeType": "team",
    "assigneeId": "4f8d3e2a-71cb-4d09-9ad7-5b8c7e1f0a32",
    "contentArea": "practice",
    "targetType": "topic",
    "targetId": "sql-injection",
    "deadline": "2026-06-12T23:59:59Z",
    "isMandatory": true,
    "note": "Follow-up to the May audit finding."
  }' \
  https://api.limeplate.com/api/public/v1/assignments

Mettre à jour une affectation

Tout sous-ensemble de deadline, isMandatory, note et isActive peut être envoyé. Les champs omis sont laissés tels quels. Utilisez isActive: false comme équivalent non destructif à DELETE.

PATCH /api/public/v1/assignments/{assignmentId}
Authorization: Bearer scs_live_…
Content-Type: application/json

Corps de requête

ChampTypeSignification
deadlineISO 8601Nouvelle date d'échéance.
isMandatoryboolBasculer l'indicateur obligatoire.
notestringRemplacer la note. Envoyez une chaîne vide pour effacer.
isActiveboolActiver ou désactiver sans affecter la progression.

Réponse

{
  "message": "Assignment updated"
}

Exemple

curl -sS -X PATCH \
  -H "Authorization: Bearer $SCH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "deadline": "2026-06-26T23:59:59Z",
    "note": "Extended after sprint planning."
  }' \
  https://api.limeplate.com/api/public/v1/assignments/d7c8a1b2-3e45-4f67-89ab-cd0123456789

Désactiver une affectation

Définit isActive à false. L'affectation n'apparaît plus dans la vue « Mes affectations » du destinataire et cesse de contribuer aux métriques de conformité, mais les enregistrements de progression historiques sont préservés pour que les rapports pour les périodes passées résolvent toujours.

DELETE /api/public/v1/assignments/{assignmentId}
Authorization: Bearer scs_live_…

Réponse

{
  "message": "Assignment deactivated"
}

Exemple

curl -sS -X DELETE \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/assignments/d7c8a1b2-3e45-4f67-89ab-cd0123456789

Événements webhook

Créer une affectation via POST /assignments déclenche assignment.created une fois. Lorsqu'un destinataire unique atteint 100 % de progression sur la cible sous-jacente, assignment.completed se déclenche pour cet utilisateur — pour les affectations d'équipe et d'organisation, cela signifie un événement par membre atteignant 100 %, non un événement pour l'affectation entière. Les deux événements incluent l'id d'affectation et l'identité du destinataire. Abonnez-vous et vérifiez les signatures via /docs/api/webhooks.