Задания
Задания привязывают часть обучения (категорию, модуль, тему, курс или сценарий) к пользователю, команде или всей организации со сроком. Те же записи поддерживают поток автоназначения SARIF. Все эндпоинты находятся под /api/public/v1/assignments.
Конечные точки
| Метод | Путь | Область действия | Назначение |
|---|---|---|---|
| GET | /assignments | assignments:read | Список заданий с агрегированным прогрессом. |
| GET | /assignments/{'{'}id{'}'} | assignments:read | Одно задание плюс прогресс по каждому пользователю. |
| POST | /assignments | assignments:write | Создать задание. Срабатывает assignment.created. |
| PATCH | /assignments/{'{'}id{'}'} | assignments:write | Обновить срок, флаг обязательности, заметку или активное состояние. |
| DELETE | /assignments/{'{'}id{'}'} | assignments:write | Деактивировать. Записи прогресса сохраняются. |
Словарь получателя и контента
Каждое задание несёт пару assigneeType + assigneeId, и тройку contentArea + targetType + targetId. Допустимые значения:
| Поле | Допустимые значения | Значение targetId / assigneeId |
|---|---|---|
assigneeType | user, team, org | Для user и team assigneeId — это соответствующий UUID. Для org id — это id Вашей организации. |
contentArea | practice, learn | practice — это практические задачи; learn — курсы и сценарии. |
targetType для practice | category, module, topic | Строковый slug, например web, owasp-top-10, sql-injection. |
targetType для learn | course, scenario | Строковый slug, например owasp-top-10-2025, phishing-call-2025. |
targetType для любой области | custom-course | UUID пользовательского курса (см. Пользовательские курсы). Элементы курса диктуют, какие практические темы и/или учебные сценарии отслеживаются для завершения. |
Список заданий
Возвращает каждое задание в организации, активное и неактивное, с денормализованными агрегатами прогресса.
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Тело запроса
| Поле | Тип | Обязательно | Значение |
|---|---|---|---|
assigneeType | string | да | user, team или org. |
assigneeId | uuid | да | ID пользователя, ID команды или ID организации в зависимости от типа. |
contentArea | string | да | practice или learn. |
targetType | string | да | См. таблицу словаря выше. |
targetId | string | да | Slug или id категории, модуля, темы, курса или сценария. |
deadline | ISO 8601 | да | Дата и время срока в UTC. |
isMandatory | bool | нет | По умолчанию true. Необязательные задания не блокируют отчёты о соответствии. |
note | string | нет | Свободный текст, показываемый получателю в панели. |
Ответ
{
"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Тело запроса
| Поле | Тип | Значение |
|---|---|---|
deadline | ISO 8601 | Новый срок. |
isMandatory | bool | Переключить флаг обязательности. |
note | string | Заменить заметку. Отправьте пустую строку для очистки. |
isActive | bool | Активировать или деактивировать без влияния на прогресс. |
Ответ
{
"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-cd0123456789Webhook-события
Создание задания через POST /assignments срабатывает assignment.created один раз. Когда любой одиночный получатель достигает 100% прогресса на основной цели, assignment.completed срабатывает для этого пользователя — для заданий команды и организации это означает одно событие на участника, достигающего 100%, а не одно событие для всего задания. Оба события включают id задания и идентичность получателя. Подписывайтесь и верифицируйте подписи через /docs/api/webhooks.