문서/API 및 웹훅/맞춤형 과정

맞춤형 과정

맞춤형 과정은 SecureCodingHub 콘텐츠 카탈로그에서 추출한 학습자 대면 큐레이팅된 주제와 시나리오의 시퀀스입니다. 일단 생성되면, 맞춤형 과정은 내장 주제 또는 카테고리처럼 할당될 수 있습니다. 동사에 따라 custom-courses:read 또는 custom-courses:write가 필요합니다.

엔드포인트

MethodPathScope용도
GET/custom-coursescustom-courses:read조직의 모든 맞춤형 과정 목록 조회.
GET/custom-courses/{'{'}id{'}'}custom-courses:read정렬된 항목과 함께 단일 맞춤형 과정 검색.
POST/custom-coursescustom-courses:write새 맞춤형 과정 생성.
PATCH/custom-courses/{'{'}id{'}'}custom-courses:write메타데이터 업데이트 및/또는 항목 목록 교체.
DELETE/custom-courses/{'{'}id{'}'}custom-courses:write맞춤형 과정 소프트 비활성화.

모든 경로는 https://api.limeplate.com/api/public/v1에 상대적입니다.

항목 모델

모든 맞춤형 과정은 정렬된 items 목록을 포함합니다. 각 항목은 카탈로그의 주제 또는 시나리오에 대한 참조입니다 — 식별자에 대해서는 콘텐츠 카탈로그를 참조하세요.

필드Type의미
itemTypestring"topic"(sql-injection와 같은 연습 주제) 또는 "scenario"(학습 모드 시나리오) 중 하나.
itemIdstring주제 또는 시나리오의 카탈로그 id.
orderIndexinteger학습자 UI의 0 기반 표시 순서. 낮은 값이 먼저 나타납니다.

PATCH 시, 항목을 그대로 두려면 items 필드를 생략하거나, 덮어쓰려면 전체 교체 목록을 보내세요. 부분 항목 업데이트는 없습니다 — 저장하고 싶은 순서대로 전체 시퀀스를 다시 보내세요.

맞춤형 과정 목록 조회

조직의 활성 맞춤형 과정당 하나의 항목을 가장 최근 업데이트 순으로 정렬하여 반환합니다.

GET /api/public/v1/custom-courses
Authorization: Bearer scs_live_…

응답

[
  {
    "id": "8b1f0c2e-3a45-4d99-9a7e-2c5e1b3a8f02",
    "name": "Backend Onboarding — Q2",
    "description": "Required reading for new backend hires.",
    "icon": "shield",
    "color": "#3b82f6",
    "itemCount": 6,
    "usageCount": 12,
    "createdByUserId": "1a2b3c4d-5e6f-7081-9203-4d5e6f708192",
    "createdByName": "Jane Smith",
    "createdAt": "2026-04-10T09:22:14Z",
    "updatedAt": "2026-05-18T15:01:47Z"
  }
]

예시

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

맞춤형 과정 가져오기

정렬된 항목이 확장된 과정을 반환합니다. resolvedTitle은 읽기 시점의 기본 주제 또는 시나리오의 사람이 읽을 수 있는 제목입니다 — 두 번째 카탈로그 조회 없이 렌더링하기에 편리합니다.

GET /api/public/v1/custom-courses/{customCourseId}
Authorization: Bearer scs_live_…

응답

{
  "id": "8b1f0c2e-3a45-4d99-9a7e-2c5e1b3a8f02",
  "name": "Backend Onboarding — Q2",
  "description": "Required reading for new backend hires.",
  "icon": "shield",
  "color": "#3b82f6",
  "items": [
    {
      "id": "c1d2e3f4-5060-7081-9203-4d5e6f708192",
      "itemType": "topic",
      "itemId": "sql-injection",
      "resolvedTitle": "SQL Injection",
      "orderIndex": 0
    },
    {
      "id": "d2e3f405-6070-8192-0304-5e6f70819203",
      "itemType": "scenario",
      "itemId": "auth-bypass-walkthrough",
      "resolvedTitle": "Auth Bypass Walkthrough",
      "orderIndex": 1
    },
    {
      "id": "e3f40506-7081-9203-0405-6f7081920304",
      "itemType": "topic",
      "itemId": "xss",
      "resolvedTitle": "Cross-Site Scripting",
      "orderIndex": 2
    }
  ],
  "usageCount": 12,
  "createdByUserId": "1a2b3c4d-5e6f-7081-9203-4d5e6f708192",
  "createdByName": "Jane Smith",
  "createdAt": "2026-04-10T09:22:14Z",
  "updatedAt": "2026-05-18T15:01:47Z"
}

예시

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/custom-courses/8b1f0c2e-3a45-4d99-9a7e-2c5e1b3a8f02

맞춤형 과정 생성

과정을 생성하고 상세 보기를 반환합니다. API 키의 조직이 새 과정을 소유합니다. 키를 발행한 사용자가 생성자로 기록됩니다.

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

요청 본문

{
  "name": "Backend Onboarding — Q2",
  "description": "Required reading for new backend hires.",
  "icon": "shield",
  "color": "#3b82f6",
  "items": [
    { "itemType": "topic",    "itemId": "sql-injection",          "orderIndex": 0 },
    { "itemType": "scenario", "itemId": "auth-bypass-walkthrough", "orderIndex": 1 },
    { "itemType": "topic",    "itemId": "xss",                    "orderIndex": 2 }
  ]
}

name은 필수이며 조직 내에서 고유해야 합니다. description, iconcolor은 선택 사항입니다 — color는 모든 CSS hex 문자열을 받습니다. items는 생성 시 비어 있을 수 있습니다. 나중에 PATCH를 통해 채울 수 있습니다.

응답

맞춤형 과정 가져오기와 동일한 형태.

예시

curl -sS -X POST \
  -H "Authorization: Bearer $SCH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Backend Onboarding — Q2",
    "description": "Required reading for new backend hires.",
    "icon": "shield",
    "color": "#3b82f6",
    "items": [
      { "itemType": "topic", "itemId": "sql-injection", "orderIndex": 0 },
      { "itemType": "topic", "itemId": "xss",           "orderIndex": 1 }
    ]
  }' \
  https://api.limeplate.com/api/public/v1/custom-courses

맞춤형 과정 업데이트

요청의 모든 필드는 선택 사항입니다. 변경하려는 필드만 전달하세요. items를 보내면 전체 항목 목록이 교체됩니다 — 순서를 변경하려면 새 orderIndex 값으로 모든 항목을 다시 보내세요.

PATCH /api/public/v1/custom-courses/{customCourseId}
Authorization: Bearer scs_live_…
Content-Type: application/json

요청 본문

{
  "name": "Backend Onboarding — Q3",
  "items": [
    { "itemType": "topic",    "itemId": "sql-injection", "orderIndex": 0 },
    { "itemType": "topic",    "itemId": "ssrf",          "orderIndex": 1 },
    { "itemType": "scenario", "itemId": "jwt-tampering", "orderIndex": 2 }
  ]
}

응답

업데이트된 상세 객체.

예시

curl -sS -X PATCH \
  -H "Authorization: Bearer $SCH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{ "name": "Backend Onboarding — Q3" }' \
  https://api.limeplate.com/api/public/v1/custom-courses/8b1f0c2e-3a45-4d99-9a7e-2c5e1b3a8f02

맞춤형 과정 삭제

과정을 소프트 비활성화합니다. GET /custom-courses와 학습자 UI에서 더 이상 나타나지 않습니다. 과정을 참조한 기존 과제는 과거 진행 상황을 계속 추적하지만 새 수신자에게는 전달되지 않습니다.

DELETE /api/public/v1/custom-courses/{customCourseId}
Authorization: Bearer scs_live_…

응답

{ "message": "Custom course deactivated" }

예시

curl -sS -X DELETE \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/custom-courses/8b1f0c2e-3a45-4d99-9a7e-2c5e1b3a8f02

맞춤형 과정 할당

맞춤형 과정은 할당될 때까지 학습자에게 전달되지 않습니다. targetType: "custom-course"targetId를 맞춤형 과정 id로 설정하여 과제를 사용하세요:

curl -sS -X POST \
  -H "Authorization: Bearer $SCH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "assigneeType": "user",
    "assigneeId": "1a2b3c4d-5e6f-7081-9203-4d5e6f708192",
    "contentArea": "practice",
    "targetType": "custom-course",
    "targetId": "8b1f0c2e-3a45-4d99-9a7e-2c5e1b3a8f02",
    "deadline": "2026-06-15T00:00:00Z",
    "isMandatory": true
  }' \
  https://api.limeplate.com/api/public/v1/assignments

학습자는 orderIndex 순서로 항목을 봅니다. 연습 주제와 학습 시나리오는 각각의 진행 상황 엔드포인트에서 추적됩니다 — 진행 상황 참조.