Glowb Dev Docs
Admin API

Admin Dashboard API

관리자 대시보드 관리 API

Admin Dashboard API

관리자 대시보드 관리 API입니다.

Base URL: /ai/admin/dashboard

이 API는 관리자 권한이 필요합니다.

엔드포인트 목록

대시보드 관리

메서드경로설명
GET/ai/admin/dashboard/managers?businessId={businessId}기업 담당자 목록 조회
POST/ai/admin/dashboard대시보드 생성
GET/ai/admin/dashboard/{campaignNo}/progress캠페인 진행 상황 조회
PATCH/ai/admin/dashboard/{campaignNo}/substep캠페인 진행 상태 변경

리스트 관리

메서드경로설명
GET/ai/admin/dashboard/{campaignNo}/list리스트 관리 조회
PATCH/ai/admin/dashboard/{campaignNo}/list리스트 관리 벌크 업데이트

벌크 업데이트

메서드경로설명
PATCH/ai/admin/dashboard/{campaignNo}/bulk신청 상태 벌크 변경

유저 풀

메서드경로설명
GET/ai/admin/dashboard/{campaignNo}/user-pool유저 풀 조회 (가입자)
GET/ai/admin/dashboard/{campaignNo}/user-pool/unregistered비가입자 이메일 풀 조회

가격 협상

메서드경로설명
POST/ai/admin/dashboard/{campaignNo}/price-negotiations협업 단가 전송

크리에이터 모집 단계

메서드경로설명
PATCH/ai/admin/dashboard/applications/creator-recruit선정 상태, 배송 상태, 운송장 번호 일괄 업데이트

API 상세

기업 담당자 목록 조회

기업의 모든 담당자(관계자) 목록을 조회합니다. 대시보드 생성 시 담당자를 선택하기 위해 사용합니다.

HTTP 요청

GET /ai/admin/dashboard/managers?businessId={businessId}
Authorization: Bearer {access_token}

Query Parameters

파라미터타입필수설명
businessIdString기업 회원 ID (memberId)

응답

성공 응답 (200 OK)

{
  "status": 200,
  "code": null,
  "message": "담당자 목록 조회 성공",
  "data": [
    {
      "managerNo": 1,
      "name": "김영희",
      "phone": "010-1234-5678",
      "email": "yhkim@company.com",
      "isDefault": true
    },
    {
      "managerNo": 2,
      "name": "박철수",
      "phone": "010-9876-5432",
      "email": "cspark@company.com",
      "isDefault": false
    }
  ]
}

성공 응답 (200 OK) - 담당자 없음

{
  "status": 200,
  "code": null,
  "message": "담당자 목록 조회 성공",
  "data": []
}

에러 응답 (404 Not Found) - 기업 정보 없음

{
  "status": 404,
  "code": "INVALID_DATA",
  "message": "기업 정보를 찾을 수 없습니다."
}

Response 스키마 (BusinessManagerResponseDto)

필드타입설명
managerNoLong담당자 번호
nameString담당자 이름
phoneString담당자 연락처
emailString담당자 이메일
isDefaultBoolean기본 담당자 여부

대시보드 생성

관리자가 대시보드를 생성합니다.

HTTP 요청

POST /ai/admin/dashboard
Authorization: Bearer {access_token}
Content-Type: application/json

Request Body

필드타입필수설명
businessIdString기업 아이디
titleString캠페인 제목
categoryCategoryType아니오캠페인 카테고리
snsTypeSnsType아니오SNS 타입
contentFormatSnsContentFormat아니오콘텐츠 포맷 (릴스, 피드, 스토리 등)
showPriceBoolean아니오가격 노출 여부 (기본값: true)
listModeString아니오리스트 모드 (EXCLUDE, SELECT)
chargeString아니오예산
nationString아니오국가
feePolicyTypeFeePolicyType아니오수수료 정책 타입
feeTypeFeeType아니오수수료 유형
feeValueInteger아니오수수료 값
managerNoLong아니오담당자 번호 (기존 담당자 선택 시)
managerNameString아니오담당자 이름
managerPhoneString아니오담당자 연락처
managerEmailString아니오담당자 이메일

담당자 설정 방법

  • 기존 담당자 선택: managerNo를 포함하여 전송하면 해당 담당자의 정보가 업데이트됩니다.
  • 새 담당자 생성: managerNo 없이 managerName, managerPhone, managerEmail을 전송하면 새 담당자가 생성됩니다.
  • 해당 기업의 첫 번째 담당자는 자동으로 기본 담당자(isDefault: true)로 설정됩니다.

CategoryType 값:

유효하지 않은 카테고리 값을 전송하면 404 INVALID_DATA 에러가 발생합니다.

설명
BEAUTY뷰티
FASHION패션
DAILY일상
TRAVEL여행
KIDS키즈
FOOD음식
RELATIONSHIP연애/결혼
INTERIOR인테리어
FOREIGN_CULTURE해외문화
EDUCATION_SELF_DEVELOPMENT교육/자기개발
BOOK도서
PERFORMANCE_EXHIBITION공연/전시
FINANCE_BUSINESS재테크/비즈니스
ITIT
PET반려동물
COOKING요리
GAME게임
SPORTS스포츠
PHOTOGRAPHY사진
MEDICINE의료
SOCIETY_POLITICS사회/정치
MOVIE_DRAMA영화/드라마
COMIC만화
HEALTH건강
CAREER커리어
MUSIC음악
ENVIRONMENT환경
GROCERY식료품
DEFAULT기본값

FeePolicyType 값:

설명
ACTUAL_COST실비
COST_PLUS_FEE실비 + 수수료
TOTAL_AMOUNT총액

FeeType 값:

설명
PERCENT퍼센트 (%)
FIXED고정 금액 (원)
{
  "businessId": "business123",
  "title": "여름 뷰티 캠페인",
  "category": "BEAUTY",
  "snsType": "INSTAGRAM",
  "contentFormat": "REELS",
  "showPrice": true,
  "listMode": "SELECT",
  "charge": "500000",
  "nation": "KR",
  "feePolicyType": "COST_PLUS_FEE",
  "feeType": "PERCENT",
  "feeValue": 10,
  "managerName": "김영희",
  "managerPhone": "010-1234-5678",
  "managerEmail": "yhkim@company.com"
}

응답

성공 응답 (201 Created)

{
  "status": 201,
  "code": null,
  "message": "대시보드가 생성되었습니다.",
  "data": 123
}

에러 응답 (404 Not Found) - 유효하지 않은 카테고리

{
  "status": 404,
  "code": "INVALID_DATA",
  "message": "유효하지 않은 카테고리입니다: INVALID_CATEGORY"
}

캠페인 진행 상황 조회

캠페인의 진행 상황 테이블을 조회합니다. adminVisible 무관하게 전체 조회됩니다.

배송 정보, 검수 정보, 인플루언서 플래그 등 모든 진행 상황 정보를 포함합니다.

HTTP 요청

GET /ai/admin/dashboard/{campaignNo}/progress
Authorization: Bearer {access_token}

Path Parameters

파라미터타입필수설명
campaignNolong캠페인 번호

응답

성공 응답 (200 OK)

{
  "status": 200,
  "code": null,
  "message": "진행 상황 조회 성공",
  "data": {
    "step": "APPLICATION_CONTRACT",
    "items": [
      {
        "id": 123,
        "creator": "크리에이터A",
        "profileImg": "https://...",
        "creatorLink": "https://www.instagram.com/creator_a",
        "flags": [
          {
            "id": 1,
            "text": "추천",
            "color": "#FF6F00",
            "category": "POSITIVE",
            "isPreset": true,
            "presetCode": "RECOMMENDED"
          },
          {
            "id": 2,
            "text": "우수 크리에이터",
            "color": "#9C27B0",
            "category": "POSITIVE",
            "isPreset": false,
            "presetCode": null
          }
        ],
        "adminVisible": true,
        "selectionStatus": "SELECTED",
        "phase": "PRODUCT_DELIVERY",
        "appliedAt": "2025-01-15T10:30:00",
        "selectedAt": "2025-01-16T14:20:00",
        "rejectedAt": null,
        "defaultUnitPrice": 450000,
        "quotePrice": 500000,
        "currentPrice": 550000,
        "matchingStatus": "confirmed",
        "deliveryStatus": "배송 중",
        "trackingNumber": "1234567890",
        "uploadUrl": null,
        "file": null,
        "aiCheckReady": false,
        "aiCheck": null,
        "personCheck": null,
        "campaignResult": null,
        "uploadStatus": null,
        "collaborationNote": null,
        "reviewInfo": {
          "hasNewSubmission": false,
          "reviews": [],
          "uploadApproved": null,
          "finalSubmission": null
        },
        "recentPosts": [
          {
            "postId": "abc123",
            "postLink": "https://instagram.com/p/abc123",
            "mediaUrl": "https://video.cdninstagram.com/...",
            "mediaType": "VIDEO",
            "publishedAt": "2025-01-20T14:30:00Z"
          },
          {
            "postId": "def456",
            "postLink": "https://instagram.com/p/def456",
            "mediaUrl": "https://scontent.cdninstagram.com/...",
            "mediaType": "IMAGE",
            "publishedAt": "2025-01-18T10:00:00Z"
          }
        ]
      }
    ],
    "isLegacy": false
  }
}

응답 필드 설명

data 객체:

필드타입설명
stepString현재 진행 단계
itemsArray신청 목록
isLegacyBoolean레거시 캠페인 여부

items 배열 내 각 항목:

필드타입설명
idLong신청 ID
creatorString크리에이터 이름
profileImgString프로필 이미지 URL
creatorLinkStringSNS 계정 링크
flagsArray<FlagDto>인플루언서 플래그 목록 (추천, 주의사항 등)
adminVisibleBoolean기업 대시보드 노출 여부
selectionStatusString선정 상태 (WAITING, SELECTED, RESERVED, REJECTED, ELIMINATED, PROPOSAL)
phaseString진행 단계
appliedAtLocalDateTime신청일
selectedAtLocalDateTime선정일
rejectedAtLocalDateTime거절일
defaultUnitPriceLong희망가 (크리에이터가 입력한 단가)
quotePriceLong기존가. 글특가 × 1.5 만원올림
currentPriceLong글특가 (광고주에게 노출되는 가격). 기준가 × (1 + 수수료율) 만원올림
matchingStatusString매칭 상태 (waiting, confirmed, reserved, rejected, eliminated, proposal)
deliveryStatusString배송 상태
trackingNumberString운송장 번호
reviewInfoObject검수 정보
recentPostsArray<PostMediaDto>최근 게시물 미디어 (최대 3개)

recentPosts 배열 내 각 항목 (PostMediaDto):

필드타입설명
postIdString게시물 ID
postLinkString게시물 링크
mediaUrlString미디어 URL (video_url 또는 images 중 첫 번째)
mediaTypeString미디어 타입 (VIDEO 또는 IMAGE)
publishedAtOffsetDateTime게시일

flags 배열 내 각 항목 (FlagDto):

필드타입설명
idLong플래그 ID
textString표시할 텍스트
colorStringHEX 색상 코드 (예: #FF6F00)
categoryString카테고리 (POSITIVE: 화이트리스트, NEGATIVE: 블랙리스트, NEUTRAL: 중립)
isPresetBoolean프리셋 플래그 여부
presetCodeString프리셋 코드 (프리셋인 경우, 예: RECOMMENDED, SCHEDULE_VIOLATION)

프리셋 플래그 코드:

코드텍스트카테고리설명
RECOMMENDED추천POSITIVE추천 인플루언서
BUSINESS_PREFERRED기업 선호POSITIVE기업이 선호하는 인플루언서
HIGH_QUALITY고품질 콘텐츠POSITIVE고품질 콘텐츠 제작자
SCHEDULE_VIOLATION일정 위반NEGATIVE일정 준수 미흡
POOR_COMMUNICATION소통 미흡NEGATIVE소통이 원활하지 않음
QUALITY_ISSUE품질 문제NEGATIVE콘텐츠 품질 문제

리스트 관리 조회

캠페인 신청 목록을 조회합니다. adminVisible 값과 무관하게 전체 신청을 조회합니다.

캠페인 정보, 인플루언서 정보, 매칭 정보, 단가 협상 상태, 계약서 정보를 모두 포함합니다.

HTTP 요청

GET /ai/admin/dashboard/{campaignNo}/list
Authorization: Bearer {access_token}

Path Parameters

파라미터타입필수설명
campaignNolong캠페인 번호

응답

성공 응답 (200 OK)

{
  "status": 200,
  "code": null,
  "message": "리스트 관리 조회 성공",
  "data": {
    "campaign": {
      "no": "123",
      "businessId": "business123",
      "thumbnailImagePath": "https://...",
      "productImagePath": "https://...",
      "snsType": "INSTAGRAM",
      "contentFormat": "REELS",
      "category": "BEAUTY",
      "campaignType": "PRODUCT",
      "campaignSubStep": "CREATOR_MATCHING",
      "productName": "여름 뷰티 캠페인",
      "charge": "500000",
      "currency": "KRW",
      "recruitCount": "10",
      "recruitmentStartDate": "2025-01-01 00:00:00",
      "recruitmentEndDate": "2025-01-31 00:00:00",
      "showPrice": true,
      "listMode": "MANUAL"
    },
    "remainBusinessCredit": 1500000,
    "bizName": "글로우비 주식회사",
    "items": [
      {
        "applicationId": 35,
        "appliedAt": "2025-01-15T10:30:00",
        "adminVisible": true,
        "sourceType": "SELF_APPLIED",
        "influenceNo": 123,
        "influenceName": "크리에이터A",
        "influenceProfileImage": "https://...",
        "influenceTel": "010-1234-5678",
        "influenceEmail": "creator@email.com",
        "influenceRankScore": "A",
        "followerCount": "15200",
        "averageViewCount": "3500",
        "currentPrice": 500000,
        "quotePrice": 600000,
        "adminMemo": "우수 크리에이터",
        "latestNegotiationId": 1,
        "latestProposedPrice": 500000,
        "latestNegotiationStatus": "PENDING",
        "negotiationRespondedAt": null,
        "contractWritten": true,
        "contractNote": "O 계약완료",
        "paymentMethod": "현금",
        "contractWrittenAt": "2025-01-20T14:00:00",
        "defaultUnitPrice": 450000,
        "recentPosts": [
          {
            "postId": "abc123",
            "postLink": "https://instagram.com/p/abc123",
            "mediaUrl": "https://video.cdninstagram.com/...",
            "mediaType": "VIDEO",
            "publishedAt": "2025-01-20T14:30:00Z"
          },
          {
            "postId": "def456",
            "postLink": "https://instagram.com/p/def456",
            "mediaUrl": "https://scontent.cdninstagram.com/...",
            "mediaType": "IMAGE",
            "publishedAt": "2025-01-18T10:00:00Z"
          }
        ]
      }
    ]
  }
}

응답 필드 설명

data 객체:

필드타입설명
campaignObject캠페인 정보
remainBusinessCreditInteger기업 잔여 크레딧
bizNameString기업명
itemsArray신청 목록

items 배열 내 각 항목:

필드타입설명
applicationIdLong신청 ID
appliedAtLocalDateTime신청일
adminVisibleBoolean기업 대시보드 노출 여부
sourceTypeString신청 경로 (SELF_APPLIED, ADMIN_ADDED, AI_RECOMMENDED)
influenceNoInteger인플루언서 번호
influenceNameString인플루언서 이름
influenceProfileImageString프로필 이미지 URL
influenceTelString전화번호
influenceEmailString이메일
influenceRankScoreString랭크 점수
followerCountString팔로워 수. Instagram OAuth 연동 데이터(SocialAccount) 우선, 없으면 크롤링 데이터(PostgreSQL)에서 조회
averageViewCountString평균 조회수. Instagram OAuth 연동 데이터 우선, 없으면 크롤링 데이터에서 조회. 네이버 플랫폼은 avgViews, 그 외는 reelsAvgViews 사용
currentPriceLong글특가 (광고주에게 노출되는 가격). 기준가 × (1 + 수수료율) 만원올림
quotePriceLong기존가 (기준 가격). 글특가 × 1.5 만원올림
adminMemoString비고 (ApplicationMatching.recommendReason)
latestNegotiationIdLong최근 단가 협상 ID
latestProposedPriceLong최근 제안 가격
latestNegotiationStatusString협상 상태 (PENDING, ACCEPT, REJECT)
negotiationRespondedAtLocalDateTime협상 응답 시간
contractWrittenBoolean계약서 작성 여부
contractNoteString계약서 비고
paymentMethodString지불 방식
contractWrittenAtLocalDateTime계약서 작성 시간
defaultUnitPriceLong크리에이터 희망 단가
recentPostsArray<PostMediaDto>최근 게시물 미디어 (최대 3개)

recentPosts 배열 내 각 항목 (PostMediaDto):

필드타입설명
postIdString게시물 ID
postLinkString게시물 링크
mediaUrlString미디어 URL (video_url 또는 images 중 첫 번째)
mediaTypeString미디어 타입 (VIDEO 또는 IMAGE)
publishedAtOffsetDateTime게시일

recentPosts 조회 로직

  • PostgreSQL의 post 테이블에서 account_link로 최근 게시물 3개를 조회합니다.
  • video_url이 있으면 mediaType: VIDEO로 반환
  • video_url이 없으면 images의 첫 번째 이미지를 mediaType: IMAGE로 반환

리스트 관리 벌크 업데이트

리스트 관리 탭에서 여러 항목을 일괄 업데이트합니다.

  • applicationId가 있으면 기존 신청을 업데이트합니다.
  • applicationId가 없고 influenceNo가 있으면 유저 풀에서 새로 추가합니다 (sourceType: ADMIN_ADDED).

HTTP 요청

PATCH /ai/admin/dashboard/{campaignNo}/list
Authorization: Bearer {access_token}
Content-Type: application/json

Path Parameters

파라미터타입필수설명
campaignNolong캠페인 번호

Request Body

필드타입필수설명
applicationIdLong조건부기존 신청 업데이트 시 필수
influenceNoInteger조건부유저 풀에서 새로 추가 시 필수
adminVisibleBoolean아니오기업 대시보드 노출 여부
currentPriceLong아니오노출가
adminMemoString아니오비고
contractWrittenString아니오계약서 작성 여부 ("O" 포함 시 작성완료, "X" 포함 시 미작성)
paymentString아니오지불 여부 ("O", "현금", "카드" 등)
{
  "items": [
    {
      "applicationId": 35,
      "adminVisible": true,
      "currentPrice": 550000,
      "adminMemo": "우수 크리에이터, 팔로워 10만+",
      "contractWritten": "O 계약완료",
      "payment": "O"
    },
    {
      "applicationId": 36,
      "adminVisible": false,
      "currentPrice": 300000,
      "adminMemo": "보류"
    },
    {
      "influenceNo": 2466,
      "adminVisible": true,
      "currentPrice": 400000,
      "adminMemo": "유저 풀에서 추가"
    }
  ]
}

응답

성공 응답 (200 OK)

{
  "status": 200,
  "code": null,
  "message": "3건의 항목이 업데이트되었습니다.",
  "data": {
    "success": true,
    "updatedIds": [35, 36, 101],
    "failedIds": [],
    "message": "3건의 항목이 업데이트되었습니다."
  }
}

일부 실패 응답 (200 OK)

{
  "status": 200,
  "code": null,
  "message": "2건 성공, 1건 실패",
  "data": {
    "success": false,
    "updatedIds": [35, 36],
    "failedIds": [37],
    "message": "2건 성공, 1건 실패"
  }
}

신청 상태 벌크 변경

여러 신청의 선정 상태, 진행 단계, 관리자 노출 여부를 일괄 변경합니다.

HTTP 요청

PATCH /ai/admin/dashboard/{campaignNo}/bulk
Authorization: Bearer {access_token}
Content-Type: application/json

Request Body

{
  "applicationIds": [1, 2, 3],
  "selectionStatus": "SELECTED",
  "phase": "PRODUCT_DELIVERY",
  "adminVisible": true
}

캠페인 진행 상태 변경

캠페인의 진행 상태(SubStep)를 변경합니다.

HTTP 요청

PATCH /ai/admin/dashboard/{campaignNo}/substep?subStep={subStep}
Authorization: Bearer {access_token}

Query Parameters

파라미터타입필수설명
subStepCampaignSubStep변경할 진행 상태

CampaignSubStep 값

설명
CAMPAIGN_REVIEW캠페인 내용 검토
CAMPAIGN_PAYMENT캠페인비 결제
CAMPAIGN_GUIDELINE콘텐츠 가이드라인 작성
CREATOR_RECRUIT크리에이터 모집
CREATOR_MATCHING협업 상세 협의
CONTENT_CREATION콘텐츠 제작
CONTENT_REVIEW콘텐츠 검수
CONTENT_PUBLISH콘텐츠 발행 취합
RESULT_SUMMARY캠페인 결과 취합
CAMPAIGN_COMPLETED캠페인 완료

유저 풀 조회

해당 캠페인에 신청하지 않은 인플루언서 목록을 조회합니다. Cursor 기반 페이지네이션을 사용합니다.

  • SNS, 카테고리, 국가로 과거 캠페인 찾기
  • 해당 캠페인 수행 경험이 있는 인플루언서 조회
  • 현재 캠페인 신청자 제외
  • priceTier 높은 순 정렬
  • 인플루언서 플래그 포함

HTTP 요청

GET /ai/admin/dashboard/{campaignNo}/user-pool?snsType={snsType}&category={category}&country={country}&cursor={cursor}&size={size}
Authorization: Bearer {access_token}

Path Parameters

파라미터타입필수설명
campaignNolong캠페인 번호

Query Parameters

파라미터타입필수설명
snsTypestring아니오SNS 타입 (INSTAGRAM, YOUTUBE, TIKTOK 등)
categorystring아니오카테고리
countrystring아니오국가 코드
cursorint아니오마지막 조회 influence no
sizeint아니오조회 개수 (기본 15)

응답

성공 응답 (200 OK)

{
  "status": 200,
  "code": null,
  "message": "유저 풀 조회 성공",
  "data": {
    "items": [
      {
        "influenceNo": 123,
        "name": "크리에이터A",
        "profileImage": "https://...",
        "followerCount": "50000",
        "averageViewCount": "5000",
        "tel": "010-1234-5678",
        "email": "creator@email.com",
        "rankScore": "TIER_A",
        "flags": [
          {
            "id": 1,
            "text": "추천",
            "color": "#FF6F00",
            "category": "POSITIVE",
            "isPreset": true,
            "presetCode": "RECOMMENDED"
          },
          {
            "id": 2,
            "text": "기업 선호",
            "color": "#4CAF50",
            "category": "POSITIVE",
            "isPreset": true,
            "presetCode": "BUSINESS_PREFERRED"
          }
        ]
      },
      {
        "influenceNo": 456,
        "name": "크리에이터B",
        "profileImage": "https://...",
        "followerCount": "30000",
        "averageViewCount": "3000",
        "tel": "010-5678-1234",
        "email": "creator2@email.com",
        "rankScore": "TIER_B",
        "flags": []
      }
    ],
    "nextCursor": 456,
    "hasNext": true,
    "totalCount": 120
  }
}

응답 필드 설명

data 객체:

필드타입설명
itemsArray인플루언서 목록
nextCursorInteger다음 페이지 커서 (없으면 null)
hasNextBoolean다음 페이지 존재 여부
totalCountLong전체 개수 (첫 페이지에만 제공)

items 배열 내 각 항목:

필드타입설명
influenceNoInteger인플루언서 번호
nameString인플루언서 이름
profileImageString프로필 이미지 URL
followerCountString팔로워수
averageViewCountString평균조회수
telString전화번호
emailString이메일
rankScoreString랭크 점수 (priceTier)
flagsArray<FlagDto>인플루언서 플래그 목록

flags 배열 내 각 항목 (FlagDto):

필드타입설명
idLong플래그 ID
textString표시할 텍스트
colorStringHEX 색상 코드 (예: #FF6F00)
categoryString카테고리 (POSITIVE: 화이트리스트, NEGATIVE: 블랙리스트, NEUTRAL: 중립)
isPresetBoolean프리셋 플래그 여부
presetCodeString프리셋 코드 (프리셋인 경우, 예: RECOMMENDED, BUSINESS_PREFERRED)

비가입자 이메일 풀 조회

해당 캠페인 SNS/카테고리에 맞는 비가입자(CollabApplicant) 이메일 목록을 조회합니다.

비가입자란?

글로브에 가입하지 않고 협업 신청서(CollabApplicant)만 작성한 사용자입니다. 주로 이메일 마케팅 발송 대상으로 사용됩니다.

중복 제거 및 필터링

  • 이메일 중복 제거: 같은 이메일로 여러 번 신청한 경우 가장 최근 등록된 데이터만 반환
  • 기존 신청자 제외: 현재 캠페인에 이미 신청한 사용자의 이메일은 제외

HTTP 요청

GET /ai/admin/dashboard/{campaignNo}/user-pool/unregistered?snsType={snsType}&category={category}
Authorization: Bearer {access_token}

Path Parameters

파라미터타입필수설명
campaignNoLong캠페인 번호

Query Parameters

파라미터타입필수설명
snsTypeString아니오SNS 타입 (INSTAGRAM, YOUTUBE, TIKTOK 등). 없으면 캠페인 SNS 사용
categoryString아니오카테고리. 없으면 캠페인 카테고리 사용

응답

성공 응답 (200 OK)

{
  "status": 200,
  "code": null,
  "message": "비가입자 이메일 풀 조회 성공",
  "data": [
    {
      "id": 1724,
      "name": "이지호",
      "email": "ijiho_853@naver.com",
      "phone": "010-1234-5678",
      "snsType": "INSTAGRAM",
      "snsAccountId": "https://www.instagram.com/study28_yonsei?igsh=...",
      "category": "EDUCATION_SELF_DEVELOPMENT"
    },
    {
      "id": 1698,
      "name": "김민수",
      "email": "minsu_kim@gmail.com",
      "phone": "010-9876-5432",
      "snsType": "INSTAGRAM",
      "snsAccountId": "https://www.instagram.com/minsu_daily",
      "category": "EDUCATION_SELF_DEVELOPMENT"
    }
  ]
}

응답 필드 설명

data 배열 내 각 항목:

필드타입설명
idLongCollabApplicant ID
nameString신청자 이름
emailString협업 연락용 이메일
phoneString전화번호
snsTypeSnsTypeSNS 플랫폼 (INSTAGRAM, YOUTUBE, TIKTOK 등)
snsAccountIdStringSNS 계정 링크
categoryString카테고리

협업 단가 전송 (벌크)

선택된 크리에이터들에게 단가 제안을 전송합니다.

  • CampaignApplication이 없으면 자동 생성(ADMIN_ADDED)되고, PriceNegotiation이 PENDING 상태로 생성됩니다.
  • 각 크리에이터별로 독립적으로 처리되며, 일부 실패 시에도 나머지는 정상 처리됩니다.

중복 방지 정책

동일 크리에이터에게 중복 전송을 방지하기 위해 다음 조건을 확인합니다:

  • PENDING 상태: 이미 협상 진행 중이면 재요청 불가
  • ACCEPT 상태: 이미 수락된 협상이 있으면 재요청 불가
  • REJECT 상태: 거절된 경우에만 재협상 가능

HTTP 요청

POST /ai/admin/dashboard/{campaignNo}/price-negotiations
Authorization: Bearer {access_token}
Content-Type: application/json

Path Parameters

파라미터타입필수설명
campaignNoLong캠페인 번호

Request Body

필드타입필수설명
itemsArray단가 제안 목록
items[].applicationIdLong조건부기존 신청 ID (있으면 우선 사용)
items[].influenceNoInteger조건부인플루언서 번호 (applicationId 없을 때 필수)
items[].proposedPriceLong제안 단가 (원)
{
  "items": [
    {
      "applicationId": 123,
      "proposedPrice": 500000
    },
    {
      "influenceNo": 456,
      "proposedPrice": 300000
    }
  ]
}

응답

성공 응답 (200 OK)

{
  "status": 200,
  "code": null,
  "message": "3명에게 단가 제안이 전송되었습니다.",
  "data": {
    "success": true,
    "successApplicationIds": [123, 124, 125],
    "phoneNotFoundApplicationIds": [125],

    "failedItems": [],
    "message": "3명에게 단가 제안이 전송되었습니다. (전화번호 없음: 1명)"
  }
}

일부 실패 응답 (200 OK)

{
  "status": 200,
  "code": null,
  "message": "2명 성공, 1명 실패",
  "data": {
    "success": false,
    "successApplicationIds": [123, 124],
    "phoneNotFoundApplicationIds": [],
    "failedItems": [
      {
        "applicationId": 125,
        "influenceNo": null,
        "failureCode": "CREATE_FAILED",
        "failureMessage": "이미 협상 진행 중입니다. 크리에이터의 응답을 기다려주세요."
      }
    ],
    "message": "2명 성공, 1명 실패"
  }
}

에러 응답 예시

중복 협상 (PENDING 상태)

failedItems에 포함되는 형태:

{
  "failureCode": "CREATE_FAILED",
  "failureMessage": "이미 협상 진행 중입니다. 크리에이터의 응답을 기다려주세요."
}

수락된 협상 재시도 (ACCEPT 상태)

failedItems에 포함되는 형태:

{
  "failureCode": "CREATE_FAILED",
  "failureMessage": "이미 수락된 협상이 있습니다. 새로운 협상을 시작할 수 없습니다."
}

존재하지 않는 신청

failedItems에 포함되는 형태:

{
  "failureCode": "APPLICATION_NOT_FOUND",
  "failureMessage": "존재하지 않는 신청입니다."
}

캠페인 불일치

failedItems에 포함되는 형태:

{
  "failureCode": "CAMPAIGN_MISMATCH",
  "failureMessage": "캠페인이 일치하지 않습니다."
}

응답 필드 설명

필드타입설명
successBoolean전체 성공 여부 (모든 항목 성공 시 true)
successApplicationIdsArray<Long>성공한 신청 ID 목록
phoneNotFoundApplicationIdsArray<Long>전화번호가 없는 신청 ID 목록 (SMS 발송 불가)
failedItemsArray실패한 항목 목록
failedItems[].applicationIdLong실패한 신청 ID
failedItems[].influenceNoInteger실패한 인플루언서 번호
failedItems[].failureCodeString실패 코드
failedItems[].failureMessageString실패 사유

크리에이터 모집 단계 일괄 업데이트

여러 캠페인 신청의 선정 상태, 배송 상태, 운송장 번호를 일괄 업데이트합니다.

업데이트 순서: 선정 상태 → 배송 상태 → 운송장 번호

선정 상태가 SELECTED로 변경되면 매칭/배송 테이블이 자동 생성됩니다.

HTTP 요청

PATCH /ai/admin/dashboard/applications/creator-recruit
Authorization: Bearer {access_token}
Content-Type: application/json

Request Body

필드타입필수설명
applicationIdLong캠페인 신청 ID
selectionStatusString아니오선정 상태
deliveryStatusString아니오배송 상태
trackingNumberString아니오운송장 번호

selectionStatus 값:

설명
WAITING선정 대기
SELECTED선정
RESERVED예비
REJECTED미선정
ELIMINATED제외

deliveryStatus 값:

설명
BEFORE_DELIVERY배송 전
DELIVERING배송 중
DELIVERED배송 완료
{
  "items": [
    {
      "applicationId": 1,
      "selectionStatus": "SELECTED",
      "deliveryStatus": "DELIVERING",
      "trackingNumber": "1234567890"
    },
    {
      "applicationId": 2,
      "selectionStatus": "SELECTED",
      "deliveryStatus": "DELIVERED"
    },
    {
      "applicationId": 3,
      "selectionStatus": "REJECTED"
    }
  ]
}

응답

성공 응답 (200 OK)

{
  "status": 200,
  "code": null,
  "message": "3건의 항목이 업데이트되었습니다.",
  "data": {
    "success": true,
    "updatedIds": [1, 2, 3],
    "failedIds": [],
    "message": "3건의 항목이 업데이트되었습니다."
  }
}

일부 실패 응답 (200 OK)

{
  "status": 200,
  "code": null,
  "message": "2건 성공, 1건 실패",
  "data": {
    "success": false,
    "updatedIds": [1, 2],
    "failedIds": [3],
    "message": "2건 성공, 1건 실패"
  }
}

사용 예시

기업 담당자 목록 조회

curl -X GET "https://api.glowb.io/ai/admin/dashboard/managers?businessId=business123" \
  -H "Authorization: Bearer {token}"

캠페인 진행 상황 조회

curl -X GET https://api.glowb.io/ai/admin/dashboard/123/progress \
  -H "Authorization: Bearer {token}"

리스트 관리 벌크 업데이트

curl -X PATCH https://api.glowb.io/ai/admin/dashboard/123/list \
  -H "Authorization: Bearer {token}" \
  -H "Content-Type: application/json" \
  -d '{
    "items": [
      {"applicationId": 1, "adminVisible": true, "currentPrice": 500000}
    ]
  }'

API 테스트

담당자 조회

대시보드 관리

리스트 관리

유저 풀 (가입자)

비가입자 이메일 풀

가격 협상

크리에이터 모집 단계

On this page