Документация/API и Webhook'и/Задания

Задания

Задания привязывают часть обучения (категорию, модуль, тему, курс или сценарий) к пользователю, команде или всей организации со сроком. Те же записи поддерживают поток автоназначения SARIF. Все эндпоинты находятся под /api/public/v1/assignments.

Конечные точки

МетодПутьОбласть действияНазначение
GET/assignmentsassignments:readСписок заданий с агрегированным прогрессом.
GET/assignments/{'{'}id{'}'}assignments:readОдно задание плюс прогресс по каждому пользователю.
POST/assignmentsassignments:writeСоздать задание. Срабатывает assignment.created.
PATCH/assignments/{'{'}id{'}'}assignments:writeОбновить срок, флаг обязательности, заметку или активное состояние.
DELETE/assignments/{'{'}id{'}'}assignments:writeДеактивировать. Записи прогресса сохраняются.

Словарь получателя и контента

Каждое задание несёт пару assigneeType + assigneeId, и тройку contentArea + targetType + targetId. Допустимые значения:

ПолеДопустимые значенияЗначение targetId / assigneeId
assigneeTypeuser, team, orgДля user и team assigneeId — это соответствующий UUID. Для org id — это id Вашей организации.
contentAreapractice, learnpractice — это практические задачи; learn — курсы и сценарии.
targetType для practicecategory, module, topicСтроковый slug, например web, owasp-top-10, sql-injection.
targetType для learncourse, scenarioСтроковый slug, например owasp-top-10-2025, phishing-call-2025.
targetType для любой областиcustom-courseUUID пользовательского курса (см. Пользовательские курсы). Элементы курса диктуют, какие практические темы и/или учебные сценарии отслеживаются для завершения.

Список заданий

Возвращает каждое задание в организации, активное и неактивное, с денормализованными агрегатами прогресса.

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

Ответ

[
  {
    "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"
  }
]

Пример

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

Получить задание

Те же поля, что и запись списка, плюс отображаемое имя назначающего, опциональная заметка и массив прогресса по каждому пользователю, подходящий для отчётов о соответствии.

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

Ответ

{
  "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
    }
  ]
}

Пример

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

Создать задание

Создаёт задание и срабатывает assignment.created. Если получатель — это команда или организация, строки прогресса по каждому пользователю материализуются для каждого участника во время создания, поэтому ответ GET /assignments/{id} немедленно полный.

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

Тело запроса

ПолеТипОбязательноЗначение
assigneeTypestringдаuser, team или org.
assigneeIduuidдаID пользователя, ID команды или ID организации в зависимости от типа.
contentAreastringдаpractice или learn.
targetTypestringдаСм. таблицу словаря выше.
targetIdstringдаSlug или id категории, модуля, темы, курса или сценария.
deadlineISO 8601даДата и время срока в UTC.
isMandatoryboolнетПо умолчанию true. Необязательные задания не блокируют отчёты о соответствии.
notestringнетСвободный текст, показываемый получателю в панели.

Ответ

{
  "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"
}

Пример

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

Обновить задание

Любое подмножество deadline, isMandatory, note и isActive может быть отправлено. Опущенные поля остаются как есть. Используйте isActive: false как неразрушающий эквивалент DELETE.

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

Тело запроса

ПолеТипЗначение
deadlineISO 8601Новый срок.
isMandatoryboolПереключить флаг обязательности.
notestringЗаменить заметку. Отправьте пустую строку для очистки.
isActiveboolАктивировать или деактивировать без влияния на прогресс.

Ответ

{
  "message": "Assignment updated"
}

Пример

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

Деактивировать задание

Устанавливает isActive в false. Задание больше не появляется в представлении «Мои задания» получателя и перестаёт вносить вклад в метрики соответствия, но исторические записи прогресса сохраняются, чтобы отчёты за прошлые периоды по-прежнему разрешались.

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

Ответ

{
  "message": "Assignment deactivated"
}

Пример

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

Webhook-события

Создание задания через POST /assignments срабатывает assignment.created один раз. Когда любой одиночный получатель достигает 100% прогресса на основной цели, assignment.completed срабатывает для этого пользователя — для заданий команды и организации это означает одно событие на участника, достигающего 100%, а не одно событие для всего задания. Оба события включают id задания и идентичность получателя. Подписывайтесь и верифицируйте подписи через /docs/api/webhooks.