SaaS APIProgress Table
GET /ai/progress-table/item/{id}
캠페인 진행 항목 조회
캠페인 진행 항목 조회
기업 대시보드용 캠페인 진행 항목을 조회합니다.
HTTP 요청
GET /ai/progress-table/item/{id}
Authorization: Bearer {access_token}Path Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
id | long | 예 | 캠페인 ID |
응답
성공 응답 (200 OK)
{
"status": 200,
"code": null,
"message": "캠페인 진행 상황 항목 조회가 완료되었습니다.",
"data": {
"step": "MATCHING",
"items": [
{
"id": 1,
"creator": "인플루언서A",
"creatorEmail": "influencer_a@example.com",
"influenceId": 12345,
"profileImg": "https://s3.../profile.jpg",
"creatorLink": "https://instagram.com/influencer_a",
"trackingNumber": "1234567890",
"uploadUrl": "https://instagram.com/p/xxx",
"file": null,
"aiCheckReady": true,
"matchingStatus": "MATCHED",
"deliveryStatus": "DELIVERED",
"aiCheck": "APPROVED",
"personCheck": "PENDING",
"campaignResult": null,
"recommendReason": "높은 참여율",
"uploadStatus": "UPLOADED",
"quotePrice": 100000,
"currentPrice": 80000,
"collaborationNote": "특별 요청 사항",
"reviewInfo": {
"hasNewSubmission": false,
"reviews": [
{
"reviewRound": 1,
"reviewId": 101,
"status": "APPROVED",
"hasNewSubmission": false,
"submissionItems": []
}
],
"uploadApproved": true,
"finalSubmission": null
},
"followerCount": 50000,
"avgViewCount": 10000,
"rank": "A",
"rankPrice": 100000,
"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"
}
],
"contractId": 42,
"contractStatus": "SIGNED"
}
],
"isLegacy": false,
"totalCount": 10,
"eliminatedCount": 2,
"eliminatedPercentage": 20.0,
"campaignDetails": {
"no": "123",
"businessId": "business_001",
"thumbnailImagePath": "https://s3.../thumbnail.jpg",
"productImagePath": "https://s3.../product.jpg",
"productImagePaths": ["https://s3.../product1.jpg"],
"snsType": "INSTAGRAM",
"contentFormat": "REEL",
"category": "BEAUTY",
"campaignType": "SEEDING",
"campaignSubStep": "CREATOR_RECRUIT",
"guidelineStatus": "COMPLETED",
"productName": "상품명",
"charge": "100000",
"currency": "KRW",
"recruitCount": "10",
"recruitmentStartDate": "2024-01-01 00:00:00",
"recruitmentEndDate": "2024-01-31 23:59:59",
"campaignContractType": "STANDARD"
},
"budgetSummary": {
"totalBudget": 1000000,
"usedCredit": 300000,
"refundAmount": 700000,
"lockedCount": 3,
"status": "ACTIVE"
},
"guidelineCompletedAt": "2025-02-15T14:30:00"
}
}Response 스키마
ProgressTableWithCampaignResponse
| 필드명 | 타입 | 설명 |
|---|---|---|
step | string | 진행 단계 ("MATCHING" | "EXECUTING") |
items | ProgressItemExceptBidPriceResponse[] | 진행 항목 목록 |
isLegacy | boolean | 레거시 여부 |
totalCount | int | 전체 항목 수 |
eliminatedCount | int | 탈락 항목 수 |
eliminatedPercentage | double | 탈락률 (%) |
campaignDetails | CampaignFullResponseDto | 캠페인 상세 정보 |
budgetSummary | BudgetSummaryDto | 캠페인 예산 요약 (SaaS 캠페인만) |
guidelineCompletedAt | datetime | 가이드라인 완성일. 가이드라인 미완성 시 null |
ProgressItemExceptBidPriceResponse
| 필드명 | 타입 | 설명 |
|---|---|---|
id | long | 항목 ID |
creator | string | 크리에이터 이름 |
creatorEmail | string | 크리에이터 이메일 |
influenceId | long | 인플루언서 ID |
profileImg | string | 프로필 이미지 URL |
creatorLink | string | 크리에이터 링크 |
trackingNumber | string | 운송장 번호 |
uploadUrl | string | 업로드 URL |
file | string | 파일 URL |
aiCheckReady | boolean | AI 체크 준비 상태 |
matchingStatus | string | 매칭 상태 |
deliveryStatus | string | 배송 상태 |
aiCheck | string | AI 검수 상태 |
personCheck | string | 담당자 검수 상태 |
campaignResult | string | 캠페인 결과 URL |
recommendReason | string | 추천 이유 |
uploadStatus | string | 업로드 상태 |
quotePrice | long | 견적 가격 |
currentPrice | long | 현재 가격 |
collaborationNote | string | 협업 노트 |
reviewInfo | ReviewInfo | 검수 정보 |
followerCount | long | 팔로워 수 |
avgViewCount | long | 평균 조회수 |
rank | string | 랭크 (A/B/C 등) |
rankPrice | int | 랭크별 가격 |
recentPosts | PostMediaDto[] | 최근 게시물 미디어 (최대 3개) |
contractId | long | 전자계약서 ID (계약서 미발송 시 null) |
contractStatus | string | 전자계약 상태 (DRAFT, SENT, OPENED, FILLED, OTP_VERIFIED, SIGNED). 계약서 미발송 시 null |
PostMediaDto
| 필드명 | 타입 | 설명 |
|---|---|---|
postId | string | 게시물 ID |
postLink | string | 게시물 링크 |
mediaUrl | string | 미디어 URL (video_url 또는 images 중 첫 번째) |
mediaType | string | 미디어 타입 (VIDEO 또는 IMAGE) |
publishedAt | datetime | 게시일 |
recentPosts는 PostgreSQL의 post 테이블에서 조회됩니다.
video_url이 있으면mediaType: VIDEO로 반환video_url이 없으면images의 첫 번째 이미지를mediaType: IMAGE로 반환
BudgetSummaryDto (SaaS 캠페인만 반환)
| 필드명 | 타입 | 설명 |
|---|---|---|
totalBudget | int | 캠페인 총 예산 (CAMPAIGN_DEPOSIT 합계) |
usedCredit | int | 사용(LOCKED) 금액 합계 |
refundAmount | int | 환급 가능 금액 (totalBudget - usedCredit) |
lockedCount | long | 잠금된 건수 |
status | string | 상태 ("ACTIVE") |
budgetSummary는 SaaS 캠페인(collabNo >= saasNum)에서만 반환됩니다.
레거시 캠페인은 null이 반환됩니다.
guidelineCompletedAt은 가이드라인 상태가 COMPLETED이고 칸반 태스크(TB_KANBAN_TASK)에서 task_code = GUIDELINE_FINAL인 태스크의 completed_at 값입니다.
가이드라인이 완성되지 않았거나 해당 태스크가 없으면 null이 반환됩니다.
예산 관련 에러 응답
매칭 상태를 PROPOSAL로 변경할 때 예산 검증 실패 시 발생하는 에러입니다.
| 상태 코드 | 에러 코드 | 설명 |
|---|---|---|
| 400 | NEED_CAMPAIGN_DEPOSIT | 캠페인 예산이 부족합니다. 추가 입금이 필요합니다. |
| 400 | INSUFFICIENT_GLOBAL_CREDIT | 기업 크레딧이 부족합니다. 크레딧을 충전해주세요. |
| 403 | PROPOSAL_STATUS_CHANGE_NOT_ALLOWED | 제안 상태의 크리에이터는 기업에서 상태를 변경할 수 없습니다. 관리자에게 문의해주세요. |
| 404 | BUDGET_NOT_FOUND | 캠페인 예산 정보를 찾을 수 없습니다. |
| 400 | BUDGET_ALREADY_LOCKED | 이미 예산이 예약되어 있습니다. |
| 400 | BUDGET_ALREADY_UNLOCKED | 이미 예산이 취소되었습니다. |
NEED_CAMPAIGN_DEPOSIT 발생 시: 캠페인 예산 추가 입금 API (POST /ai/payments/collab/confirm)를 호출하세요.
INSUFFICIENT_GLOBAL_CREDIT 발생 시: 크레딧 충전 API (POST /ai/payments/credit/confirm)를 먼저 호출하세요.