SaaS API가이드라인 V2 API
PUT /ai/guideline/v2/{collabNo}
가이드라인 V2 저장 (Upsert)
가이드라인 V2 저장
가이드라인 V2를 저장합니다. 없으면 새로 생성, 있으면 기존 데이터와 병합합니다.
| 항목 | 값 |
|---|---|
| 메서드 | PUT |
| 경로 | /ai/guideline/v2/{collabNo} |
| 인증 | Bearer 토큰 필수 |
요청
PUT /ai/guideline/v2/123?isFirst=true&isModify=false HTTP/1.1
Host: api.glowb.io
Authorization: Bearer {access_token}
Content-Type: application/jsoncurl -X PUT "https://api.glowb.io/ai/guideline/v2/123?isFirst=true" \
-H "Authorization: Bearer {access_token}" \
-H "Content-Type: application/json" \
-d '{...}'Path Parameters
Prop
Type
Query Parameters
Prop
Type
Request Body
{
"useScriptReview": true,
"contentInfo": {
"requiredAppealPoints": { "root": { "children": [...] } },
"optionalAppealPoints": { "root": { "children": [...] } },
"promotionGuide": { "root": { "children": [...] } },
"cautionGuide": { "root": { "children": [...] } },
"hashtags": ["#글로브뷰티", "#여름선크림", "#데일리선크림"]
},
"shootingDetailInfo": {
"categoryCode": "BEAUTY",
"basicShots": [
{ "code": "HOOK", "subOption": null },
{ "code": "TEXTURE_SHOT", "subOption": null },
{ "code": "COLOR_SHOT", "subOption": null },
{
"code": "USAGE_SHOT",
"subOption": { "code": "BODY_EXPOSURE", "additionalPrice": 50000 }
},
{ "code": "PROMOTION_CONTENT", "subOption": null },
{ "code": "APPEAL_POINT_CONTENT", "subOption": null }
],
"addonShots": [
{ "code": "BEFORE_AFTER", "additionalPrice": 50000 },
{ "code": "OUTDOOR", "additionalPrice": 50000 }
]
},
"uploadSettingInfo": {
"brandTag": {
"accountName": "@glowb_beauty",
"tagMethods": ["PERSON_TAG", "CAPTION_TAG"]
},
"sponsorLabel": {
"enabled": true,
"replaceAdTag": false
},
"addCollaborator": false,
"mustReadCaution": true,
"useAutoDm": false
},
"storylineInfo": {
"referenceUrls": [
"https://instagram.com/reel/xxx",
"https://youtube.com/watch?v=yyy"
],
"storylineContent": { "root": { "children": [...] } },
"brandLogoUrls": ["https://s3.../logo.png"],
"saveBrandLogoAsDefault": true,
"photoAssetUrls": ["https://s3.../photo1.jpg", "https://s3.../photo2.jpg"]
},
"extra": {}
}필드 상세
최상위
Prop
Type
ContentInfo (Step 1: 콘텐츠 내용)
Prop
Type
ShootingDetailInfo (Step 2: 촬영 상세)
flat 구조로 저장합니다. 초반/중반/후반 구분은 프론트에서 처리합니다.
Prop
Type
카테고리 코드: BEAUTY, FASHION, TRAVEL, FINANCE_BUSINESS, FOOD, PARENTING_WEDDING, LIVING, IT, HEALTH_FITNESS
ShotSelection:
| 필드 | 타입 | 설명 |
|---|---|---|
code | string | 촬영 항목 코드 |
subOption | SubOptionSelection | null | 서브옵션 (추가 조건) |
SubOptionSelection:
| 필드 | 타입 | 설명 |
|---|---|---|
code | string | 서브옵션 코드 |
additionalPrice | integer | 추가 단가 (원) |
AddonShotSelection:
| 필드 | 타입 | 설명 |
|---|---|---|
code | string | 추가금 항목 코드 |
additionalPrice | integer | 인당 추가 단가 (원) |
카테고리별 기본 항목 코드:
| 카테고리 | 기본 항목 |
|---|---|
| 뷰티 | HOOK, TEXTURE_SHOT, COLOR_SHOT, PACKAGE_SHOT, USAGE_SHOT(서브: BODY_EXPOSURE +5만), TIP_SHOT, PROMOTION_CONTENT, APPEAL_POINT_CONTENT, PURCHASE_GUIDE, ETC |
| 패션 | HOOK, MATERIAL_SHOT, UNBOXING_SHOT, STYLING_TIP_SHOT, LOOKBOOK_SHOT(서브: FIVE_OR_MORE +5만), PROMOTION_CONTENT, APPEAL_POINT_CONTENT, PURCHASE_GUIDE, ETC |
| 여행 | HOOK, TRAVEL_INTRO_SHOT, ACCOMMODATION_SHOT, FOOD_SHOT, ACTIVITY_SHOT, LANDMARK_SHOT(서브: SIX_OR_MORE +5만), PROMOTION_CONTENT, APPEAL_POINT_CONTENT, PURCHASE_GUIDE, ETC |
| 금융/비즈니스 | HOOK, PRODUCT_INTRO_SHOT, USAGE_GUIDE_SHOT, COPYWRITING_SHOT, TIP_SHOT, PROMOTION_CONTENT, APPEAL_POINT_CONTENT, PURCHASE_GUIDE, ETC |
| 푸드 | HOOK, STORE_SHOT, COOKING_SHOT, TABLE_SHOT, MENU_DESC_SHOT(서브: FOUR_OR_MORE +5만), PRODUCT_INFO_SHOT, PROMOTION_CONTENT, APPEAL_POINT_CONTENT, PURCHASE_GUIDE, ETC |
| 육아/결혼 | HOOK, PRODUCT_INTRO_SHOT, PACKAGE_SHOT, TIP_SHOT, PROMOTION_CONTENT, APPEAL_POINT_CONTENT, PURCHASE_GUIDE, ETC |
| 리빙 | HOOK, PRODUCT_INTRO_SHOT, PACKAGE_SHOT, TIP_SHOT, FULL_VIEW_SHOT, PROMOTION_CONTENT, APPEAL_POINT_CONTENT, PURCHASE_GUIDE, ETC |
| IT | HOOK, FEATURE_DEMO_SHOT, SCREEN_SHOT, USAGE_SCENE_SHOT, PRODUCT_DESC_SHOT, PROMOTION_CONTENT, APPEAL_POINT_CONTENT, PURCHASE_GUIDE, ETC |
| 운동/건강 | HOOK, INGREDIENT_SHOT, PACKAGE_SHOT, USAGE_SHOT, ROUTINE_SHOT, PROMOTION_CONTENT, APPEAL_POINT_CONTENT, PURCHASE_GUIDE, ETC |
공통 단가 상승 항목:
| 코드 | 설명 | 추가 단가 |
|---|---|---|
BEFORE_AFTER | 비포&애프터 샷 | +50,000원 |
PROCEDURE | 시술 관련 샷 | +150,000원 |
OUTDOOR | 야외/방문 촬영 | +50,000원 |
BODY_EXPOSURE | 얼굴 외 신체 노출 촬영 | +50,000원 |
CHILD_USAGE | 아이가 제품 사용하는 샷 | +50,000원 |
UploadSettingInfo (Step 3: 업로드 설정)
Prop
Type
StorylineInfo (Step 4: 스토리라인/자료)
Prop
Type
응답
초안/완성본 저장 성공 (200 OK)
{
"status": 200,
"code": null,
"message": "가이드라인 저장 완료",
"data": {
"collabNo": 123,
"isFirst": true,
"guidelineStatus": "DRAFT",
"message": "가이드라인이 저장되었습니다."
}
}임시저장 성공 (200 OK)
{
"status": 200,
"code": null,
"message": "가이드라인 저장 완료",
"data": {
"collabNo": 123,
"isModify": true,
"guidelineStatus": "NONE",
"message": "가이드라인이 임시저장되었습니다."
}
}에러 응답
| 상태 코드 | 코드 | 설명 |
|---|---|---|
401 | UNAUTHORIZED_ACCESS | 캠페인 소유자가 아님 |
403 | GUIDELINE_MODIFICATION_NOT_ALLOWED | 콘텐츠 제작 시작 후 수정 불가 (관리자 제외) |
404 | CAMPAIGN_NOT_FOUND | 캠페인을 찾을 수 없음 |
저장 시 부수 효과
| 조건 | 동작 |
|---|---|
useScriptReview=true | TB_CAMPAIGN_ADDON_FEE에 SCRIPT_REVIEW 30,000원 저장 |
useScriptReview=true | 1차 검수: 대본(SCRIPT_VIDEO), 2차 검수: 영상+캡션+해시태그 |
useScriptReview=false | 1차 검수: 영상+캡션+해시태그, 2차 검수 없음 |
isFirst=true | guidelineStatus=DRAFT, campaignSubStep=CAMPAIGN_GUIDELINE |
isFirst=false | guidelineStatus=COMPLETED, campaignSubStep=CREATOR_RECRUIT, 벡터화 호출, 칸반 태스크 완료 |
isModify=true | MongoDB만 저장, 상태/단계 변경 없음 |
hashtags 존재 | Collab.keywords에 동기화 |
saveBrandLogoAsDefault=true | Business.brandLogoUrl에 저장 |
photoAssetUrls 존재 | Collab.productImagePath에 동기화 |