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
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
businessId | String | 예 | 기업 회원 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)
| 필드 | 타입 | 설명 |
|---|---|---|
managerNo | Long | 담당자 번호 |
name | String | 담당자 이름 |
phone | String | 담당자 연락처 |
email | String | 담당자 이메일 |
isDefault | Boolean | 기본 담당자 여부 |
대시보드 생성
관리자가 대시보드를 생성합니다.
HTTP 요청
POST /ai/admin/dashboard
Authorization: Bearer {access_token}
Content-Type: application/jsonRequest Body
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
businessId | String | 예 | 기업 아이디 |
title | String | 예 | 캠페인 제목 |
category | CategoryType | 아니오 | 캠페인 카테고리 |
snsType | SnsType | 아니오 | SNS 타입 |
contentFormat | SnsContentFormat | 아니오 | 콘텐츠 포맷 (릴스, 피드, 스토리 등) |
showPrice | Boolean | 아니오 | 가격 노출 여부 (기본값: true) |
listMode | String | 아니오 | 리스트 모드 (EXCLUDE, SELECT) |
charge | String | 아니오 | 예산 |
nation | String | 아니오 | 국가 |
feePolicyType | FeePolicyType | 아니오 | 수수료 정책 타입 |
feeType | FeeType | 아니오 | 수수료 유형 |
feeValue | Integer | 아니오 | 수수료 값 |
managerNo | Long | 아니오 | 담당자 번호 (기존 담당자 선택 시) |
managerName | String | 아니오 | 담당자 이름 |
managerPhone | String | 아니오 | 담당자 연락처 |
managerEmail | String | 아니오 | 담당자 이메일 |
담당자 설정 방법
- 기존 담당자 선택:
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 | 재테크/비즈니스 |
IT | IT |
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
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
campaignNo | long | 예 | 캠페인 번호 |
응답
성공 응답 (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 객체:
| 필드 | 타입 | 설명 |
|---|---|---|
step | String | 현재 진행 단계 |
items | Array | 신청 목록 |
isLegacy | Boolean | 레거시 캠페인 여부 |
items 배열 내 각 항목:
| 필드 | 타입 | 설명 |
|---|---|---|
id | Long | 신청 ID |
creator | String | 크리에이터 이름 |
profileImg | String | 프로필 이미지 URL |
creatorLink | String | SNS 계정 링크 |
flags | Array<FlagDto> | 인플루언서 플래그 목록 (추천, 주의사항 등) |
adminVisible | Boolean | 기업 대시보드 노출 여부 |
selectionStatus | String | 선정 상태 (WAITING, SELECTED, RESERVED, REJECTED, ELIMINATED, PROPOSAL) |
phase | String | 진행 단계 |
appliedAt | LocalDateTime | 신청일 |
selectedAt | LocalDateTime | 선정일 |
rejectedAt | LocalDateTime | 거절일 |
defaultUnitPrice | Long | 희망가 (크리에이터가 입력한 단가) |
quotePrice | Long | 기존가. 글특가 × 1.5 만원올림 |
currentPrice | Long | 글특가 (광고주에게 노출되는 가격). 기준가 × (1 + 수수료율) 만원올림 |
matchingStatus | String | 매칭 상태 (waiting, confirmed, reserved, rejected, eliminated, proposal) |
deliveryStatus | String | 배송 상태 |
trackingNumber | String | 운송장 번호 |
reviewInfo | Object | 검수 정보 |
recentPosts | Array<PostMediaDto> | 최근 게시물 미디어 (최대 3개) |
recentPosts 배열 내 각 항목 (PostMediaDto):
| 필드 | 타입 | 설명 |
|---|---|---|
postId | String | 게시물 ID |
postLink | String | 게시물 링크 |
mediaUrl | String | 미디어 URL (video_url 또는 images 중 첫 번째) |
mediaType | String | 미디어 타입 (VIDEO 또는 IMAGE) |
publishedAt | OffsetDateTime | 게시일 |
flags 배열 내 각 항목 (FlagDto):
| 필드 | 타입 | 설명 |
|---|---|---|
id | Long | 플래그 ID |
text | String | 표시할 텍스트 |
color | String | HEX 색상 코드 (예: #FF6F00) |
category | String | 카테고리 (POSITIVE: 화이트리스트, NEGATIVE: 블랙리스트, NEUTRAL: 중립) |
isPreset | Boolean | 프리셋 플래그 여부 |
presetCode | String | 프리셋 코드 (프리셋인 경우, 예: 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
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
campaignNo | long | 예 | 캠페인 번호 |
응답
성공 응답 (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 객체:
| 필드 | 타입 | 설명 |
|---|---|---|
campaign | Object | 캠페인 정보 |
remainBusinessCredit | Integer | 기업 잔여 크레딧 |
bizName | String | 기업명 |
items | Array | 신청 목록 |
items 배열 내 각 항목:
| 필드 | 타입 | 설명 |
|---|---|---|
applicationId | Long | 신청 ID |
appliedAt | LocalDateTime | 신청일 |
adminVisible | Boolean | 기업 대시보드 노출 여부 |
sourceType | String | 신청 경로 (SELF_APPLIED, ADMIN_ADDED, AI_RECOMMENDED) |
influenceNo | Integer | 인플루언서 번호 |
influenceName | String | 인플루언서 이름 |
influenceProfileImage | String | 프로필 이미지 URL |
influenceTel | String | 전화번호 |
influenceEmail | String | 이메일 |
influenceRankScore | String | 랭크 점수 |
followerCount | String | 팔로워 수. Instagram OAuth 연동 데이터(SocialAccount) 우선, 없으면 크롤링 데이터(PostgreSQL)에서 조회 |
averageViewCount | String | 평균 조회수. Instagram OAuth 연동 데이터 우선, 없으면 크롤링 데이터에서 조회. 네이버 플랫폼은 avgViews, 그 외는 reelsAvgViews 사용 |
currentPrice | Long | 글특가 (광고주에게 노출되는 가격). 기준가 × (1 + 수수료율) 만원올림 |
quotePrice | Long | 기존가 (기준 가격). 글특가 × 1.5 만원올림 |
adminMemo | String | 비고 (ApplicationMatching.recommendReason) |
latestNegotiationId | Long | 최근 단가 협상 ID |
latestProposedPrice | Long | 최근 제안 가격 |
latestNegotiationStatus | String | 협상 상태 (PENDING, ACCEPT, REJECT) |
negotiationRespondedAt | LocalDateTime | 협상 응답 시간 |
contractWritten | Boolean | 계약서 작성 여부 |
contractNote | String | 계약서 비고 |
paymentMethod | String | 지불 방식 |
contractWrittenAt | LocalDateTime | 계약서 작성 시간 |
defaultUnitPrice | Long | 크리에이터 희망 단가 |
recentPosts | Array<PostMediaDto> | 최근 게시물 미디어 (최대 3개) |
recentPosts 배열 내 각 항목 (PostMediaDto):
| 필드 | 타입 | 설명 |
|---|---|---|
postId | String | 게시물 ID |
postLink | String | 게시물 링크 |
mediaUrl | String | 미디어 URL (video_url 또는 images 중 첫 번째) |
mediaType | String | 미디어 타입 (VIDEO 또는 IMAGE) |
publishedAt | OffsetDateTime | 게시일 |
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/jsonPath Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
campaignNo | long | 예 | 캠페인 번호 |
Request Body
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
applicationId | Long | 조건부 | 기존 신청 업데이트 시 필수 |
influenceNo | Integer | 조건부 | 유저 풀에서 새로 추가 시 필수 |
adminVisible | Boolean | 아니오 | 기업 대시보드 노출 여부 |
currentPrice | Long | 아니오 | 노출가 |
adminMemo | String | 아니오 | 비고 |
contractWritten | String | 아니오 | 계약서 작성 여부 ("O" 포함 시 작성완료, "X" 포함 시 미작성) |
payment | String | 아니오 | 지불 여부 ("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/jsonRequest 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
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
subStep | CampaignSubStep | 예 | 변경할 진행 상태 |
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
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
campaignNo | long | 예 | 캠페인 번호 |
Query Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
snsType | string | 아니오 | SNS 타입 (INSTAGRAM, YOUTUBE, TIKTOK 등) |
category | string | 아니오 | 카테고리 |
country | string | 아니오 | 국가 코드 |
cursor | int | 아니오 | 마지막 조회 influence no |
size | int | 아니오 | 조회 개수 (기본 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 객체:
| 필드 | 타입 | 설명 |
|---|---|---|
items | Array | 인플루언서 목록 |
nextCursor | Integer | 다음 페이지 커서 (없으면 null) |
hasNext | Boolean | 다음 페이지 존재 여부 |
totalCount | Long | 전체 개수 (첫 페이지에만 제공) |
items 배열 내 각 항목:
| 필드 | 타입 | 설명 |
|---|---|---|
influenceNo | Integer | 인플루언서 번호 |
name | String | 인플루언서 이름 |
profileImage | String | 프로필 이미지 URL |
followerCount | String | 팔로워수 |
averageViewCount | String | 평균조회수 |
tel | String | 전화번호 |
email | String | 이메일 |
rankScore | String | 랭크 점수 (priceTier) |
flags | Array<FlagDto> | 인플루언서 플래그 목록 |
flags 배열 내 각 항목 (FlagDto):
| 필드 | 타입 | 설명 |
|---|---|---|
id | Long | 플래그 ID |
text | String | 표시할 텍스트 |
color | String | HEX 색상 코드 (예: #FF6F00) |
category | String | 카테고리 (POSITIVE: 화이트리스트, NEGATIVE: 블랙리스트, NEUTRAL: 중립) |
isPreset | Boolean | 프리셋 플래그 여부 |
presetCode | String | 프리셋 코드 (프리셋인 경우, 예: 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
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
campaignNo | Long | 예 | 캠페인 번호 |
Query Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
snsType | String | 아니오 | SNS 타입 (INSTAGRAM, YOUTUBE, TIKTOK 등). 없으면 캠페인 SNS 사용 |
category | String | 아니오 | 카테고리. 없으면 캠페인 카테고리 사용 |
응답
성공 응답 (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 배열 내 각 항목:
| 필드 | 타입 | 설명 |
|---|---|---|
id | Long | CollabApplicant ID |
name | String | 신청자 이름 |
email | String | 협업 연락용 이메일 |
phone | String | 전화번호 |
snsType | SnsType | SNS 플랫폼 (INSTAGRAM, YOUTUBE, TIKTOK 등) |
snsAccountId | String | SNS 계정 링크 |
category | String | 카테고리 |
협업 단가 전송 (벌크)
선택된 크리에이터들에게 단가 제안을 전송합니다.
- CampaignApplication이 없으면 자동 생성(ADMIN_ADDED)되고, PriceNegotiation이 PENDING 상태로 생성됩니다.
- 각 크리에이터별로 독립적으로 처리되며, 일부 실패 시에도 나머지는 정상 처리됩니다.
중복 방지 정책
동일 크리에이터에게 중복 전송을 방지하기 위해 다음 조건을 확인합니다:
- PENDING 상태: 이미 협상 진행 중이면 재요청 불가
- ACCEPT 상태: 이미 수락된 협상이 있으면 재요청 불가
- REJECT 상태: 거절된 경우에만 재협상 가능
HTTP 요청
POST /ai/admin/dashboard/{campaignNo}/price-negotiations
Authorization: Bearer {access_token}
Content-Type: application/jsonPath Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
campaignNo | Long | 예 | 캠페인 번호 |
Request Body
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
items | Array | 예 | 단가 제안 목록 |
items[].applicationId | Long | 조건부 | 기존 신청 ID (있으면 우선 사용) |
items[].influenceNo | Integer | 조건부 | 인플루언서 번호 (applicationId 없을 때 필수) |
items[].proposedPrice | Long | 예 | 제안 단가 (원) |
{
"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": "캠페인이 일치하지 않습니다."
}응답 필드 설명
| 필드 | 타입 | 설명 |
|---|---|---|
success | Boolean | 전체 성공 여부 (모든 항목 성공 시 true) |
successApplicationIds | Array<Long> | 성공한 신청 ID 목록 |
phoneNotFoundApplicationIds | Array<Long> | 전화번호가 없는 신청 ID 목록 (SMS 발송 불가) |
failedItems | Array | 실패한 항목 목록 |
failedItems[].applicationId | Long | 실패한 신청 ID |
failedItems[].influenceNo | Integer | 실패한 인플루언서 번호 |
failedItems[].failureCode | String | 실패 코드 |
failedItems[].failureMessage | String | 실패 사유 |
크리에이터 모집 단계 일괄 업데이트
여러 캠페인 신청의 선정 상태, 배송 상태, 운송장 번호를 일괄 업데이트합니다.
업데이트 순서: 선정 상태 → 배송 상태 → 운송장 번호
선정 상태가 SELECTED로 변경되면 매칭/배송 테이블이 자동 생성됩니다.
HTTP 요청
PATCH /ai/admin/dashboard/applications/creator-recruit
Authorization: Bearer {access_token}
Content-Type: application/jsonRequest Body
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
applicationId | Long | 예 | 캠페인 신청 ID |
selectionStatus | String | 아니오 | 선정 상태 |
deliveryStatus | String | 아니오 | 배송 상태 |
trackingNumber | String | 아니오 | 운송장 번호 |
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}
]
}'