Admin API
Admin Dashboard API
관리자 대시보드 관리 API
Admin Dashboard API
관리자 대시보드 관리 API입니다.
Base URL: /ai/admin/dashboard
이 API는 관리자 권한이 필요합니다.
엔드포인트 목록
대시보드 관리
| 메서드 | 경로 | 설명 |
|---|---|---|
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 | 유저 풀 조회 |
가격 협상
| 메서드 | 경로 | 설명 |
|---|---|---|
POST | /ai/admin/dashboard/{campaignNo}/price-negotiations | 협업 단가 전송 |
API 상세
대시보드 생성
관리자가 대시보드를 생성합니다.
HTTP 요청
POST /ai/admin/dashboard
Authorization: Bearer {access_token}
Content-Type: application/jsonRequest Body
{
"businessId": "business123",
"title": "여름 뷰티 캠페인"
}응답
성공 응답 (201 Created)
{
"status": 201,
"code": null,
"message": "대시보드가 생성되었습니다.",
"data": 123
}캠페인 진행 상황 조회
캠페인의 진행 상황 테이블을 조회합니다. adminVisible 무관하게 전체 조회됩니다.
HTTP 요청
GET /ai/admin/dashboard/{campaignNo}/progress
Authorization: Bearer {access_token}Path Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
campaignNo | long | 예 | 캠페인 번호 |
응답
성공 응답 (200 OK)
{
"status": 200,
"code": null,
"message": "진행 상황 조회 성공",
"data": {
"campaign": {
"campaignNo": 123,
"title": "여름 뷰티 캠페인"
},
"statistics": {
"totalApplications": 50,
"selected": 10,
"rejected": 5
},
"applications": [...]
}
}리스트 관리 조회
캠페인 신청 목록을 조회합니다. 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"
},
"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": null,
"averageViewCount": null,
"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
}
]
}
}응답 필드 설명
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 | 팔로워 수 (추후 구현) |
averageViewCount | String | 평균 조회수 (추후 구현) |
currentPrice | Long | 노출가 (ApplicationMatching) |
quotePrice | Long | 기준가 (ApplicationMatching) |
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 | 크리에이터 희망 단가 |
리스트 관리 벌크 업데이트
리스트 관리 탭에서 여러 항목을 일괄 업데이트합니다.
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 기반 페이지네이션을 사용합니다.
HTTP 요청
GET /ai/admin/dashboard/{campaignNo}/user-pool?snsType={snsType}&category={category}&country={country}&cursor={cursor}&size={size}
Authorization: Bearer {access_token}Query Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
snsType | string | 아니오 | SNS 타입 (INSTAGRAM, YOUTUBE, TIKTOK 등) |
category | string | 아니오 | 카테고리 |
country | string | 아니오 | 국가 코드 |
cursor | int | 아니오 | 마지막 조회 influence no |
size | int | 아니오 | 조회 개수 (기본 15) |
협업 단가 전송 (벌크)
선택된 크리에이터들에게 단가 제안을 전송합니다.
CampaignApplication이 없으면 자동 생성(ADMIN_ADDED)되고, PriceNegotiation이 PENDING 상태로 생성됩니다.
HTTP 요청
POST /ai/admin/dashboard/{campaignNo}/price-negotiations
Authorization: Bearer {access_token}
Content-Type: application/jsonRequest Body
{
"items": [
{
"influenceId": "influence123",
"proposedPrice": 500000
},
{
"influenceId": "influence456",
"proposedPrice": 300000
}
]
}사용 예시
캠페인 진행 상황 조회
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}
]
}'