4–30초 정수, 720P, 16:9 또는 9:16. 참조 이미지 최대 30장, 참조 오디오 최대 10개. 참조 영상은 지원하지 않습니다. 참조 오디오 없으면 건당 $2(400크레딧), 있으면 $3(600크레딧)이며 길이에 관계없이 동일합니다. 생성된 사운드트랙은 참조 오디오가 아닙니다. 기간 한정으로 장기 공급을 보장하지 않습니다. 대기 시간은 혼잡도에 따라 달라집니다. 다시 제출하지 말고 원래 작업을 조회하세요. 실패 시 전액 환불됩니다.
플레이그라운드에서 사용해 보기 →빠른 시작
세 단계면 됩니다: 작업 제출 → 결과 조회 → 영상 링크 받기. YOUR_API_KEY를 내 키로 바꾸면 아래 명령을 그대로 실행할 수 있습니다.
1단계 · 제출(작업 ID를 바로 돌려줍니다, HTTP 202)
curl https://kovapi.com/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "seedance-2.5-30s", "prompt": "가을 골짜기의 작은 마을을 새벽부터 해 질 녘까지 걸어서 지나가는 여행자, 내내 뒤따르는 카메라", "duration": 25, "resolution": "720P", "size": "16:9"}'응답(HTTP 202)
{
"id": "img_5c2e8f1a9b3d7e6f0a4c8b2d",
"object": "video.generation.job",
"status": "queued",
"created": 1791281400,
"model": "seedance-2.5-30s"
}2단계 · status가 succeeded 또는 failed가 될 때까지 5~10초마다 조회
curl https://kovapi.com/v1/videos/jobs/img_5c2e8f1a9b3d7e6f0a4c8b2d \ -H "Authorization: Bearer YOUR_API_KEY"
성공했을 때의 응답
{
"id": "img_5c2e8f1a9b3d7e6f0a4c8b2d",
"object": "video.generation.job",
"status": "succeeded",
"created": 1791281400,
"model": "seedance-2.5-30s",
"data": [
{"url": "https://img.kovapi.com/i/8c1f0e5d2b7a49e3a6d0c4f1b9e2a7d5.mp4"}
],
"usage": {"clips": 1, "model": "seedance-2.5-30s"}
}3단계 · data[0].url이 결과 영상(MP4)입니다. 15일 동안 보관되므로 더 오래 쓰려면 내 저장소에 내려받아 두세요.
전체 예제(Python: 제출 → 대기 → 로컬에 저장)
import time
import requests
BASE = "https://kovapi.com/v1"
HEADERS = {"Authorization": "Bearer YOUR_API_KEY"}
# 1. 제출
job = requests.post(f"{BASE}/videos/generations", headers=HEADERS, json={
"model": "seedance-2.5-30s",
"prompt": "가을 골짜기의 작은 마을을 새벽부터 해 질 녘까지 걸어서 지나가는 여행자, 내내 뒤따르는 카메라",
"duration": 25,
"resolution": "720P",
"size": "16:9",
}).json()
if "error" in job:
raise SystemExit(job["error"]["message"])
# 2. 10초마다 조회, 최대 1시간까지 대기
deadline = time.time() + 3600
while job["status"] not in ("succeeded", "failed") and time.time() < deadline:
time.sleep(10)
job = requests.get(f"{BASE}/videos/jobs/{job['id']}", headers=HEADERS).json()
# 3. 영상 내려받기
if job["status"] == "succeeded":
url = job["data"][0]["url"]
with open("seedance-2.5-30s.mp4", "wb") as f:
f.write(requests.get(url).content)
print("saved", url)
elif job["status"] == "failed":
print("failed:", job["error"]["code"], job["error"]["message"])
else:
print("still", job["status"], job["id"])대기 중일 때는 조회 결과에 queue_position(앞에 있는 작업 수)과 eta_seconds(예상 대기 시간)도 함께 옵니다. 프로그램에 정해 둔 대기 시간을 넘겨도 다시 제출하지 마세요. 작업은 그대로 남아 있으니 나중에 같은 작업 ID로 이어서 조회하면 됩니다.
인증
Authorization: Bearer YOUR_API_KEY Content-Type: application/json
콘솔에서 API 키를 만들면 시작할 수 있습니다.
사양 한눈에 보기
| 길이 | 4–30초 |
| 해상도 | 720P |
| 화면 비율 | 16:9 / 9:16 |
| 참조 이미지 | 최대 30장 · 참조로 사용(인물, 장면, 스타일), 프레임으로는 쓰지 않음 |
| 참조 영상 | 지원하지 않음 |
| 참조 오디오 | 최대 10개 |
| 소리 | 항상 포함, 끌 수 없음(audio: false는 거절됨) |
| 과금 방식 | 클립 단위: 길이와 관계없이 같은 가격 |
요청 파라미터
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
| model | string | 예 | 모델 ID. 여기서는 seedance-2.5-30s입니다. |
| prompt | string | 예 | 내용, 카메라, 동작을 설명하세요。 |
| duration | integer | 아니오 | 길이(초). 4~30 사이의 정수이며 기본값은 30, 즉 가장 긴 값입니다. 건당 과금이라 길이가 가격을 바꾸지 않습니다. seconds로도 쓸 수 있습니다. |
| resolution | string | 아니오 | 720P |
| size | string | 아니오 | 화면 비율: 16:9 / 9:16(기본값 16:9). aspect_ratio로도 쓸 수 있습니다. 이 모델은 21:9를 지원하지 않습니다. |
| image | string | 아니오 | Image-to-video: include a reference image (public URL, data: URI or base64); omit for text-to-video. |
| images | array | 아니오 | 참조 이미지 여러 장. 최대 30장입니다. 상한을 넘으면 잘라내지 않고 거절합니다. reference_images로도 쓸 수 있습니다. |
| audio_reference | string / array | 아니오 | 공개 HTTPS URL 또는 배열, 최대 10개. 참조 이미지가 1장 이상 필요합니다. MP3/WAV/M4A, 파일당 15MB 및 30초 이하. 참조 오디오가 있으면 $3(600크레딧). |
| audio | boolean | 아니오 | 결과 영상에는 항상 소리가 포함되며 끌 수 없습니다. false를 보내면 거절되므로(400) 생략하세요. |
| callback_url | string | 아니오 | 작업이 끝나면 결과를 보낼 주소. 아래 웹훅 부분을 보세요. |
| n | integer | 아니오 | 작업 하나는 영상 1개를 만들므로 넣지 않아도 됩니다. 1보다 큰 값을 넣어도 영상은 1개만 나오지만, 제출할 때 n개 분의 크레딧이 예약되고 초과분은 작업이 끝날 때 돌아옵니다. |
가격
기간 한정 · 건당 과금
| 클립당 크레딧 | 클립당 가격(USD) | |
|---|---|---|
| 참조 오디오 없음 | 400 | $2.00 |
| 참조 오디오 있음 | 600 | $3.00 |
4–30초 정수, 720P, 16:9 또는 9:16. 참조 이미지 최대 30장, 참조 오디오 최대 10개. 참조 영상은 지원하지 않습니다. 참조 오디오 없으면 건당 $2(400크레딧), 있으면 $3(600크레딧)이며 길이에 관계없이 동일합니다. 생성된 사운드트랙은 참조 오디오가 아닙니다. 기간 한정으로 장기 공급을 보장하지 않습니다. 대기 시간은 혼잡도에 따라 달라집니다. 다시 제출하지 말고 원래 작업을 조회하세요. 실패 시 전액 환불됩니다.
참조 소재
4–30초 정수, 720P, 16:9 또는 9:16. 참조 이미지 최대 30장, 참조 오디오 최대 10개. 참조 영상은 지원하지 않습니다. 참조 오디오 없으면 건당 $2(400크레딧), 있으면 $3(600크레딧)이며 길이에 관계없이 동일합니다. 생성된 사운드트랙은 참조 오디오가 아닙니다. 기간 한정으로 장기 공급을 보장하지 않습니다. 대기 시간은 혼잡도에 따라 달라집니다. 다시 제출하지 말고 원래 작업을 조회하세요. 실패 시 전액 환불됩니다.
참조 이미지는 최대 30장이며 인물, 장면, 스타일을 정하고 프레임으로는 쓰이지 않습니다. 프롬프트에서 @Image1, @Image2로 지칭하세요.
실제 인물의 얼굴도 가릴 필요 없이 참조 이미지로 사용할 수 있습니다. 이미지 속 인물의 초상을 사용할 권리가 있는지 반드시 확인해 주세요.
{
"model": "seedance-2.5-30s",
"prompt": "Follow @Image1 and use @Audio1 as the soundtrack",
"duration": 25, "resolution": "720P", "size": "16:9",
"images": ["https://example.com/reference.png"],
"audio_reference": ["https://example.com/reference.mp3"]
}콘텐츠 요건
Seedance의 모든 작업은 콘텐츠 심사를 거칩니다. 대상은 프롬프트, 참조 소재, 생성된 영상이며 화면과 소리를 모두 심사합니다. 심사를 통과하지 못한 작업은 content_policy로 실패하며 과금되지 않습니다.
심사 시점
제출할 때 프롬프트와 참조 소재를 먼저 심사하고, 영상이 생성된 뒤 화면과 소리를 다시 심사합니다. 그래서 거절 결과는 제출 후 몇 초 만에 올 수도 있고 렌더링이 끝난 뒤에야 올 수도 있습니다(30분 넘게 걸릴 수도 있습니다). status가 failed, error.code가 content_policy로 끝난 작업은 심사에서 거절된 것입니다. Webhook을 쓰면 video.failed 이벤트가 전달됩니다.
과금 없음
거절된 작업은 과금되지 않습니다. 제출할 때 보류한 금액은 작업이 끝날 때 전액 환불되며, 호출 로그에도 과금되지 않은 것으로 표시됩니다.
소리
소리(대사, 내레이션, 노래, 효과음)는 모델이 프롬프트에 따라 생성하며 화면과 함께 심사합니다. 프롬프트에 쓴 대사, 내레이션, 가사는 실제로 읽히거나 노래로 불립니다. 목소리가 필요 없는 영상이라면 프롬프트에 대사와 가사를 쓰지 마세요. 이 모델은 항상 소리가 포함되며 끌 수 없습니다. 업로드한 참조 오디오도 심사하며, 저작권이 있는 음악을 참조 오디오로 쓰면 거절될 수 있습니다.
자주 거절되는 내용
- 성적 내용, 노출, 성적 암시(AI로 생성하거나 합성한 이미지 포함)
- 유혈, 잔혹한 묘사, 자해, 총상과 출혈 같은 폭력적 부상
- 총기, 폭발물, 마약
- 미성년자를 성적으로 다루는 내용은 일절 불가하며, 미성년자와 술·담배·마약·위험한 행동이 함께 나오는 장면도 거절됩니다
- 정치인, 연예인, 운동선수, 기업인 등 공인의 외모나 목소리(닮은 인물 포함)
- 저작권이 있는 캐릭터와 IP(디즈니, 마블 캐릭터 등)
- 혐오·차별 콘텐츠와 가짜 뉴스
긴 스토리보드 대본
위반 장면이 하나라도 있으면 영상 전체가 거절되며, 긴 스토리보드 대본에서 특히 자주 일어납니다. 액션 장면의 총격전이나 출혈 클로즈업, 미성년자가 술을 마시거나 담배를 피우는 장면이 있으면 전체가 실패합니다. 제출 전에 대본을 끝까지 읽고 이런 장면을 삭제하거나 고쳐 쓰세요.
실존 인물
실존 인물의 사진을 참조로 쓰려면 그 사람의 초상을 사용할 권리가 있어야 합니다. 모델별로 실존 인물 참조 이미지를 지원하는지는 이 페이지 위쪽에 적혀 있습니다.
거절된 뒤
같은 내용으로 다시 제출해도 다시 거절됩니다. 문제가 될 만한 부분을 찾아 프롬프트를 고쳐 쓰거나 참조 소재를 바꾼 뒤 다시 제출하세요.
오류 코드: content_policy · status: failed
upstream_line_unavailable: 생성 서비스가 과부하 상태이거나 가용 리소스가 소진되면 upstream_line_unavailable을 반환합니다. 실패 작업은 과금되지 않으며 예약 크레딧은 반환됩니다. 잠시 후 다시 시도해 주세요. 이 오류는 특정 매개변수나 자료의 문제를 지적하지 않습니다. 명확한 길이 제한, 참조 읽기 실패, 심사 거절은 각각 duration_rejected, reference_unreadable, content_policy를 유지하므로 해당 안내를 따라 주세요.
작업 상태와 응답 필드
GET /v1/videos/jobs/{id}는 아래 상태를 돌려줍니다. 각 필드의 설명은 비동기 작업에 있습니다. 5~10초마다 조회하거나, 아래의 웹훅으로 결과를 받으세요. 조회는 무료이며, 같은 계정의 어느 키로든 조회할 수 있습니다.
| 상태 | 의미 |
|---|---|
| queued | 대기 중. queue_position(앞에 있는 작업 수)과 eta_seconds(예상 대기 시간)가 함께 옵니다. |
| processing | 생성 중. |
| succeeded | 완료. 결과는 data[0].url, 과금 내역은 usage에 있습니다. |
| failed | 실패. 사유는 error에 있고, 예약된 크레딧은 전액 환불됩니다. |
processing이queued로 돌아갈 때가 있습니다. 예를 들어 서비스가 붐빌 때, 완성된 영상을 다시 가져오는 중일 때, 서비스가 재시작된 뒤입니다. 작업을 끝내지 못하면 게이트웨이가 자동으로 다시 만들 수 있습니다. 몇 번을 재시도하든 작업 하나에 한 번만 과금됩니다.- 한 계정은 최대 50개 작업을 동시에 생성하며, 그보다 많은 작업은 제출 순서대로 대기합니다. 15분이 지나도 시작되지 않은 작업은 자동으로 실패 처리되고 전액 환불됩니다. 작업 기록은 3일, 영상 링크는 15일 동안 보관됩니다.
생성 시간
4–30초 정수, 720P, 16:9 또는 9:16. 참조 이미지 최대 30장, 참조 오디오 최대 10개. 참조 영상은 지원하지 않습니다. 참조 오디오 없으면 건당 $2(400크레딧), 있으면 $3(600크레딧)이며 길이에 관계없이 동일합니다. 생성된 사운드트랙은 참조 오디오가 아닙니다. 기간 한정으로 장기 공급을 보장하지 않습니다. 대기 시간은 혼잡도에 따라 달라집니다. 다시 제출하지 말고 원래 작업을 조회하세요. 실패 시 전액 환불됩니다.
오류와 환불
제출 단계의 오류는 HTTP 4xx / 5xx로 바로 돌아오며, 작업은 만들어지지 않고 과금되지 않습니다. 작업이 접수된 뒤의 실패는 작업 조회 결과로 알려 주며, 예약된 크레딧은 전액 환불됩니다. 전체 코드는 오류 코드에 있습니다.
제출할 때 돌아오는 오류
| HTTP | code | 원인 | 조치 |
|---|---|---|---|
| 400 | invalid_request | 파라미터가 올바르지 않습니다. 길이, 해상도, 화면 비율 또는 참조 소재 수가 이 모델의 허용 범위를 벗어났거나, 프롬프트가 너무 길거나, 참조 이미지나 참조 영상을 읽을 수 없거나, 항상 소리가 포함되는 모델에 audio: false를 보낸 경우 등입니다. 구체적인 원인은 message에 적혀 있습니다. | message에 적힌 대로 고친 뒤 다시 제출하세요. |
| 400 | invalid_callback_url | callback_url이 공개된 http(s) 주소가 아니거나 2000자를 넘습니다. | 인터넷에서 접근할 수 있는 주소를 쓰세요. |
| 400 | model_not_found | 모델 ID의 철자가 틀렸거나, model이 없거나, 이 엔드포인트에서 쓸 수 없는 모델입니다(예: 이미지 엔드포인트에 채팅 모델을 지정한 경우). | GET /v1/models 또는 API 레퍼런스에 있는 모델 ID를 쓰세요. |
| 401 | invalid_api_key | 키가 없거나, 삭제되었거나, 비활성화되었습니다. 계정이 비활성화된 경우에도 나옵니다. | 콘솔의 「API Keys」 페이지에서 이 키를 확인하세요. |
| 402 | insufficient_quota | 이 요청의 크레딧을 예약하기에 잔액이 부족합니다. 게이트웨이는 요청에 들 수 있는 최대 비용을 먼저 예약하므로, 동시 호출이 몰릴 때도 이 오류가 날 수 있습니다. | 동시 호출이 몰린 경우라면 몇 초 기다린 뒤 다시 시도하고, 그렇지 않으면 충전하세요. |
| 429 | rate_limit_exceeded | 이 키에 설정한 분당 요청 수를 넘었습니다(최근 60초 기준). Retry-After 헤더는 붙지 않습니다. | 몇 초 기다린 뒤 다시 시도하거나, 콘솔에서 이 키의 한도를 올리세요. |
| 503 | model_maintenance | 모델이 점검 중이라 요청을 받지 않습니다. 점검 중에는 다른 모델이 대신 답변하지도 않습니다. | 점검이 끝나면 다시 시도하세요. 진행 상황은 서비스 상태에서 볼 수 있습니다. |
| 503 | service_unavailable | 참조 소재 저장 실패처럼 당사 측에서 일시적인 오류가 났습니다. 작업은 만들어지지 않았고 과금되지도 않았습니다. | 잠시 후 다시 시도하세요. |
작업 실패(status가 failed)
| code | 언제 나오나요 | 조치 |
|---|---|---|
| content_policy | 영상: 프롬프트, 참조 소재, 또는 생성된 화면이나 소리가 콘텐츠 심사를 통과하지 못했습니다(소리가 걸렸으면 param이 audio입니다). Wan Standard 및 Prime: 입력 소재가 심사를 통과하지 못했습니다. error.reason은 FaceDetectionSuspect(실제 사람 얼굴 의심) 또는 DataInspectionFailed(입력 콘텐츠 심사 실패)입니다. error.message에 원인과 조정 방법이 표시됩니다. 실패한 작업은 과금되지 않습니다. | 프롬프트를 고쳐 쓰거나 참조 소재를 바꾼 뒤 다시 제출하세요. 같은 입력은 다시 거부됩니다. |
| duration_rejected | 영상: 길이가 받아들여지지 않았습니다. 대부분 참조 오디오나 참조 영상이 상한을 넘은 경우이며, 1초가 안 되게 넘어도 마찬가지입니다. | 참조 오디오나 참조 영상을 상한 이내로 잘라서 다시 제출하세요. 같은 입력은 다시 실패합니다. |
| reference_unreadable | 영상: 모델이 참조 이미지, 영상 또는 오디오를 내려받지 못했습니다. 대부분 YouTube나 클라우드 드라이브 공유 페이지 같은 웹 페이지 링크인 경우입니다. | 파일을 바로 내려받을 수 있는 링크로 바꾸거나 Playground에서 파일을 업로드하세요. 같은 입력은 다시 실패합니다. |
| invalid_video_request | 제출 시 파라미터나 참조 소재가 받아들여지지 않아 생성이 시작되지 않았습니다. | 길이, 화면 비율, 참조 소재를 확인한 뒤 다시 제출하세요. 요금은 청구되지 않습니다. |
| special_failed | 생성에 실패해 영상이 만들어지지 않았습니다. | 요금은 청구되지 않습니다. 그대로 다시 제출할 수 있습니다. |
| special_unknown | 제출이 접수되었는지 명확한 응답이 없었습니다. 중복 생성을 막기 위해 다시 제출하지 않았습니다. | 요금은 청구되지 않습니다. 다시 제출할 수 있습니다. |
| special_fetch | 영상은 생성됐지만 파일을 여러 번 가져오지 못했습니다. | 요금은 청구되지 않습니다. 다시 제출해 주세요. |
| special_unavailable | 이 요금제를 쓸 수 없었거나 120분 안에 생성이 시작되지 않았습니다. | 요금은 청구되지 않습니다. 잠시 후 다시 시도해 주세요. |
message의 문구가 아니라 code로 판단하세요. 모르는 code가 오거나 code가 없으면 upstream_error로 처리하면 됩니다. 다시 제출하면 대개 성공합니다. 실패한 작업은 모두 전액 환불됩니다.
조회 대신 웹훅으로 받기
제출할 때 callback_url을 넣으면 작업이 끝나는 즉시(성공이든 실패든) 게이트웨이가 조회 엔드포인트와 똑같은 결과를 그 URL로 보냅니다. 서명이 포함되며, 전송에 실패하면 자동으로 재시도합니다. 콘솔의 「설정 → 웹훅」에서 계정 전체에 쓸 주소를 지정할 수도 있습니다. 웹훅 문서 →
curl https://kovapi.com/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "seedance-2.5-30s", "prompt": "가을 골짜기의 작은 마을을 새벽부터 해 질 녘까지 걸어서 지나가는 여행자, 내내 뒤따르는 카메라", "duration": 25, "resolution": "720P", "size": "16:9", "callback_url": "https://your-domain.com/webhook"}'