Admin APIAdmin Dashboard API
POST /ai/admin/dashboard/{campaignNo}/price-negotiations
협업 단가 전송
협업 단가 전송 (벌크)
선택된 크리에이터들에게 단가 제안을 전송합니다.
- 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 | 실패 사유 |