Admin APIAdmin Campaign API
GET /ai/admin/campaigns/{campaignNo}
캠페인 상세 조회
캠페인 상세 조회
캠페인 상세 정보를 조회합니다.
HTTP 요청
GET /ai/admin/campaigns/{campaignNo}
Authorization: Bearer {access_token}응답
성공 응답 (200 OK)
{
"status": 200,
"code": null,
"message": "캠페인 상세 조회 성공",
"data": {
"no": 123,
"businessId": "business123",
"businessName": "(주)글로우비",
"title": "여름 뷰티 캠페인",
"category": "BEAUTY",
"sns": "instagram",
"snsContentFormat": "REEL",
"campaignType": "PRODUCT_SPONSORSHIP",
"productName": "여름 뷰티 제품",
"productUrl": "https://example.com/product",
"nation": "KR",
"creatorTargetCountry": "KR",
"isVisitRequired": "false",
"averageUnitPrice": "100000",
"person": "10",
"charge": "1000000",
"currency": "KRW",
"feePolicyType": "COST_PLUS_FEE",
"feeType": "PERCENT",
"feeValue": 10,
"priceRoundUp": true,
"deliveryType": "배송",
"firstReviewTypes": ["SCRIPT", "HASHTAG"],
"secondReviewTypes": ["VIDEO"],
"finalSubmissionTypes": ["INSTAGRAM_REEL", "INSTAGRAM_POST"],
"secondaryUsageMonths": 6,
"secondaryUsageOption": "SNS_AD",
"showPrice": true,
"priceRoundingType": 1,
"tiktokUsPriceMode": null,
"adminFeedbackApprovalEnabled": true,
"adminFeedbackApprovalScriptEnabled": true,
"adminSelectionApprovalEnabled": false,
"listMode": "EXCLUDE",
"modelType": "STANDARD",
"guidelineVersion": 2,
"campaignSubStep": "CREATOR_RECRUIT",
"guidelineStatus": "COMPLETED",
"campaignContractType": "STANDARD",
"campaignContractDescription": "계약 내용",
"caution": "제품 촬영 시 주의사항",
"managers": [
{ "managerNo": 1, "name": "홍길동", "phone": "010-1234-5678", "email": "manager@example.com", "isDefault": true }
],
"guidelineCompletedAt": "2026-05-26T11:50:41",
"recruitmentDays": 4,
"schedules": [...],
"paymentVerification": {
"paymentStatus": "PAID",
"isPaymentStatusSet": false,
"verifiedAt": null,
"verifiedAmount": null,
"verifiedMethod": null,
"verifiedMethodMemo": null,
"verifierName": null
},
"deficitLock": {
"engaged": true,
"amount": 300000,
"status": "LOCKED",
"threshold": 800000,
"sumLockedNormal": 500000,
"policyEnabled": true
}
}
}응답 필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
no | integer | 캠페인 번호 |
businessId | string | 기업 회원 ID |
businessName | string | 기업명 |
title | string | 캠페인 제목 |
category | string | 카테고리 코드 |
sns | string | SNS 플랫폼 |
snsContentFormat | SnsContentFormat | 콘텐츠 포맷 (REEL, FEED, STORY 등) |
campaignType | CampaignType | 캠페인 제공종류 |
productName | string | 상품명 |
productUrl | string | 상품 URL |
nation | string | 캠페인 운영 국가 (예: KR) |
creatorTargetCountry | string | 크리에이터 타겟 국가. ISO 3166-1 alpha-2 (예: KR). 미지정이면 null |
isVisitRequired | string | 방문 필요 여부 |
person | string | 모집인원 |
charge | string | 비용 |
currency | string | 화폐 단위 (예: KRW, USD). 수정 화면 로드 / 이전 게시물 불러오기에서 표시 |
feePolicyType | FeePolicyType | 수수료 정책 타입 (ACTUAL_COST: 실비, COST_PLUS_FEE: 실비+수수료, TOTAL_AMOUNT: 총액) |
feeType | FeeType | 수수료 유형 (PERCENT: %, FIXED: 원) |
feeValue | integer | 수수료 값 |
priceRoundUp | boolean | 가격 만원 단위 올림 여부 (레거시, priceRoundingType으로 대체) |
deliveryType | string | 배송 여부 (한국어 설명, DeliveryType.getDescription()) |
firstReviewTypes | Set<SubmissionItemType> | 1차 검수 필수 제출물 타입 |
secondReviewTypes | Set<SubmissionItemType> | 2차 검수 필수 제출물 타입 |
finalSubmissionTypes | Set<FinalSubmissionType> | 최종 제출물 타입 |
secondaryUsageMonths | integer | 2차 활용 기간 (개월). -1 = 영구활용 |
secondaryUsageOption | string | 2차 활용 옵션 |
showPrice | boolean | 가격 노출 여부 |
priceRoundingType | integer | 가격 만원 단위 처리 방식 (0=반올림, 1=올림, 2=없음) |
tiktokUsPriceMode | string | 미국 틱톡 랭크가(USD) 단가 모드. LOWEST_PRICE(A) / ACCEPTANCE(B), 설정 전이면 null(A 로 계산). 변경은 전용 API |
adminFeedbackApprovalEnabled | boolean | 검수의 검수 게이트 ON/OFF — 영상 라운드(VIDEO·CAPTION·HASHTAG). true면 기업 피드백이 관리자 승인 후 크리에이터에 전달. 실제 판정과 동일하게 true일 때만 ON(저장값 없으면 OFF). 어드민 게이트 토글의 현재 상태 표시에 사용 |
adminFeedbackApprovalScriptEnabled | boolean | 검수의 검수 게이트 ON/OFF — 스크립트 라운드. 영상 게이트와 독립. ⚠️ 이 값이 true여도 전역 플래그 script_admin_gate_enabled가 OFF면 게이트가 걸리지 않는다(이중 게이팅) |
adminSelectionApprovalEnabled | boolean | 선정의 선정 게이트 ON/OFF. true면 기업의 선정이 관리자 승인 후 확정된다. 실제 판정과 동일하게 true일 때만 ON(저장값 없으면 OFF). 관리자 전용 필드로, 기업/크리에이터 대상 API에는 노출되지 않는다. |
listMode | string | 리스트 모드 (SELECT / EXCLUDE) |
modelType | CampaignModelType | 캠페인 모델 타입 (STANDARD / SECONDARY_USAGE / PERFORMANCE) |
guidelineVersion | integer | 가이드라인 버전 (1: v1, 2: v2) |
campaignSubStep | CampaignSubStep | 캠페인 진행 상태 |
guidelineStatus | GuidelineStatus | 가이드라인 상태 (REQUESTED: 요청됨, DRAFT: 초안, COMPLETED: 완성) |
campaignContractType | string | 계약 형식 |
campaignContractDescription | string | 계약 내용 |
caution | string | 주의사항 |
managers | array | 캠페인 담당자 목록(N:M, 동등). 각 항목 { managerNo, name, phone, email, isDefault }. 담당자 미지정 시 빈 배열 |
guidelineCompletedAt | datetime | [TASK-071] 가이드라인 완성일. 출처: MongoDB GuidelineDocument.completedAt → fallback Collab.recruitment_start_date (legacy). 가이드 미완성(DRAFT) 캠페인은 null. 운영자는 PUT API 의 같은 필드로 정정 가능. |
recruitmentDays | integer | [TASK-071 Phase 3] 모집 영업일 (1-10, 기본 4). 관리자 수정 페이지에서 표시·수정 |
paymentVerification | object | 결제 상태 정보. 항상 내려간다(null 아님). 하위 필드는 아래 표 참조 |
deficitLock | object | 80% 부족분 lock 스냅샷. 상세는 부족분 lock 조회 참조. SaaS 이전 캠페인은 engaged=false, policyEnabled=false로 고정 |
paymentVerification 필드
| 필드 | 타입 | 설명 |
|---|---|---|
paymentStatus | CampaignPaymentStatus | UNPAID(미결제) | PAYMENT_PENDING(결제필요) | PAID(결제됨) |
isPaymentStatusSet | boolean | 결제 상태가 명시적으로 지정된 값인지 여부. 판단 근거는 TB_CAMPAIGN_PAYMENT_VERIFICATION 행의 존재 여부 |
verifiedAt | datetime | 결제 완료 처리 시각. 미처리 시 null |
verifiedAmount | integer | 확인된 결제 금액. 미처리 시 null |
verifiedMethod | PaymentMethod | 결제 방식. 미처리 시 null |
verifiedMethodMemo | string | 결제 방식이 OTHER 일 때의 자유 메모 |
verifierName | string | 결제 확인 담당자 이름 |
isPaymentStatusSet 판단 기준
| 값 | 의미 | paymentStatus 신뢰도 |
|---|---|---|
true | 어드민이 PATCH .../step 으로 결제 상태를 지정한 적 있음 | 그대로 신뢰 |
false | 한 번도 지정된 적 없음. 서버가 campaignSubStep 기준 폴백 규칙으로 도출한 추측값 | 신뢰 불가 |
광고주가 직접 만든 초안 캠페인(POST /ai/business/collab/draft)은 결제 상태를 지정하는 단계를 거치지 않아 isPaymentStatusSet=false 로 내려갑니다. 이때 paymentStatus 는 폴백 규칙(campaignSubStep != CAMPAIGN_PAYMENT 이면 PAID)에 따라 결제되지 않았는데도 PAID 로 표시되므로, 프런트는 isPaymentStatusSet 이 false 인 동안 paymentStatus 를 표시하지 말고 결제 상태 선택을 유도해야 합니다.
어드민이 결제 상태를 한 번 지정하면(세 값 중 무엇이든) verification 행이 생성되어 이후 조회부터 isPaymentStatusSet=true 가 됩니다.