인증서
SecureCodingHub는 사용자가 전체 카테고리(Web, API, Mobile, Client)의 모든 학습 시나리오 그리고 모든 연습 챌린지를 완료할 때 자동으로 인증서를 발급합니다. 이러한 엔드포인트는 발급된 인증서와 공개 스타일 검증 조회를 노출합니다. certificates:read 범위가 필요합니다.
엔드포인트
| Method | Path | Scope | 용도 |
|---|---|---|---|
GET | /certificates/users/{'{'}userId{'}'} | certificates:read | 한 사용자의 모든 카테고리에 대한 인증서 상태. |
GET | /certificates/verify/{'{'}certNumber{'}'} | certificates:read | 공개 번호로 인증서 검증. |
모든 경로는 https://api.limeplate.com/api/public/v1에 상대적입니다.
인증서 발급 방식
발급은 완전히 자동입니다 — 수동 "부여" 엔드포인트가 없습니다. 규칙:
- 사용자당 카테고리당 하나의 인증서. 카테고리는
web,api,mobile및client입니다. - 카테고리 인증서는 사용자가 해당 카테고리의 모든 학습 시나리오와 모든 연습 챌린지를 완료하는 순간 발급됩니다.
- 각 인증서에는 영구적인 공개 공유 가능한
certificateNumber가 할당됩니다. - 발급은
certificate.issued웹훅 이벤트를 발사합니다. 페이로드에 대해서는 웹훅를 참조하세요.
발급 후 콘텐츠를 다시 완료해도 새 인증서가 생성되지 않습니다. 원래 번호는 영구적입니다.
사용자의 인증서 상태 목록 조회
카테고리당 하나의 항목을 반환합니다. certificateId가 null인 항목은 사용자가 시작했지만 아직 완료하지 않은 카테고리를 나타냅니다 — "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"를 반영합니다.practiceTotal와learnTotal은 라이브 카운트입니다 — 카테고리에 새 콘텐츠를 추가해도 이미 발급된 인증서가 무효화되지 않습니다 않지만, 진행 중인 사용자의 분모는 위로 이동합니다.
예시
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, categoryId 및 issuedAt를 포함하며, 검증 응답을 반영합니다. 웹훅 참조.