문서/API 및 웹훅/인증서

인증서

SecureCodingHub는 사용자가 전체 카테고리(Web, API, Mobile, Client)의 모든 학습 시나리오 그리고 모든 연습 챌린지를 완료할 때 자동으로 인증서를 발급합니다. 이러한 엔드포인트는 발급된 인증서와 공개 스타일 검증 조회를 노출합니다. certificates:read 범위가 필요합니다.

엔드포인트

MethodPathScope용도
GET/certificates/users/{'{'}userId{'}'}certificates:read한 사용자의 모든 카테고리에 대한 인증서 상태.
GET/certificates/verify/{'{'}certNumber{'}'}certificates:read공개 번호로 인증서 검증.

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

인증서 발급 방식

발급은 완전히 자동입니다 — 수동 "부여" 엔드포인트가 없습니다. 규칙:

  • 사용자당 카테고리당 하나의 인증서. 카테고리는 web, api, mobileclient입니다.
  • 카테고리 인증서는 사용자가 해당 카테고리의 모든 학습 시나리오와 모든 연습 챌린지를 완료하는 순간 발급됩니다.
  • 각 인증서에는 영구적인 공개 공유 가능한 certificateNumber가 할당됩니다.
  • 발급은 certificate.issued 웹훅 이벤트를 발사합니다. 페이로드에 대해서는 웹훅를 참조하세요.

발급 후 콘텐츠를 다시 완료해도 새 인증서가 생성되지 않습니다. 원래 번호는 영구적입니다.

사용자의 인증서 상태 목록 조회

카테고리당 하나의 항목을 반환합니다. certificateIdnull인 항목은 사용자가 시작했지만 아직 완료하지 않은 카테고리를 나타냅니다 — "Web 인증서까지 22개 챌린지 중 18개 남았습니다" UI를 렌더링하기에 편리합니다.

GET /api/public/v1/certificates/users/{userId}
Authorization: Bearer scs_live_…

응답

[
  {
    "categoryId": "web",
    "categoryTitle": "Web Application Security",
    "certificateId": "7e4c9d09-86ca-4125-bbd8-7fae54c8f654",
    "certificateNumber": "SCH-2026-WEB-000123",
    "issuedAt": "2026-05-12T08:41:22Z",
    "practiceTotal": 75,
    "practiceCompleted": 75,
    "learnTotal": 22,
    "learnCompleted": 22,
    "isComplete": true
  },
  {
    "categoryId": "api",
    "categoryTitle": "API Security",
    "certificateId": null,
    "certificateNumber": null,
    "issuedAt": null,
    "practiceTotal": 60,
    "practiceCompleted": 42,
    "learnTotal": 18,
    "learnCompleted": 14,
    "isComplete": false
  },
  {
    "categoryId": "mobile",
    "categoryTitle": "Mobile Application Security",
    "certificateId": null,
    "certificateNumber": null,
    "issuedAt": null,
    "practiceTotal": 50,
    "practiceCompleted": 0,
    "learnTotal": 15,
    "learnCompleted": 0,
    "isComplete": false
  },
  {
    "categoryId": "client",
    "categoryTitle": "Client-Side Security",
    "certificateId": null,
    "certificateNumber": null,
    "issuedAt": null,
    "practiceTotal": 40,
    "practiceCompleted": 6,
    "learnTotal": 12,
    "learnCompleted": 2,
    "isComplete": false
  }
]
  • isComplete는 "practiceCompleted == practiceTotal && learnCompleted == learnTotal"를 반영합니다.
  • practiceTotallearnTotal은 라이브 카운트입니다 — 카테고리에 새 콘텐츠를 추가해도 이미 발급된 인증서가 무효화되지 않습니다 않지만, 진행 중인 사용자의 분모는 위로 이동합니다.

예시

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/certificates/users/1a2b3c4d-5e6f-7081-9203-4d5e6f708192

인증서 검증

공개 번호로 인증서를 조회하고 보유자, 조직 및 카테고리를 반환합니다. 경력 사이트의 "인증서 검증" 페이지를 백업하거나 채용 시 후보자의 주장을 검증하는 데 사용하세요.

GET /api/public/v1/certificates/verify/{certNumber}
Authorization: Bearer scs_live_…

엔드포인트가 공개 검증 조회처럼 동작하지만, 호출할 때 여전히 API 키와 certificates:read 범위가 필요합니다. 인증 없이 진정으로 공개 검증을 원하시면, SecureCodingHub 호스팅 검증 URL에 링크하세요: https://www.securecodinghub.com/verify/{'{'}certNumber{'}'}.

응답

{
  "certificateNumber": "SCH-2026-WEB-000123",
  "userName": "Jane Smith",
  "organizationName": "Acme Corp",
  "categoryId": "web",
  "categoryTitle": "Web Application Security",
  "issuedAt": "2026-05-12T08:41:22Z"
}

해당 번호의 인증서가 존재하지 않으면 404 certificate_not_found를 반환합니다. 취소되었거나 테스트 픽스처 인증서 번호도 404를 반환합니다.

예시

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/certificates/verify/SCH-2026-WEB-000123

인증서 이벤트 수신

사용자 엔드포인트를 폴링하는 대신 인증서를 발급되는 순간 HR/인재 시스템으로 푸시하려면 certificate.issued 웹훅을 구독하세요. 웹훅 페이로드는 userId, certificateNumber, categoryIdissuedAt를 포함하며, 검증 응답을 반영합니다. 웹훅 참조.