문서/API 및 웹훅/감사 로그

감사 로그

조직의 모든 변경 — 관리자 UI 작업과 Public API 호출 모두 — 이 단일 감사 스트림에 기록됩니다. 이러한 엔드포인트를 사용하여 해당 스트림을 SIEM으로 보내거나, 내부 컴플라이언스 보고서를 만들거나, 특정 변경을 조사하세요. API 키에 필요한 범위: audit-log:read.

엔드포인트

MethodPathScope용도
GET/api/public/v1/audit-logaudit-log:read선택적 필터가 있는 페이지 매김된 감사 이벤트 목록.
GET/api/public/v1/audit-log/actionsaudit-log:read조직에 대해 기록된 고유한 작업 이름. 필터 드롭다운 구축에 유용합니다.

기록되는 것

Public API 호출은 자동 감사됩니다. 항목은 actorRole = "api_key"actorEmail = "apikey:<apiKeyId>"을 포함하며, 여기서 <apiKeyId>는 호출한 API 키의 전체 UUID입니다((scs_live_… 토큰 접두사가 아님). 관리자 UI 작업은 사람의 이메일과 그들의 org_admin 역할을 사용합니다. 두 스트림은 동일한 로그에 혼합되어 단일 내보내기로 모든 변경 기록을 다룹니다.

감사 이벤트 목록 조회

이벤트를 최신순으로 반환합니다. 모든 필터는 선택 사항이며 결합될 수 있습니다.

GET /api/public/v1/audit-log
  ?action=sarif.ingested
  &actorEmail=apikey:7d8a3e0b-4f12-4cd6-b9e1-21f6cf5d4a73
  &from=2026-05-01T00:00:00Z
  &to=2026-05-29T23:59:59Z
  &page=1
  &pageSize=50
Authorization: Bearer scs_live_…

쿼리 매개변수

매개변수Type기본값참고
actionstring정확한 일치 작업 이름. /audit-log/actions에서 유효한 값을 가져오세요.
actorEmailstring정확한 일치 행위자 이메일. API 키 항목의 경우 apikey:<api-key-uuid> 형식을 사용하세요.
fromISO 8601createdAt의 포함 하한 (UTC).
toISO 8601createdAt의 포함 상한 (UTC).
pageinteger11 기반 페이지 인덱스.
pageSizeinteger50200으로 제한됨. 1–200 범위 밖의 값은 50으로 폴백합니다.

응답

{
  "items": [
    {
      "id": "0e7a3b4c-9d2f-4e1a-b6c8-2c4f8d5a1e90",
      "createdAt": "2026-05-29T13:42:11.318Z",
      "actorEmail": "apikey:7d8a3e0b-4f12-4cd6-b9e1-21f6cf5d4a73",
      "actorRole": "api_key",
      "action": "assignment.created",
      "targetType": "assignment",
      "targetId": "b1d8c2a0-7e34-4f9a-9d51-8e2c91a4f607",
      "targetLabel": "jane.smith@acme.com / SQL Injection",
      "metadata": "{\"topicId\":\"sql-injection\",\"deadlineDays\":14}",
      "ipAddress": "203.0.113.42"
    },
    {
      "id": "ba98c9d4-5f60-4b21-9c0e-3f72e1b58a44",
      "createdAt": "2026-05-29T13:41:08.902Z",
      "actorEmail": "amelia.ng@acme.com",
      "actorRole": "org_admin",
      "action": "user.invited",
      "targetType": "user",
      "targetId": "c4f1d22a-83b7-4d2c-9a01-7e6b5d1f9c33",
      "targetLabel": "jane.smith@acme.com",
      "metadata": null,
      "ipAddress": "203.0.113.7"
    }
  ],
  "total": 2841,
  "page": 1,
  "pageSize": 50
}
  • metadata는 JSON 문자열입니다(객체가 아님). 클라이언트에서 파싱하세요. 형태는 작업당 다릅니다.
  • total은 현재 페이지가 아닌 전체 필터링된 카운트를 반영합니다 — 페이지 수를 도출하려면 pageSize로 나누세요.
  • User-agent 및 기타 요청 헤더는 포렌식을 위해 서버 측에 저장되지만 이 응답에서는 반환되지 않습니다.

예시

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  "https://api.limeplate.com/api/public/v1/audit-log?from=2026-05-01T00:00:00Z&pageSize=200"

고유한 작업 목록 조회

조직에 대해 기록된 모든 작업 이름을 알파벳 순으로 정렬하여 반환합니다. 목록은 조직 범위이며 — 새 테넌트는 이벤트가 흐르기 시작할 때까지 빈 배열을 반환합니다.

GET /api/public/v1/audit-log/actions
Authorization: Bearer scs_live_…

응답

[
  "apikey.created",
  "apikey.revoked",
  "assignment.completed",
  "assignment.created",
  "course.published",
  "sarif.ingested",
  "user.invited",
  "user.role_changed",
  "webhook.created"
]

예시

curl -sS \
  -H "Authorization: Bearer $SCH_API_KEY" \
  https://api.limeplate.com/api/public/v1/audit-log/actions

SIEM으로 보내기

전형적인 패턴은 cron에서 /audit-log를 폴링하고, 수집한 마지막 createdAt와 동일한 from을 전달하며, items.length < pageSize까지 페이지를 걸어가는 것입니다. 결과가 최신순으로 정렬되므로, 증분 페처는 다운스트림 순서를 시간순으로 유지하려면 이벤트를 방출하기 전에 페이지를 반전해야 합니다. v1에는 스트리밍 감사 웹훅이 없습니다 — 특정 이벤트에 대한 저지연 반응이 필요할 때 감사 폴링을 웹훅 아래에 문서화된 대상 도메인 웹훅과 결합하세요.