{"openapi":"3.0.0","paths":{"/api/v1/status/{slug}/{listId}":{"get":{"description":"OB 3.0 표준 폐지 목록 VC.\ncredentialStatus.statusListCredential URL에서 참조됩니다.\n\n인코딩: gzip + base64url (RFC 3986 §4.2)\n비트 0 = 유효, 비트 1 = 폐지","operationId":"StatusController_getStatusList","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}},{"name":"listId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"BitstringStatusListCredential JSON-LD"}},"summary":"BitstringStatusListCredential 조회","tags":["status"]}},"/api/v1/platform":{"post":{"operationId":"PlatformController_createPlatform","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePlatformDto"}}}},"responses":{"201":{"description":""}},"security":[{"admin-key":[]}],"summary":"[어드민] Platform 파트너 생성 및 API Key 발급","tags":["platform"]},"get":{"operationId":"PlatformController_listPlatforms","parameters":[],"responses":{"200":{"description":""}},"security":[{"admin-key":[]}],"summary":"[어드민] Platform 파트너 목록","tags":["platform"]}},"/api/v1/platform/tenants":{"post":{"operationId":"PlatformController_createSubTenant","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSubTenantDto"}}}},"responses":{"201":{"description":""}},"security":[{"platform-key":[]}],"summary":"[Platform] 서브 테넌트 생성","tags":["platform"]},"get":{"operationId":"PlatformController_listSubTenants","parameters":[],"responses":{"200":{"description":""}},"security":[{"platform-key":[]}],"summary":"[Platform] 서브 테넌트 목록","tags":["platform"]}},"/api/v1/platform/tenants/{tenantId}":{"get":{"operationId":"PlatformController_getSubTenant","parameters":[{"name":"tenantId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"platform-key":[]}],"summary":"[Platform] 서브 테넌트 상세 조회","tags":["platform"]}},"/api/v1/platform/tenants/{tenantId}/approve":{"post":{"operationId":"PlatformController_approveSubTenant","parameters":[{"name":"tenantId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"platform-key":[]}],"summary":"[Platform] 서브 테넌트 KYB 승인 (플랫폼 자체 검증 후)","tags":["platform"]}},"/api/v1/platform/tenants/{tenantId}/suspend":{"post":{"operationId":"PlatformController_suspendSubTenant","parameters":[{"name":"tenantId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"platform-key":[]}],"summary":"[Platform] 서브 테넌트 정지","tags":["platform"]}},"/api/v1/platform/tenants/{tenantId}/api-key/rotate":{"post":{"operationId":"PlatformController_rotateApiKey","parameters":[{"name":"tenantId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"platform-key":[]}],"summary":"[Platform] 서브 테넌트 API Key 교체","tags":["platform"]}},"/api/v1/auth/login":{"post":{"operationId":"AuthController_login","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginDto"}}}},"responses":{"200":{"description":""}},"summary":"테넌트 로그인 — email + API Key → JWT","tags":["auth"]}},"/api/v1/tenants/register":{"post":{"description":"테넌트를 생성하고 API Key를 발급합니다.\n\n> ⚠️ **주의:** 가입 직후에는 배지 클래스 생성 및 배지 발행이 **불가능**합니다.\n> KYB(사업자 인증) 제출 후 관리자 승인이 완료되어야 발행 기능이 활성화됩니다.\n>\n> **TrustFlow 연동의 경우** 이 엔드포인트를 사용하지 않고,\n> `POST /v1/platform/tenants` (X-Platform-Key 필요)를 통해 서브 테넌트를 자동 생성하세요.\n> Platform API로 생성된 테넌트는 `autoApprove: true` 옵션으로 즉시 발행 가능합니다.","operationId":"TenantsController_register","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RegisterDto"}}}},"responses":{"201":{"description":"테넌트 생성 및 API Key 발급 성공 — KYB 승인 후 발행 가능"},"409":{"description":"이미 사용 중인 slug 또는 이메일"}},"summary":"테넌트 가입 (TrustBadge 직접 가입)","tags":["tenants"]}},"/api/v1/tenants/me":{"get":{"operationId":"TenantsController_getMe","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"내 테넌트 정보 조회","tags":["tenants"]}},"/api/v1/tenants/me/kyb":{"post":{"operationId":"TenantsController_submitKyb","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SubmitKybDto"}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"KYB 제출","tags":["tenants"]}},"/api/v1/tenants/me/api-keys":{"get":{"operationId":"TenantsController_listApiKeys","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"API 키 목록","tags":["tenants"]}},"/api/v1/tenants/me/api-keys/{keyId}/rotate":{"post":{"operationId":"TenantsController_rotateApiKey","parameters":[{"name":"keyId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"API 키 교체","tags":["tenants"]}},"/api/v1/tenants/{slug}/did.json":{"get":{"operationId":"TenantsController_getDidDocument","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"W3C DID Document"},"404":{"description":"테넌트 미존재 또는 키 미생성"}},"summary":"DID Document 조회 (did:web)","tags":["tenants"]}},"/api/v1/tenants/admin/stats":{"get":{"operationId":"TenantsController_adminStats","parameters":[],"responses":{"200":{"description":""}},"summary":"[어드민] 플랫폼 통계","tags":["tenants"]}},"/api/v1/tenants/admin/list":{"get":{"operationId":"TenantsController_adminList","parameters":[],"responses":{"200":{"description":""}},"summary":"[어드민] 전체 테넌트 목록","tags":["tenants"]}},"/api/v1/tenants/admin/kyb":{"get":{"operationId":"TenantsController_adminKybQueue","parameters":[],"responses":{"200":{"description":""}},"summary":"[어드민] KYB 심사 대기 목록","tags":["tenants"]}},"/api/v1/tenants/{tenantId}/kyb/approve":{"patch":{"operationId":"TenantsController_approveKyb","parameters":[{"name":"tenantId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewKybDto"}}}},"responses":{"200":{"description":""}},"summary":"[어드민] KYB 승인","tags":["tenants"]}},"/api/v1/tenants/{tenantId}/kyb/reject":{"patch":{"operationId":"TenantsController_rejectKyb","parameters":[{"name":"tenantId","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewKybDto"}}}},"responses":{"200":{"description":""}},"summary":"[어드민] KYB 거부","tags":["tenants"]}},"/api/v1/badges/ai-assist":{"post":{"description":"배지명/카테고리를 입력하면 Claude가 설명·기준·태그·프레임·티어·아이콘·색상을 자동 추천합니다.","operationId":"BadgesController_generateAiSuggestion","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AiAssistDto"}}}},"responses":{"200":{"description":"AI 추천 결과"},"503":{"description":"AI 어시스트가 활성화되지 않음 (ANTHROPIC_API_KEY 필요)"}},"security":[{"api-key":[]}],"summary":"AI 디자인 어시스트","tags":["badges"]}},"/api/v1/badges/ai-assist/status":{"get":{"operationId":"BadgesController_getAiStatus","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"AI 어시스트 활성화 여부","tags":["badges"]}},"/api/v1/badges":{"post":{"description":"새 배지 클래스를 생성합니다. **KYB 승인된 테넌트만 가능합니다.** 생성 후 `DRAFT` 상태이며, `/activate` 호출 후 발행에 사용할 수 있습니다.","operationId":"BadgesController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateBadgeClassDto"}}}},"responses":{"201":{"description":"배지 클래스 생성 성공 (DRAFT 상태)"},"403":{"description":"KYB 미승인 — 관리자 승인 후 생성 가능"}},"security":[{"api-key":[]}],"summary":"배지 클래스 생성","tags":["badges"]},"get":{"operationId":"BadgesController_findAll","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"배지 클래스 목록 조회","tags":["badges"]}},"/api/v1/badges/{id}":{"get":{"operationId":"BadgesController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"배지 클래스 단건 조회","tags":["badges"]},"patch":{"operationId":"BadgesController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateBadgeClassDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"배지 클래스 수정","tags":["badges"]}},"/api/v1/badges/{id}/activate":{"post":{"description":"DRAFT 상태의 배지 클래스를 ACTIVE 상태로 전환합니다. 활성화 후 배지 발행에 사용할 수 있습니다.","operationId":"BadgesController_activate","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"배지 클래스 활성화","tags":["badges"]}},"/api/v1/badges/{id}/archive":{"post":{"operationId":"BadgesController_archive","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"배지 클래스 보관 (비활성화)","tags":["badges"]}},"/api/v1/webhooks/events":{"get":{"operationId":"WebhooksController_listEvents","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"사용 가능한 webhook 이벤트 목록","tags":["webhooks"]}},"/api/v1/webhooks":{"get":{"operationId":"WebhooksController_findAll","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Webhook 목록 조회","tags":["webhooks"]},"post":{"description":"새 webhook을 등록합니다. 응답에 포함된 `secret`은 다시 표시되지 않으니 안전한 곳에 보관하세요.","operationId":"WebhooksController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateWebhookBodyDto"}}}},"responses":{"201":{"description":"생성 성공 (secret 1회 노출)"}},"security":[{"api-key":[]}],"summary":"Webhook 등록","tags":["webhooks"]}},"/api/v1/webhooks/{id}":{"get":{"operationId":"WebhooksController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Webhook 단건 조회","tags":["webhooks"]},"patch":{"operationId":"WebhooksController_update","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateWebhookBodyDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Webhook 수정 (url/events/description)","tags":["webhooks"]},"delete":{"operationId":"WebhooksController_delete","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"204":{"description":""}},"security":[{"api-key":[]}],"summary":"Webhook 삭제","tags":["webhooks"]}},"/api/v1/webhooks/{id}/toggle":{"post":{"operationId":"WebhooksController_toggle","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToggleWebhookBodyDto"}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"Webhook 활성/비활성 토글","tags":["webhooks"]}},"/api/v1/webhooks/{id}/deliveries":{"get":{"operationId":"WebhooksController_deliveries","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"최근 발송 기록 (기본 50건)","tags":["webhooks"]}},"/api/v1/assertions":{"post":{"description":"수신자에게 배지를 발행합니다. **KYB 승인된 테넌트만 가능합니다.** 발행 즉시 XDC 블록체인 앵커링 및 수신자 이메일 발송이 비동기로 처리됩니다.","operationId":"AssertionsController_issue","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/IssueAssertionDto"}}}},"responses":{"201":{"description":"발행 성공"},"403":{"description":"KYB 미승인 — 관리자 승인 후 발행 가능"}},"security":[{"api-key":[]}],"summary":"배지 단건 발행","tags":["assertions"]},"get":{"operationId":"AssertionsController_findAll","parameters":[{"name":"status","required":false,"in":"query","schema":{"enum":["ISSUED","REVOKED","EXPIRED"],"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"발행 내역 목록 조회","tags":["assertions"]}},"/api/v1/assertions/batch":{"post":{"description":"여러 수신자에게 배지를 일괄 발행합니다. **KYB 승인된 테넌트만 가능합니다.**","operationId":"AssertionsController_issueMany","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/BatchIssueDto"}}}},"responses":{"201":{"description":"일괄 발행 성공"},"403":{"description":"KYB 미승인 — 관리자 승인 후 발행 가능"}},"security":[{"api-key":[]}],"summary":"배지 일괄 발행","tags":["assertions"]}},"/api/v1/assertions/csv":{"post":{"description":"CSV 텍스트로 대량 배지를 발행합니다.\n\n헤더 형식: `email,name,badgeClassId,expiresAt`\n- `email`: 필수\n- `name`: 수신자 이름 (선택)\n- `badgeClassId`: 배지 ID (선택, 없으면 body의 badgeClassId 사용)\n- `expiresAt`: 만료일 ISO8601 (선택)\n\n실패한 행은 건너뛰고 계속 진행합니다. 결과 리포트를 반환합니다.","operationId":"AssertionsController_issueCsv","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CsvIssueDto"}}}},"responses":{"201":{"description":"일괄 발행 완료 (성공/실패 통계 포함)"},"403":{"description":"KYB 미승인"}},"security":[{"api-key":[]}],"summary":"CSV 일괄 발행","tags":["assertions"]}},"/api/v1/assertions/public/{id}":{"get":{"description":"OB 3.0 표준 Verifiable Credential JSON을 반환합니다. 인증 없이 공개 접근 가능합니다.","operationId":"AssertionsController_getPublicAssertion","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"공개 OB 3.0 VC JSON 조회 (인증 불필요)","tags":["assertions"]}},"/api/v1/assertions/{id}":{"get":{"operationId":"AssertionsController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"발행 내역 단건 조회","tags":["assertions"]}},"/api/v1/assertions/{id}/revoke":{"post":{"operationId":"AssertionsController_revoke","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RevokeAssertionDto"}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"배지 발행 취소 (Revoke)","tags":["assertions"]}},"/api/v1/assertions/admin/stats":{"get":{"operationId":"AdminAssertionsController_adminStats","parameters":[{"name":"x-admin-key","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"어드민 어서션 통계","tags":["assertions-admin"]}},"/api/v1/assertions/admin/list":{"get":{"operationId":"AdminAssertionsController_adminList","parameters":[{"name":"x-admin-key","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"어드민 어서션 목록 (필터/페이징)","tags":["assertions-admin"]}},"/api/v1/assertions/admin/export.csv":{"get":{"operationId":"AdminAssertionsController_adminExportCsv","parameters":[{"name":"x-admin-key","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"어드민 어서션 CSV 내보내기","tags":["assertions-admin"]}},"/api/v1/assertions/admin/{id}":{"get":{"operationId":"AdminAssertionsController_adminGet","parameters":[{"name":"x-admin-key","required":true,"in":"header","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"어드민 어서션 상세 (마스킹 없음)","tags":["assertions-admin"]}},"/api/v1/assertions/admin/{id}/force-revoke":{"post":{"operationId":"AdminAssertionsController_adminForceRevoke","parameters":[{"name":"x-admin-key","required":true,"in":"header","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"어드민 강제 폐지","tags":["assertions-admin"]}},"/api/v1/assertions/admin/{id}/retry-anchor":{"post":{"operationId":"AdminAssertionsController_adminRetryAnchor","parameters":[{"name":"x-admin-key","required":true,"in":"header","schema":{"type":"string"}},{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"어드민 앵커 재시도","tags":["assertions-admin"]}},"/api/v1/verify":{"get":{"operationId":"VerificationController_verifyByUrl","parameters":[{"name":"url","required":true,"in":"query","description":"Public assertion URL","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Verify an assertion by public URL","tags":["verification"]}},"/api/v1/verify/wallet/badges":{"get":{"operationId":"VerificationController_walletBadges","parameters":[{"name":"email","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Get all badges for a recipient email (wallet view)","tags":["verification"]}},"/api/v1/verify/{id}/share":{"get":{"description":"배지를 LinkedIn/카카오/SNS에 공유할 때 필요한 메타데이터를 반환합니다.\n\n반환 데이터:\n- `linkedin`: LinkedIn Add to Profile URL\n- `kakao`: 카카오 공유 파라미터\n- `og`: Open Graph 메타데이터 (title, description, image, url)","operationId":"VerificationController_getShareMeta","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"SNS 공유 메타데이터","tags":["verification"]}},"/api/v1/verify/{id}":{"get":{"operationId":"VerificationController_verifyById","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"Verify an assertion by ID","tags":["verification"]}},"/api/v1/recipients":{"post":{"description":"이메일을 키로 수령자를 등록합니다. 기존 수령자가 있으면 정보를 갱신합니다. 배지 발급 시 자동으로 호출되므로 직접 사용할 일은 적습니다.","operationId":"RecipientsController_upsert","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateRecipientDto"}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"수령자 등록 또는 갱신 (upsert)","tags":["recipients"]},"get":{"operationId":"RecipientsController_findAll","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"수령자 목록 조회","tags":["recipients"]}},"/api/v1/recipients/{id}":{"get":{"operationId":"RecipientsController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"수령자 단건 조회","tags":["recipients"]}},"/api/v1/payments/plans":{"get":{"operationId":"PaymentsController_getPlans","parameters":[],"responses":{"200":{"description":""}},"summary":"플랜 목록 및 가격 조회","tags":["payments"]}},"/api/v1/payments/my-plan":{"get":{"operationId":"PaymentsController_getMyPlan","parameters":[],"responses":{"200":{"description":""}},"summary":"현재 플랜 및 이번 달 사용량 조회","tags":["payments"]}},"/api/v1/payments/subscribe/{plan}":{"post":{"operationId":"PaymentsController_subscribe","parameters":[{"name":"plan","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"플랜 구독 (STARTER / PROFESSIONAL)","tags":["payments"]}},"/api/v1/payments/subscription":{"delete":{"operationId":"PaymentsController_cancel","parameters":[],"responses":{"200":{"description":""}},"summary":"구독 취소 (FREE 플랜으로 전환)","tags":["payments"]}},"/api/v1/payments/webhook/portone":{"post":{"operationId":"PaymentsController_portoneWebhook","parameters":[],"responses":{"201":{"description":""}},"summary":"PortOne 결제 웹훅 (내부용)","tags":["payments"]}},"/api/v1/payments/admin/platform-usage":{"get":{"operationId":"PaymentsController_adminPlatformUsage","parameters":[],"responses":{"200":{"description":""}},"summary":"플랫폼 파트너 사용량 전체 (어드민)","tags":["payments"]}},"/api/v1/payments/admin/platform-usage/{platformId}":{"get":{"operationId":"PaymentsController_adminPlatformDetail","parameters":[{"name":"platformId","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"특정 플랫폼 사용량 상세 (어드민)","tags":["payments"]}},"/api/v1/pathways":{"post":{"description":"여러 배지를 묶어서 상위 메타 배지를 자동 발행하는 학습 경로를 설정합니다.\n\n**type: \"ALL\"** — 모든 하위 배지 취득 시 메타 배지 자동 발행\n**type: \"ANY_N\"** — requiredCount개 이상 취득 시 자동 발행 (예: 5개 중 3개)\n\n메타 배지는 조건 달성 즉시 자동으로 수신자에게 발행됩니다.","operationId":"PathwayController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreatePathwayDto"}}}},"responses":{"201":{"description":"Pathway 생성 성공"}},"security":[{"api-key":[]}],"summary":"Pathway 생성 (Milestone Badge)","tags":["pathways"]},"get":{"operationId":"PathwayController_findAll","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"Pathway 목록 조회","tags":["pathways"]}},"/api/v1/pathways/{pathwayId}/progress/{email}":{"get":{"operationId":"PathwayController_getProgress","parameters":[{"name":"pathwayId","required":true,"in":"path","schema":{"type":"string"}},{"name":"email","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"수신자별 Pathway 진행 상황 조회","tags":["pathways"]}},"/api/v1/analytics/me":{"get":{"operationId":"AnalyticsController_getMyStats","parameters":[],"responses":{"200":{"description":""}},"summary":"내 테넌트 발급 통계 (대시보드용)","tags":["analytics"]}},"/api/v1/analytics/admin/overview":{"get":{"operationId":"AnalyticsController_getAdminOverview","parameters":[],"responses":{"200":{"description":""}},"summary":"전체 플랫폼 통계 (어드민 전용)","tags":["analytics"]}},"/api/v1/analytics/admin/platforms":{"get":{"operationId":"AnalyticsController_getPlatformSummary","parameters":[],"responses":{"200":{"description":""}},"summary":"플랫폼 파트너 사용량 전체 (어드민 전용)","tags":["analytics"]}},"/api/v1/analytics/admin/platforms/{platformId}":{"get":{"operationId":"AnalyticsController_getPlatformDetail","parameters":[{"name":"platformId","required":true,"in":"path","schema":{"type":"string"}},{"name":"months","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"특정 플랫폼 사용량 상세","tags":["analytics"]}},"/api/v1/analytics/forecast":{"get":{"operationId":"AnalyticsController_getForecast","parameters":[],"responses":{"200":{"description":""}},"summary":"다음 분기 발급 수 예측 (내 테넌트)","tags":["analytics"]}},"/api/v1/analytics/skill-trends":{"get":{"operationId":"AnalyticsController_getSkillTrends","parameters":[],"responses":{"200":{"description":""}},"summary":"카테고리별 스킬 트렌드 (내 테넌트)","tags":["analytics"]}},"/api/v1/analytics/trending-badges":{"get":{"operationId":"AnalyticsController_getTrendingBadges","parameters":[{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"이번 달 인기 배지 Top N","tags":["analytics"]}},"/api/v1/analytics/admin/forecast":{"get":{"operationId":"AnalyticsController_getAdminForecast","parameters":[],"responses":{"200":{"description":""}},"summary":"전체 플랫폼 분기 예측 (어드민)","tags":["analytics"]}},"/api/v1/analytics/admin/skill-trends":{"get":{"operationId":"AnalyticsController_getAdminSkillTrends","parameters":[],"responses":{"200":{"description":""}},"summary":"전체 플랫폼 스킬 트렌드 (어드민)","tags":["analytics"]}},"/api/v1/campaigns":{"post":{"description":"대규모 배지 발행 캠페인을 생성합니다. scheduledAt 미지정 시 DRAFT 상태로 저장됩니다. **KYB 승인된 테넌트만 실제 발송 가능.**","operationId":"CampaignsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCampaignDto"}}}},"responses":{"201":{"description":"생성 성공"}},"security":[{"api-key":[]}],"summary":"캠페인 생성","tags":["campaigns"]},"get":{"operationId":"CampaignsController_findAll","parameters":[],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"캠페인 목록 조회","tags":["campaigns"]}},"/api/v1/campaigns/{id}":{"get":{"operationId":"CampaignsController_findOne","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"캠페인 단건 조회 (통계 포함)","tags":["campaigns"]}},"/api/v1/campaigns/{id}/recipients":{"get":{"operationId":"CampaignsController_getRecipients","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"캠페인 수령자 목록 조회","tags":["campaigns"]}},"/api/v1/campaigns/{id}/start":{"post":{"operationId":"CampaignsController_start","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"캠페인 즉시 시작","tags":["campaigns"]}},"/api/v1/campaigns/{id}/cancel":{"post":{"operationId":"CampaignsController_cancel","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"캠페인 취소 (SCHEDULED/DRAFT만)","tags":["campaigns"]}},"/api/v1/profiles/{slug}":{"get":{"description":"수령자의 공개 프로필과 발행된 배지 목록을 반환합니다.\n\n`publicEnabled`가 `true`이고 `publicSlug`가 설정된 수령자만 조회됩니다.","operationId":"ProfilesController_getPublicProfile","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":"프로필 + 배지 목록"},"404":{"description":"프로필을 찾을 수 없음"}},"summary":"공개 프로필 조회","tags":["profiles"]}},"/api/v1/profiles/recipient/{email}":{"get":{"operationId":"ProfilesController_getRecipientProfile","parameters":[{"name":"email","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"수령자 프로필 조회 (발급기관용)","tags":["profiles"]},"patch":{"description":"발급기관이 자기 테넌트 내 수령자의 공개 프로필을 설정합니다.\n\n- `publicSlug`: 공개 페이지 슬러그 (영문/숫자/하이픈 3-30자, 전역 unique)\n- `publicEnabled`: 공개 여부 토글\n- `publicBio`: 자기소개 (최대 500자)\n- `publicLinks`: 외부 링크 배열 (최대 10개)","operationId":"ProfilesController_updateProfile","parameters":[{"name":"email","required":true,"in":"path","schema":{"type":"string"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateProfileDto"}}}},"responses":{"200":{"description":""}},"security":[{"api-key":[]}],"summary":"수령자 공개 프로필 설정","tags":["profiles"]}},"/api/v1/og/assertion/{id}":{"get":{"description":"SNS 공유용 1200×630 PNG 이미지. 1시간 캐시.","operationId":"OgController_assertionOg","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"배지 발행건 OG 이미지 (PNG)","tags":["og"]}},"/api/v1/og/profile/{slug}":{"get":{"description":"SNS 공유용 1200×630 PNG 이미지. 1시간 캐시.","operationId":"OgController_profileOg","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"공개 프로필 OG 이미지 (PNG)","tags":["og"]}},"/api/v1/share/assertion/{id}":{"get":{"operationId":"ShareController_assertionShare","parameters":[{"name":"id","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"배지 발행건 OG/공유 HTML (SNS 봇용)","tags":["share"]}},"/api/v1/share/profile/{slug}":{"get":{"operationId":"ShareController_profileShare","parameters":[{"name":"slug","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"공개 프로필 OG/공유 HTML (SNS 봇용)","tags":["share"]}},"/api/v1/skills":{"get":{"operationId":"SkillsController_search","parameters":[{"name":"q","required":true,"in":"query","schema":{"type":"string"}},{"name":"category","required":true,"in":"query","schema":{"type":"string"}},{"name":"limit","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"스킬 검색 / 자동완성 (Public)","tags":["skills"]},"post":{"operationId":"SkillsController_create","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateSkillDto"}}}},"responses":{"201":{"description":""}},"security":[{"api-key":[]}],"summary":"새 스킬 태그 생성 / 업서트 (어드민 또는 발행기관)","tags":["skills"]}},"/api/v1/skills/categories":{"get":{"operationId":"SkillsController_categories","parameters":[],"responses":{"200":{"description":""}},"summary":"사용 가능한 카테고리 목록 (Public)","tags":["skills"]}},"/api/v1/skills/recalculate":{"post":{"operationId":"SkillsController_recalculate","parameters":[],"responses":{"201":{"description":""}},"summary":"SkillTag.badgeCount 재계산 (어드민 전용, cron 권장)","tags":["skills"]}},"/api/v1/system/health":{"get":{"operationId":"SystemController_health","parameters":[{"name":"x-admin-key","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"시스템 헬스 체크 (DB/Redis/Vault/Chain)","tags":["system"]}},"/api/v1/system/queues":{"get":{"operationId":"SystemController_queues","parameters":[{"name":"x-admin-key","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"큐 통계 (waiting/active/completed/failed/delayed)","tags":["system"]}},"/api/v1/system/build":{"get":{"operationId":"SystemController_build","parameters":[{"name":"x-admin-key","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"빌드 정보 (commit/env/uptime 등)","tags":["system"]}},"/api/v1/system/log":{"get":{"operationId":"SystemController_log","parameters":[{"name":"x-admin-key","required":true,"in":"header","schema":{"type":"string"}},{"name":"level","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"최근 로그 (메모리 버퍼)","tags":["system"]}},"/api/v1/system/log/stream":{"get":{"operationId":"SystemController_stream","parameters":[{"name":"x-admin-key","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"summary":"로그 SSE 스트림","tags":["system"]}},"/api/v1/system/queues/{queue}/retry-failed":{"post":{"operationId":"SystemController_retryFailed","parameters":[{"name":"x-admin-key","required":true,"in":"header","schema":{"type":"string"}},{"name":"queue","required":true,"in":"path","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"큐의 실패 작업 일괄 재시도","tags":["system"]}},"/api/v1/system/cache/clear":{"post":{"operationId":"SystemController_clearCache","parameters":[{"name":"x-admin-key","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"캐시 키 클리어 (analytics/cache prefix만)","tags":["system"]}},"/api/v1/system/stats/recompute":{"post":{"operationId":"SystemController_recompute","parameters":[{"name":"x-admin-key","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"PlatformUsage 재계산","tags":["system"]}},"/api/v1/system/broadcast":{"post":{"operationId":"SystemController_broadcast","parameters":[{"name":"x-admin-key","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"모든 KYB 승인 테넌트에 공지 이메일","tags":["system"]}},"/api/v1/system/skills/reseed":{"post":{"operationId":"SystemController_reseed","parameters":[{"name":"x-admin-key","required":true,"in":"header","schema":{"type":"string"}}],"responses":{"201":{"description":""}},"summary":"기본 스킬 태그 리시드 (upsert)","tags":["system"]}}},"info":{"title":"TrustBadge API","description":"OB 3.0 디지털 자격증서 발행 플랫폼 API","version":"1.0","contact":{}},"tags":[],"servers":[],"components":{"securitySchemes":{"bearer":{"scheme":"bearer","bearerFormat":"JWT","type":"http"},"api-key":{"type":"apiKey","in":"header","name":"X-API-Key"},"admin-key":{"type":"apiKey","in":"header","name":"X-Admin-Key"},"platform-key":{"type":"apiKey","in":"header","name":"X-Platform-Key"}},"schemas":{"CreatePlatformDto":{"type":"object","properties":{}},"CreateSubTenantDto":{"type":"object","properties":{}},"LoginDto":{"type":"object","properties":{}},"RegisterDto":{"type":"object","properties":{}},"SubmitKybDto":{"type":"object","properties":{}},"ReviewKybDto":{"type":"object","properties":{}},"AiAssistDto":{"type":"object","properties":{}},"CreateBadgeClassDto":{"type":"object","properties":{}},"UpdateBadgeClassDto":{"type":"object","properties":{}},"CreateWebhookBodyDto":{"type":"object","properties":{}},"UpdateWebhookBodyDto":{"type":"object","properties":{}},"ToggleWebhookBodyDto":{"type":"object","properties":{}},"IssueAssertionDto":{"type":"object","properties":{}},"BatchIssueDto":{"type":"object","properties":{}},"CsvIssueDto":{"type":"object","properties":{}},"RevokeAssertionDto":{"type":"object","properties":{}},"CreateRecipientDto":{"type":"object","properties":{}},"CreatePathwayDto":{"type":"object","properties":{}},"CreateCampaignDto":{"type":"object","properties":{}},"UpdateProfileDto":{"type":"object","properties":{}},"CreateSkillDto":{"type":"object","properties":{}}}}}