SaaS API피드백 관리자 승인 (v4)
피드백 제출
검수 라운드의 피드백을 작성·제출합니다. 관리자 승인 게이트가 ON이면 크리에이터에게 바로 전달되지 않고 PENDING 상태로 대기합니다.
피드백 제출
검수 라운드의 피드백을 작성·제출합니다. 토글 ON이면 관리자 검토 대기(PENDING)로 들어가고 크리에이터에게 가지 않습니다.
인증 필요. 소유 기업(캠페인 작성자) 또는 관리자만 접근 가능 — 아니면 403 FORBIDDEN(code AUTH_002).
미디어(이미지/영상)를 첨부할 경우, 먼저 미디어 업로드 API로 파일을 업로드하여 mediaUrl을 받은 뒤, 해당 URL을 mediaList[].mediaUrl에 넣어 제출하세요.
승인 옵션
- 피드백 없이 즉시 승인: 이 API가 아니라 승인 API를 사용하세요. 게이트를 거치지 않고 바로 승인됩니다.
- 피드백을 남기면서 승인(
approveWithFeedback: true): 피드백은 즉시resolved처리되지만, 게이트(관리자 승인)는 그대로 거칩니다. 게이트가 모두 통과되면 재제출 요청이 아니라 승인으로 릴리즈됩니다. - 재제출 요청(기본,
approveWithFeedback미지정/false): 게이트 통과 후 피드백 달린 제출물이REJECTED(재제출 요청)로 릴리즈됩니다.
HTTP 요청
POST /ai/v4/feedback/review/{reviewId}/submit
Authorization: Bearer {access_token}
Content-Type: application/jsonPath Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
reviewId | long | 예 | 검수 라운드 ID |
Request Body
items[] 하나로 자유/가이드라인 내·외 피드백 모두 담습니다. isDraft: true 면 임시저장(게이트/크리에이터 전달 없이 저장만). approveWithFeedback: true 면 피드백을 남기면서 승인(피드백 즉시 resolved + 게이트 통과 후 승인 릴리즈).
{
"isDraft": false,
"approveWithFeedback": false,
"items": [
{
"itemId": 9001,
"feedback": "도입부에 훅이 없어요. Hook 장면을 추가해주세요.",
"highlightedText": null,
"selection": null,
"feedbackType": "GUIDELINE_UNREFLECTED",
"feedbackCategory": "영상 초반",
"feedbackItem": "HOOK",
"billingType": "FREE",
"mediaList": [
{ "mediaType": "IMAGE", "comment": "이 부분 참고", "mediaUrl": "https://storage.googleapis.com/{bucket}/feedback/9001/uuid_sample.jpg" },
{ "mediaType": "VIDEO", "startTime": 10.5, "endTime": 15.0, "comment": "이 구간 재촬영", "mediaUrl": "https://storage.googleapis.com/{bucket}/feedback/9001/uuid_clip.mp4" }
]
},
{
"itemId": 9001,
"feedback": "가이드라인에 없는 클로즈업 장면 추가 촬영 부탁드려요.",
"feedbackType": "GUIDELINE_EXTRA",
"billingType": "PAID"
}
]
}SubmitRequest
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
isDraft | boolean | 아니오 | true: 임시저장(상태 변경·관리자 게이트·크리에이터 전달 없음). 미지정/false: 정식 제출. 정식·임시 모두 직전 임시저장본은 교체됨 |
approveWithFeedback | boolean | 아니오 | true: 피드백 포함 승인 — 생성되는 피드백을 즉시 resolved 처리하고 검수 라운드에 "승인 의도"를 기억(approvedWithFeedback). 게이트는 그대로 거치며, 모두 통과되면 재제출이 아니라 승인으로 릴리즈. 미지정/false: 재제출 요청. 정식 제출 시 매번 요청값으로 갱신됨 |
items | SubmitItem[] | 예 | 피드백 목록 |
SubmitItem
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
itemId | long | 예 | 피드백을 붙일 제출물(장면) ID. 해당 reviewId에 속해야 함 |
feedback | string | 아니오 | 피드백 내용 |
highlightedText | string | 아니오 | 하이라이트된 텍스트 |
selection | string | 아니오 | 선택 영역 정보(JSON 문자열) |
feedbackType | string | 아니오 | FREE/GUIDELINE_UNREFLECTED/GUIDELINE_EXTRA. 미지정 시 FREE |
feedbackCategory | string | 아니오 | AI 검수 카테고리 (예: 영상 초반) |
feedbackItem | string | 아니오 | AI 검수 항목 코드 (예: HOOK) |
billingType | string | 아니오 | FREE/PAID. 미지정 시 FREE |
mediaList | MediaMeta[] | 아니오 | 미디어 메타데이터. 미디어는 먼저 업로드 API로 올려 받은 mediaUrl을 넣습니다 |
MediaMeta
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
mediaType | string | 아니오 | IMAGE / VIDEO. 미지정 시 IMAGE |
startTime | double | 아니오 | 영상 시작 시간(초) |
endTime | double | 아니오 | 영상 끝 시간(초) |
comment | string | 아니오 | 해당 미디어 코멘트 |
mediaUrl | string | 예 | 미디어 업로드 API(POST /ai/v4/feedback/media)로 받은 GCS URL. 없거나 blank면 해당 항목은 저장되지 않음 |
응답
성공 응답 (200)
{ "status": 200, "code": null, "message": "제출 완료", "data": null }에러 응답
| 상태 코드 | code | 상황 |
|---|---|---|
403 | AUTH_002 | 소유 기업/관리자가 아님 |
400 | INVALID_DATA | 검수 라운드/피드백/제출물 없음, 또는 itemId가 해당 reviewId에 속하지 않음 |