SaaS API제출 링크 (매직 링크)
GET /ai/submit-link/{token}
링크 컨텍스트 조회 (무인증)
링크 컨텍스트 조회
토큰을 검증하고, 해당 신청의 제출 컨텍스트(검수 라운드 목록)를 반환합니다. 링크 진입 시 가장 먼저 호출합니다.
무인증 엔드포인트 — JWT 없이 토큰만으로 접근합니다. (/ai/submit-link/**는 permitAll)
HTTP 요청
GET /ai/submit-link/{token}Path Parameters
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
token | string | 예 | 발급받은 제출 링크 토큰 |
응답
성공 응답 (200 OK)
{
"status": 200,
"code": null,
"message": "조회 완료",
"data": {
"applicationId": 100,
"reviewRounds": [
{ "reviewId": 50, "reviewRound": 1, "status": "REVIEWING", "itemTypes": ["SCRIPT_VIDEO"] },
{ "reviewId": 51, "reviewRound": 2, "status": "PENDING", "itemTypes": ["VIDEO", "CAPTION", "HASHTAG"] }
]
}
}Response Body 스키마
| 필드명 | 타입 | 설명 |
|---|---|---|
applicationId | long | 제출 대상 캠페인 신청 ID |
reviewRounds | array | 신청의 검수 라운드 목록 |
reviewRounds[].reviewId | long | 검수 라운드 ID (완료 콜백에 사용) |
reviewRounds[].reviewRound | int | 검수 차수 (1=1차, 2=2차) |
reviewRounds[].status | string | 검수 상태 |
reviewRounds[].itemTypes | string[] | 해당 라운드에 실제로 존재하는 제출항목 타입 목록(중복 제거). 예: ["SCRIPT_VIDEO"], ["VIDEO","CAPTION","HASHTAG"] |
스크립트/영상 단계 구분은 reviewRound 번호가 아니라 itemTypes로 판별하세요.
스크립트 단계에서는 1차 라운드만 내려오고(2차는 1차 통과 후 생성) 영상 전용 캠페인에서는 영상이 1차로 생성되기도 하므로, reviewRound === 1로 스크립트/영상을 추정하면 오판합니다. itemTypes에 스크립트 타입(SCRIPT_VIDEO/SCRIPT_BLOG)이 있으면 스크립트 입력, 없으면(VIDEO/PHOTO/CAPTION/HASHTAG) 콘텐츠 제출 화면으로 분기하세요.
SCRIPT_BLOG는 블로그 1·2차 양쪽에 등장할 수 있어 서버는 단계를 단정하지 않고 "그 라운드에 존재하는 타입 목록"만 그대로 내려줍니다.
최종제출물 가능 여부는 신청 단계로 판단되며, 컨텍스트에는 검수 라운드만 노출됩니다.
최종제출은 POST /ai/submit-link/{token}/complete/final을 직접 호출합니다.
에러 응답
| 상황 | 상태 코드 | 메시지 |
|---|---|---|
| 토큰 없음 | 400 | 유효하지 않은 링크입니다. |
| 만료/사용됨/비활성 | 400 | 만료되었거나 사용할 수 없는 링크입니다. |