선정 (계약서 작성 건너뛰기)
지정한 크리에이터를 제안·크레딧 잠금·계약 체결까지 한 번에 끝내고 제출 단계로 세웁니다.
선정 (계약서 작성 건너뛰기)
지정한 크리에이터를 제안 → 크레딧 잠금 → 계약 체결까지 한 번에 처리합니다. 계약서 열람·정보입력·OTP 인증·서명은 통째로 건너뛰고 서명 완료 상태를 직접 만듭니다.
OTP 인증은 실제 문자가 발송되고 과금됩니다. 반복 테스트에서 이 경로를 태울 수 없어 상태를 직접 만드는 방식을 택했습니다. 그래서 계약서 PDF도 생성되지 않습니다.
호출이 끝나면 크리에이터는 곧바로 아래 단계에 서 있습니다.
| 캠페인 | 다음 단계 |
|---|---|
2회검수 (doubleReview = true) | 스크립트 제출 |
1회검수 (doubleReview = false) | 영상 제출 |
HTTP 요청
POST /ai/test-setup/campaign/{collabNo}/select
Content-Type: application/jsonPath Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
collabNo | Integer | 예 | 캠페인 번호 |
Request Body
{
"influenceNos": [6282, 6281],
"unitPrice": 100000,
"skipDelivery": false
}| 필드 | 타입 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
influenceNos | Array<Integer> | 예 | — | 선정할 인플루언서 번호 목록 |
unitPrice | Long | 아니오 | 100000 | 협업 단가. 노출가·제안가로 함께 들어가고 크레딧 잠금 금액의 기준이 됩니다 |
skipDelivery | Boolean | 아니오 | false | true 면 배송 완료 처리를 건너뜁니다 |
처리 순서
크리에이터 한 명당 아래를 순서대로 수행합니다.
- 신청 생성 — 이미 있으면 재사용. 없으면
SELF_APPLIED로 새로 만듭니다 - 기업 노출 + 단가 —
adminVisible = true, 노출가·제안가 설정, 추천사 프리셋 주입 - 제안 + 크레딧 잠금 —
PROPOSAL로 바꾸고 캠페인 예산에서 잠급니다. 이미 잠겨 있으면 건너뜁니다 - 계약 체결 —
ApplicationContract를SIGNED상태로 직접 생성 - 선정 확정 + 검수 라운드 —
SELECTED로 바꾸고ContentReview생성 (2회검수 = 1차, 1회검수 = 2차) - 일정 트리거 발화 — 아래 표 참고
마지막으로 캠페인 단계를 CONTENT_CREATION 으로 넘기고 신청자 목록을 숨깁니다(운영 서명 흐름과 동일).
일정 트리거를 실제로 발화시키는 이유
마감이 trigger_type 없이 임시값(placeholder)으로 남으면, 어드민·크리에이터 화면이 계약자 전원을 연체로 표시합니다. 그래서 상태는 직접 만들되 일정 트리거만은 운영과 같은 서비스를 호출합니다.
| 캠페인 | 발화하는 트리거 | 제출 마감 |
|---|---|---|
| 비배송형 | TRIGGER_1B_CONTRACT_GUIDELINE | 서명 + 3일(2회검수) / +4일(1회검수) |
| 국내 배송형 | TRIGGER_1A_DELIVERY_INPUT | 배송완료 + 3일(2회검수) / +4일(1회검수) |
| 해외 배송형 (2회검수) | TRIGGER_1A_DELIVERY_ESTIMATE | 운송장 등록 + 배송영업일 4일 + 3일 |
| 해외 배송형 (1회검수) | TRIGGER_1B_CONTRACT_GUIDELINE | 서명 + 9일 (운송장 트리거 미사용) |
배송형에서는 운송장 더미와 배송 완료 시각까지 넣습니다. 택배사는 국내면 kr.cjlogistics, 해외면 OTHER 로 들어갑니다.
skipDelivery: true 를 주면 배송 처리를 건너뛰어 마감이 임시값으로 남습니다. 운송장 입력을 광고주 화면에서 직접 테스트하고 싶을 때 쓰세요. 이 상태에서는 화면에 연체로 보이는 것이 정상입니다.
응답 (200 OK)
{
"status": 200,
"code": null,
"message": "선정 완료",
"data": {
"collabNo": 3201,
"doubleReview": true,
"nextStage": "SCRIPT_SUBMISSION",
"campaignSubStep": "CONTENT_CREATION",
"selectedCount": 2,
"selected": [
{
"applicationId": 88123,
"influenceNo": 6282,
"influenceName": "테스트크리에이터",
"unitPrice": 100000,
"lockedAmount": 100000,
"contractId": 4412,
"contractStatus": "SIGNED",
"reviewRound": 1,
"deliveryCompleted": true
}
],
"failed": []
}
}| 필드 | 설명 |
|---|---|
nextStage | SCRIPT_SUBMISSION(2회검수) 또는 CONTENT_SUBMISSION(1회검수) |
lockedAmount | 실제로 잠긴 금액. 만원 단위 올림이 적용됩니다 |
reviewRound | 생성된 검수 라운드 (1 = 스크립트, 2 = 영상) |
deliveryCompleted | 배송 완료까지 세팅했는지 여부 |
failed[] | 인플루언서를 못 찾은 건. { influenceNo, reason } |
존재하지 않는 인플루언서가 섞여 있어도 전체가 실패하지 않고 해당 건만 failed 로 빠집니다.
재호출 안전성
같은 크리에이터로 다시 호출해도 터지지 않습니다. 신청·계약·배송·매칭 레코드는 있으면 갱신하고, 예산은 이미 잠겨 있으면 건너뜁니다.
에러 응답
에러도 HTTP 는 200 이고, 판정은 body 의 status 필드로 합니다.
body status | message | 상황 |
|---|---|---|
404 | influenceNos 는 필수입니다. | influenceNos 가 비었거나 없음 |
404 | 캠페인을 찾을 수 없습니다: {collabNo} | 캠페인 없음 |
이 API가 만들지 않는 것
- 계약서 PDF — 상태만
SIGNED이므로 "계약서 보기" 화면은 비어 있습니다 - 배송지(
TB_DELIVERY_ADDRESS) — 배송 레코드만 완료 처리합니다 - 알림·메일·문자 — 일절 발송하지 않습니다