Seedance 2.0
공식 ModelArk 작업 API로 Seedance 2.0 동영상을 생성합니다: 텍스트로 동영상 생성, 첫 프레임과 마지막 프레임, 이미지·동영상·오디오 참조, 480p부터 4K까지.
Seedance 2.0은 ByteDance의 동영상 생성 모델(Dreamina Seedance 2.0)입니다. 공식 ModelArk 작업 요청 본문을 보내고, 반환된 작업 ID를 보관한 뒤 그 작업에서 완성된 동영상을 받아오세요. 이미지, 동영상, 오디오는 content에 URL로 넣습니다.
모델 ID
| 모델 ID | 해상도 | 설명 |
|---|---|---|
dreamina-seedance-2-0 | 480p, 720p, 1080p, 4K | 전체 모델 |
dreamina-seedance-2-0-fast | 480p, 720p | 초당 가격이 더 낮음 |
dreamina-seedance-2-0-mini | 480p, 720p | 초당 가격이 가장 낮음 |
세 ID 모두 같은 파라미터를 받습니다. 현재 가격은 모델 페이지에서 확인하세요.
간단한 예제
curl https://api.seedrouter.ai/v1/contents/generations/tasks \
-H "Authorization: Bearer $SEEDROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "dreamina-seedance-2-0",
"content": [{"type": "text", "text": "A red paper boat drifts across a calm pond at sunrise, slow dolly-in"}],
"resolution": "720p",
"ratio": "16:9",
"duration": 5,
"generate_audio": true
}'엔드포인트
POST https://api.seedrouter.ai/v1/contents/generations/tasks| 헤더 | 값 |
|---|---|
| Authorization | Bearer YOUR_API_KEY |
| Content-Type | application/json |
요청 본문은 공식 ModelArk의 "동영상 생성 작업 만들기" 요청 그대로입니다. 이미 ModelArk를 호출하고 있다면 base URL을 https://api.seedrouter.ai/v1로 바꾸고 API 키만 교체하면 됩니다. 응답은 완성된 동영상이 아니라 {"id": "task_..."}입니다. API 키는 서버 측 코드에 보관하세요.
파라미터
| 이름 | 타입 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
model | string | 예 | — | 위의 세 모델 ID 중 하나입니다. |
content | object[] | 예 | — | 프롬프트와 미디어입니다. 아래를 참고하세요. |
resolution | enum | 아니요 | 720p | 480p, 720p, 1080p, 4k. Fast와 Mini ID는 480p와 720p만 받습니다. |
ratio | enum | 아니요 | adaptive | 16:9, 4:3, 1:1, 3:4, 9:16, 21:9, adaptive. |
duration | integer | 아니요 | 5 | 4~15초. 모델이 길이를 정하게 하려면 -1. |
generate_audio | boolean | 아니요 | true | 동영상과 함께 사운드를 생성합니다. |
watermark | boolean | 아니요 | false | 워터마크를 추가합니다. |
return_last_frame | boolean | 아니요 | false | 마지막 프레임도 이미지 URL로 함께 반환합니다. |
execution_expires_after | integer | 아니요 | 172800 | 3600~259200초. 이 시간이 지나도 완료되지 않은 작업은 expired가 되며 과금되지 않습니다. |
priority | integer | 아니요 | 0 | 0~9. |
safety_identifier | string | 아니요 | — | 최종 사용자를 식별하는 1~64자 문자열입니다. 해시값을 써도 됩니다. |
service_tier | enum | 아니요 | default | default만 가능합니다. |
content_filter | boolean | 아니요 | true | SeedRouter 확장 필드입니다. false로 설정하면 이 요청의 콘텐츠 필터링이 꺼집니다. |
content 항목
| 항목 | 형태 | 역할 | 제한 |
|---|---|---|---|
| 텍스트 | {"type": "text", "text": "..."} | — | 1개. |
| 이미지 | {"type": "image_url", "image_url": {"url": "https://..."}, "role": "..."} | first_frame, last_frame, reference_image | 참조 이미지 최대 9장. |
| 동영상 | {"type": "video_url", "video_url": {"url": "https://..."}, "role": "reference_video"} | reference_video | 최대 3개. |
| 오디오 | {"type": "audio_url", "audio_url": {"url": "https://..."}, "role": "reference_audio"} | reference_audio | 최대 3개. 참조 이미지나 참조 동영상이 필요합니다. |
알 수 없는 필드는 거부됩니다. 지원하지 않는 항목: seed, callback_url(대신 작업을 폴링하세요), draft와 draft_task, tools, 1.x 전용인 frames와 camera_fixed, 그리고 output_format과 omni_reference_task_type(Seedance 2.5 전용). 작업은 취소하거나 삭제할 수 없습니다.
모드
모드는 content 항목에 따라 정해지며, 모드 파라미터는 없습니다.
| 모드 | content |
|---|---|
| 텍스트로 동영상 생성 | 텍스트 항목 1개 |
| 첫 프레임 | 텍스트(선택) + 역할이 first_frame인 이미지 1장, 또는 역할이 없는 이미지 1장 |
| 첫 프레임과 마지막 프레임 | 텍스트(선택) + first_frame 이미지 1장 + last_frame 이미지 1장 |
| 멀티모달 참조 | 텍스트 + reference_image, reference_video, reference_audio 항목의 임의 조합 |
첫 프레임 계열 모드는 참조 항목과 함께 쓸 수 없습니다. 이미지가 여러 장이거나 다른 미디어가 함께 있으면 모든 이미지에 role이 필요합니다.
참조 예제
curl https://api.seedrouter.ai/v1/contents/generations/tasks \
-H "Authorization: Bearer $SEEDROUTER_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "dreamina-seedance-2-0",
"content": [
{"type": "text", "text": "The character from the image walks through the market in the video, same camera move"},
{"type": "image_url", "image_url": {"url": "https://example.com/character.png"}, "role": "reference_image"},
{"type": "video_url", "video_url": {"url": "https://example.com/market.mp4"}, "role": "reference_video"}
],
"ratio": "adaptive",
"duration": 8
}'예제의 URL은 접근 가능한 본인의 파일로 바꾸세요.
미디어 입력
이 API는 URL 참조만 받습니다. Base64, data: URL, asset:// ID, multipart 업로드는 받지 않습니다. Playground는 선택한 파일을 스토리지에 업로드한 뒤 그 URL을 전송합니다.
미디어는 공개 HTTP(S) URL이어야 하며 모델의 공식 제한을 충족해야 합니다:
| 미디어 | 형식 | 제한 |
|---|---|---|
| 이미지 | JPEG, PNG, WebP, BMP, TIFF, GIF, HEIC, HEIF | 30MB 미만, 가로·세로 300 |
| 동영상 | MP4, MOV (H.264 또는 H.265) | 개당 2 |
| 오디오 | WAV, MP3 | 개당 2~15초, 최대 3개, 합계 15초 이하, 참조 이미지나 참조 동영상 필요, 15MB 이하 |
실제 사람의 얼굴이 담긴 참조 이미지와 참조 동영상은 모델에서 지원하지 않습니다.
미디어는 작업이 시작될 때, 생성에 앞서 검사됩니다. 미디어가 이 제한 중 하나라도 어기면 작업은 invalid_request_error와 위반한 규칙을 알려 주는 메시지(예: The request was rejected: content reference videos must total at most 15 seconds.)와 함께 failed로 끝나며 과금되지 않습니다. 그 시점에 읽을 수 없는 파일은 모델에 그대로 전달되고, 모델이 받아들이거나 거부합니다. 어느 쪽이든 실패한 작업은 과금되지 않습니다.
과금에 영향을 주는 요소
현재 요금은 모델 가격 섹션에서 확인하세요. Seedance 2.0은 공식 단위인 동영상 토큰으로 과금합니다:
video tokens = (output seconds + reference video seconds) × width × height × 24 / 1024100만 토큰당 요율은 출력 해상도와 요청에 참조 동영상이 포함되는지 여부에 따라 달라집니다. 참조 동영상이 포함된 요청은 모든 토큰에 더 낮은 요율이 적용됩니다. 텍스트, 이미지, 오디오 입력은 과금되지 않습니다. 16:9 기준으로 1초는 480p(864×496)에서 10,044토큰, 720p에서 21,600토큰, 1080p에서 48,600토큰, 4K에서 194,400토큰입니다.
과금은 완성된 동영상이 보고하는 토큰(usage.completion_tokens)을 따르므로, duration: -1은 실제로 생성된 길이를 기준으로 과금됩니다. 렌더링된 클립은 요청한 길이보다 약간 길게 나옵니다. 5초 720p 16:9 요청은 121프레임으로 렌더링되며 108,000토큰이 아니라 108,900토큰이 보고됩니다. 최종 과금액은 계정의 사용 내역에서 확인하세요. 실패하거나 만료된 작업은 과금되지 않습니다.
출력 스키마
제출하면 작업 ID가 반환됩니다:
{"id": "task_..."}작업 조회
curl https://api.seedrouter.ai/v1/contents/generations/tasks/YOUR_TASK_ID \
-H "Authorization: Bearer $SEEDROUTER_API_KEY"status가 succeeded, failed, expired 중 하나가 될 때까지 10~20초마다 폴링하세요. 폴링 중 네트워크 타임아웃이 발생해도 생성이 실패한 것은 아닙니다. 작업 ID를 유지한 채 조회를 이어가세요. 진행 상황 확인을 위해 다른 작업을 만들지 마세요.
전체 폴링 예제
위의 Python 제출 예제 다음에 실행하세요.
import time
deadline = time.monotonic() + 1800
while time.monotonic() < deadline:
result = requests.get(
f"https://api.seedrouter.ai/v1/contents/generations/tasks/{task_id}",
headers={"Authorization": f"Bearer {os.environ['SEEDROUTER_API_KEY']}"},
timeout=30,
)
result.raise_for_status()
task = result.json()
if task["status"] == "succeeded":
print(task["content"]["video_url"])
break
if task["status"] in ("failed", "expired"):
raise RuntimeError(task["error"]["message"])
time.sleep(15)
else:
raise TimeoutError(f"Still waiting. Resume polling task {task_id}.")성공한 작업
{
"id": "task_...",
"model": "dreamina-seedance-2-0",
"status": "succeeded",
"content": {
"video_url": "https://static.seedrouter.ai/media/tasks/task_example/0.mp4",
"last_frame_url": "https://static.seedrouter.ai/media/tasks/task_example/last_frame/0.jpg"
},
"usage": {"completion_tokens": 108900, "total_tokens": 108900},
"seed": 42,
"resolution": "720p",
"ratio": "16:9",
"duration": 5,
"framespersecond": 24,
"generate_audio": true,
"draft": false,
"output_format": "mp4",
"service_tier": "default",
"execution_expires_after": 172800,
"priority": 0,
"created_at": 1790321515,
"updated_at": 1790321652
}| 필드 | 의미 |
|---|---|
id | 이후 조회를 위해 이 ID를 보관하세요. |
status | queued, running, succeeded, failed, expired 중 하나입니다. |
content.video_url | 생성된 동영상입니다. |
content.last_frame_url | return_last_frame이 true일 때 반환되는 마지막 프레임입니다. |
usage.completion_tokens | 완성된 동영상의 동영상 토큰이며, 과금 수량입니다. |
duration, resolution, ratio, framespersecond, seed | 실제로 렌더링된 값입니다. seed는 모델이 고른 값입니다. |
created_at, updated_at | 초 단위 Unix 타임스탬프입니다. |
error | 실패하거나 만료된 작업의 {"code", "message"}입니다. |
동영상 URL은 저희 스토리지에 호스팅됩니다. 오래 보관해야 한다면 파일을 직접 스토리지에 저장하세요.
작업 목록
curl "https://api.seedrouter.ai/v1/contents/generations/tasks?page_num=1&page_size=20&filter.status=succeeded" \
-H "Authorization: Bearer $SEEDROUTER_API_KEY"최근 7일간의 작업 객체를 최신순으로 담은 {"total": N, "items": [...]}를 반환합니다. page_num과 page_size는 1~500입니다(기본값은 각각 1과 20). 필터: filter.status, filter.model, filter.task_ids(반복 가능), filter.service_tier.
오류
작업이 생성되기 전에 거부된 요청은 HTTP 오류와 error 객체를 반환하며 과금되지 않습니다. 접수된 뒤 실패한 작업은 조회 시 HTTP 200과 함께 status: "failed"(또는 "expired") 및 error 객체를 반환합니다. 콘텐츠 필터링으로 출력이 보류되면 content_policy_violation으로 실패하고, execution_expires_after를 넘겨 실행된 작업은 task_expired와 함께 expired로 끝납니다.
코드, HTTP 상태, 재시도 지침은 공통 오류 카탈로그를 참고하세요.
{
"id": "task_...",
"model": "dreamina-seedance-2-0",
"status": "failed",
"error": {
"code": 60001,
"message": "The request was rejected by the content policy. Please revise the prompt or input images."
}
}제출 자체가 타임아웃된 경우에는 다시 보내기 전에 작업 목록을 확인하세요. 첫 번째 요청이 이미 접수되었을 수 있습니다.
팁
- 피사체, 동작, 카메라 움직임, 조명을 완전한 문장으로 설명하세요.
- 480p와 짧은
duration으로 초안을 만든 뒤, 마음에 드는 결과를 더 높은 해상도로 렌더링하세요. return_last_frame으로 샷을 이어 붙이세요. 반환된 프레임을 다음 작업의first_frame으로 사용하면 됩니다.
