POST /ai/admin/campaigns/{campaignNo}/recruitment/close
캠페인 모집 즉시 종료 (관리자 전용)
모집 종료
진행 중인 캠페인의 모집을 즉시 마감합니다. 모집 종료일이 호출 시각으로 당겨지며, 이후 크리에이터의 신규 신청은 거부됩니다.
본 API는 관리자 전용입니다. 모집 이후 단계(선정·계약·제작) 일정과 캠페인 진행 단계(campaignSubStep)는 변경되지 않습니다. 모집을 일찍 닫는 것과 이후 일정을 앞당기는 것은 별개 결정이기 때문입니다.
HTTP 요청
POST /ai/admin/campaigns/{campaignNo}/recruitment/close
Authorization: Bearer {access_token}요청 본문은 없습니다.
Path Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
campaignNo | Integer | 예 | 캠페인 번호 |
처리 흐름
- 캠페인 조회 — 없으면
CAMPAIGN_NOT_FOUND - 이미 마감 여부 판정 —
recruitmentEndDate <= 현재 시각이면 아무것도 변경하지 않고alreadyClosed: true로 응답 (멱등) - 캠페인 모집 종료일 갱신 —
TB_COLLAB.recruitment_end_date = 현재 시각 - 모집 단계 일정 갱신 —
TB_CAMPAIGN_SCHEDULE의phase = RECRUITMENT행만end_date = 현재 시각,updated_at갱신
왜 두 곳을 함께 닫는가
모집 마감일은 두 군데에 나뉘어 저장됩니다.
| 저장 위치 | 쓰이는 곳 |
|---|---|
TB_COLLAB.recruitment_end_date | 크리에이터에게 노출되는 캠페인 목록 필터, 신청 API의 마감 판정 |
TB_CAMPAIGN_SCHEDULE (phase = RECRUITMENT)의 end_date | 광고주·관리자 일정 화면의 모집 단계 종료일 |
한쪽만 닫으면 목록에서는 사라졌는데 일정 화면에는 모집 중으로 남는 식으로 어긋나므로, 두 값을 함께 갱신합니다.
original_end_date(가이드라인 완성 시 1회 세팅 후 불변)는 변경하지 않습니다. 지연 일수 계산이 이 값을 기준으로 하므로, 조기 마감이 "일정을 당긴 것"으로 집계되면 안 되기 때문입니다.
응답
성공 응답 (200 OK)
{
"status": 200,
"code": null,
"message": "모집이 마감되었습니다.",
"data": {
"campaignNo": 2485,
"recruitmentEndDate": "2026-08-18T14:32:10",
"alreadyClosed": false
}
}이미 마감된 캠페인이면 메시지가 "이미 모집이 마감된 캠페인입니다."로 내려가고 alreadyClosed가 true가 됩니다. 이때 recruitmentEndDate는 기존 종료일이며 새로 밀리지 않습니다.
응답 필드
| 필드 | 타입 | 설명 |
|---|---|---|
campaignNo | Integer | 캠페인 번호 |
recruitmentEndDate | LocalDateTime | 적용된 모집 종료일. 이번 호출로 마감했다면 처리 시각, 이미 마감이었다면 기존 종료일 |
alreadyClosed | Boolean | 호출 시점에 이미 마감 상태였는지 여부. true면 이번 호출로 바뀐 값은 없음 |
에러 응답
| 상태 코드 | code | 사례 |
|---|---|---|
404 | CAMPAIGN_NOT_FOUND | 캠페인 없음 |
401 | — | 인증 실패 |
마감 후 신청 차단
모집이 마감되면 크리에이터 신청 API가 신청을 거부합니다.
POST /ai/influence/campaign/application{
"status": 409,
"code": "CAMPAIGN_RECRUITMENT_CLOSED",
"message": "모집이 마감된 캠페인입니다.",
"data": null
}이 차단은 본 API로 닫은 캠페인뿐 아니라 모집 기간이 자연 만료된 모든 캠페인에 적용됩니다. 캠페인 목록 API는 원래부터 recruitmentEndDate >= now 조건으로 마감 캠페인을 제외해 왔으나, 신청 API 자체에는 검증이 없어 목록에서 사라진 뒤에도 직접 호출하면 신청이 저장됐습니다.
판정 기준은 Collab.recruitmentEndDate 단일 값입니다.
recruitmentEndDate가null인 레거시 캠페인은 차단되지 않습니다.- 관리자가 유저 풀에서 리스트에 담아둔 행(
ADMIN_ADDED)을 크리에이터가 이어받아 신청하는 경로도 동일하게 차단됩니다. 관리자가 리스트에 담는 행위 자체는 별도 API라 영향을 받지 않으므로, 마감 후에 담은 크리에이터는 본인 신청을 완료할 수 없습니다.
관련 API
- 모집 마감 취소 —
POST /ai/admin/campaigns/{campaignNo}/recruitment/reopen. 마감을 되돌리고 새 모집 종료일을 지정합니다. - 자동 모집 종료 — 선정 인원 전원이 계약 서명을 마치면 어드민이 누르지 않아도 모집이 자동으로 마감됩니다. 판정 기준과 트리거 지점은 마감 취소 문서에 정리돼 있습니다.