SaaS API캠페인 일정
크리에이터 개별 일정 조회 API
GET /ai/campaign-schedules/applications/{applicationId} — 신청자별 일정 (제출/검수/피드백 마감)
크리에이터 개별 일정 조회 API
신청 ID로 해당 크리에이터의 개별 일정 목록을 조회합니다. 플로우 진행에 따라 일정이 동적으로 추가/갱신됩니다.
HTTP 요청
GET /ai/campaign-schedules/applications/{applicationId}
Authorization: Bearer {access_token}Path Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
applicationId | long | 예 | 크리에이터 신청 ID |
응답
성공 응답 (200 OK) - 1회검수 캠페인 (전체 플로우 완료 시)
{
"status": 200,
"code": null,
"message": "크리에이터 개별 일정 조회가 성공하였습니다.",
"data": {
"schedules": [
{
"id": 1,
"phase": "CONTENT_SUBMISSION_DEADLINE",
"phaseDescription": "제작물 제출 마감",
"deadline": "2026-04-05T14:00:00",
"originalDeadline": "2026-04-05T14:00:00",
"triggerType": "TRIGGER_1A_DELIVERY_INPUT",
"triggeredAt": "2026-04-01T14:00:00",
"triggerFired": true,
"createdAt": "2026-04-01T14:00:00",
"updatedAt": null
},
{
"id": 2,
"phase": "CONTENT_REVIEW_DEADLINE",
"phaseDescription": "제작물 검수 마감",
"deadline": "2026-04-09T10:00:00",
"originalDeadline": "2026-04-09T10:00:00",
"triggerType": "TRIGGER_VIDEO_SUBMITTED",
"triggeredAt": "2026-04-04T10:00:00",
"triggerFired": true,
"createdAt": "2026-04-04T10:00:00",
"updatedAt": null
},
{
"id": 3,
"phase": "FEEDBACK_DEADLINE",
"phaseDescription": "피드백 반영 마감",
"deadline": "2026-04-13T15:00:00",
"originalDeadline": "2026-04-13T15:00:00",
"triggerType": "TRIGGER_VIDEO_SUBMITTED",
"triggeredAt": "2026-04-09T15:00:00",
"triggerFired": true,
"createdAt": "2026-04-09T15:00:00",
"updatedAt": null
},
{
"id": 4,
"phase": "UPLOAD_ALLOWED_DATE",
"phaseDescription": "업로드 허용일",
"deadline": "2026-04-20T00:00:00",
"originalDeadline": "2026-04-20T00:00:00",
"triggerType": "TRIGGER_3_VIDEO_REVIEW_DONE",
"triggeredAt": "2026-04-14T10:00:00",
"triggerFired": true,
"createdAt": "2026-04-14T10:00:00",
"updatedAt": null
}
],
"applicationId": 100,
"guidelineCompletedAt": "2026-04-01T10:00:00",
"expectedCompletedAt": "2026-04-22T10:00:00"
}
}성공 응답 (200 OK) - 2회검수 캠페인 (전체 플로우 완료 시)
{
"status": 200,
"code": null,
"message": "크리에이터 개별 일정 조회가 성공하였습니다.",
"data": {
"schedules": [
{
"id": 1,
"phase": "SCRIPT_SUBMISSION_DEADLINE",
"phaseDescription": "스크립트 제출 마감",
"deadline": "2026-04-12T00:00:00",
"originalDeadline": "2026-04-12T00:00:00",
"triggerType": "TRIGGER_1B_CONTRACT_GUIDELINE",
"triggeredAt": "2026-04-10T00:00:00",
"triggerFired": true,
"createdAt": "2026-04-10T00:00:00",
"updatedAt": null
},
{
"id": 2,
"phase": "SCRIPT_REVIEW_DEADLINE",
"phaseDescription": "스크립트 검수 마감",
"deadline": "2026-04-16T09:00:00",
"originalDeadline": "2026-04-16T09:00:00",
"triggerType": "TRIGGER_SCRIPT_SUBMITTED",
"triggeredAt": "2026-04-12T09:00:00",
"triggerFired": true,
"createdAt": "2026-04-12T09:00:00",
"updatedAt": null
},
{
"id": 3,
"phase": "CONTENT_SUBMISSION_DEADLINE",
"phaseDescription": "제작물 제출 마감",
"deadline": "2026-04-20T15:00:00",
"originalDeadline": "2026-04-20T15:00:00",
"triggerType": "TRIGGER_2_SCRIPT_REVIEW_DONE",
"triggeredAt": "2026-04-16T15:00:00",
"triggerFired": true,
"createdAt": "2026-04-16T15:00:00",
"updatedAt": null
},
{
"id": 4,
"phase": "CONTENT_REVIEW_DEADLINE",
"phaseDescription": "제작물 검수 마감",
"deadline": "2026-04-28T10:00:00",
"originalDeadline": "2026-04-28T10:00:00",
"triggerType": "TRIGGER_VIDEO_SUBMITTED",
"triggeredAt": "2026-04-24T10:00:00",
"triggerFired": true,
"createdAt": "2026-04-24T10:00:00",
"updatedAt": null
},
{
"id": 5,
"phase": "FEEDBACK_DEADLINE",
"phaseDescription": "피드백 반영 마감",
"deadline": "2026-05-02T14:00:00",
"originalDeadline": "2026-05-02T14:00:00",
"triggerType": "TRIGGER_VIDEO_SUBMITTED",
"triggeredAt": "2026-04-28T14:00:00",
"triggerFired": true,
"createdAt": "2026-04-28T14:00:00",
"updatedAt": null
},
{
"id": 6,
"phase": "UPLOAD_ALLOWED_DATE",
"phaseDescription": "업로드 허용일",
"deadline": "2026-05-10T00:00:00",
"originalDeadline": "2026-05-10T00:00:00",
"triggerType": "TRIGGER_3_VIDEO_REVIEW_DONE",
"triggeredAt": "2026-05-03T10:00:00",
"triggerFired": true,
"createdAt": "2026-05-03T10:00:00",
"updatedAt": null
}
],
"applicationId": 200,
"guidelineCompletedAt": "2026-04-10T09:00:00",
"expectedCompletedAt": "2026-05-12T09:00:00"
}
}일정은 한 번에 전부 생성되지 않습니다. 플로우 단계마다 해당 일정만 추가됩니다.
- 선정 시: 제출 마감만 생성 (1회검수:
CONTENT_SUBMISSION_DEADLINE, 2회검수:SCRIPT_SUBMISSION_DEADLINE) - 제출 시: 검수 마감 추가
- 피드백 시: 피드백 마감 추가
- 업로드일 설정 시: 업로드 허용일 추가
- 같은 phase는 새 row가 생기지 않고 기존 deadline이 갱신됩니다.
Response 스키마 (ListResponse)
| 필드명 | 타입 | 설명 |
|---|---|---|
schedules | ApplicationScheduleResponseDto[] | 일정 목록 |
applicationId | long | 신청 ID |
guidelineCompletedAt | datetime | [TASK-071] 가이드라인 완성일. 출처: MongoDB GuidelineDocument.completedAt → fallback Collab.recruitment_start_date. 가이드 미완성(DRAFT) 캠페인은 null. 운영자는 admin PUT 으로 정정 가능. |
expectedCompletedAt | datetime | [TASK-071 Jay 2026-05-26] 캠페인 예상 완료일 (백엔드 계산). 국내만 산정 (해외 null). 영업일 기준 guidelineCompletedAt + baseDays + (recruitmentDays - 4). 자세한 산정 규칙은 캠페인 일정 조회 API 참고. |
ApplicationScheduleResponseDto
| 필드명 | 타입 | 설명 |
|---|---|---|
id | long | 일정 ID |
phase | string | 일정 단계 enum |
phaseDescription | string | 단계 한글 설명 |
deadline | datetime | 현재 마감일 (재계산에 따라 갱신) |
originalDeadline | datetime | 원본 마감일 (최초 생성 시 1회 세팅, 불변) |
triggerType | string | [TASK-071] 이 마감일을 확정시킨 트리거 종류 (enum name). null이면 아직 트리거 미발동(임시 마감) → 화면에 회색 상대 문구로 노출. 전체 값은 아래 ScheduleTriggerType 표 참고. |
triggeredAt | datetime | [TASK-071] 트리거 발동 시각 (미발동 시 null) |
triggerFired | boolean | [TASK-071] 트리거 발동 여부 (triggerType != null). true면 실제 일자로 확정됨 → 회색 placeholder가 실제 일자로 전환 |
delays | ScheduleDelayInfo[] | 본인 차원 사유 + 캠페인 차원 사유(선정/배송) mirror 합본 |
createdAt | datetime | 생성일 |
updatedAt | datetime | 수정일 |
ApplicationSchedulePhase (개별 일정 단계)
| Phase | 설명 | 비고 |
|---|---|---|
SCRIPT_SUBMISSION_DEADLINE | 스크립트 제출 마감 | 2회검수만 |
SCRIPT_REVIEW_DEADLINE | 스크립트 검수 마감 | 2회검수만 |
CONTENT_SUBMISSION_DEADLINE | 제작물 제출 마감 | |
CONTENT_REVIEW_DEADLINE | 제작물 검수 마감 | |
FEEDBACK_DEADLINE | 피드백 반영 마감 | |
UPLOAD_ALLOWED_DATE | 업로드 허용일 | |
FINAL_RESUBMISSION_DEADLINE | 최종제출물 재제출 마감 | 재요청 시 |
SETTLEMENT_DEADLINE | 정산 마감 |
ScheduleTriggerType (트리거 종류)
각 일정 row 의 triggerType 에 들어가는 값. 어떤 트리거가 해당 마감일을 확정했는지 나타낸다. null 이면 아직 미발동(임시 마감).
| triggerType | 발화 시점 | 시트 명세 |
|---|---|---|
TRIGGER_1A_DELIVERY_INPUT | 배송지/운송장 입력 (배송형) | Trigger 1-A |
TRIGGER_1B_CONTRACT_GUIDELINE | 계약 서명완료 + 가이드라인 발송 (비배송형) | Trigger 1-B |
TRIGGER_2_SCRIPT_REVIEW_DONE | 스크립트 검수 완료 — 광고주 승인 (2회검수) | Trigger 2 |
TRIGGER_3_VIDEO_REVIEW_DONE | 영상 검수 완료 — 광고주 승인 | Trigger 3 |
TRIGGER_4_FINAL_UPLOAD_DONE | 최종 제출물 업로드 완료 | Trigger 4 |
TRIGGER_SCRIPT_SUBMITTED | 크리에이터 스크립트 제출/재제출 → 검수 마감 산정 | 검수 = 제출일 + 2영업일 |
TRIGGER_VIDEO_SUBMITTED | 크리에이터 영상 제출/재제출 → 검수 마감 산정 | 검수 = 재제출일 + 2영업일 |
TRIGGER_2R_SCRIPT_RESUBMIT_REQUEST | 광고주 스크립트 재제출 요청 (2회검수) | 재제출 = 요청일 + 1일 |
TRIGGER_3R_VIDEO_RESUBMIT_REQUEST | 광고주 영상 재제출 요청 | 재제출 = 요청일 + 2일(첫)/+3일(재) |
TRIGGER_4R_FINAL_RESUBMIT_REQUEST | 광고주 최종제출물 재요청 | 재제출 = 요청일 + 1일 (검수 없음) |
일정 계산 규칙
1회검수 (비배송)
| 단계 | 기준 | 계산 |
|---|---|---|
| 제작물 제출 마감 | 선정 시 | 선정일 + 4일 |
| 제작물 검수 마감 | 크리에이터 제출 시 | 제출일 + 영업일 2일 |
| 피드백 반영 마감 | 기업 피드백 시 | 피드백일 + 4일 |
| 업로드 허용일 | 기업 설정 시 | 기업 입력값 |
1회검수 (배송) — 제작물 제출 마감만 다름: 배송마감예상일 + 4일
2회검수 (비배송)
| 단계 | 기준 | 계산 |
|---|---|---|
| 스크립트 제출 마감 | 선정 시 | 선정일 + 2일 |
| 스크립트 검수 마감 | 크리에이터 제출 시 | 제출일 + 영업일 2일 |
| 제작물 제출 마감 | 스크립트 승인 시 | 승인일 + 4일 |
| 제작물 검수 마감 | 크리에이터 제출 시 | 제출일 + 영업일 2일 |
| 피드백 반영 마감 | 기업 피드백 시 | 피드백일 + 4일 |
| 업로드 허용일 | 기업 설정 시 | 기업 입력값 |
2회검수 (배송) — 스크립트 제출 마감만 다름: 배송마감예상일 + 2일
영업일 = 토/일 제외 (공휴일 미포함). 배송마감예상일 = 캠페인 일정의 DRAFT_SUBMISSION phase endDate.
API 테스트
캠페인 단위 전체 일정 조회는 캠페인 일정 조회 API 페이지 참고. 트리거 발화 흐름은 트리거 기반 일정 재설계 페이지 참고.