Seedance 2.0 API: 완벽한 연동 가이드 (2026)

2월 11, 2026

Seedance 2.0 API는 ByteDance의 AI 영상 생성 모델에 대한 프로그래밍 방식의 접근을 제공합니다. 이 가이드에서는 인증부터 비동기 폴링, 웹훅 기반 아키텍처까지 개발자가 Seedance를 애플리케이션과 프로덕션 워크플로우에 연동하는 데 필요한 모든 것을 다룹니다.

API 개요

Seedance 2.0 REST API는 텍스트-투-비디오 생성, 이미지-투-비디오 생성, 상태 폴링, 결과 조회를 위한 엔드포인트를 제공합니다. 모든 생성은 비동기 방식입니다: 요청을 제출하면 태스크 ID를 받고, 폴링하거나 웹훅으로 결과를 받습니다.

기능엔드포인트메서드
텍스트-투-비디오/v2/generate/textPOST
이미지-투-비디오/v2/generate/imagePOST
상태 확인/v2/tasks/{task_id}GET
결과 다운로드/v2/tasks/{task_id}/resultGET
웹훅 설정/v2/webhooksPOST
계정 정보/v2/accountGET

베이스 URL: https://api.seedance.ai

응답 형식: 모든 엔드포인트는 status, data, error 필드를 포함하는 일관된 구조의 JSON을 반환합니다.

빠른 시작 (5분)

세 단계로 첫 번째 생성 영상을 얻으세요.

1단계: API 키 발급. Dreamina 개발자 포털에서 계정을 만들고 설정 > API Keys에서 키를 생성하세요.

2단계: 생성 요청 제출.

curl -X POST https://api.seedance.ai/v2/generate/text \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedance-2.0",
    "prompt": "A golden retriever running through a field of sunflowers at sunset, slow motion, cinematic lighting",
    "aspect_ratio": "16:9",
    "duration": 4
  }'

3단계: 결과 폴링.

curl https://api.seedance.ai/v2/tasks/TASK_ID \
  -H "Authorization: Bearer YOUR_API_KEY"

status"completed"를 반환하면 응답에 24시간 유효한 서명된 다운로드 링크가 포함된 video_url 필드가 포함됩니다.

인증

모든 API 요청에는 Authorization 헤더에 Bearer 토큰이 필요합니다. API 키는 계정 및 결제 플랜에 연동됩니다.

JavaScript

const SEEDANCE_API_KEY = process.env.SEEDANCE_API_KEY

const headers = {
  'Authorization': `Bearer ${SEEDANCE_API_KEY}`,
  'Content-Type': 'application/json',
}

Python

import os
import requests

SEEDANCE_API_KEY = os.environ["SEEDANCE_API_KEY"]

headers = {
    "Authorization": f"Bearer {SEEDANCE_API_KEY}",
    "Content-Type": "application/json",
}

cURL

curl -H "Authorization: Bearer $SEEDANCE_API_KEY" \
     -H "Content-Type: application/json" \
     https://api.seedance.ai/v2/account

보안 베스트 프랙티스:

  • API 키를 소스 코드가 아닌 환경 변수에 저장하세요
  • 개발자 대시보드에서 정기적으로 키를 순환하세요
  • 개발 환경과 프로덕션 환경에 별도의 키를 사용하세요
  • 무단 사용을 감지하기 위해 계정 대시보드에서 사용량을 모니터링하세요

텍스트-투-비디오 엔드포인트

텍스트 설명으로 영상을 생성합니다. 대부분의 사용 사례에서 주요 엔드포인트입니다.

요청 파라미터:

파라미터타입필수기본값설명
modelstring--모델 버전 (seedance-2.0)
promptstring--영상 설명 (30~500자)
negative_promptstring아니요--제외할 요소
aspect_ratiostring아니요16:916:9, 9:16, 1:1
durationinteger아니요44 또는 8
seedinteger아니요랜덤재현성 시드
webhook_urlstring아니요--완료 알림 URL

JavaScript 예시

async function generateTextToVideo(prompt) {
  const response = await fetch('https://api.seedance.ai/v2/generate/text', {
    method: 'POST',
    headers,
    body: JSON.stringify({
      model: 'seedance-2.0',
      prompt,
      aspect_ratio: '16:9',
      duration: 4,
    }),
  })

  const data = await response.json()

  if (!data.data?.task_id) {
    throw new Error(`Generation failed: ${data.error?.message ?? 'Unknown error'}`)
  }

  return data.data.task_id
}

Python 예시

def generate_text_to_video(prompt: str) -> str:
    response = requests.post(
        "https://api.seedance.ai/v2/generate/text",
        headers=headers,
        json={
            "model": "seedance-2.0",
            "prompt": prompt,
            "aspect_ratio": "16:9",
            "duration": 4,
        },
    )
    response.raise_for_status()
    data = response.json()

    task_id = data.get("data", {}).get("task_id")
    if not task_id:
        raise ValueError(f"Generation failed: {data.get('error', {}).get('message', 'Unknown')}")

    return task_id

효과적인 프롬프트 작성법은 50개 이상의 즉시 사용 가능한 템플릿이 포함된 Seedance 프롬프트 가이드를 참고하세요.

이미지-투-비디오 엔드포인트

모션 프롬프트로 정지 이미지를 애니메이션화합니다. 이미지가 시각적 시작점을 제공하고, 모션 프롬프트가 장면이 어떻게 움직여야 하는지를 설명합니다.

요청 파라미터:

파라미터타입필수설명
modelstringseedance-2.0
imagefile/URL소스 이미지 (JPEG/PNG, 최대 10MB)
motion_promptstring원하는 모션 설명
durationinteger아니요4 또는 8
seedinteger아니요재현성 시드
webhook_urlstring아니요완료 알림 URL

JavaScript 예시 (파일 업로드)

async function generateImageToVideo(imagePath, motionPrompt) {
  const imageBuffer = await fs.promises.readFile(imagePath)
  const blob = new Blob([imageBuffer], { type: 'image/png' })

  const formData = new FormData()
  formData.append('model', 'seedance-2.0')
  formData.append('image', blob, 'input.png')
  formData.append('motion_prompt', motionPrompt)
  formData.append('duration', '4')

  const response = await fetch('https://api.seedance.ai/v2/generate/image', {
    method: 'POST',
    headers: { 'Authorization': `Bearer ${SEEDANCE_API_KEY}` },
    body: formData,
  })

  const data = await response.json()
  return data.data.task_id
}

JavaScript 예시 (URL 참조)

async function generateImageToVideoFromUrl(imageUrl, motionPrompt) {
  const response = await fetch('https://api.seedance.ai/v2/generate/image', {
    method: 'POST',
    headers,
    body: JSON.stringify({
      model: 'seedance-2.0',
      image_url: imageUrl,
      motion_prompt: motionPrompt,
      duration: 4,
    }),
  })

  const data = await response.json()
  return data.data.task_id
}

Python 예시

def generate_image_to_video(image_path: str, motion_prompt: str) -> str:
    with open(image_path, "rb") as f:
        files = {"image": ("input.png", f, "image/png")}
        data = {
            "model": "seedance-2.0",
            "motion_prompt": motion_prompt,
            "duration": "4",
        }

        response = requests.post(
            "https://api.seedance.ai/v2/generate/image",
            headers={"Authorization": f"Bearer {SEEDANCE_API_KEY}"},
            files=files,
            data=data,
        )

    response.raise_for_status()
    return response.json()["data"]["task_id"]

비동기 생성 및 상태 폴링

Seedance API의 모든 생성은 비동기 방식입니다. 요청 제출 후 task_id를 받고 완료될 때까지 폴링해야 합니다. 일반적인 생성 시간은 길이와 서버 부하에 따라 30~120초입니다.

태스크 상태 값:

상태설명
pending요청 수신, 처리 대기 중
processing생성 진행 중
completed영상 다운로드 준비 완료
failed생성 실패 (error 필드 참고)

JavaScript 폴링 구현

async function pollForResult(taskId, maxAttempts = 60, intervalMs = 3000) {
  for (let attempt = 0; attempt < maxAttempts; attempt++) {
    const response = await fetch(
      `https://api.seedance.ai/v2/tasks/${taskId}`,
      { headers }
    )
    const data = await response.json()
    const status = data.data?.status

    if (status === 'completed') {
      return data.data.video_url
    }

    if (status === 'failed') {
      throw new Error(`Generation failed: ${data.data?.error ?? 'Unknown error'}`)
    }

    await new Promise((resolve) => setTimeout(resolve, intervalMs))
  }

  throw new Error('Generation timed out after maximum polling attempts')
}

Python 폴링 구현

import time

def poll_for_result(task_id: str, max_attempts: int = 60, interval: float = 3.0) -> str:
    for _ in range(max_attempts):
        response = requests.get(
            f"https://api.seedance.ai/v2/tasks/{task_id}",
            headers=headers,
        )
        response.raise_for_status()
        data = response.json()["data"]

        if data["status"] == "completed":
            return data["video_url"]

        if data["status"] == "failed":
            raise RuntimeError(f"Generation failed: {data.get('error', 'Unknown')}")

        time.sleep(interval)

    raise TimeoutError("Generation timed out")

폴링 베스트 프랙티스:

  • 처음 30초 동안은 3초 간격으로 시작
  • 30초 이후에는 5초 간격으로 증가
  • 최대 타임아웃을 3~5분으로 설정
  • 속도 제한 응답에 대해 지수 백오프 구현

웹훅 연동

웹훅은 생성 완료 시 서버에 알림을 푸시하여 폴링의 필요성을 제거합니다. 프로덕션 시스템에 권장되는 방식입니다.

웹훅 설정

// 웹훅 엔드포인트 등록
async function registerWebhook(url) {
  const response = await fetch('https://api.seedance.ai/v2/webhooks', {
    method: 'POST',
    headers,
    body: JSON.stringify({
      url,
      events: ['generation.completed', 'generation.failed'],
    }),
  })

  return response.json()
}

웹훅 페이로드

생성 완료 시 Seedance가 웹훅 URL로 POST 요청을 보냅니다:

{
  "event": "generation.completed",
  "task_id": "task_abc123",
  "status": "completed",
  "video_url": "https://cdn.seedance.ai/results/...",
  "duration": 4,
  "created_at": "2026-02-11T10:30:00Z",
  "completed_at": "2026-02-11T10:31:15Z"
}

Express.js 웹훅 핸들러

app.post('/webhooks/seedance', express.json(), (req, res) => {
  const { event, task_id, video_url, status } = req.body

  if (event === 'generation.completed') {
    // 완료된 영상 처리
    processCompletedVideo(task_id, video_url)
  }

  if (event === 'generation.failed') {
    // 실패 처리
    handleGenerationFailure(task_id)
  }

  res.status(200).json({ received: true })
})

웹훅 보안:

  • 웹훅 서명 헤더를 확인하여 Seedance에서 온 요청인지 검증
  • HTTPS 엔드포인트만 사용
  • 재시도를 방지하기 위해 5초 이내에 200 상태로 응답
  • 중복 전달 처리를 위한 멱등성 프로세싱 구현

에러 처리

Seedance API는 구조화된 에러 응답과 함께 표준 HTTP 상태 코드를 사용합니다. 프로덕션 신뢰성을 위해 적절한 에러 처리가 필수적입니다.

에러 응답 형식:

{
  "status": "error",
  "error": {
    "code": "RATE_LIMITED",
    "message": "Rate limit exceeded. Retry after 30 seconds.",
    "retry_after": 30
  }
}

주요 에러 코드:

HTTP 상태에러 코드설명조치
400INVALID_PARAMS잘못된 요청 파라미터요청 본문 수정
401UNAUTHORIZED유효하지 않거나 만료된 API 키키 확인/순환
403FORBIDDEN플랜이 해당 작업을 허용하지 않음플랜 업그레이드
429RATE_LIMITED동시 요청 초과대기 후 재시도
500INTERNAL_ERROR서버 측 오류백오프와 함께 재시도
503SERVICE_UNAVAILABLE일시적 유지보수지연 후 재시도

JavaScript 재시도 에러 처리

async function apiRequestWithRetry(url, options, maxRetries = 3) {
  for (let attempt = 0; attempt < maxRetries; attempt++) {
    const response = await fetch(url, options)

    if (response.ok) {
      return response.json()
    }

    if (response.status === 429) {
      const data = await response.json()
      const retryAfter = data.error?.retry_after ?? 30
      await new Promise((resolve) => setTimeout(resolve, retryAfter * 1000))
      continue
    }

    if (response.status >= 500) {
      const backoffMs = Math.pow(2, attempt) * 1000
      await new Promise((resolve) => setTimeout(resolve, backoffMs))
      continue
    }

    const errorData = await response.json()
    throw new Error(`API error ${response.status}: ${errorData.error?.message ?? 'Unknown'}`)
  }

  throw new Error('Maximum retries exceeded')
}

Python 재시도 에러 처리

def api_request_with_retry(method: str, url: str, max_retries: int = 3, **kwargs) -> dict:
    for attempt in range(max_retries):
        response = requests.request(method, url, headers=headers, **kwargs)

        if response.ok:
            return response.json()

        if response.status_code == 429:
            retry_after = response.json().get("error", {}).get("retry_after", 30)
            time.sleep(retry_after)
            continue

        if response.status_code >= 500:
            time.sleep(2 ** attempt)
            continue

        response.raise_for_status()

    raise RuntimeError("Maximum retries exceeded")

속도 제한 및 할당량

속도 제한은 플랜에 따라 다르며 일일 총량이 아닌 동시 요청에 적용됩니다.

플랜동시 요청요청/분일일 한도
Free2105회 생성
Pro1060100회 생성
Business50+맞춤형무제한

속도 제한 헤더: 모든 API 응답에 속도 제한 정보가 포함됩니다:

X-RateLimit-Limit: 10
X-RateLimit-Remaining: 7
X-RateLimit-Reset: 1707654321

피크 사용 시간에 한도를 초과하지 않도록 이 헤더를 모니터링하여 요청 속도를 사전에 관리하세요.

프로덕션 워크플로우 구축

대규모 영상 생성 프로덕션 시스템에서는 큐 기반 처리를 구현하여 동시성을 관리하고 실패를 적절히 처리하며 처리량을 최적화하세요.

배치 처리 패턴

async function processBatch(prompts) {
  const concurrencyLimit = 5
  const results = []

  for (let i = 0; i < prompts.length; i += concurrencyLimit) {
    const batch = prompts.slice(i, i + concurrencyLimit)

    const batchResults = await Promise.allSettled(
      batch.map(async (prompt) => {
        const taskId = await generateTextToVideo(prompt)
        const videoUrl = await pollForResult(taskId)
        return { prompt, videoUrl }
      })
    )

    const settled = batchResults.map((result) =>
      result.status === 'fulfilled'
        ? result.value
        : { error: result.reason.message }
    )

    results.push(...settled)
  }

  return results
}

큐 기반 아키텍처

대용량 애플리케이션에서는 메시지 큐를 사용하여 제출과 처리를 분리하세요:

Client → API Gateway → Message Queue → Worker Pool → Seedance API

                                       Status Store → Webhook / Polling

권장 큐 서비스: Bull (Redis), AWS SQS, Google Cloud Tasks, RabbitMQ

비용 모니터링

계정 엔드포인트를 모니터링하여 프로그래밍 방식으로 API 비용을 추적하세요:

async function checkUsage() {
  const response = await fetch('https://api.seedance.ai/v2/account', {
    headers,
  })
  const data = await response.json()

  return {
    plan: data.data.plan,
    usedToday: data.data.generations_today,
    limitToday: data.data.generations_limit,
    billingCycleSpend: data.data.current_spend,
  }
}

대량 할인을 포함한 상세 요금 정보는 Seedance 요금 가이드를 참고하세요.

FAQ

Seedance API 키는 어떻게 받나요?

Seedance 개발자 포털(Dreamina 플랫폼)에서 계정을 만들고 대시보드에서 API 키를 생성하세요. 무료 등급 API 접근이 가능합니다.

Seedance API는 어떤 프로그래밍 언어를 지원하나요?

Seedance API는 HTTP 요청을 할 수 있는 모든 언어에서 작동하는 REST API입니다. JavaScript, Python, cURL로 공식 예제가 제공됩니다.

Seedance API 생성에 얼마나 걸리나요?

해상도와 길이 설정에 따라 일반적으로 30~120초가 소요됩니다. API는 비동기 폴링을 사용하여 생성 상태를 확인합니다.

Seedance API 속도 제한은 어떻게 되나요?

속도 제한은 플랜에 따라 다릅니다. 무료 등급은 약 2개의 동시 요청, Pro는 최대 10개, Business 플랜은 맞춤형 한도를 제공합니다.

Seedance API는 웹훅을 지원하나요?

네. 웹훅 URL을 설정하여 영상 생성 완료 시 알림을 받을 수 있어 상태 폴링이 불필요합니다.

Seedance API를 상업 프로젝트에 사용할 수 있나요?

네. Pro 및 Business 플랜 API 사용에는 상업 라이선스가 포함됩니다. 구체적인 사용 권한은 이용약관을 확인하세요.

관련 아티클

AIVidPipeline

에디토리얼 팀

AIVidPipeline은 AI 영상, 이미지, 음악 크리에이터를 위한 튜토리얼, 모델 비교, 워크플로 가이드를 발행합니다. 제품 업데이트를 추적하고 기능 및 가격 정보를 검증한 뒤 실무형 가이드로 정리합니다.

pages.blog.messages.cta_title

pages.blog.messages.cta_description

Seedance 2.0 API: 완벽한 연동 가이드 (2026)