Admin APIAdmin Dashboard API
GET /ai/admin/dashboard/{campaignNo}/list
리스트 관리 조회
리스트 관리 조회
캠페인 신청 목록을 조회합니다. 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": "글로우비 주식회사",
"veteranPercentage": 42.8,
"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",
"matchScore": 0.87,
"autoCategories": ["뷰티", "스킨케어", "리뷰"],
"defaultUnitPrice": 450000,
"previouslyCollaborated": true,
"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 | 기업명 |
veteranPercentage | Double | 고인물% — 신청자 중 고인물 크리에이터 비율 (소수점 1자리). 70% 이상이면 추가 모집 필요 신호 |
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 | 글특가 (광고주에게 노출되는 가격). 기준가 x (1 + 수수료율) 만원올림 |
quotePrice | Long | 기존가 (기준 가격). 글특가 x 1.5 만원올림 |
matchScore | Double | AI 매칭 점수 (벡터 코사인 유사도, 0~1). TB_APPLICATION_MATCHING.match_score에서 조회 |
autoCategories | Array<String> | AI 자동 카테고리 목록. PostgreSQL influencer_profile.auto_category_categories를 , 구분 파싱 |
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 | 크리에이터 희망 단가 |
previouslyCollaborated | Boolean | 같은 브랜드와 기협업 여부 (이전 캠페인에서 SELECTED된 적 있음) |
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로 반환
기협업자 (previouslyCollaborated) 판별 로직
- 같은 기업(businessId)의 다른 캠페인에서
SELECTED상태였던 크리에이터이면true - 현재 캠페인의 SELECTED는 제외 (자기 자신 캠페인)
- 한 브랜드가 여러 캠페인을 운영하는 경우, 이전 캠페인 중 하나라도 SELECTED였으면 기협업자로 표시
고인물% (veteranPercentage) 계산 로직
- 고인물 정의: 현재 모집 중인 캠페인(CREATOR_RECRUIT, CREATOR_MATCHING) 중 70% 이상에 직접 신청(SELF_APPLIED) 한 크리에이터
- 고인물%: 해당 캠페인 신청자 중 고인물 크리에이터가 차지하는 비율
- ADMIN_ADDED, AI_RECOMMENDED로 추가된 건은 고인물 판별 대상에서 제외
- 고인물% ≥ 70% → 추가 모집 필요 신호