Admin APIAdmin Dashboard API
POST /ai/admin/dashboard/demo-applicants/upload-url/*
데모(목업) 후보 미디어 업로드 URL 발급 (presigned)
데모(목업) 후보 미디어 업로드 URL 발급
수기 등록할 데모 후보의 영상·이미지를 S3 에 올리기 위한 presigned PUT URL 을 발급합니다. 목적지 기준으로 엔드포인트가 2개입니다.
| 엔드포인트 | 쓰는 곳 | 허용 contentType |
|---|---|---|
/upload-url/post-media | recentPosts[].mediaUrl | 영상: video/mp4, video/quicktime, video/webm, video/x-m4v이미지: image/jpeg, image/png, image/webp, image/gif |
/upload-url/profile-image | profileImage | image/jpeg, image/png, image/webp, image/gif |
왜 이렇게 나눴나 — 목적지가 다르기 때문입니다. 게시물과 프로필은 허용 형식이 다르고(프로필은 이미지만) S3 경로도 갈려야 나중에 구분됩니다.
반면 게시물 안에서 영상/이미지는 나누지 않습니다. 둘 다 정상이고 같은 자리로 가므로 걸러낼
실수가 없습니다. S3 경로(post/video/ vs post/image/)는 서버가 contentType 을 보고 가릅니다 —
프런트는 종류를 신경 쓰지 않아도 됩니다.
왜 멀티파트가 아니라 presigned 인가 — 멀티파트 업로드는 nginx 앞단에서 죽어 애플리케이션 로그조차 남지 않은 이력이 있습니다. 프런트가 S3 로 직접 PUT 하면 서버를 거치지 않아 그 문제가 사라집니다. 가이드라인 trial 업로드와 같은 방식·같은 버킷입니다.
흐름
1) 발급 POST .../upload-url/post-media → { uploadUrl, publicUrl, contentType }
2) PUT PUT {uploadUrl} + Content-Type 헤더 (발급 때와 동일하게)
3) 등록 POST .../{campaignNo}/demo-applicants/manual
recentPosts[].mediaUrl = publicUrl / profileImage = publicUrlHTTP 요청
POST /ai/admin/dashboard/demo-applicants/upload-url/post-media
POST /ai/admin/dashboard/demo-applicants/upload-url/profile-image
Authorization: Bearer {access_token}
Content-Type: application/jsonRequest Body
두 엔드포인트 모두 동일합니다.
{
"filename": "reel_01.mp4",
"contentType": "video/mp4"
}| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
filename | String | 아니오 | 원본 파일명. S3 키에 붙어 나중에 알아보기 쉬워집니다. 생략 시 upload |
contentType | String | 예 | 파일 MIME 타입. presigned 서명에 포함되므로 실제 PUT 헤더와 반드시 같아야 합니다. 허용 목록 밖이면 400 |
응답
성공 응답 (200 OK)
{
"status": 200,
"message": "발급 완료",
"data": {
"uploadUrl": "https://<bucket>.s3.<region>.amazonaws.com/demo/applicant/post/video/1752..._reel_01.mp4?X-Amz-Signature=...",
"publicUrl": "https://<bucket>.s3.<region>.amazonaws.com/demo/applicant/post/video/1752..._reel_01.mp4",
"contentType": "video/mp4"
}
}| 필드 | 설명 |
|---|---|
uploadUrl | 여기에 PUT. 유효시간 30분 |
publicUrl | 업로드 후 접근할 URL. 수기 등록 요청에 이 값을 담는다 |
contentType | 발급에 쓰인 타입. PUT 헤더에 그대로 |
2단계 — S3 에 PUT
Content-Type 헤더를 발급 때와 똑같이 넣어야 합니다. presigned 서명에 Content-Type 이 포함돼 있어
다르면 S3 가 403 을 냅니다. 이 API 에서 가장 많이 밟는 함정입니다.
curl -X PUT "{uploadUrl}" \
-H "Content-Type: video/mp4" \
--upload-file ./reel_01.mp43단계 — 수기 등록에 사용
수기 등록 요청에 publicUrl 을 담습니다.
{
"username": "creator_jp_1",
"profileImage": "{profile-image 의 publicUrl}",
"recentPosts": [
{ "postLink": "https://www.instagram.com/reel/ABC123/",
"mediaUrl": "{post-media(영상) 의 publicUrl}", "mediaType": "VIDEO",
"publishedAt": "2026-07-10T14:30:00Z" },
{ "postLink": "https://www.instagram.com/p/DEF456/",
"mediaUrl": "{post-media(이미지) 의 publicUrl}", "mediaType": "IMAGE",
"publishedAt": "2026-07-08T10:00:00Z" }
]
}