AI 동영상 생성
Videos API로 텍스트와 이미지에서 동영상을 만들고 진행 상황을 확인하여 MP4를 다운로드합니다.
문서 개요로 돌아가기연결 및 인증
Base URL: https://apivn.dev/v1
Authorization: Bearer $STALI_API_KEY
STALI_API_KEY 환경 변수를 설정하세요. GET /v1/models로 동영상 생성 없이 인증을 확인합니다.
read -r -s -p "STALI_API_KEY: " STALI_API_KEY
export STALI_API_KEY
printf '\n'
curl -fsS https://apivn.dev/v1/models -H "Authorization: Bearer ${STALI_API_KEY:?STALI_API_KEY}"cURL 명령은 Bash용입니다. Windows에서는 PowerShell로 키를 설정하고 예제 미디어 URL을 공급자가 접근할 수 있는 파일로 바꾸세요.
동영상 생성에는 요금이 부과됩니다. 성공 응답의 id를 저장하여 같은 작업을 추적하세요.
id 발급 후 작업이 실패하면 환불은 공급자 결과와 대사에 따라 처리됩니다. failed 상태만으로 즉시 환불을 의미하지 않습니다.
조회, 다운로드, 취소는 새 생성 작업을 만들지 않습니다. 취소 성공이 기록된 요금의 자동 환불을 보장하지는 않습니다.
모델 및 기능
| 모델 | 길이(초) | 동영상당 요금 | 최대 참조 이미지 | 화면 비율 | 해상도 |
|---|---|---|---|---|---|
apivn/seedance-2.5 | 5 / 8 / 10 / 12 / 15 / 30 | $0.3182 / $0.4205 / $0.4886 / $0.5795 / $0.7159 / $1.06 | 0–9 | 16:9, 9:16, 1:1, 4:3, 3:4, 21:9, auto | 720p / 1080p |
seedance-2.5-30s | 30 고정 | $2.27 | 1–9 | 16:9, 9:16, 1:1, 4:3, 3:4 | 720p |
seedance-2.5-10s | 10 고정 | $1.36 | 1–9 | 16:9, 9:16, 1:1, 4:3, 3:4 | 720p |
seedance-2.5 | 5 / 10 / 15 / 20–30 | $0.1909 / $0.2932 / $0.4295 / $0.6341 | 1–10 | 16:9, 9:16, 1:1, 4:3, 3:4 | 720p |
seedance-2.0-fast | 5 / 10 / 15 | $0.15 / $0.2523 / $0.3886 | 1–10 | 16:9, 9:16, 1:1, 4:3, 3:4 | 720p |
veo-3.1 | 4 / 6 / 8 | $0.1136 / $0.1136 / $0.1136 | 1–3 | 16:9, 9:16 | — |
google-omni-flash | 5 / 10 | $0.15 / $0.15 | 1–3 | 16:9, 9:16 | 720p |
seedance-2.5-10s 및 seedance-2.5-30s는 이름에 표시된 길이로 고정되며 seconds 값으로 변경되지 않습니다.
이미지, 크기, 해상도 지원은 공급자 경로에 따라 달라집니다. 모든 매개변수가 모든 모델에 적용되지는 않습니다.
seedance-2.5는 5, 10, 15 또는 20–30 범위의 초 값을 받으며, 이 구간을 벗어난 값은 거부됩니다. 20–30 구간에서는 시스템이 가장 가까운 20, 25, 30 기준으로 환산할 수 있습니다. apivn/seedance-2.5는 정확히 5, 8, 10, 12, 15 또는 30만 받습니다. 응답의 seconds를 확인하고, 프롬프트만으로 길이를 추론하지 마세요.
엔드포인트 및 매개변수
POST /v1/videos — 작업 생성
application/json을 전송하세요. 이 엔드포인트는 multipart/form-data를 받지 않습니다. 모델이 지원하는 URL 또는 이미지 JSON을 사용하세요.
| 매개변수 | 필수 여부 | 사용법 |
|---|---|---|
model | 필수 | 등록된 동영상 모델 ID를 명시하세요. 기본 모델에 의존하지 마세요. |
prompt | 필수 | 주제, 배경, 동작, 카메라 움직임을 설명하세요. |
seconds | 선택 | 모델 표를 따릅니다. seedance-2.5는 기본 5초, apivn/seedance-2.5는 기본 10초입니다. 고정 모델은 다른 seconds 값을 무시합니다. |
aspect_ratio | 선택 | 모델에 따라 16:9 또는 9:16을 지정합니다. apivn/seedance-2.5는 1:1, 4:3, 3:4, 21:9, auto도 가능합니다. size와 일치시켜 주세요. |
size | 선택 | 1280x720 또는 720x1280 등이며 허용 크기는 모델에 따라 다릅니다. |
images / input_reference | 선택 | 시작/참조 이미지를 URL/JSON으로 전달합니다. 전체 본문 한도는 20 MB이며 공급자의 이미지 제한도 적용됩니다. |
last_frame | 선택 | veo-3.1 또는 apivn/seedance-2.5(batch-frame)의 종료 프레임이며, 동일한 input_reference를 사용합니다. |
input_video | 선택 | google-omni-flash 동영상 변환용 원본 MP4 URL입니다. |
resolution | 선택 | apivn/seedance-2.5는 720p 또는 1080p를 지원합니다(기본 720p). 1080p는 초당 가격이 ×2로 계산됩니다. 다른 모델은 무시하거나 size에서 환산할 수 있습니다. |
generate_audio | 선택 | apivn/seedance-2.5: generate_audio(기본 true). reference_audios를 보낼 수 있습니다(최대 2개 URL). |
GET /v1/videos/{id} — 진행 상황
원래 모델을 ?model=로 전달하세요. 10초 간격으로 시작하고 429이면 간격을 늘리세요. 아래 JSON은 실제 결과가 아닌 예시입니다.
- queued: 접수되어 대기 중입니다.
- in_progress: 공급자가 처리 중입니다.
- completed: 결과를 다운로드할 수 있습니다.
- failed: error를 확인하고 지원을 위해 id를 보관하세요.
{
"id": "video_abc123",
"object": "video",
"model": "apivn/seedance-2.5",
"status": "completed",
"progress": 100,
"seconds": "10",
"size": "1280x720",
"error": null
}GET /v1/videos/{id}/content — MP4 다운로드
completed 이후 같은 API 키와 ?model=로 요청하고 바이너리 응답을 .mp4로 저장하세요.
DELETE /v1/videos/{id} — 취소 요청
취소는 라우트와 작업 상태에 따라 달라집니다. 일부 라우트는 현재 DELETE를 지원하지 않습니다. 취소 명령을 환불 보장으로 간주하지 마세요.
길이별 요금
표시 요금은 이 사이트의 현재 설정과 해당 가격 조정을 반영합니다. 생성 전에 확인하세요.
| 모델 | 길이(초) | 동영상당 요금 |
|---|---|---|
apivn/seedance-2.5 | 5 | $0.3182 |
apivn/seedance-2.5 | 8 | $0.4205 |
apivn/seedance-2.5 | 10 | $0.4886 |
apivn/seedance-2.5 | 12 | $0.5795 |
apivn/seedance-2.5 | 15 | $0.7159 |
apivn/seedance-2.5 | 30 | $1.06 |
seedance-2.5-30s | 30 | $2.27 |
seedance-2.5-10s | 10 | $1.36 |
seedance-2.5 | 5 | $0.1909 |
seedance-2.5 | 10 | $0.2932 |
seedance-2.5 | 15 | $0.4295 |
seedance-2.5 | 30 | $0.6341 |
seedance-2.0-fast | 5 | $0.15 |
seedance-2.0-fast | 10 | $0.2523 |
seedance-2.0-fast | 15 | $0.3886 |
veo-3.1 | 4 | $0.1136 |
veo-3.1 | 6 | $0.1136 |
veo-3.1 | 8 | $0.1136 |
google-omni-flash | 5 | $0.15 |
google-omni-flash | 10 | $0.15 |
Seedance 2.5: 20–30초 구간은 동일한 가격이며, 표에는 30초 기준이 표시됩니다. apivn/seedance-2.5는 5/8/10/12/15/30 각 구간별로 별도 계산됩니다(표 = 720p, 1080p = ×2). 고정 모델 가격과 시간 기반 가격은 시스템의 서로 다른 두 계산 방식을 따릅니다.
전체 요금 보기통합 예제
각 POST는 유료 동영상을 생성합니다. 하나의 예제를 선택하고 example.com 미디어 URL은 실행 전에 바꾸세요.
import os
import time
from getpass import getpass
from urllib.parse import quote
import requests
from requests.adapters import HTTPAdapter
api_key = os.getenv("STALI_API_KEY") or getpass("STALI_API_KEY: ")
headers = {"Authorization": f"Bearer {api_key}"}
model = "apivn/seedance-2.5"
http = requests.Session()
http.mount("https://", HTTPAdapter(max_retries=0))
created = http.post("https://apivn.dev/v1/videos", headers=headers, json={
"model": model, "prompt": "Cinematic sunset over ocean waves",
"seconds": 10, "aspect_ratio": "16:9", "resolution": "720p",
"generate_audio": True,
}, timeout=(10, 120))
created.raise_for_status()
video = created.json()
video_id = video["id"]
print(video_id, video.get("status"), flush=True)
job_url = "https://apivn.dev/v1/videos/" + quote(video_id, safe="")
for _ in range(120):
if video.get("status") in ("completed", "failed"):
break
time.sleep(10)
progress = http.get(job_url, headers=headers, params={"model": model}, timeout=(10, 60))
progress.raise_for_status()
video = progress.json()
print(video_id, video.get("status"), flush=True)
if video.get("status") != "completed":
raise RuntimeError(str(video))
content = http.get(job_url + "/content", headers=headers, params={"model": model}, stream=True, timeout=(10, 120))
content.raise_for_status()
with open("video.mp4", "wb") as output:
for chunk in content.iter_content(chunk_size=65536):
if chunk:
output.write(chunk)오류 처리
| HTTP | 원인 | 조치 |
|---|---|---|
| 400 | 잘못된 매개변수 또는 미지원 취소입니다. | JSON, seconds, 이미지 및 모델 지원을 확인하세요. |
| 401 | 키가 없거나 유효하지 않습니다. | 인증 헤더와 활성 키를 확인하세요. |
| 402 | HTTP 402: error.type, 사용 가능한 잔액, 키 한도 또는 이전 요청의 미정산 금액을 확인하세요. | error.type을 확인하세요. insufficient_balance → 사용 가능한 잔액 확인, api_key_monthly_limit → Dashboard → Keys에서 한도 확인 또는 조정, outstanding_undercharge → 이전 요청의 미정산 금액 대사. /docs/reference/errors를 참고하세요. |
| 403 | 요청 권한이 없습니다. | 키 권한, 모델 및 콘텐츠 정책을 확인하세요. |
| 404 | 현재 경로에 모델 또는 작업이 없습니다. | 생성 시의 id, 키 및 ?model=를 사용하세요. |
| 409 | 이 작업을 수행할 준비가 되지 않았습니다. | 계속 조회하고 completed 이후 다운로드하세요. |
| 413 | 요청 본문이 한도를 초과했습니다. | 본문을 줄이고 큰 내장 미디어 대신 URL을 사용하세요. |
| 429 | 요청 빈도 또는 동시 작업 한도 초과입니다. | 대기 시간을 늘리고 동시 작업을 줄이세요. |
| 502 | 공급자 경로 응답 오류입니다. | 요청 ID를 보관하고 POST를 자동 재전송하지 마세요. |
시간 초과나 네트워크 오류 후 POST를 자동 재전송하지 마세요. 이미 접수되었을 수 있습니다. id가 있으면 조회하고 없으면 요청 ID를 보관하여 사용 내역이나 지원팀에 확인하세요.
프롬프트 설계
아래 내용은 창작 지침이며 모든 세부 사항의 재현을 보장하지 않습니다. 각 모델의 콘텐츠 정책이 적용됩니다.
명확한 프롬프트 작성
- 효과보다 주제, 배경, 주요 동작을 먼저 정하세요.
- 길이는 프롬프트뿐 아니라 seconds로 지정하세요.
- 장면 간 좌우 위치와 의상을 일관되게 유지하세요.
- 장면마다 명확한 카메라 움직임 하나를 우선하세요.
- 광원, 색상, 재질을 구체적으로 설명하세요.
- 작은 글자, 로고, 정확한 숫자 표현은 피하세요.
- 짧은 장면으로 시작하고 결과 확인 후 하나씩 조정하세요.
참조 이미지 구성
- 전송 순서대로 Image 1, Image 2…를 지정하세요.
- 각 이미지가 인물, 의상, 배경 중 무엇인지 명시하세요.
- 사용 권한이 있고 선명하며 시각적 방향이 일관된 이미지를 사용하세요.
- 자연스러운 움직임을 위해 첫/마지막 프레임의 인물과 구도를 맞추세요.
- 모델 이미지 한도를 지키세요. 참조가 완벽한 재현을 보장하지는 않습니다.
프롬프트 템플릿
确认生成。参数已确定:16:9 横屏,三个连续镜头组成一个完整视频,立即生成,无需再次确认或提问。
The reference images are colored-pencil character design sketches: use them only for design and outfits. Render the video as a photoreal 3D CG game cinematic with dramatic lighting.
Image 1 = PROTAGONIST: [character design].
Image 2 = ANTAGONIST: [opponent design].
Image 3 = ENVIRONMENT: [setting].
FIXED LAYOUT: altar in the background CENTER; protagonist on the LEFT; antagonist on the RIGHT. Nobody disappears, teleports or swaps sides.
LIGHTING: torchlight from the left wall, cool moonlight from the ceiling.
Action: well-choreographed, orbiting camera. No blood, no wounds, no gore.
Sound: heavy impacts, wind, no dialogue.
镜头1: camera pushes in, protagonist draws a weapon, antagonist raises claws.
镜头2: fast exchange, camera orbits.
镜头3: climax, both stay on their sides, protagonist lands ready.
Keep faces and outfits consistent. No text, no numbers, no subtitles, no watermark.동작이 누락되면 템플릿을 줄이세요. API 매개변수를 문장으로 대체하지 마세요.
노골적 묘사 없는 액션
| 노골적인 묘사 피하기 | 더 안전한 시각적 방향 |
|---|---|
| blood, wound, gore, corpse | sparks, black smoke, torn fabric only |
| 핏물 웅덩이 | murky grey mist, dark viscous puddle |
| 상처를 입히는 공격 | glowing wisps of spirit-light, shadowy aura |
| 피부의 베인 상처 | tearing only the fabric of the sleeve, no blood |
여러 장면 구성
- 이야기를 시작과 끝이 명확한 장면으로 나누세요.
- 인물 설명, 조명, 참조를 동일하게 유지하세요.
- 다음 장면 생성 전에 각 장면을 다운로드하고 확인하세요.
- 편집 도구로 연결하세요. 각 POST는 별도 유료 작업입니다.
결과가 의도와 다를 때
- 동작 누락: 한 장면의 사건 수를 줄이세요.
- 위치 뒤바뀜: 좌우 위치와 고정 구도를 명시하세요.
- 일관성 부족: 참조와 식별 특징을 재사용하세요.
- 길이 오류: seconds와 고정 길이 모델을 확인하세요.
- 거부: error와 콘텐츠 정책을 확인하고 같은 요청을 반복하지 마세요.
프레임 격자로 동작 확인
ffmpeg -i clip.mp4 -vf "fps=1,scale=320:-1,tile=6x5" -frames:v 1 frame_grid.pngffmpeg 명령은 로컬 clip.mp4로 프레임 격자를 만들며 API를 호출하지 않습니다. ffmpeg를 먼저 설치하세요.
실행 전 확인
- 올바른 모델 ID와 지원 길이를 선택하세요.
- 생성 전에 요금과 잔액을 확인하세요.
- 키는 서버에 보관하고 공개 브라우저 코드에 넣지 마세요.
- JSON과 공급자가 접근할 수 있는 미디어 URL을 사용하세요.
- 추적을 위해 id, model, 요청 ID를 저장하세요.
- 같은 id를 ?model=로 조회하고 제한 시 간격을 늘리세요.
- completed 이후 다운로드하고 MP4를 확인하세요.
- 접수 여부가 불확실하면 자동으로 재생성하지 마세요.
- 사용 내역에서 오류와 비용을 확인하고 필요하면 지원팀에 id를 보내세요.

