Glowb Dev Docs
Admin APIAdmin Dashboard API

POST /ai/admin/dashboard/demo-applicants/upload-url/*

데모(목업) 후보 미디어 업로드 URL 발급 (presigned)

데모(목업) 후보 미디어 업로드 URL 발급

수기 등록할 데모 후보의 영상·이미지를 S3 에 올리기 위한 presigned PUT URL 을 발급합니다. 목적지 기준으로 엔드포인트가 2개입니다.

엔드포인트쓰는 곳허용 contentType
/upload-url/post-mediarecentPosts[].mediaUrl영상: video/mp4, video/quicktime, video/webm, video/x-m4v
이미지: image/jpeg, image/png, image/webp, image/gif
/upload-url/profile-imageprofileImageimage/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 = publicUrl

HTTP 요청

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/json

Request Body

두 엔드포인트 모두 동일합니다.

{
  "filename": "reel_01.mp4",
  "contentType": "video/mp4"
}
필드타입필수설명
filenameString아니오원본 파일명. S3 키에 붙어 나중에 알아보기 쉬워집니다. 생략 시 upload
contentTypeString파일 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.mp4

3단계 — 수기 등록에 사용

수기 등록 요청에 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" }
  ]
}

테스트

On this page