SaaS API광고주 캠페인 초안
POST /ai/business/collab/draft
광고주 직접 캠페인 초안 생성
광고주 직접 캠페인 초안 생성
비즈니스(광고주) 사용자가 해피콜 이전 단계에서 캠페인 초안을 직접 생성합니다.
제목은 [브랜드명] 캠페인 으로 자동 세팅되며, 수수료(feePolicyType / feeType / feeValue) 와 category 는 NULL 로 저장되어 관리자가 해피콜 후 채웁니다.
생성 즉시 대시보드에 노출되며, 모집 일정은 now ~ now + 5일 로 기본 세팅된 뒤 이후 단계(EXCLUSION_SELECTION ~ SETTLEMENT) 는 CampaignPhase.durationDays 기준으로 cascade 로 자동 생성됩니다.
광고주에게는 별도 메일을 발송하지 않으며(프런트 팝업이 안내 처리), 영업팀에게 알림 메일 + 캠페인 알리미 슬랙 채널 알림이 자동 발송됩니다.
| 항목 | 값 |
|---|---|
| 메서드 | POST |
| 경로 | /ai/business/collab/draft |
| 인증 | 필요 (ROLE_BUSINESS) |
| Content-Type | multipart/form-data |
요청
POST /ai/business/collab/draft HTTP/1.1
Host: api.glowb.com
Authorization: Bearer eyJhbGciOiJIUzI1NiIs...
Content-Type: multipart/form-datacurl -X POST "https://api.glowb.com/ai/business/collab/draft" \
-H "Authorization: Bearer {access_token}" \
-F "campaign_data=@draft.json;type=application/json" \
-F "detail_images=@product1.jpg" \
-F "detail_images=@product2.jpg" \
-F "guide_files=@guide.pdf"const formData = new FormData();
formData.append('campaign_data', new Blob([JSON.stringify({
modelType: 'STANDARD',
scriptReviewRequired: true,
managerNo: 30,
managerName: '홍길동',
managerPhone: '010-0000-0000',
managerEmail: 'manager@example.com',
productUrl: 'https://example.com/product/123',
rewardType: 'BOTH',
deliveryType: 'DELIVERY',
productReturnRequired: false,
snsType: 'INSTAGRAM',
snsContentFormat: 'INSTAGRAM_REELS',
nation: 'KR',
budget: '1000000',
headcount: '3',
finalSubmissionTypes: ['CONTENT_LINK', 'PARTNERSHIP_CODE'],
comment: '4월 중순 라이브 일정이에요.',
commentAnonymous: false,
secondaryUsageOption: '["post_secondary","clean_version"]',
secondaryUsageMonths: 3
})], { type: 'application/json' }));
detailImageFiles.forEach((f) => formData.append('detail_images', f));
guideFiles.forEach((f) => formData.append('guide_files', f));
const response = await fetch('/ai/business/collab/draft', {
method: 'POST',
headers: { 'Authorization': `Bearer ${accessToken}` },
body: formData
});Request Parts
Prop
Type
campaign_data 스키마
Prop
Type
검수 유형 자동 매핑
scriptReviewRequired 와 SNS 플랫폼(Naver vs 그 외) 조합에 따라 Collab.firstReviewTypes / secondReviewTypes 가 자동 결정됩니다. (GuidelineV2Service.setReviewTypes 와 동일 로직)
| 조건 | firstReviewTypes | secondReviewTypes |
|---|---|---|
true + Naver | {SCRIPT_BLOG} | {SCRIPT_BLOG, PHOTO} |
true + 그 외 | {SCRIPT_VIDEO} | {VIDEO, CAPTION, HASHTAG} |
false + Naver | {} | {SCRIPT_BLOG, PHOTO} |
false + 그 외 | {} | {VIDEO, CAPTION, HASHTAG} |
응답
성공 응답 (201 Created)
{
"status": 201,
"code": null,
"message": "캠페인 초안이 생성되었습니다.",
"data": {
"campaignNo": 2309,
"title": "[facebook] 캠페인",
"managerName": "홍길동",
"managerEmail": "manager@example.com",
"managerPhone": "010-0000-0000"
}
}에러 응답
| 상태 코드 | 설명 |
|---|---|
401 | 인증 실패 |
403 | ROLE_BUSINESS 권한 부족 |
404 | 기업 정보를 찾을 수 없음 (INVALID_DATA) |
500 | S3 업로드 실패 등 내부 오류 |