서비스로 돌아가기

API 문서

회사 워크스페이스의 도메인과 스캔을 서버·CI 에서 다루는 방법 · v1

시작하기

  1. 조직 → API 키 탭에서 키를 발급해요. 원문은 발급할 때 한 번만 보여 줘요.
  2. 모든 요청에 Authorization: Bearer rwk_… 를 붙여요.
  3. 워크스페이스는 키가 발급된 회사로 고정돼요. 키에 개인 워크스페이스는 없어요.
권한할 수 있는 일
read도메인 · 스캔 · 리포트 조회
scan조회 + 스캔 시작 · TXT 재확인

회사가 2단계 인증·허용 IP를 켜 두면 API 키도 같은 정책을 따라요. 정책 밖에서는 403이 돌아와요.

엔드포인트

GET/api/domains읽기 전용

워크스페이스에 등록된 도메인 목록.

{
  "domains": [
    { "id": 12, "domain": "example.com", "scope": "single", "status": "verified",
      "consent_signed": true, "txt_token": "…", "created_at": "2026-10-06T08:12:00Z" }
  ]
}
  • status — pending(미인증) · verified(인증됨) · stale(재인증 필요)
  • scope — single · sweep
GET/api/scans읽기 전용

스캔 목록 + 남은 크레딧 + 구독 정보.

{
  "scans": [ { "id": 340, "domain": "example.com", "status": "done",
               "phase": "reporting", "finding_count": 6, "cost_krw": "3720", "created_at": "…" } ],
  "credits": 3,
  "subscription": { "plan": "growth", "status": "active", "next_charge_at": "…" }
}
  • status — pending_payment · running · done · failed · canceled
GET/api/scans/{id}읽기 전용

한 스캔의 발견 사항 · 증거 · 도구 실행 기록.

{
  "scan": { "id": 340, "status": "done", "finding_count": 6 },
  "findings": [
    { "id": 91, "severity": "high", "title": "/backup 디렉터리가 공개됨",
      "target_url": "https://example.com/backup/", "remediation": "…", "advisory": "…",
      "status": "open", "evidence": [ { "kind": "http", "preview": "HTTP/1.1 200 OK…" } ] }
  ],
  "actions": [ { "tool": "nuclei_scan", "host": "example.com", "verdict": "allow", "ts": "…" } ]
}
  • 증거의 개인정보는 저장 전에 마스킹됩니다
  • severity — critical · high · medium · low · info
  • ?lang=ko|en — 발견 항목의 제목·설명·조치 방법·증거와 종합 리포트(scan.report_md)를 그 언어로 번역해서 돌려줘요. 번역이 아직 만들어지는 중이면 원문과 함께 tr_pending 이 0보다 큰 값으로 와요(몇 초 뒤 다시 호출).
GET/api/scans/{id}/report.{pdf|docx|xlsx|hwpx}읽기 전용

끝난 스캔의 리포트 파일 — PDF(공유·보관) · Word(.docx, 수정·전달) · Excel(.xlsx, 조치 추적표: 조치 상태 선택·담당자·기한) · 한글(.hwpx). 심각도 요약, 발견 항목별 위치·분류(CWE)·위험 점수(CVSS)·고치는 방법·증거가 들어 있어요.

  • ?lang=ko|en — 파일 언어(기본 ko). 번역본이 없으면 만들어질 때까지 기다린 뒤 내려줘요(최대 90초).
  • ?tz=Asia/Seoul — 날짜·시각 표기에 쓸 시간대(IANA, 기본 Asia/Seoul).
  • 진행 중인 스캔은 409 scan_not_finished, 없는 스캔·형식은 404. 10분에 30회, 동시에 2건까지 만들어요.
  • 응답은 Content-Disposition: attachment 이고 캐시되지 않아요.
POST/api/scans스캔 실행

스캔 시작. 점검 강도(tier)에 따라 크레딧이 필요해요 — fast 1개 · thorough 2개(기본) · deep 3개. 구독은 자동 재점검과 매달 크레딧 지급을 포함하지만, 수동 스캔은 항상 크레딧을 써요.

# 요청 — tier: thorough(기본) | fast | deep
{ "domainId": 12 }
{ "domainId": 12, "tier": "deep" }

# 옛 형식(engine·mode)도 받아요 — 같은 강도로 해석돼요: strix+deep → deep, strix+standard → thorough, strix+quick·redwolf → fast
{ "domainId": 12, "engine": "strix", "mode": "deep" }

# 응답 200
{ "scan": { "id": 341, "status": "pending_payment" } }

# 실패
{ "error": "consent_required" }    # TXT 미인증 · 동의서 필요
{ "error": "payment_required" }    # 크레딧이 모자람
{ "error": "auth_engine_unsupported" } # 로그인 자격(auth)은 tier=fast 에서만
{ "error": "scan_already_running" }
  • 4중 관문(TXT · 동의서 · 결제 · 네트워크 고정)을 통과해야 실제로 시작됩니다
  • 워크스페이스당 동시에 1개만 실행됩니다
POST/api/domains/{id}/verify스캔 실행

도메인 DNS TXT 재확인 (+ 동의서 메일 재발송).

{ "verified": true, "consent_sent": true, "consent_signed": false }
  • TXT 레코드는 _redwolf.<도메인>, 값은 도메인 카드에 표시됩니다
  • 메일 발송 상한이 있어 연속 호출은 429

curl 예시

export REDME_KEY=rwk_…        # 발급받은 키
export REDME=https://redme.ai

# 도메인 목록
curl -H "Authorization: Bearer $REDME_KEY" $REDME/api/domains

# 스캔 시작 (domainId 는 도메인 목록에서)
curl -X POST -H "Authorization: Bearer $REDME_KEY" -H "Content-Type: application/json" \
  -d '{"domainId":12,"kind":"oneshot"}' $REDME/api/scans

# 결과가 나올 때까지 상태 확인
curl -H "Authorization: Bearer $REDME_KEY" $REDME/api/scans/341
# 리포트 파일(영어 Word)
curl -H "Authorization: Bearer $REDME_KEY" -o report.docx "$REDME/api/scans/341/report.docx?lang=en"

오류

오류는 {"error":"code"} 형태로 돌아옵니다.

HTTPcode뜻해결
401invalid_api_key키가 폐기됐거나 형식이 잘못됨키를 다시 발급
403forbidden_role키 권한으로는 할 수 없는 작업scan 권한 키 발급
403mfa_required회사가 2단계 인증을 요구하는데 키 발급자가 미등록발급자가 [계정] 탭에서 등록
403ip_not_allowed회사의 허용 IP 밖에서 호출회사 관리자에게 IP 등록 요청
402payment_required크레딧 · 구독 없음요금제에서 결제
412txt_not_verified
consent_required
도메인 소유 · 동의 관문 미통과도메인 카드의 안내대로 처리
429scan_already_running
rate_limited
동시 스캔 1개 제한 또는 호출 상한잠시 후 재시도

알아 둘 것