Glowb Dev Docs
SaaS API기업용 콘텐츠 검수

GET /ai/business/contents/review/{reviewId}/detail

검수 라운드 상세 조회

검수 라운드 상세 조회

검수 라운드의 모든 제출물과 각 제출물의 히스토리, 피드백을 포함하여 조회합니다.

HTTP 요청

GET /ai/business/contents/review/{reviewId}/detail
Authorization: Bearer {access_token}

Path Parameters

파라미터타입필수설명
reviewIdlong예검수 라운드 ID

응답

성공 응답 (200 OK)

{
  "status": 200,
  "code": null,
  "message": "검수 라운드 상세 조회가 완료되었습니다.",
  "data": {
    "reviewId": 1,
    "applicationId": 100,
    "reviewRound": 1,
    "guidelineVersion": 2,
    "status": "REVIEWING",
    "adminApprovalStatus": "NONE",
    "awaitingRevision": false,
    "uploadApproved": false,
    "feedbackDeadline": "2024-01-20T10:30:00",
    "createdAt": "2024-01-15T10:30:00",
    "creatorName": "홍길동",
    "creatorEmail": "creator@example.com",
    "submissionItems": [
      {
        "id": 1,
        "itemType": "VIDEO",
        "filePath": "https://s3.../video.mp4",
        "editorState": null,
        "comment": null,
        "status": "REVIEWING",
        "isSubmitted": true,
        "submittedAt": "2024-01-16T14:00:00",
        "uploadedAt": "2024-01-16T14:00:00",
        "currentVersion": 2,
        "createdAt": "2024-01-15T10:30:00",
        "histories": [...],
        "feedbacks": [
          {
            "id": 10,
            "feedback": "자유 피드백 내용",
            "translatedFeedback": null,
            "translatedLanguage": null,
            "feedbackType": "FREE",
            "billingType": "FREE",
            "paidScope": null,
            "revisionNo": 1,
            "feedbackCategory": null,
            "feedbackItem": null,
            "highlightedText": null,
            "isResolved": true,
            "isDraft": false,
            "createdAt": "2024-01-17T10:00:00"
          },
          {
            "id": 11,
            "feedback": "제형 표현이 충분히 보이지 않습니다.",
            "translatedFeedback": "質感の表現が十分に見えません。",
            "translatedLanguage": "jp",
            "feedbackType": "GUIDELINE_UNREFLECTED",
            "billingType": "FREE",
            "paidScope": null,
            "revisionNo": 2,
            "feedbackCategory": "필수 촬영 항목",
            "feedbackItem": "제형 표현 샷",
            "highlightedText": null,
            "isResolved": false,
            "isDraft": false,
            "createdAt": "2024-01-19T10:00:00"
          },
          {
            "id": 12,
            "feedback": "작성 중인 피드백...",
            "feedbackType": "FREE",
            "billingType": "FREE",
            "paidScope": null,
            "revisionNo": 2,
            "feedbackCategory": null,
            "feedbackItem": null,
            "highlightedText": null,
            "isResolved": false,
            "isDraft": true,
            "createdAt": "2024-01-19T11:00:00"
          }
        ]
      }
    ],
    "unreflectedFeedbackIds": [1, 2, 3],
    "previousReviewId": null,
    "uploadDateType": "CANDIDATE",
    "uploadDate": null,
    "candidateDates": "[\"2026-04-10\",\"2026-04-13\",\"2026-04-15\"]",
    "submissionDeadline": "2026-04-25T23:59:59",
    "hasTriggered": true
  }
}

Response 스키마

필드타입설명
reviewIdlong검수 라운드 ID
applicationIdlongCampaignApplication ID
reviewRoundint검수 라운드 (1: 1차, 2: 2차)
guidelineVersionint가이드라인 버전 (1: v1, 2: v2)
statusstring검수 상태
adminApprovalStatusstring검수의 검수(관리자 승인 게이트) 상태. NONE(게이트 미개입=평소) / PENDING·CHANGES_REQUESTED(관리자 승인 대기=보류 → 재제출·승인하기 차단) / APPROVED(승인 완료)
awaitingRevisionboolean크리에이터 재제출 대기 여부. 재제출 요청이 크리에이터에게 나가면 true, 크리에이터가 재제출하면 false. true인 동안에는 승인(업로드/영상제작 요청) 버튼을 막는다. status와 달리 대기 중 관리자 반려로 REVIEWING으로 되돌아가도 true가 유지된다.
uploadApprovedboolean업로드 승인 여부
feedbackDeadlinedatetime피드백 마감일
createdAtdatetime생성일시
creatorNamestring크리에이터명
creatorEmailstring크리에이터 이메일
submissionItemsarray제출물 목록 (히스토리, 피드백 포함)
unreflectedFeedbackIdsarray<long>반영되지 않은 피드백 ID 목록 (nullable)
previousReviewIdlong이전 검수 라운드 ID (2차 검수인 경우 1차 검수 ID, 1차 검수이면 null)
uploadDateTypestring업로드일 선택 타입 (OPTIMAL / CANDIDATE / ASAP, nullable)
uploadDatedatetime업로드 예정일 (OPTIMAL 타입인 경우, nullable)
candidateDatesstring후보 업로드 날짜 목록 (CANDIDATE 타입인 경우, JSON 배열 문자열, nullable)
submissionDeadlinedatetime제작물 제출 마감일 (TB_APPLICATION_SCHEDULE CONTENT_SUBMISSION_DEADLINE, nullable)
hasTriggeredbooleansubmissionDeadline이 트리거로 확정된 마감인지 여부

제출물 comment = 크리에이터 코멘트

  • submissionItems[].comment는 크리에이터가 제출하며 남긴 코멘트입니다. 전 타입 공통이며 Lexical 에디터 JSON 문자열(이미지 노드 포함 가능)이라, 일반 텍스트로 출력하지 말고 읽기 전용 에디터로 렌더링해야 합니다.
  • 스크립트 코멘트는 라운드당 하나라 모든 장면(SCRIPT_VIDEO)에 같은 값이 들어 있습니다. 한 번만 표시하세요.
  • 이전 차수 코멘트는 submissionItems[].previousRoundComments를 쓰세요. histories[]를 직접 해석할 필요가 없습니다.

제출물 previousRoundComments = 이전 차수 크리에이터 코멘트 목록

"previousRoundComments": [
  { "version": 2, "comment": "{2차 코멘트 Lexical JSON}" },
  { "version": 1, "comment": "{1차 코멘트 Lexical JSON}" }
]
  • 크리에이터 응답의 previousRoundComments와 같은 규칙입니다: 크리에이터 제출본 스냅샷만(어드민 수정 이력 제외), 최근 차수부터, 버전별 1건, 코멘트 없는 차수 제외.
  • 현재 코멘트(comment)로 보이는 차수는 빠집니다. 광고주에게 재작성 중 초안 대신 직전 제출본이 comment로 보이면, 그 차수는 목록에 없습니다.
  • 관리자는 실제 현재 내용(초안)을 받으므로, 재작성 직전에 남긴 직전 제출본 차수도 목록에 포함됩니다.
  • 첫 차수면 빈 배열입니다.

광고주에게는 크리에이터 초안이 보이지 않습니다

관리자가 아닌 호출자에게는 아래 경우 제출물의 filePath·editorState·comment가 마지막 제출본으로 대체됩니다.

  • 제출 여부가 해제된 초안: 가장 최근 히스토리 스냅샷
  • 크리에이터가 재작성 중인 제출물(승인 완료 라운드 제외): 재작성 직전에 남긴 현재 버전 스냅샷 (제출 여부는 true로 유지됨)

관리자는 실제 현재 내용을 그대로 받습니다.

hasTriggered — 지연 판정 전에 반드시 확인하세요

제출 마감일은 선정 시점에 임시(placeholder) 값으로 먼저 깔린 뒤, 배송완료·계약 서명완료 같은 트리거가 발동해야 실제 일자로 확정됩니다.

  • hasTriggered: true — 트리거가 발동해 확정된 마감입니다. 지연 판정에 사용할 수 있습니다.
  • hasTriggered: false — 아직 트리거가 발동하지 않은 임시 마감입니다. 날짜가 이미 지나 있어도 크리에이터에게 제출 의무가 시작되지 않은 상태이므로 "지연"으로 판정하면 안 됩니다.

마감일 행이 아예 없는 경우에도 false로 내려옵니다.

unreflectedFeedbackIds 필드

기업이 "피드백 미반영" 검수 추가 요청 시 지정한 피드백 ID 목록입니다.

  • 값이 있으면: 해당 피드백들을 하이라이트 표시하여 크리에이터가 미반영한 피드백 확인 가능
  • 값이 null이면: 검수 추가 요청이 없거나 OUTSIDE_GUIDELINE 유형인 경우

피드백의 feedbackType 필드 (신규)

각 피드백에 feedbackType, feedbackCategory, feedbackItem 필드가 추가되었습니다.

  • feedbackType: 피드백 종류 구분
    • FREE — 기존 자유 피드백 (category/item은 null)
    • GUIDELINE_UNREFLECTED — 가이드라인 미반영 항목 (category: 섹션명, item: 항목명)
    • GUIDELINE_EXTRA — 가이드라인 외 추가 피드백 (category: 자막/녹음 등, item: null)
  • 기존 피드백은 모두 feedbackType: "FREE"로 조회됩니다.
  • 프론트에서 feedbackType으로 피드백 종류를 구분하여 렌더링하면 됩니다.

피드백의 revisionNo 필드 (신규)

각 피드백에 작성 시점의 수정 차수가 실립니다. 1이 1차 피드백, 2가 2차 피드백입니다.

  • 차수는 크리에이터가 정식 제출한 횟수입니다. 최초 제출이 1차이고, 기업 피드백이 전달된 뒤 크리에이터가 재제출하면 2차가 됩니다.
  • 검수 단위로 1부터 시작합니다. 스크립트 검수와 영상 검수의 차수는 서로 독립입니다.
  • 저장 시점에 고정되며 이후 갱신되지 않습니다.
  • 목록에는 이전 차수의 피드백도 함께 내려옵니다. 승인·해결된 1차 피드백이 2차 피드백과 같은 배열에 섞이므로, 화면에서 회차를 구분하려면 이 필드로 그룹핑해야 합니다.
  • 2차에서 끝나지 않습니다. 3차·4차도 실제로 발생하므로 "1차/2차" 두 값으로 고정하지 말고 N차로 렌더링하세요.
  • 기존 피드백은 revisionNo: 1로 조회됩니다.

revisionNo 와 reviewRound 는 다른 개념입니다

  • reviewRound — 단계. 1=스크립트 검수, 2=영상 검수.
  • revisionNo — 그 단계 안에서의 수정 차수. 1차/2차/N차.

이름이 비슷하지만 섞으면 안 됩니다. 영상 검수(reviewRound: 2)의 1차 피드백은 revisionNo: 1입니다.

피드백의 billingType 필드

FREE(무료 검수) 또는 PAID(유료 검수) 표시 마커입니다.

피드백의 paidScope 필드 (신규)

유료 검수(재촬영/재녹음)의 범위입니다. PARTIAL(일부) / FULL(전면). billingType: PAID 인 피드백에만 값이 있고, 무료 피드백·범위를 고르지 않은 유료 피드백·컬럼 도입 전 행은 null입니다. null이면 범위 표기 없이 항목명(예: 재촬영)만 보여주세요.

billingType 을 과금 근거로 사용하지 마세요

실제 크레딧 차감은 검수 추가 요청(OUTSIDE_GUIDELINE, 50,000 크레딧)에서 일어나며 이 필드와 연동되지 않습니다. 또한 PAID 피드백은 재제출 시 삭제 후 재생성되므로 revisionNo가 재삽입 시점 값으로 다시 매겨질 수 있습니다.

피드백의 translatedFeedback / translatedLanguage 필드

각 피드백에 크리에이터 언어 번역문이 함께 내려갑니다.

  • translatedFeedback — 번역문. 해외 캠페인에서 기업이 번역을 저장한 피드백에만 값이 있고, 없으면 null입니다.
  • translatedLanguage — 번역문 언어 코드 (jp/en). 번역이 없으면 null입니다.
  • 원문 feedback은 항상 유지됩니다. 크리에이터 화면은 translatedFeedback이 있으면 이를, 없으면 feedback을 보여줍니다.

피드백의 isDraft 필드

각 피드백에 isDraft 필드가 포함됩니다.

  • isDraft: true — 임시저장된 피드백 (아직 정식 제출되지 않음)
  • isDraft: false — 정식 제출된 피드백
  • 프론트에서 isDraft로 구분하여 임시저장 피드백은 별도 UI로 표시할 수 있습니다.
  • 정식 제출 시 임시저장 피드백은 자동 삭제됩니다.

previousReviewId 필드

2차 검수(reviewRound=2)인 경우, 같은 신청 건의 1차 검수 라운드 ID를 반환합니다.

  • 이 ID로 /ai/business/contents/review/{previousReviewId}/detail을 호출하면 1차 검수 내용을 확인할 수 있습니다.
  • 1차 검수이거나 1차 검수가 존재하지 않으면 null입니다.

업로드일 관련 필드 (uploadDateType, uploadDate, candidateDates)

해당 신청 건의 최종 제출물(FinalSubmission)에 설정된 업로드일 정보입니다.

  • OPTIMAL: 3일 이내 최적 날짜에 게시 → uploadDate에 날짜 저장
  • CANDIDATE: 기업이 후보 3개 지정 → candidateDates에 JSON 배열 저장
  • ASAP: 가능한 빨리 게시
  • 업로드일이 아직 설정되지 않은 경우 세 필드 모두 null입니다.

API 테스트

On this page