Main APIAI 콘텐츠 검수 API
POST /ai/influence/contents/ai-review/video
AI 영상 검수
AI 영상 검수
영상 URL과 캠페인 정보를 기반으로 AI 검수를 수행합니다. collabNo로 가이드라인을 조회하여 검수 기준으로 사용합니다.
| 항목 | 값 |
|---|---|
| 메서드 | POST |
| 경로 | /ai/influence/contents/ai-review/video |
| 인증 | 필요 |
| Content-Type | application/json |
요청
POST /ai/influence/contents/ai-review/video
Authorization: Bearer {access_token}
Content-Type: application/jsonRequest Body
{
"collabNo": 123,
"applicationId": 456,
"itemId": 789,
"videoUrl": "https://example.com/video.mp4",
"campaignName": "2024 겨울 캠페인",
"brand": "브랜드명",
"options": {
"language": "ko",
"needTranscript": true,
"needSceneCut": true,
"extras": {}
}
}Request Body 스키마
| 필드명 | 타입 | 필수 | 설명 |
|---|---|---|---|
collabNo | long | 예 | 캠페인 번호 (가이드라인 조회용) |
applicationId | long | 아니오 | 지원 ID (결과 저장용) |
itemId | long | 아니오 | 제출물 ID (결과 저장용) |
videoUrl | string | 예 | 검수할 영상 URL |
campaignName | string | 아니오 | 캠페인명 |
brand | string | 아니오 | 브랜드명 |
options | object | 아니오 | 검수 옵션 |
Options 스키마
| 필드명 | 타입 | 기본값 | 설명 |
|---|---|---|---|
language | string | ko | 검수 언어 (ko, en 등) |
needTranscript | boolean | true | 자막 추출 여부 |
needSceneCut | boolean | true | 장면 분할 여부 |
extras | object | null | 추가 옵션 |
중요: applicationId와 itemId가 모두 제공된 경우에만 검수 결과가 DynamoDB에 저장됩니다.
응답
성공 응답 (200 OK)
{
"status": 200,
"code": null,
"message": "AI 영상 검수 완료",
"data": {
"collabNo": 123,
"applicationId": 456,
"itemId": 789,
"contentType": "VIDEO",
"overallStatus": "PASS",
"checkedAt": "2024-12-22T10:30:00+09:00",
"contentDetailResult": {
"categoryCode": "BEAUTY",
"basicShots": [
{
"code": "PRODUCT_SHOT",
"expected": {
"appealPoint": "제품 클로즈업",
"subOption": "5초 이상"
},
"result": {
"status": "PASS",
"confidence": 0.95,
"evidence": [
{
"type": "VIDEO",
"timeRange": [10.5, 18.2],
"description": "제품 클로즈업 장면 확인",
"text": null
}
],
"comment": "가이드라인에 맞게 제품 클로즈업이 포함되어 있습니다."
}
}
],
"additionalOptions": [
{
"code": "BRAND_MENTION",
"result": {
"status": "PASS",
"confidence": 0.88,
"evidence": [
{
"type": "AUDIO",
"timeRange": [5.0, 8.0],
"description": "브랜드명 언급",
"text": "오늘 소개할 제품은 브랜드명의..."
}
],
"comment": "브랜드명이 정확히 언급되었습니다."
}
}
]
},
"marketingInfoResult": {
"requiredPoints": [
{
"text": "제품 사용 후기 포함",
"result": {
"status": "PASS",
"matchType": "EXACT",
"matchedText": "사용해보니 정말 좋았어요",
"evidence": [
{
"type": "AUDIO",
"timeRange": [25.0, 30.0],
"description": "사용 후기 언급",
"text": "사용해보니 정말 좋았어요"
}
],
"comment": "필수 마케팅 포인트가 포함되어 있습니다."
}
}
],
"optionalPoints": [],
"hashtags": ["#광고", "#협찬", "#브랜드명"],
"videoMarketingOptions": {
"promotion": {
"expectedDescription": "유료광고 표시",
"result": {
"status": "PASS",
"matchType": "PARTIAL",
"matchedText": "#광고",
"evidence": [],
"comment": "광고 표시가 확인되었습니다."
}
},
"brandAccountTag": null,
"collaborator": null
}
},
"errors": [],
"meta": {
"modelVersion": "gemini-2.0-flash",
"processingTimeMs": 15234.5
}
}
}응답 스키마
| 필드 | 타입 | 설명 |
|---|---|---|
collabNo | long | 캠페인 번호 |
applicationId | long | 지원 ID |
itemId | long | 제출물 ID |
contentType | string | 콘텐츠 타입 (VIDEO) |
overallStatus | string | 전체 검수 결과 (PASS, FAIL) |
checkedAt | string | 검수 완료 시간 (ISO 8601) |
contentDetailResult | object | 콘텐츠 상세 검수 결과 |
marketingInfoResult | object | 마케팅 정보 검수 결과 |
errors | array | 오류 메시지 목록 |
meta | object | 메타 정보 |
ContentDetailResult 스키마
| 필드 | 타입 | 설명 |
|---|---|---|
categoryCode | string | 카테고리 코드 |
basicShots | array | 기본 샷 검수 결과 목록 |
additionalOptions | array | 추가 옵션 검수 결과 목록 |
ShotCheckResult 스키마
| 필드 | 타입 | 설명 |
|---|---|---|
status | string | 상태 (PASS, FAIL, PARTIAL) |
confidence | number | 신뢰도 (0.0 ~ 1.0) |
evidence | array | 근거 목록 |
comment | string | AI 코멘트 |
Evidence 스키마
| 필드 | 타입 | 설명 |
|---|---|---|
type | string | 근거 타입 (VIDEO, AUDIO, TEXT) |
timeRange | array | 시간 범위 [시작초, 종료초] |
description | string | 설명 |
text | string | 추출된 텍스트 (있는 경우) |
Meta 스키마
| 필드 | 타입 | 설명 |
|---|---|---|
modelVersion | string | 사용된 AI 모델 버전 |
processingTimeMs | number | 처리 시간 (밀리초) |
v4 가이드라인 응답 형식
가이드라인 버전이 v4인 캠페인은 아래와 같이 응답 구조가 달라집니다. v2 캠페인은 기존 형식 그대로 반환됩니다.
v4 변경점 요약
| 항목 | v2 | v4 |
|---|---|---|
basicShots | array (flat) | object (beginning / middle / ending) |
expected | { "appealPoint": "..." } | { "scene": "...", "example_comment": "..." } |
cautionResult | 없음 | array<object> (주의사항 위반 검수) |
overallStatus | PASS / FAIL | PASS / FAIL / PARTIAL |
v4 응답 예시
{
"status": 200,
"code": null,
"message": "AI 영상 검수 완료",
"data": {
"collabNo": 1546,
"contentType": "VIDEO",
"overallStatus": "FAIL",
"checkedAt": "2026-06-01T08:32:25.037332+00:00",
"contentDetailResult": {
"basicShots": {
"beginning": [
{
"code": "HOOK",
"expected": {
"scene": "[장면] 크리에이터가 입안의 불편함으로 인해 미간을 찌푸리며 고통스러워하는 표정을 짓는다.",
"example_comment": "[예시멘트] 아 진짜... 또 구내염이에요? 밥 먹을 때마다 고통스러워서 미치겠어요 ㅠㅠ"
},
"result": {
"status": "PASS",
"confidence": 0.92,
"evidence": [
{
"type": "frame",
"timeRange": [0.0, 3.5],
"description": "크리에이터가 입 주변을 만지며 불편한 표정을 짓고 있음.",
"text": ""
},
{
"type": "speech",
"timeRange": [0.5, 3.0],
"description": "구내염으로 인한 고통을 표현하는 멘트.",
"text": "또 구내염 났어... 진짜 아파서 밥도 못 먹겠어"
}
],
"comment": "가이드라인에서 요구한 HOOK 장면이 영상 초반에 적절히 표현되어 있습니다."
}
}
],
"middle": [
{
"code": "PRODUCT_INTRO_SHOT",
"expected": {
"scene": "[장면] 크리에이터가 하이퍼 오라샷 제품을 꺼내 카메라를 향해 보여준다.",
"example_comment": "[예시멘트] 바로 하이퍼 오라샷이에요. 이거 진짜 인생템 등극했습니다!"
},
"result": {
"status": "PASS",
"confidence": 0.95,
"evidence": [
{
"type": "frame",
"timeRange": [4.0, 8.0],
"description": "크리에이터가 파우치에서 하이퍼 오라샷 제품을 꺼내 카메라에 보여줌.",
"text": ""
},
{
"type": "speech",
"timeRange": [4.5, 7.5],
"description": "제품 소개 멘트.",
"text": "그래서 찾은 게 바로 이 하이퍼 오라샷! 진짜 구원템이에요"
}
],
"comment": "제품을 자연스럽게 꺼내며 소개하는 장면이 가이드라인과 일치합니다."
}
},
{
"code": "STRENGTH_SHOT",
"expected": {
"scene": "[장면] 크리에이터가 제품을 입안에 뿌리는 모습을 클로즈업하여 보여준다.",
"example_comment": "[예시멘트] 칙칙 뿌리기만 하면 끝! FDA/식약처 인증 의료기기라 믿음이 확 가죠?"
},
"result": {
"status": "FAIL",
"confidence": 0.85,
"evidence": [
{
"type": "frame",
"timeRange": [9.0, 15.0],
"description": "제품 사용 장면이 있으나 클로즈업이 아닌 중간 샷으로 촬영됨.",
"text": ""
}
],
"comment": "제품 사용 시연은 있으나, 가이드라인에서 요구한 클로즈업 촬영이 아닙니다."
}
}
],
"ending": [
{
"code": "PURCHASE_GUIDE_END",
"expected": {
"scene": "[장면] 크리에이터가 제품을 들고 환하게 웃으며 추천 메시지를 전달한다.",
"example_comment": "[예시멘트] 구내염으로 고생하고 있다면, 하이퍼 오라샷 꼭 한번 써보세요!"
},
"result": {
"status": "PASS",
"confidence": 0.88,
"evidence": [
{
"type": "frame",
"timeRange": [40.0, 46.0],
"description": "크리에이터가 제품을 들고 카메라를 향해 미소 지으며 추천.",
"text": ""
},
{
"type": "speech",
"timeRange": [41.0, 45.0],
"description": "마무리 추천 멘트.",
"text": "입안 상처 때문에 고생하는 분들 꼭 써보세요, 진짜 달라요!"
}
],
"comment": "엔딩 샷에서 제품 추천 메시지를 적절히 전달하고 있습니다."
}
}
]
},
"additionalOptions": [
{
"code": "NARRATION_REQUIRED",
"result": {
"status": "PASS",
"confidence": 1.0,
"evidence": [
{
"type": "speech",
"timeRange": [0.0, 46.0],
"description": "크리에이터가 영상 내내 자신의 목소리로 직접 말하고 있음.",
"text": ""
}
],
"comment": "A female voice narrates throughout the audio."
}
},
{
"code": "BGM_INCLUDED",
"result": {
"status": "PASS",
"confidence": 0.95,
"evidence": [
{
"type": "speech",
"timeRange": [0.0, 46.0],
"description": "잔잔한 배경음악이 영상 전반에 깔려 있음.",
"text": ""
}
],
"comment": "Soft background music is present throughout the audio."
}
}
]
},
"marketingInfoResult": {
"requiredPoints": [
{
"text": "FDA&식약처 인증 의료기기로 검증된 구강 상처 케어템",
"result": {
"status": "PASS",
"matchType": "PARAPHRASE",
"matchedText": "식약처 인증받은 의료기기라 안심하고 쓸 수 있어요",
"evidence": [
{
"type": "speech",
"timeRange": [12.0, 15.0],
"description": "식약처 인증 관련 멘트.",
"text": "식약처 인증받은 의료기기라 안심하고 쓸 수 있어요"
}
],
"comment": "의미적으로 동일한 표현으로 언급됨."
}
},
{
"text": "43종 스테로이드 불검출 및 천연 유래 성분으로 안심 사용 가능",
"result": {
"status": "FAIL",
"matchType": "NOT_FOUND",
"matchedText": "",
"evidence": [],
"comment": "관련 멘트나 자막이 없습니다."
}
}
],
"optionalPoints": [
{
"text": "파우치에 쏙 들어가는 콤팩트한 사이즈로 뛰어난 휴대성",
"result": {
"status": "PASS",
"matchType": "EXACT",
"matchedText": "파우치에 쏙 들어가서 휴대하기 너무 좋아요",
"evidence": [
{
"type": "speech",
"timeRange": [30.0, 33.0],
"description": "휴대성 관련 멘트.",
"text": "파우치에 쏙 들어가서 휴대하기 너무 좋아요"
}
],
"comment": "거의 동일한 표현으로 언급됨."
}
}
]
},
"cautionResult": [
{
"text": "바이러스 치료, 완치 표현 사용 불가",
"result": {
"status": "PASS",
"evidence": [
{
"type": "speech",
"timeRange": [0.0, 46.0],
"description": "치료, 완치와 같은 금지 표현을 사용하지 않았습니다.",
"text": ""
}
],
"comment": "해당 금지어가 영상 내에서 언급되지 않았습니다."
}
}
],
"errors": [],
"meta": {
"modelVersion": "gemini3",
"processingTimeMs": 131129.77
}
}
}v4 basicShots (섹션별 그룹)
| 필드 | 타입 | 설명 |
|---|---|---|
basicShots.beginning | array<object> | 영상 도입부 필수 장면 결과 |
basicShots.middle | array<object> | 영상 본문 필수 장면 결과 |
basicShots.ending | array<object> | 영상 마무리 필수 장면 결과 |
v4 expected 스키마
| 필드 | 타입 | 설명 |
|---|---|---|
scene | string | 가이드라인에 정의된 장면 설명 |
example_comment | string | 가이드라인에 정의된 예시 멘트 |
v4 cautionResult
| 필드 | 타입 | 설명 |
|---|---|---|
text | string | 주의사항 항목 텍스트 |
result.status | string | PASS(위반 안 함) / FAIL(위반) / UNCERTAIN |
result.evidence | array<object> | 위반 근거 |
result.comment | string | 판단 코멘트 |
에러 응답
| 상태 코드 | 코드 | 메시지 |
|---|---|---|
| 400 | INVALID_REQUEST | collabNo는 필수입니다. |
| 400 | INVALID_REQUEST | videoUrl은 필수입니다. |
| 500 | AI_REVIEW_FAILED | AI 검수 중 오류가 발생했습니다. |
사용 예시
curl -X POST https://api.glowb.io/ai/influence/contents/ai-review/video \
-H "Authorization: Bearer {token}" \
-H "Content-Type: application/json" \
-d '{
"collabNo": 123,
"applicationId": 456,
"itemId": 789,
"videoUrl": "https://example.com/video.mp4",
"campaignName": "2024 겨울 캠페인",
"brand": "브랜드명",
"options": {
"language": "ko",
"needTranscript": true,
"needSceneCut": true
}
}'