SaaS API콘텐츠 검수
POST /ai/influence/contents/feedbacks
관리자 피드백 추가
관리자 피드백 추가
관리자 권한으로 제출물에 피드백 1건을 즉시 추가합니다. 관리자 피드백 내용 수정·관리자 피드백 삭제와 짝을 이루는 API입니다.
검수의 검수(관리자 승인 대기) 화면에서 관리자가 새 피드백을 쓸 때 사용합니다. 임시저장(POST /ai/v4/feedback/review/:reviewId/submit, isDraft=true)으로 저장한 피드백은 draft로 남아 승인해도 크리에이터에게 전달되지 않으므로, 관리자가 쓴 피드백은 이 API로 한 건씩 바로 저장해야 합니다.
관리자 전용 API입니다. ROLE_ADMIN 권한이 없으면 FEEDBACK_CREATE_FORBIDDEN(403, 관리자만 피드백을 추가할 수 있습니다.)이 발생합니다. 관리자 수정·삭제 API의 FEEDBACK_EDIT_FORBIDDEN 과 짝입니다. 권한 확인을 통과한 뒤의 입력 오류는 여전히 INVALID_DATA(404)입니다.
동작
- 정식 피드백으로 저장됩니다 —
isDraft=false,businessResponse=NONE. - 승인 상태(
adminDecision)는 라운드가 이미 크리에이터에게 나갔는지로 갈립니다.
| 시점 | 라운드 상태 | adminDecision |
|---|---|---|
| 검수의 검수 (승인 대기·반려) | 게이트 PENDING / CHANGES_REQUESTED | PENDING |
| 기업 검수 중 (아직 크리에이터에게 안 나감) | 게이트 NONE·APPROVED + 라운드 PENDING/REVIEWING | PENDING |
| 크리에이터 수정 중·라운드 승인 후 | awaitingRevision=true 또는 라운드 REJECTED/APPROVED | APPROVED |
PENDING으로 저장된 피드백은 기업 피드백과 같이 관리자 승인(decide)을 거쳐 함께 전달됩니다.- 이미 크리에이터에게 나간 라운드는 더 거칠 승인 단계가 없어
APPROVED로 저장합니다.PENDING으로 두면 그 피드백은 전달될 기회가 없습니다. - 수정 차수(
revisionNo)는 라운드의 현재 차수로 기록됩니다. - 광고주가 피드백 포함 승인으로 올린 라운드면 추가된 피드백도 즉시 해결(
isResolved=true) 처리됩니다. - 라운드 상태·검수의 검수 게이트·알림은 바꾸지 않습니다. 이미 크리에이터에게 전달된 라운드에 추가하면 크리에이터 화면에 곧바로 보이며, 알림은 발송되지 않습니다.
추가 이력 추적
서버 로그에 [ADMIN_FEEDBACK_CREATE] 태그로 피드백 ID·관리자 ID·라운드 ID·라운드 상태·저장된 adminDecision·내용이 기록됩니다.
HTTP 요청
POST /ai/influence/contents/feedbacks
Authorization: Bearer {access_token}
Content-Type: application/jsonRequest Body
v4 제출(submit) 요청의 items[] 한 건과 같은 형식입니다. id는 무시되며 항상 새 피드백이 생성됩니다.
{
"itemId": 4237,
"feedback": "자막의 과장 표현을 수정해 주세요.",
"highlightedText": null,
"selection": null,
"feedbackType": "FREE",
"feedbackCategory": null,
"feedbackItem": "자막",
"billingType": "FREE",
"paidScope": null,
"mediaList": [
{
"mediaType": "IMAGE",
"startTime": 3.5,
"endTime": null,
"comment": null,
"mediaUrl": "https://storage.googleapis.com/glowb-input/feedback/4237/example.png"
}
]
}Request Body 스키마
| 필드명 | 타입 | 필수 | 설명 |
|---|---|---|---|
itemId | long | 예 | 피드백을 달 제출물 ID |
feedback | string | 조건부 | 피드백 내용. feedback과 mediaList 중 하나는 있어야 함 |
highlightedText | string | 아니오 | 캡션·해시태그 드래그 피드백의 대상 텍스트 |
selection | string | 아니오 | 선택 위치 JSON 문자열(AI 항목 피드백은 aiItemKey) |
feedbackType | string | 아니오 | FREE(기본) / GUIDELINE_UNREFLECTED / GUIDELINE_EXTRA |
feedbackCategory | string | 아니오 | 피드백 카테고리 |
feedbackItem | string | 아니오 | 하위 카테고리(예: 자막, 편집효과, 재녹음) |
translatedFeedback | string | 아니오 | 크리에이터 언어 번역문(선택). 해외 캠페인에서만 저장되고 한국 캠페인에서는 무시됩니다. 언어 코드는 서버가 캠페인으로 정합니다. 번역문은 피드백 번역 API로 만들 수 있습니다. |
billingType | string | 아니오 | FREE(기본) / PAID |
paidScope | string | 아니오 | 유료 검수 범위 PARTIAL / FULL. billingType=PAID일 때만 저장 |
mediaList | array | 조건부 | 첨부 미디어. 파일은 먼저 POST /ai/v4/feedback/media로 업로드한 뒤 받은 mediaUrl을 넣음 |
id | long | 아니오 | 무시됨 |
응답
성공 응답 (200 OK)
{
"status": 200,
"code": null,
"message": "피드백이 추가되었습니다.",
"data": {
"id": 7190,
"feedback": "자막의 과장 표현을 수정해 주세요.",
"highlightedText": null,
"selection": null,
"mediaList": [],
"feedbackAuthor": {
"id": "byaht"
},
"isResolved": false,
"checkedByCreator": false,
"feedbackType": "FREE",
"billingType": "FREE",
"paidScope": null,
"revisionNo": 1,
"feedbackCategory": null,
"feedbackItem": "자막",
"createdAt": "2026-09-22T20:45:00",
"resolvedAt": null,
"isDraft": false,
"releasedToCreator": false,
"translatedFeedback": "字幕の誇張表現を修正してください。",
"translatedLanguage": "jp"
}
}응답 필드 (번역 관련)
| 필드 | 타입 | 설명 |
|---|---|---|
translatedFeedback | string | null | 저장된 번역문. 요청에 없었거나 한국 캠페인이면 null |
translatedLanguage | string | null | 번역문 언어 코드(jp / en). 번역문이 없으면 null |
에러 응답
| 상태 코드 | 설명 |
|---|---|
403 | 관리자 권한 없음 (FEEDBACK_CREATE_FORBIDDEN) |
404 | itemId 누락 |
404 | feedback과 mediaList가 모두 비어있음 |
404 | 제출물을 찾을 수 없음 / 제출물에 검수 라운드가 없음 |