사용자 로그 조회

GET /v1/users/{user_id}/logs · 권한 logs:read

한 사용자의 로그 기록을 커서 페이지네이션으로 최신순으로 조회합니다. 대시보드의 사용자 활동 보기에 표시되는 데이터입니다. 같은 규칙을 따르지만 로그 조회와 달리 from, to, type, org_id 필터만 허용하며, 다른 필터는 무시됩니다.

조직 범위

조직 관리자를 위한 멤버 진단 보기를 만들려면 org_id를 전달하십시오. 이 경우 키에는 organizations:read 권한도 있어야 합니다. 사용자가 해당 조직의 멤버가 아니면(invited, active, suspended 멤버십이 없으면) 요청은 404 not_found로 실패합니다. 이는 알 수 없는 사용자에 대한 응답과 같습니다. 사용자가 멤버이면 해당 조직의 컨텍스트에서 발생한 기록, 즉 org_id가 그 조직인 기록만 반환됩니다. 조직 밖에서 발생했거나 다른 조직의 컨텍스트에서 발생한 사용자의 로그인 기록은 반환되지 않습니다. org_id를 생략하면 환경 내 사용자의 모든 기록이 포함됩니다.

요청

매개변수 위치 필수 설명
user_id path 예 사용자 ID이며 usr_ 접두사가 붙습니다.
limit query 아니요 페이지 크기, 1에서 100까지. 기본값은 20입니다.
after query 아니요 list_metadata.after에서 받은 불투명 커서(더 오래된 기록). before와 함께 사용할 수 없습니다.
before query 아니요 list_metadata.before에서 받은 불투명 커서(더 새로운 기록). after와 함께 사용할 수 없습니다.
from query 아니요 RFC 3339 시각이며, 이 시각 이후의 기록을 조회합니다. 보존 기간 내여야 합니다.
to query 아니요 RFC 3339 시각이며, 이 시각 이전의 기록을 조회합니다. from보다 늦어야 합니다.
type query 아니요 authentication. 또는 session.created와 같은 로그 유형 접두사입니다. 최대 20개 값까지 매개변수를 반복할 수 있으며, 그중 하나라도 일치하는 기록이 반환됩니다.
org_id query 아니요 조직 ID이며 org_ 접두사가 붙습니다. 보기를 해당 조직의 기록으로 제한합니다. 조직 범위를 참조하십시오. organizations:read 권한이 필요합니다.

기록은 항상 occurred_at 기준 최신순으로 정렬되며, order 매개변수는 없습니다(order=desc는 허용되며, 다른 값은 validation_failed로 실패합니다). 커서는 발급된 필터와 함께 사용할 때만 유효합니다.

응답

200 OK. data에는 해당 페이지의 기록이 담깁니다. list_metadata.after는 더 오래된 기록을, list_metadata.before는 더 새로운 기록을 가리키며, 해당 기록이 없으면 null입니다. 전체 개수는 반환되지 않습니다. 비어 있는 필드는 null입니다.

ip, ip_asn, user_agent, user_agent_family는 키에 audit-events:read_ip 권한이 있을 때만 포함되며, identifier_hint는 users:read_pii 권한이 있을 때만 포함됩니다. 권한이 없으면 마스킹된 값이 아니라 해당 필드가 아예 제외됩니다. ip_country는 항상 반환됩니다.

{
  "data": [
    {
      "id": "evt_01j9xk3m7q8r2s4t6v8w0y2z4a",
      "occurred_at": "2026-10-01T08:15:42.120Z",
      "type": "authentication.password.failed",
      "outcome": "failure",
      "reason_code": "invalid_credentials",
      "user_id": "usr_0a1b2c3d4e5f6g7h8j9k0m1n2p",
      "org_id": null,
      "application_id": "app_01j9xk3m7q8r2s4t6v8w0y2z4b",
      "connection_id": "conn_01j9xk3m7q8r2s4t6v8w0y2z4c",
      "directory_id": null,
      "session_id": null,
      "identifier_hint": "a***@e***.com",
      "ip": "203.0.113.7",
      "ip_country": "DE",
      "ip_asn": 64500,
      "user_agent": "Mozilla/5.0 (X11; Linux x86_64)",
      "user_agent_family": "Firefox",
      "risk": null,
      "auth_context": null,
      "act_chain": null,
      "details": {"attempt": 3},
      "request_id": "0192a6c1-7d3e-7a10-9b2c-3d4e5f607182",
      "correlation_id": null,
      "trace_id": "4bf92f3577b34da6a3ce929d0e0e4736"
    }
  ],
  "list_metadata": {
    "before": null,
    "after": "<opaque cursor>"
  }
}

오류

모든 오류는 안정적인 code를 포함한 application/problem+json 본문으로 반환됩니다.

HTTP code 발생 조건
400 invalid_cursor 커서 형식이 잘못되었거나 이 요청에 대해 발급되지 않았습니다.
400 invalid_filter 로그 서비스가 필터 또는 커서를 거부했습니다.
400 range_outside_retention from이 요금제의 보존 기간보다 이전입니다.
422 validation_failed 쿼리 매개변수가 잘못되었습니다(limit 범위 초과, 잘못된 시각, from보다 늦지 않은 to, type 값 20개 초과, 형식이 잘못된 org_id, 반복된 매개변수).
401 unauthenticated API 키가 없거나, 잘못되었거나, 취소되었습니다.
403 insufficient_permissions 키에 logs:read 권한이 없거나, org_id가 설정되었는데 키에 organizations:read 권한이 없습니다. required_permissions에 요청에 필요한 권한이 나열됩니다.
404 not_found 사용자 ID 형식이 잘못되었거나, org_id가 설정되었는데 사용자가 해당 조직의 멤버가 아닙니다.
429 rate_limited 요청 한도를 초과했습니다. Retry-After를 따르십시오.
503 service_unavailable 종속 서비스를 일시적으로 사용할 수 없습니다. 나중에 다시 시도하십시오.

예제

curl "https://api.eu.keenauth.com/v1/users/usr_0a1b2c3d4e5f6g7h8j9k0m1n2p/logs?limit=50" \
  -H "Authorization: Bearer $KEENAUTH_SECRET_KEY"

한 조직의 기록만 조회하려면 다음과 같이 하십시오.

keenauth users logs list usr_0a1b2c3d4e5f6g7h8j9k0m1n2p --org-id org_01j9xk3m7q8r2s4t6v8w0y2z4d --type authentication.

개인정보

이 엔드포인트는 개인정보, 즉 환경 로그를 포함합니다. KeenAuth API의 개인정보에서 저장되는 항목, 보관 기간, 삭제 방법을 설명합니다. 어떤 필드에도 민감정보(건강, 생체 인식 데이터, 종교, 정치적 견해, 성적 指向 등)를 보내지 마십시오.