SaaS API콘텐츠 검수
GET /ai/influence/contents/ai-review/script/{reviewId}
AI 스크립트 검수 결과 조회
AI 스크립트 검수 결과 조회
1차 제출물(SCRIPT_VIDEO)에 대한 AI 스크립트 검수 결과를 검수 라운드(reviewId) 단위로 조회합니다.
해당 회차에서 제출된 모든 SCRIPT_VIDEO 항목을 묶어 1건의 검수 결과로 저장하므로, itemId가 아닌 reviewId로 조회합니다.
검수 진행 조건 및 시점
- 가이드라인 버전이 v4인 캠페인에서만 AI 스크립트 검수가 진행됩니다.
- 일괄 제출(
PUT /ai/influence/contents/review/{reviewId}/submit) 직후 비동기로 검수가 시작되며, 평균 30~60초 소요됩니다. - 검수가 끝나기 전에 조회하면
data가null로 반환됩니다. (잠시 후 다시 조회)
HTTP 요청
GET /ai/influence/contents/ai-review/script/{reviewId}
Authorization: Bearer {access_token}Path Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
reviewId | long | 예 | 검수 라운드 ID |
응답
성공 응답 (200 OK)
{
"status": 200,
"code": null,
"message": "검수 결과 조회 완료",
"data": {
"collabNo": 1234,
"applicationId": 5678,
"reviewId": 910,
"contentType": "SCRIPT_VIDEO",
"overallStatus": "PARTIAL",
"checkedAt": "2026-05-14T10:30:00Z",
"contentDetailResult": {
"categoryCode": "BEAUTY",
"basicShots": {
"beginning": [
{
"code": "HOOK",
"expected": {},
"result": {
"status": "PASS",
"confidence": 0.90,
"evidence": [
{
"type": "script_text",
"sceneIndex": 0,
"description": "피부 고민 토로하며 훅 시작",
"text": "요즘 피부가 너무 건조해서 고민이었는데요"
}
],
"comment": "가이드라인의 훅 요구사항에 맞게 피부 고민을 제시하고 있음"
}
}
],
"middle": [
{
"code": "TEXTURE_SHOT",
"expected": {},
"result": { "status": "UNCERTAIN", "confidence": 0.45, "evidence": [], "comment": "제형 묘사가 불명확" }
}
],
"ending": [
{
"code": "PURCHASE_GUIDE_END",
"expected": {},
"result": { "status": "FAIL", "confidence": 0.80, "evidence": [], "comment": "구매 유도 마무리 장면 없음" }
}
]
}
},
"marketingInfoResult": {
"requiredPoints": [
{
"text": "SPF50+ PA++++ 자외선 차단",
"result": {
"status": "PASS",
"matchType": "PARAPHRASE",
"matchedText": "SPF50에 PA++++ 자외선 차단까지 되거든요",
"evidence": [
{ "type": "script_text", "sceneIndex": 1, "description": "나레이션 언급", "text": "이 크림 SPF50에 PA++++ 자외선 차단까지 되거든요" }
],
"comment": "씬2 나레이션에서 거의 동일한 표현으로 언급"
}
},
{
"text": "24시간 지속력",
"result": { "status": "FAIL", "matchType": "NOT_FOUND", "matchedText": null, "evidence": [], "comment": "스크립트 전체에서 미발견" }
}
],
"optionalPoints": [
{
"text": "비건 인증",
"result": { "status": "FAIL", "matchType": "NOT_FOUND", "matchedText": null, "evidence": [], "comment": "언급 없음" }
}
]
},
"cautionResult": [
{
"text": "다이어트 대신 '가벼워진다' 라는 우회적 표현 사용 권장",
"result": {
"status": "FAIL",
"evidence": [
{ "type": "script_text", "sceneIndex": 2, "description": "금지 표현 '다이어트' 직접 사용", "text": "다이어트 효과가 확실한 제품이에요" }
],
"comment": "'다이어트'를 직접 사용하고 있어 우회 표현으로 변경 필요"
}
}
],
"errors": [],
"meta": {
"modelVersion": "gemini2",
"processingTimeMs": 48000
}
}
}검수 결과 없음 (200 OK)
검수가 아직 끝나지 않았거나 해당 회차에 검수 결과가 없는 경우, data는 null입니다.
{
"status": 200,
"code": null,
"message": "검수 결과가 없습니다.",
"data": null
}응답 필드 (data)
| 필드 | 타입 | 설명 |
|---|---|---|
collabNo | long | 캠페인 번호 |
applicationId | long | 신청 ID |
reviewId | long | 검수 라운드 ID |
contentType | string | SCRIPT_VIDEO |
overallStatus | string | 종합 결과 (PASS / FAIL / PARTIAL) |
checkedAt | datetime | 검수 완료 시각 (ISO 8601) |
contentDetailResult | object | 영상 초/중/후 필수 장면 검수 결과 |
marketingInfoResult | object | 필수/선택 소구포인트 검수 결과 |
cautionResult | array<object> | 주의사항 위반 여부 검수 (없으면 빈 배열) |
errors | array<string> | 검수 중 발생한 에러 목록 |
meta | object | 모델 버전, 처리 시간 등 메타 정보 |
contentDetailResult
| 필드 | 타입 | 설명 |
|---|---|---|
categoryCode | string | 카테고리 코드 (예: BEAUTY) |
basicShots.beginning | array<object> | 영상 도입부 필수 장면 결과 |
basicShots.middle | array<object> | 영상 본문 필수 장면 결과 |
basicShots.ending | array<object> | 영상 마무리 필수 장면 결과 |
basicShots.{section}[].code | string | 장면 코드 (HOOK, TEXTURE_SHOT 등) |
basicShots.{section}[].result.status | string | PASS / FAIL / UNCERTAIN |
basicShots.{section}[].result.confidence | number | 신뢰도 (0.0 ~ 1.0) |
basicShots.{section}[].result.evidence | array<object> | 판단 근거 (스크립트 인용) |
basicShots.{section}[].result.comment | string | 판단 코멘트 |
marketingInfoResult
| 필드 | 타입 | 설명 |
|---|---|---|
requiredPoints[] | array<object> | 필수 소구포인트별 검수 결과 |
requiredPoints[].text | string | 소구포인트 텍스트 |
requiredPoints[].result.status | string | PASS / FAIL / UNCERTAIN |
requiredPoints[].result.matchType | string | EXACT / PARAPHRASE / NOT_FOUND |
requiredPoints[].result.matchedText | string | 매칭된 스크립트 문구 (없으면 null) |
optionalPoints[] | array<object> | 선택 소구포인트별 검수 결과 |
optionalPoints[].text | string | 소구포인트 텍스트 |
optionalPoints[].result.status | string | PASS / FAIL |
optionalPoints[].result.matchType | string | EXACT / PARAPHRASE / NOT_FOUND |
optionalPoints[].result.matchedText | string | 매칭된 스크립트 문구 (없으면 null) |
cautionResult
| 필드 | 타입 | 설명 |
|---|---|---|
text | string | 주의사항 항목 텍스트 |
result.status | string | PASS(위반 안 함) / FAIL(위반) / UNCERTAIN |
result.evidence | array<object> | 위반 근거 (위반 시) |
result.comment | string | 판단 코멘트 |
evidence (공통)
| 필드 | 타입 | 설명 |
|---|---|---|
type | string | script_text (스크립트 근거) |
sceneIndex | int | 근거가 위치한 씬 인덱스 (0부터 시작) |
description | string | 근거에 대한 설명 |
text | string | 실제 스크립트 텍스트 인용 |
meta
| 필드 | 타입 | 설명 |
|---|---|---|
modelVersion | string | 사용된 모델 (gemini2 = Gemini 2.5 Flash) |
processingTimeMs | number | 처리 소요 시간 (ms) |
모든 검수 항목의 status는 PASS / FAIL / UNCERTAIN으로 통일됩니다. (선택 소구포인트는 PASS / FAIL만)
(단, overallStatus는 PASS / FAIL / PARTIAL)