REST API 레퍼런스
KYRA MDR REST API는 alert, incident, collector 및 기타 플랫폼 리소스에 대한 프로그래밍 방식의 접근을 제공합니다. 기존 도구와 KYRA MDR을 통합하거나, 워크플로우를 자동화하거나, 커스텀 대시보드를 구축하는 데 사용할 수 있습니다.
Base URL: https://api.seekerslab.com/api/v1
인증
모든 API 요청에는 Authorization 헤더에 Bearer 토큰이 필요합니다.
API Key 생성
- KYRA MDR Console을 엽니다
- Settings > API Keys로 이동합니다
- Create API Key를 클릭합니다
- 키에 이름을 지정합니다 (예: “SIEM Integration”)
- 권한 범위를 선택합니다 (read-only 또는 read-write)
- 키를 복사합니다 — 다시 표시되지 않습니다
API Key 사용
모든 요청에 키를 포함합니다:
curl -H "Authorization: Bearer YOUR_API_KEY" \ https://api.seekerslab.com/api/v1/alerts인증 오류
| 상태 | 의미 |
|---|---|
401 Unauthorized | API key 누락 또는 유효하지 않음 |
403 Forbidden | API key에 필요한 권한 없음 |
429 Too Many Requests | Rate limit 초과 (아래 참조) |
Rate Limit
| 플랜 | Rate Limit |
|---|---|
| FREE | 60 requests/minute |
| MDR | 300 requests/minute |
| PRO | 1,000 requests/minute |
| CUSTOM | Custom |
Rate limit 헤더는 모든 응답에 포함됩니다:
X-RateLimit-Limit: 300X-RateLimit-Remaining: 297X-RateLimit-Reset: 1700000060공통 파라미터
| 파라미터 | 타입 | 설명 |
|---|---|---|
page | integer | 페이지 번호 (기본값: 1) |
size | integer | 페이지당 항목 수 (기본값: 20, 최대: 100) |
sort | string | 정렬 필드 (예: created_at) |
order | string | 정렬 순서: asc 또는 desc |
from | ISO 8601 | 시간 범위 시작 |
to | ISO 8601 | 시간 범위 종료 |
Alerts
Alert 목록 조회
GET /alerts쿼리 파라미터:
| 파라미터 | 타입 | 설명 |
|---|---|---|
severity | string | 심각도별 필터: critical, high, medium, low, info |
status | string | 상태별 필터: open, in_progress, resolved, false_positive |
source_type | string | 소스별 필터: fortigate, windows, aws-cloudtrail 등 |
예시:
# 최근 24시간의 모든 미처리 critical alert 조회curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://api.seekerslab.com/api/v1/alerts?severity=critical&status=open&from=2026-03-21T00:00:00Z"응답:
{ "data": [ { "id": "alert-550e8400-e29b", "title": "Brute Force Authentication Attempt", "severity": "high", "status": "open", "source_type": "windows", "source_ip": "10.0.1.55", "mitre_tactic": "Credential Access", "mitre_technique": "T1110", "created_at": "2026-03-22T08:15:30Z", "event_count": 47, "ai_summary": "47 failed logon attempts (Event ID 4625) from 10.0.1.55 targeting 3 accounts in 2 minutes." } ], "pagination": { "page": 1, "size": 20, "total": 1, "total_pages": 1 }}Alert 상세 조회
GET /alerts/{alert_id}curl -H "Authorization: Bearer YOUR_API_KEY" \ https://api.seekerslab.com/api/v1/alerts/alert-550e8400-e29bAlert 상태 업데이트
PATCH /alerts/{alert_id}curl -X PATCH \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"status": "resolved", "comment": "False positive - authorized penetration test"}' \ https://api.seekerslab.com/api/v1/alerts/alert-550e8400-e29bIncidents
Incident 목록 조회
GET /incidents| 파라미터 | 타입 | 설명 |
|---|---|---|
severity | string | 심각도별 필터 |
status | string | open, investigating, contained, resolved, closed |
assignee | string | 담당 분석가별 필터 |
curl -H "Authorization: Bearer YOUR_API_KEY" \ "https://api.seekerslab.com/api/v1/incidents?status=open"응답:
{ "data": [ { "id": "inc-7c9e6679-a1f4", "title": "Suspected Lateral Movement - WORKSTATION-12", "severity": "critical", "status": "investigating", "alert_count": 5, "created_at": "2026-03-22T07:00:00Z", "updated_at": "2026-03-22T08:30:00Z", "assignee": "analyst@company.com", "mitre_tactics": ["Lateral Movement", "Credential Access"], "ai_summary": "Multiple pass-the-hash logons from WORKSTATION-12 to 4 servers within 10 minutes, followed by LSASS memory access." } ]}Incident 상세 조회
GET /incidents/{incident_id}타임라인, 관련 alert, 영향받는 자산, 대응 조치를 포함한 전체 incident를 반환합니다.
Incident 코멘트 추가
POST /incidents/{incident_id}/commentscurl -X POST \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{"content": "Isolated WORKSTATION-12 from network. Investigating root cause."}' \ https://api.seekerslab.com/api/v1/incidents/inc-7c9e6679-a1f4/commentsCollectors
Collector 목록 조회
GET /collectorscurl -H "Authorization: Bearer YOUR_API_KEY" \ https://api.seekerslab.com/api/v1/collectors응답:
{ "data": [ { "id": "col-abc123", "name": "DC-Collector-01", "hostname": "collector01.internal.company.com", "status": "connected", "version": "1.5.2", "os": "Ubuntu 22.04", "last_seen": "2026-03-22T09:00:15Z", "events_per_second": 245, "uptime_hours": 720 } ]}Collector 상세 조회
GET /collectors/{collector_id}상태 메트릭, 설정된 소스, 버퍼 상태를 포함한 상세 정보를 반환합니다.
로그 검색
이벤트 검색
POST /searchcurl -X POST \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "query": "source_type:windows AND event_id:4625", "from": "2026-03-21T00:00:00Z", "to": "2026-03-22T00:00:00Z", "size": 50 }' \ https://api.seekerslab.com/api/v1/search응답:
{ "data": [ { "timestamp": "2026-03-21T14:22:10Z", "source_type": "windows", "source_ip": "10.0.1.55", "event_id": 4625, "message": "An account failed to log on.", "fields": { "TargetUserName": "admin", "LogonType": 3, "WorkstationName": "ATTACKER-PC", "IpAddress": "192.168.1.100" } } ], "total": 342}검색 쿼리 구문
| 연산자 | 예시 | 설명 |
|---|---|---|
| 필드 일치 | source_type:windows | 정확한 필드 일치 |
| AND | severity:critical AND status:open | 두 조건 모두 |
| OR | src_ip:10.0.1.1 OR src_ip:10.0.1.2 | 하나의 조건 |
| NOT | NOT source_type:sysmon | 일치 제외 |
| 와일드카드 | user:admin* | 접두사 일치 |
| 범위 | event_count:[10 TO 100] | 숫자 범위 |
Webhooks
Webhook 생성
POST /webhookscurl -X POST \ -H "Authorization: Bearer YOUR_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "Slack Critical Alerts", "url": "https://hooks.slack.com/services/T00/B00/xxx", "events": ["alert.created"], "filters": { "severity": ["critical", "high"] } }' \ https://api.seekerslab.com/api/v1/webhooksWebhook 이벤트
| 이벤트 | 설명 |
|---|---|
alert.created | 새 alert 탐지됨 |
alert.updated | Alert 상태 변경됨 |
incident.created | 새 incident 생성됨 |
incident.updated | Incident 상태 변경됨 |
collector.disconnected | Collector 오프라인 전환 |
Webhook Payload
{ "event": "alert.created", "timestamp": "2026-03-22T08:15:30Z", "data": { "id": "alert-550e8400-e29b", "title": "Brute Force Authentication Attempt", "severity": "high", "source_type": "windows", "url": "https://kyra-mdr-console.seekerslab.com/alerts/alert-550e8400-e29b" }}오류 응답
모든 오류는 일관된 형식을 따릅니다:
{ "error": { "code": "INVALID_PARAMETER", "message": "Invalid severity value. Allowed: critical, high, medium, low, info", "details": { "parameter": "severity", "value": "urgent" } }}| HTTP 상태 | 오류 코드 | 설명 |
|---|---|---|
| 400 | INVALID_PARAMETER | 유효하지 않은 요청 파라미터 |
| 401 | UNAUTHORIZED | API key 누락 또는 유효하지 않음 |
| 403 | FORBIDDEN | 권한 부족 |
| 404 | NOT_FOUND | 리소스를 찾을 수 없음 |
| 429 | RATE_LIMITED | 요청 과다 |
| 500 | INTERNAL_ERROR | 서버 오류 — 고객 지원에 문의 |
SDK 및 라이브러리
REST API는 모든 HTTP 클라이언트에서 사용 가능합니다. 아래는 주요 언어에서의 예시입니다:
# Python 예시import requests
API_KEY = "your-api-key"BASE_URL = "https://api.seekerslab.com/api/v1"
headers = {"Authorization": f"Bearer {API_KEY}"}
# 미처리 critical alert 조회response = requests.get( f"{BASE_URL}/alerts", headers=headers, params={"severity": "critical", "status": "open"})
alerts = response.json()["data"]for alert in alerts: print(f"[{alert['severity']}] {alert['title']}")도움이 필요하신가요?
- API 관련 문의: api-kyra@seekerslab.com
- Rate Limit 증가 요청: kyra@seekerslab.com으로 연락
- 버그 리포트: 문제 보고 시
X-Request-Id응답 헤더를 포함해 주세요