Glowb Dev Docs
테스트 데이터 세팅

캠페인 + 가이드라인 생성

캠페인을 만들고 가이드라인까지 채웁니다. 공동작업자·브랜드 계정 태그·협찬 레이블을 켜고 끌 수 있습니다.

캠페인 + 가이드라인 생성

캠페인 생성을 그대로 수행한 뒤, MongoDB guidelines 에 가이드라인 본문을 저장하고 guidelineStatus 를 COMPLETED 로 올립니다.

운영과 동일하게 캠페인 단계가 CAMPAIGN_GUIDELINE → CREATOR_RECRUIT(모집 시작) 로 넘어가고, 모집 마감이 가이드라인 완성 시점 + 모집 영업일(기본 4) 로 재계산됩니다.

모집이 시작되므로 랜딩 노출(showLanding)도 함께 켜집니다. 캠페인만 만든 상태(POST /ai/test-setup/campaign)에서는 꺼져 있습니다.

HTTP 요청

POST /ai/test-setup/campaign-with-guideline
Content-Type: application/json

Request Body

캠페인 생성의 모든 필드에 영상 마케팅 옵션 3종이 추가됩니다. 전부 선택값이며, 안 보내면 세 옵션 모두 꺼진 상태로 생성됩니다.

{
  "snsType": "TIKTOK",
  "nation": "KR",
  "creatorTargetCountry": "KR",
  "collaborator":    { "enabled": true, "accountName": "@glowb_test" },
  "brandAccountTag": { "enabled": true, "accountName": "@glowb_test",
                       "tagMethods": ["PERSON_TAG", "CAPTION_TAG"] },
  "sponsorLabel":    { "enabled": true, "accountName": "@glowb_sponsor", "replaceAdTag": true }
}
필드타입설명
collaboratorObject공동작업자 추가
collaborator.enabledBoolean사용 여부 (기본 false)
collaborator.accountNameString계정명 (@ 포함, 기본 @glowb_test)
brandAccountTagObject브랜드 계정 태그
brandAccountTag.enabledBoolean사용 여부 (기본 false)
brandAccountTag.accountNameString계정명 (@ 포함)
brandAccountTag.tagMethodsArray<String>PERSON_TAG(사람 태그) / CAPTION_TAG(캡션 작성). 중복 선택 가능
sponsorLabelObject협찬 레이블 추가
sponsorLabel.enabledBoolean사용 여부 (기본 false)
sponsorLabel.accountNameString계정명 (@ 포함). 브랜드 계정과 별개로 저장됩니다
sponsorLabel.replaceAdTagBoolean#광고 태그 대신 협찬 레이블로 대체 (기본 true)

계정이 저장되는 자리가 항목마다 다릅니다.

  • 공동작업자·브랜드 계정 태그 — upload_requirements.account_name 한 칸을 공유합니다. 둘 다 켜면 공동작업자 계정명이 쓰이고, 둘 다 꺼져 있으면 null 입니다. 이 값은 Business.instagramAccountName(광고주 브랜드 계정)으로 sync 되는 자리라 원래 하나입니다.
  • 협찬 레이블 — 자기 칸(sponsor_label_text)을 따로 가집니다. 브랜드 계정과 다른 계정을 넣을 수 있습니다.

계정명은 @ 를 떼고 저장됩니다.

응답 (200 OK)

{
  "status": 200,
  "code": null,
  "message": "캠페인 + 가이드라인 생성 완료",
  "data": {
    "collabNo": 3202,
    "title": "자동생성-3202",
    "businessId": "202604Q",
    "snsType": "TIKTOK",
    "nation": "KR",
    "creatorTargetCountry": "KR",
    "currency": "KRW",
    "doubleReview": true,
    "deliveryType": "DELIVERY",
    "campaignSubStep": "CREATOR_RECRUIT",
    "recruitmentEndDate": "2026-08-11T23:59:59",
    "guidelineStatus": "COMPLETED",
    "uploadRequirements": {
      "collaborator": { "enabled": true },
      "account_name": "glowb_test",
      "narration_required": true,
      "brand_tag": { "enabled": true, "tag_methods": ["PERSON_TAG", "CAPTION_TAG"] },
      "sponsor_label": { "enabled": true, "replace_ad_tag": true },   // 계정은 여기 없고 sponsor_label_text 에
      "is_ai_suggested": null
    }
  }
}

uploadRequirements 는 가이드라인에 실제로 저장된 값을 그대로 돌려줍니다. 꺼진 옵션은 enabled: false 로 내려갑니다.

저장되는 가이드라인 본문

AI를 태우지 않고 뷰티 프리셋을 씁니다. 실제 생성은 수 분이 걸리고 트렌드 컨셉이 3개 미만이면 폴백 없이 502로 실패하기 때문입니다.

V4 스키마(snake_case)로 저장해야 합니다. GET /ai/guideline/{collabNo} 는 저장된 문서를 매핑 없이 그대로 돌려줍니다. 구 GuidelineRequestDto 형태(basicInfo·contentDetailInfo·marketingInfo)로 넣으면 화면이 아무 필드도 못 찾아 빈 가이드라인으로 보입니다.

{
  "selected_concept": { "type": "viral", "label": "자기 전 5분 턱선 루틴", "index": 1 },
  "concept_one_liner": "...",
  "shots": {
    "beginning": [{ "code": "HOOK", "scene": "...", "scene_json": "<Lexical 상태 JSON>" }],
    "middle": [
      { "code": "TEXTURE_SHOT", "scene": "...", "scene_json": "..." },
      { "code": "USAGE_SHOT",   "scene": "...", "scene_json": "..." },
      { "code": "TIP_SHOT",     "scene": "...", "scene_json": "..." }
    ],
    "ending": [{ "code": "PURCHASE_GUIDE_END", "scene": "...", "scene_json": "..." }]
  },
  "required_appeal_points": ["..."],
  "optional_appeal_points": ["..."],
  "hashtags": ["홈케어디바이스", "턱선관리", "EMS마사지기", "글로우비"],
  "upload_requirements": {
    "collaborator": { "enabled": true },
    "account_name": "glowb_test",
    "narration_required": true,
    "brand_tag": { "enabled": true, "tag_methods": ["PERSON_TAG", "CAPTION_TAG"] },
    "sponsor_label": { "enabled": true, "replace_ad_tag": true },   // 계정은 여기 없고 sponsor_label_text 에
    "is_ai_suggested": null
  },
  "brand_tag_methods": ["PERSON_TAG", "CAPTION_TAG"],
  "sponsor_label_text": "glowb_sponsor",
  "caution_guide": "...", "caution_guide_json": "<Lexical 상태 JSON>",
  "creator_preference": "...", "product_link_share": { "enabled": false, "method": "dm", "link": "" }
}

읽을 때 헷갈리기 쉬운 세 가지를 짚어 둡니다.

  • 마케팅 옵션 3종은 upload_requirements 안에 있습니다. marketingInfo.videoMarketingOptions 는 구 스키마 자리라 V4 화면이 읽지 않습니다.
  • 계정명은 @ 를 뗀 값으로 저장됩니다(@glowb_test → glowb_test). 실제 V4 데이터가 그렇습니다.
  • scene_json 은 프런트 에디터(Lexical)의 상태 JSON 입니다. scene 본문만 넣고 이걸 빼면 에디터가 빈 화면이 됩니다.

촬영 옵션 코드(TEXTURE_SHOT·USAGE_SHOT·TIP_SHOT)는 GuidelineShotOptionCatalog 의 BEAUTY 코드와 일치해야 프런트가 라벨을 그립니다. 프리셋을 수정할 때 임의 코드를 넣지 마세요.

컨셉 후보 3개는 data 가 아니라 세션 필드 concepts 에 따로 저장됩니다.

에러 응답

에러도 HTTP 는 200 이고, body 의 status 필드로 판정합니다.

body status상황
404snsType 이 INSTAGRAM/TIKTOK 이 아님
500MongoDB 에 같은 collabNo 문서가 중복 존재 (non unique result)

API 테스트

On this page