이벤트 API
SDK가 백그라운드로 호출하는 주 이벤트 수집 엔드포인트. 대부분의 경우 직접 호출할 필요 없이 Python SDK, TypeScript SDK의 @junyul/node 또는 @junyul/core를 사용하면 됩니다.
공통 필드 (SDK.md §3.1)
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
| event_id | string | 필수 | UUIDv7 또는 evt_ 접두사 포함 |
| timestamp | RFC3339 | 필수 | 이벤트 발생 시각 (UTC) |
| asset_id | string | 필수 | 고객 정의 자산 식별자 |
| event_type | enum | 필수 | 35종 중 하나 (아래 목록) |
| legal_bases | string[] | 선택 | 관련 법령 (10종 중 복수) |
| risk_tier | enum | 선택 | low | limited | high | prohibited |
| subject_hash | SHA-256 | 선택 | 사용자 ID의 해시 |
| context_hash | SHA-256 | 선택 | 입력 컨텍스트의 해시 |
| outcome_hash | SHA-256 | 선택 | 출력·결정의 해시 |
| correlation_id | string | 선택 | 연관 이벤트 그룹화 ID |
| trace_id / span_id | string | 선택 | OpenTelemetry 연동 |
| tags | object | 선택 | 고객 정의 태그 (최대 16개) |
| metadata | object | 선택 | 이벤트 타입별 추가 데이터 |
event_type 35종
Legacy (back-compat) — 6종
ai_inference,objection,human_review,disclosure_shown,disclosure_acknowledged,watermark_applied
Transparency — 4종
transparency.notice_shown,transparency.notice_dismissed,transparency.result_labeled,transparency.policy_disclosed
Decision — 5종
decision.automated_decision_made,decision.explanation_provided,decision.human_review_triggered,decision.human_review_completed,decision.decision_reversed
Objection — 4종
objection.received,objection.acknowledged,objection.resolved,objection.escalated
Assessment — 4종
assessment.impact_assessment_started,assessment.impact_assessment_completed,assessment.impact_assessment_updated,assessment.risk_classification_changed
Model & Asset — 6종
model.model_deployed,model.model_retired,model.performance_degraded,asset.created,asset.updated,asset.archived
Incident (EU AI Act Article 73) — 3종
incident.detected,incident.reported_to_authority,incident.mitigated
단일 이벤트 전송
POST https://api.junyul.com/v1/events
Authorization: Bearer JUN_live_xxx
Content-Type: application/json
Idempotency-Key: my-request-id-1
{
"event_id": "evt_019d9d64-81f5-78af-84fb-076f29a54e90",
"timestamp": "2026-04-18T09:23:45.123Z",
"asset_id": "credit_scoring_v3",
"asset_version": "v3.2.1",
"event_type": "decision.automated_decision_made",
"legal_bases": ["ai_basic_law_kr", "credit_info_36_2_kr", "pipa_37_2_kr"],
"risk_tier": "high",
"subject_hash": "sha256:...",
"outcome_hash": "sha256:...",
"correlation_id": "req_abc123",
"metadata": {
"model": "gpt-4o",
"duration_ms": 1234,
"tokens_in": 256,
"tokens_out": 512
}
}배치 전송 (권장, 최대 1000건)
POST https://api.junyul.com/v1/events/batch
Authorization: Bearer JUN_live_xxx
Content-Type: application/json
{
"events": [
{ ...event1... },
{ ...event2... }
]
}
// 202 Accepted
{
"data": { "accepted": 2, "rejected": 0, "errors": [] },
"request_id": "req_01KXXX"
}Idempotency
Idempotency-Key 헤더를 보내면 서버는 해당 키를 10분간 캐시해 중복 요청을 정확히 한 번 처리합니다. SDK는 자동으로 UUIDv5 기반 idempotency key를 생성해 멱등성을 보장합니다.
에러 응답
400— schema 검증 실패 (event_type이 enum 밖 등)401 / 403— API key 누락 또는 스코프 부족429— 레이트 리미트 초과 (Retry-After헤더 포함)5xx— 서버 장애 (SDK는 자동 재시도 + outbox 저장)