o2o-plagiarism-ai/docs/API_GUIDE_BAIKAL.md

7.3 KiB

저작권 탭 API 연동 가이드

1. 연동 요약

저작권 탭은 아래 API를 한 번 호출해 렌더링한다.

POST https://plagiarism.o2o.kr/v1/plagiarism/review

이 API는 내부적으로 표절 탐지, AI 생성 의심도 산출, 판례 비교를 수행하지만 앱에는 화면에 필요한 요약값만 반환한다. 상세 탐지 API의 matches, evidence_spans, extracted_elements, score_semantics, 모델 정보 등은 응답하지 않는다.

2. 공통 규격

항목
Base URL https://plagiarism.o2o.kr
Method POST
Path /v1/plagiarism/review
Content-Type application/json; charset=utf-8
인증 운영에서 설정된 경우 X-API-Key 헤더 사용
시간 ISO 8601 UTC

3. 요청

최소 요청

{
  "doc_id": "episode-001",
  "text": "창밖으로 보이는 숲은 오늘따라 유난히 푸르게 보였다."
}

전체 요청

{
  "doc_id": "episode-001",
  "text": "검사할 에피소드 본문 전체",
  "metadata": {
    "title": "에피소드 1",
    "author": "홍길동",
    "genre": "자서전"
  },
  "options": {
    "threshold": null,
    "top_k": 5,
    "autobiography_mode": null
  },
  "legal_context": {
    "work_type": "literary",
    "access_evidence": null,
    "protected_expression_reviewed": false,
    "rights_verified": false
  }
}
필드 타입 필수 설명
doc_id string O 호출 측 문서 또는 에피소드 ID
text string O 검사할 본문, 1자 이상
metadata object X 제목, 저자, 장르 등 표시·추적용 메타데이터
options.threshold number/null X 탐지 임계값. 미지정 시 서버 기본값
options.top_k integer X 내부 비교 후보 수, 기본 5
options.autobiography_mode boolean/null X 자서전 특화 전처리 사용 여부
legal_context object X 사람이 확인한 접근 가능성·권리관계 등의 법적 맥락

일반적인 저작권 탭 연동에서는 doc_id, text만 전달하면 된다.

4. 응답

침해 의심이 낮은 예시

{
  "doc_id": "episode-001",
  "copyright": {
    "originality_percent": 98,
    "similarity_percent": 2,
    "compared_count": 31560,
    "has_suspicion": false,
    "description": "등록 원문 검색 세그먼트 31,560건과 대조한 결과 표절 의심 구간이 없습니다."
  },
  "similar_sentences": {
    "count": 0,
    "label": "0건"
  },
  "ai_generation_suspicion": {
    "level": "low",
    "label": "낮음"
  },
  "legal_judgment": {
    "status": "low",
    "label": "등록 판례 기준 침해 의심 낮음",
    "summary": "등록 코퍼스에서 일치 증거가 확인되지 않아 판례 기반 침해 의심을 제시하지 않습니다. 다만 미매칭은 비침해 확정이 아닙니다.",
    "precedent_ids": []
  },
  "analyzed_at": "2026-08-18T03:00:00Z"
}

판례에 따른 침해 의심 예시

{
  "doc_id": "episode-002",
  "copyright": {
    "originality_percent": 10,
    "similarity_percent": 90,
    "compared_count": 31560,
    "has_suspicion": true,
    "description": "등록 원문 검색 세그먼트 31,560건과 대조한 결과 표절 의심 구간이 확인되었습니다."
  },
  "similar_sentences": {
    "count": 5,
    "label": "5건"
  },
  "ai_generation_suspicion": {
    "level": "unknown",
    "label": "확인 불가"
  },
  "legal_judgment": {
    "status": "suspected",
    "label": "판례에 비추어 저작권 침해 의심",
    "summary": "2011고단6934, 2013노232 판례의 판단 기준과 탐지 증거를 비교한 결과, 표현 일치 범위가 커 저작권 침해가 의심되어 추가 검토가 필요합니다.",
    "precedent_ids": ["2011고단6934", "2013노232"]
  },
  "analyzed_at": "2026-08-18T03:01:00Z"
}

5. 화면 매핑

화면 항목 응답 경로 표시 방법
독창성 98% copyright.originality_percent 숫자 뒤 %
저작권 · 유사도 2% copyright.similarity_percent 숫자 뒤 %
대조 결과 설명 copyright.description 문자열 그대로 표시
유사 문장 0건 similar_sentences.label 문자열 그대로 표시
AI 생성 의심도 낮음 ai_generation_suspicion.label 문자열 그대로 표시
판례 판단 제목 legal_judgment.label 의심 또는 검토 필요 시 표시
판례 판단 근거 legal_judgment.summary 제목 아래 설명으로 표시
근거 판례 legal_judgment.precedent_ids[] 사건번호 배지로 표시

compared_count는 현재 등록된 검색 세그먼트 수다. 원천 PDF 파일 수 또는 외부 공개 문서 전체 건수로 바꾸어 표기하지 않는다.

6. 상태값

의미 권장 UI
suspected 판례와 탐지 증거에 비추어 침해 의심 빨간색 또는 주의 표시
low 현재 증거에서 침해 의심 낮음 기본 또는 정상 표시
review_required 관련 판례에 따른 추가 확인 필요 노란색 검토 표시
unavailable 등록 판례가 없어 비교 불가 회색 안내 표시

ai_generation_suspicion.level

한글 라벨
low 낮음
medium 중간
high 높음
unknown 확인 불가

unknown을 임의로 low로 바꾸지 않는다. 학습 모델이 없거나 채점할 수 없는 경우다.

7. 호출 예시

curl -X POST 'https://plagiarism.o2o.kr/v1/plagiarism/review' \
  -H 'Content-Type: application/json' \
  -d '{
    "doc_id": "episode-001",
    "text": "검사할 에피소드 본문"
  }'
const response = await fetch(
  "https://plagiarism.o2o.kr/v1/plagiarism/review",
  {
    method: "POST",
    headers: { "Content-Type": "application/json" },
    body: JSON.stringify({ doc_id: episodeId, text: episodeText })
  }
);

if (!response.ok) throw new Error(`저작권 검사 실패: ${response.status}`);
const result = await response.json();

originality.textContent = `${result.copyright.originality_percent}%`;
copyrightDescription.textContent = result.copyright.description;
similarSentenceCount.textContent = result.similar_sentences.label;
aiSuspicion.textContent = result.ai_generation_suspicion.label;
legalTitle.textContent = result.legal_judgment.label;
legalDescription.textContent = result.legal_judgment.summary;

8. 오류 처리

HTTP 의미 처리
200 검사 완료 응답으로 화면 갱신
401 API 키 누락 또는 불일치 인증 설정 확인
422 요청 형식 오류 또는 빈 본문 입력값 확인
503 탐지 또는 판례 검토 기능 사용 불가 잠시 후 재시도
500 서버 내부 오류 오류 로그와 doc_id 전달

앱은 검사 중 로딩 상태를 표시하고, 실패하면 직전 성공 결과를 새 결과처럼 표시하지 않는다.

9. 상세 API

관리자 화면에서 일치 원문, 좌표, 점수 구성 등 상세 증거가 필요할 때만 POST /v1/plagiarism/detect를 사용한다. 모바일 저작권 탭은 응답 크기가 작은 POST /v1/plagiarism/review를 사용한다.

이 결과는 등록 코퍼스와 판례에 기반한 검토 보조 의견이며 법률상 침해 확정이 아니다.