동영상 생성 API
동영상 생성 API는 비동기 동영상 작업을 생성합니다. 생성 요청은 작업 ID와 함께 HTTP 202를 반환합니다. 해당 ID로 작업 상태가 succeeded 또는 failed가 될 때까지 조회한 다음, 완성된 MP4를 다운로드하세요.
아래 예시는 https://api.icodeeasy.cc를 기본 URL로 사용합니다. 아래에 설명된 모든 엔드포인트 호출에는 API 키가 필요하며, 성공 후 반환되는 서명된 결과 파일 URL만 예외입니다.
Authorization: Bearer <API 키>
엔드포인트
| 용도 | 메서드와 경로 |
|---|---|
| 동영상 작업 생성 | POST /v1/videos/generations |
| 작업 조회 | GET /v1/videos/tasks/{id} |
| 완성된 콘텐츠 다운로드 | GET /v1/videos/tasks/{id}/content |
| 완료되었거나 실패한 작업 삭제 | DELETE /v1/videos/tasks/{id} |
5분 빠른 시작
1. 작업 생성
curl -X POST https://api.icodeeasy.cc/v1/videos/generations \
-H 'Authorization: Bearer <API 키>' \
-H 'Content-Type: application/json' \
-d '{
"model": "doubao-seedance-2.5",
"prompt": "비 내리는 미래 도시 거리, 카메라가 천천히 전진하고 젖은 도로에 네온이 반사된다",
"resolution": "480p",
"ratio": "9:16",
"duration": 4,
"generate_audio": true
}'
생성 요청은 HTTP 202를 반환합니다.
{
"id": "vid_1785398400000000000",
"task_id": "vid_1785398400000000000",
"object": "video.generation.job",
"status": "queued",
"model": "doubao-seedance-2.5",
"created_at": "2026-07-30T08:00:00Z",
"updated_at": "2026-07-30T08:00:00Z"
}
작업 ID로는 task_id 사용을 권장합니다. 조회, 다운로드, 삭제에 사용할 수 있으며 id는 호환 기간 동안 같은 값으로 유지됩니다. 202 응답은 작업이 접수되었다는 뜻이며, 동영상이 이미 완성되었다는 뜻은 아닙니다.
2. 작업 조회
생성 응답의 task_id를 TASK_ID에 넣으세요.
TASK_ID='vid_1785398400000000000'
curl "https://api.icodeeasy.cc/v1/videos/tasks/${TASK_ID}" \
-H 'Authorization: Bearer <API 키>'
약 5초마다 한 번씩 조회하세요. 현재 작업이 queued 또는 running 상태인 동안에는 다른 작업을 생성하지 마세요.
{
"id": "vid_1785398400000000000",
"object": "video.generation.job",
"status": "running",
"model": "doubao-seedance-2.0",
"created_at": "2026-07-30T08:00:00Z",
"updated_at": "2026-07-30T08:00:20Z",
"progress": 42
}
progress는 참고용이며 없을 수도 있습니다. 진행률이 아닌 status를 기준으로 판단하세요.
3. 동영상 다운로드
status가 succeeded가 되면 응답에 url과 최종 cost_rmb가 포함됩니다.
{
"id": "vid_1785398400000000000",
"object": "video.generation.job",
"status": "succeeded",
"model": "doubao-seedance-2.0",
"created_at": "2026-07-30T08:00:00Z",
"updated_at": "2026-07-30T08:01:18Z",
"progress": 100,
"url": "/v1/videos/tasks/vid_1785398400000000000/content",
"cost_rmb": 0.528
}
표준 인증 콘텐츠 경로를 통해 다운로드하고 리디렉션을 따르세요.
TASK_ID='vid_1785398400000000000'
curl -L "https://api.icodeeasy.cc/v1/videos/tasks/${TASK_ID}/content" \
-H 'Authorization: Bearer <API 키>' \
-o result.mp4
콘텐츠 경로는 HTTP Range와 일반적인 조건부 다운로드 헤더를 지원합니다. 성공하기 전에 콘텐츠를 요청하면 409 video_not_ready가 반환됩니다.
작업 수명 주기와 안전한 재시도
| 상태 | 의미 | 클라이언트 동작 |
|---|---|---|
queued | 접수되었으며 시작 대기 중 | 같은 작업을 계속 조회 |
running | 동영상을 생성하는 중 | 같은 작업을 계속 조회 |
succeeded | 최종 성공 상태이며 콘텐츠 준비 완료 | 결과를 다운로드하여 저장 |
failed | 최종 실패 상태 | error.code를 확인하고, 의도적으로 다시 시도할 때만 새 작업 생성 |
재시도 규칙:
- HTTP
202를 받은 뒤에는 반환된task_id를 계속 조회하세요. 생성 요청을 반복하면 다른 작업이 생성될 수 있습니다. - 작업 조회와 다운로드
GET요청은 안전하게 재시도할 수 있습니다. - 생성 요청에서
submission_unknown이 반환되면 다른 요청을 제출하지 마세요. 작업이 이미 접수되었을 수 있으므로 요청 시간, 모델, 프롬프트 요약과 함께 지원팀에 문의하세요. - 작업이 최종
failed상태로 확인된 후에는 다른 동영상을 생성하려는 경우에만 새 작업을 만드세요.
웹훅과 callback_url은 지원하지 않습니다. 대신 작업 엔드포인트를 조회하세요.
생성 요청 참고 자료
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
model | string | 예 | 표준 모델 ID. 기본 모델은 없으며, 누락되거나 빈 문자열이면 400 invalid_request가 반환됩니다. |
prompt | string | 표준 모델은 텍스트 필수 | 모든 텍스트 지시문을 여기에 넣습니다. Motion Control에서는 참조 에셋 두 개를 모두 제공한 경우 선택 사항입니다. |
content | array | 참조 사용 시 | 공개 HTTPS 이미지/동영상 URL 항목만 포함하는 참조 미디어 목록입니다. |
resolution | string | 아니요 | 출력 해상도 등급. 기본값과 허용값은 모델에 따라 다릅니다. Motion Control에서는 사용할 수 없습니다. |
ratio | string | 아니요 | 출력 화면 비율. aspect_ratio도 별칭으로 허용됩니다. Motion Control에서는 사용할 수 없습니다. |
duration | integer | 아니요 | 요청 시간(초). 기본값과 허용값은 모델에 따라 다릅니다. Motion Control에서는 사용할 수 없습니다. |
generate_audio | boolean | 아니요 | 지원되는 경우 오디오를 생성합니다. 기본값은 모델 표를 참고하세요. Motion Control에서는 사용할 수 없습니다. |
motion_mode | string | Motion Control 전용 | std 또는 pro. 기본값은 std입니다. |
character_orientation | string | Motion Control 전용 | image 또는 video. 기본값은 image입니다. 참조 동영상의 허용 시간 범위를 결정합니다. |
keep_original_sound | boolean | Motion Control 전용 | 참조 동영상의 소리를 유지합니다. 기본값은 true입니다. |
모든 텍스트 지시문은 prompt에 넣으세요. content는 참조 이미지와 동영상에만 사용합니다.
참조 미디어 목록(content)
content는 첫 프레임과 마지막 프레임, 여러 개의 순서 없는 참조 이미지, 또는 Motion Control용 이미지 한 개와 동영상 한 개처럼 작업 하나에 여러 미디어를 담기 위한 목록입니다. 각 항목의 image_url 또는 video_url에 HTTPS URL 문자열을 직접 입력합니다.
[
{ "type": "image_url", "image_url": "https://cdn.example.com/first.png", "role": "first_frame" },
{ "type": "image_url", "image_url": "https://cdn.example.com/last.png", "role": "last_frame" }
]
- 이미지 타입:
image_url또는input_image. - 동영상 타입:
video_url또는input_video. - 프레임 역할:
first_frame과last_frame. 마지막 프레임을 사용하려면 항상 첫 프레임이 필요합니다. - Motion 역할:
reference_image한 개와reference_video한 개. - Grok 참조 이미지에는 역할을 지정하지 않습니다.
reference_image도 허용됩니다. - 참조 오디오는 현재 지원하지 않습니다.
- 미디어는 작업이 읽는 동안 유효한 공개 HTTPS URL이어야 합니다.
- 이미지는
image_url, 동영상은video_url에 넣습니다.
첫 프레임 + 마지막 프레임 전체 호출 예시
두 이미지를 공개 HTTPS URL에 배치한 뒤 URL을 content에 직접 넣습니다.
curl -X POST https://api.icodeeasy.cc/v1/videos/generations \
-H 'Authorization: Bearer <API 키>' \
-H 'Content-Type: application/json' \
-d '{
"model": "doubao-seedance-2.0",
"prompt": "첫 프레임에서 마지막 프레임까지 카메라가 부드럽게 이동한다",
"content": [
{"type":"image_url","image_url":"https://cdn.example.com/first.png","role":"first_frame"},
{"type":"image_url","image_url":"https://cdn.example.com/last.png","role":"last_frame"}
],
"resolution": "480p",
"ratio": "9:16",
"duration": 4,
"generate_audio": true
}'
첫 프레임만 전달할 수는 있습니다. 같은 요청에 첫 프레임이 없으면 마지막 프레임만 전달할 수 없습니다.
모델 사용 예제
Seedance: 텍스트, 첫 프레임, 마지막 프레임
Seedance 2.5, Seedance 2.0 Standard, Fast, Mini와 Seedance 1.5 Pro는 텍스트 기반 동영상 생성과 첫/마지막 프레임 기반 생성을 지원합니다. 참조 이미지에는 프레임 역할을 명시해야 하며, Seedance 2.5가 이 계열의 첫 번째 모델입니다.
{
"model": "doubao-seedance-2.5",
"prompt": "아침 햇빛이 변하는 동안 카메라가 유리 조각 주위를 돈다",
"content": [
{ "type": "image_url", "image_url": "https://cdn.example.com/seedance-first.png", "role": "first_frame" },
{ "type": "image_url", "image_url": "https://cdn.example.com/seedance-last.png", "role": "last_frame" }
],
"resolution": "720p",
"ratio": "16:9",
"duration": 6,
"generate_audio": true
}
Seedance 2.5의 기본값은 480p, 9:16, 4초, 생성 오디오 활성화입니다. 첫 프레임 또는 첫/마지막 프레임을 사용하면 화면 비율은 adaptive로 정규화됩니다.
MiniMax H3: 텍스트, 첫 프레임, 마지막 프레임
MiniMax-H3는 동일한 공개 요청으로 텍스트 기반 동영상 생성과 첫/마지막 프레임 생성을 지원합니다. 768P 또는 2K, 4–15초, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 화면 비율을 사용할 수 있습니다. 기본값은 768P, 9:16, 5초입니다. generate_audio를 보내지 마세요. H3의 공개 계약에는 생성 오디오 요청 토글이 없습니다.
Kling: 프레임 기반 생성
{
"model": "kling-v3",
"prompt": "옅은 안개를 뚫고 기차가 역으로 들어온다",
"content": [
{ "type": "image_url", "image_url": "https://cdn.example.com/kling-first.png", "role": "first_frame" },
{ "type": "image_url", "image_url": "https://cdn.example.com/kling-last.png", "role": "last_frame" }
],
"resolution": "1080p",
"ratio": "16:9",
"duration": 5,
"generate_audio": true
}
Kling의 주요 차이점:
kling-v2-6: 마지막 프레임에는1080p가 필요합니다. 생성 오디오는1080p에서만 사용할 수 있으며 마지막 프레임과 함께 사용할 수 없습니다.kling-3.0-turbo: 첫 프레임만 지원하며 생성 오디오는 지원하지 않습니다.kling-v3와kling-v3-omni: 첫/마지막 프레임과 생성 오디오를 지원합니다.kling-v3-omni는 역할이 없는 참조 이미지도 최대 두 개까지 허용하지만, 한 요청에서 역할 없는 이미지와 프레임 역할 이미지를 섞지 마세요.kling-video-o1: 첫/마지막 프레임을 지원하며 생성 오디오는 지원하지 않습니다.
Grok: 순서 없는 참조 이미지
Grok은 참조 이미지 URL을 최대 일곱 개까지 허용합니다. first_frame 또는 last_frame 역할을 지정하지 마세요.
{
"model": "grok-imagine-1.5-video",
"prompt": "카메라가 상승하는 동안 협곡 위로 구름이 흐른다",
"content": [
{ "type": "image_url", "image_url": "https://cdn.example.com/grok-reference.png" }
],
"resolution": "480p",
"ratio": "16:9",
"duration": 6
}
Grok의 기본값은 480p, 9:16, 6초입니다. 생성 오디오는 지원하지 않습니다.
Kling Motion Control
공개 HTTPS 이미지 한 개와 3~30초 길이의 공개 HTTPS MP4 동영상 한 개를 지정하세요.
{
"model": "kling-v3-motion-control",
"prompt": "캐릭터의 정체성을 유지하고 참조 동작을 따른다",
"content": [
{ "type": "image_url", "image_url": "https://cdn.example.com/character.png", "role": "reference_image" },
{ "type": "video_url", "video_url": "https://cdn.example.com/motion.mp4", "role": "reference_video" }
],
"motion_mode": "std",
"character_orientation": "image",
"keep_original_sound": true
}
character_orientation: "image": 참조 동영상은 3~10초여야 합니다.character_orientation: "video": 참조 동영상은 3~30초여야 합니다.- Motion Control 모델에는
resolution,ratio,duration,generate_audio를 보내지 마세요.
모델 기능 표
| 표준 모델 ID | 해상도 / 모드 | 시간 | 화면 비율 | 참조 | 오디오 기본값 |
|---|---|---|---|---|---|
doubao-seedance-2.5 | 480p, 720p | 4–30초 | 16:9, 4:3, 1:1, 3:4, 9:16, 21:9, adaptive | 첫 + 마지막 프레임; 프레임 안내 시 비율은 adaptive로 정규화 | 켬 |
doubao-seedance-2.0 | 480p, 720p, 1080p, 4K | 4–15초 | 16:9, 9:16, 1:1, 4:3, 3:4, 21:9, adaptive | 첫 + 마지막 프레임 | 켬 |
doubao-seedance-2.0-fast | 480p, 720p | 4–15초 | Seedance 2.0과 동일 | 첫 + 마지막 프레임 | 켬 |
doubao-seedance-2.0-mini | 480p, 720p | 4–15초 | Seedance 2.0과 동일 | 첫 + 마지막 프레임 | 켬 |
doubao-seedance-1-5-pro | 480p, 720p, 1080p | 4–12초 | 16:9, 9:16, 1:1, 4:3, 3:4, 21:9 | 첫 + 마지막 프레임 | 켬 |
MiniMax-H3 | 768P, 2K | 4–15초 | 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | 첫 + 마지막 프레임 | 공개 생성 오디오 토글 없음 |
kling-v2-6 | 720p, 1080p | 5초 또는 10초 | 16:9, 9:16, 1:1 | 첫 프레임 + 조건부 마지막 프레임 | 끔 |
kling-3.0-turbo | 720p, 1080p | 3–15초 | 16:9, 9:16, 1:1 | 첫 프레임만 | 미지원 |
kling-v3 | 720p, 1080p, 4K | 3–15초 | 16:9, 9:16, 1:1 | 첫 + 마지막 프레임 | 켬 |
kling-v3-omni | 720p, 1080p, 4K | 3–15초 | 16:9, 9:16, 1:1 | 첫 + 마지막 프레임 또는 역할 없는 이미지 최대 2개 | 켬 |
kling-video-o1 | 720p, 1080p | 5초 또는 10초 | 16:9, 9:16, 1:1 | 첫 + 마지막 프레임 | 미지원 |
kling-v2-6-motion-control | std, pro | 참조 동영상 | — | 이미지 1개 + 동영상 1개 | 원본 소리 켬 |
kling-v3-motion-control | std, pro | 참조 동영상 | — | 이미지 1개 + 동영상 1개 | 원본 소리 켬 |
grok-imagine-1.5-video | 480p, 720p | 6–30초 | 16:9, 9:16, 1:1, 3:2, 2:3 | 역할 없는 이미지 최대 7개 | 미지원 |
표준 모델에서 생략한 선택 항목은 위에 표시된 각 모델의 기본값을 사용합니다. model 자체는 항상 필수입니다. 서비스는 작업을 시작하기 전에 조합의 유효성을 검사합니다.
응답 및 다운로드 동작
모든 작업 응답은 다음 형식을 사용합니다.
| 필드 | 의미 |
|---|---|
id | 조회, 콘텐츠, 삭제, 지원 문의에 사용하는 소유자 범위의 작업 ID |
object | 항상 video.generation.job |
status | queued, running, succeeded 또는 failed |
model | 별칭 정규화 후의 표준 모델 ID |
created_at, updated_at | UTC RFC 3339 타임스탬프 |
progress | 참고용 생성 진행률. 사용할 수 없으면 생략 |
url | 성공 후에만 표시. 릴레이 콘텐츠 경로 또는 서명된 릴레이 파일 경로일 수 있음 |
cost_rmb | 최종 작업 요금. 성공적으로 정산된 후 표시 |
error.code | 실패한 작업의 안정적인 실패 범주 |
반환된 URL 형식을 가정해 저장하지 말고 GET /v1/videos/tasks/{id}/content를 사용하세요. HTTP 클라이언트에서 -L을 사용하거나 리디렉션을 활성화하세요. 인증된 콘텐츠 엔드포인트는 200, 206 Partial Content 또는 릴레이 관리 스토리지로의 리디렉션을 반환할 수 있습니다.
서명된 릴레이 파일 URL은 API 키 없이 열 수 있으며, 전체 URL을 소유한 사람은 해당 동영상에 접근할 수 있습니다. 공개 로그, 페이지 또는 클라이언트 측 분석에 노출하지 마세요.
안전하게 종료된 작업을 삭제하면 HTTP 204가 반환되며 릴레이가 관리하는 동영상 파일도 함께 삭제될 수 있습니다. 필요한 결과는 작업을 삭제하기 전에 다운로드해 저장하세요. 작업이 실행 중이거나 요금 정산이 완료되지 않은 경우 삭제 요청은 409 video_delete_unsafe로 거부됩니다. 로컬 작업 기록을 삭제해도 이미 시작된 동영상 생성은 취소되지 않습니다.
오류 처리
HTTP 오류는 다음 형식을 사용합니다.
{
"error": {
"type": "invalid_request",
"message": "model is not supported"
}
}
| HTTP | 오류 타입 | 의미 / 조치 |
|---|---|---|
400 | invalid_request | 잘못된 모델, 필드, 미디어 URL, 역할, 시간, 화면 비율 또는 모델 조합. 요청을 수정하세요. |
401 | unauthorized | API 키가 없거나 잘못되었거나 비활성화됨 |
402 | insufficient_balance | 잔액으로 요청한 작업 비용을 충당할 수 없음. 생성은 시작되지 않음 |
404 | not_found | 작업이 없거나 다른 계정에 속함 |
409 | video_not_ready | 최종 성공 전에 콘텐츠를 요청함 |
409 | video_delete_unsafe | 아직 안전하게 삭제할 수 없는 작업임 |
413 | request_too_large | 생성 JSON 본문이 크기 제한을 초과함 |
502 | upstream_error | 동영상 생성 또는 결과 다운로드 실패 |
503 | video_service_unavailable, upstream_quota_exceeded, video_price_unavailable | 동영상 서비스 처리 용량 또는 현재 공개 가격을 일시적으로 사용할 수 없음 |
503 | submission_unknown | 작업 접수 여부가 불확실함. 중복 요청을 제출하지 마세요. |
실패한 작업 응답은 다음과 같을 수 있습니다.
{
"id": "vid_1785398400000000000",
"object": "video.generation.job",
"status": "failed",
"model": "doubao-seedance-2.0",
"error": { "code": "generation_failed" }
}
요금 청구
동영상 생성에는 월간 할당량이 아닌 계정 잔액을 사용합니다.
작업 가격 = 선택한 모델/규격의 표시 RMB 초당 가격 × 청구 시간(초)
가격 페이지에서 현재 초당 가격을 확인하세요. 해상도, 생성 오디오 또는 Motion Control 모드에 따라 다른 표시 초당 가격 항목이 선택될 수 있습니다. 표준 모델의 청구 시간은 요청한 duration이며, Motion Control의 청구 시간은 감지된 참조 동영상 길이를 정수 초로 올림한 값입니다.
작업을 생성할 때 계정 잔액으로 비용을 충당할 수 있어야 합니다. 잔액이 부족하면 생성을 시작하기 전에 402가 반환됩니다. 성공한 작업의 cost_rmb가 최종 요금의 기준입니다. 명확히 실패한 작업에는 요금이 부과되지 않습니다.