이미지 & 비디오 빠른 시작

텍스트 프롬프트와 참조 미디어로 이미지와 비디오를 생성하는 방법을 알아보세요.

이미지 & 비디오 API는 비동기 방식입니다. 생성을 제출하고 완료되면 서명된 URL에서 결과를 다운로드합니다. 이미지와 비디오는 별도의 엔드포인트를 사용하지만, 요청 및 응답 형식은 둘 다 같습니다.

결과를 수집하는 방법은 두 가지입니다. 아래 예시에서 사용하는 권장 방식은 웹훅 전송입니다. 생성이 종료 상태에 도달하는 즉시 ElevenLabs가 엔드포인트를 호출하므로 대기 시간이 소요되지 않습니다. 폴링은 콜백을 받을 엔드포인트가 없을 때의 대안이며, 각 예시에서 폴링으로 전환하는 방법도 보여줍니다.

이미지 & 비디오 API를 사용하려면 프로 요금제 이상이 필요합니다. 그보다 낮은 등급의 워크스페이스에서 호출하면 402 paid_plan_required 오류와 함께 거부됩니다. API 키에는 워크스페이스의 이미지 & 비디오 또는 Flows 권한도 있어야 합니다.

이미지 생성

1

API 키 만들기

대시보드에서 API 키를 생성하세요. 이 키로 API에 안전하게 액세스할 수 있습니다.

키는 관리형 시크릿으로 저장하고, .env 파일을 통한 환경 변수 또는 앱 구성에서 직접 SDK에 전달하세요.

.env
ELEVENLABS_API_KEY=<your_api_key_here>
2

SDK 설치

환경 변수에서 API 키를 불러오기 위해 dotenv 라이브러리도 사용합니다.

pip install elevenlabs
pip install python-dotenv
3

생성 제출

각 모델에는 고유한 요청 클래스가 있으며, 해당 클래스의 필드는 모델이 허용하는 파라미터입니다. 따라서 모델을 바꾸면 사용할 수 있는 필드도 달라질 수 있습니다. 알 수 없는 필드는 무시되지 않고 거부됩니다.

webhook은 완료된 결과를 워크스페이스의 웹훅으로 전송하도록 요청하므로, 생성이 대기열에 추가되는 즉시 호출이 반환됩니다. 생성 이벤트를 구독하는 웹훅이 필요합니다. 설정 방법은 이미지 & 비디오 웹훅을 참고하거나, 필드를 생략하고 대신 폴링하세요.

# example.py
import os
from dotenv import load_dotenv
from elevenlabs import ImageGenerationRequest_Gemini3ProImage, WebhookTarget_All
from elevenlabs.client import ElevenLabs
load_dotenv()
elevenlabs = ElevenLabs(api_key=os.getenv("ELEVENLABS_API_KEY"))
generation = elevenlabs.flows.image.create(
request=ImageGenerationRequest_Gemini3ProImage(
prompt="A corgi in a tiny lifeguard chair on a sunlit beach at golden hour, photorealistic",
aspect_ratio="16:9",
resolution="2K",
webhook=WebhookTarget_All(),
)
)
print(generation.id, generation.status)

응답에는 생성 ID만 포함됩니다. 새로 생성된 항목의 상태는 항상 pending입니다.

{
"id": "JWr5N6X9ZTqf8jD2LmQb",
"status": "pending"
}
4

결과 수집

요청에서 webhook을 선택했으므로, 생성이 completed 또는 failed에 도달하면 ElevenLabs가 엔드포인트에 flows_generation 이벤트를 게시합니다. 이벤트의 data는 GET 엔드포인트가 반환하는 내용과 동일하며, 이미지 & 비디오 웹훅에서는 이를 수신하는 핸들러를 안내합니다.

콜백을 받을 엔드포인트가 없다면 위 요청에서 webhook을 제거하고 대신 폴링하세요. 상태가 completed 또는 failed가 될 때까지 생성을 가져오되, 이미지의 경우 요청 사이에 최소 2초를 두세요. 모달리티별 간격은 폴링 가이드라인을 참고하세요.

import time
import requests
while True:
result = elevenlabs.flows.image.get(generation.id)
if result.status in ("completed", "failed"):
break
time.sleep(2)
if result.status == "failed":
raise RuntimeError(f"{result.failure_reason}: {result.error_message}")
with open("corgi.png", "wb") as f:
f.write(requests.get(result.content_url).content)

어느 방식을 사용하든 완료된 생성에는 동일한 필드가 포함됩니다.

{
"id": "JWr5N6X9ZTqf8jD2LmQb",
"status": "completed",
"content_url": "https://storage.googleapis.com/generations/JWr5N6X9ZTqf8jD2LmQb",
"content_mime_type": "image/png"
}
5

코드 실행

python example.py

생성이 대기열에 추가되고 ID가 출력됩니다. 웹훅 전송을 사용하면 이미지가 엔드포인트에 도착하고, 폴링 방식에서는 corgi.png에 저장됩니다.

비디오 생성

비디오 생성에는 flows.video를 사용하며 동일한 제출 및 수집 패턴을 따릅니다. 비디오는 몇 분이 걸릴 수 있으므로, 이 예시에서는 결과를 기다리는 대신 webhook을 통해 웹훅 전송을 선택합니다.

from elevenlabs import VideoGenerationRequest_Veo31FastGenerate001, WebhookTarget_All
generation = elevenlabs.flows.video.create(
request=VideoGenerationRequest_Veo31FastGenerate001(
prompt="A corgi rides a tiny surfboard across a sunlit wave at golden hour, cinematic",
duration_secs=8,
aspect_ratio="16:9",
resolution="1080p",
generate_audio=True,
webhook=WebhookTarget_All(),
)
)
print(generation.id)

생성이 대기열에 추가되면 즉시 호출이 반환되고, 완료된 결과는 생성 이벤트를 구독하는 워크스페이스의 모든 웹훅으로 전송됩니다. 비디오 출력은 MP4이므로 완료된 페이로드의 content_mime_type은 video/mp4로 보고됩니다. 웹훅 설정 및 이를 수신하는 핸들러 작성 방법은 이미지 & 비디오 웹훅을 참고하세요.

webhook을 사용하려면 생성 이벤트를 구독하는 워크스페이스 웹훅이 하나 이상 있어야 합니다. 없으면, 결과를 받을 곳이 없는 생성을 시작하는 대신 생성 호출이 거부됩니다. 필드를 제거하면 flows.video.get을 사용한 폴링으로 전환할 수 있으며, 10초에 한 번보다 자주 폴링하지 마세요.

결과 수집

웹훅과 폴링은 동일한 페이로드를 반환하므로, 선택 기준은 무엇을 받는지가 아니라 결과를 기다리는 방식입니다.

웹훅 전송폴링
적합한 용도두 모달리티의 기본 방식 및 모든 프로덕션 환경공개 엔드포인트가 없는 스크립트 및 환경
필요 조건생성 이벤트를 구독하는 HTTPS 엔드포인트없음
대기 비용없음. 생성이 완료되면 호출됨생성당 폴링마다 요청 1회

가능한 경우 웹훅을 사용하세요. 콜백을 받을 곳이 없을 때는 폴링을 사용하고, 폴링할 경우 아래 간격을 따르세요.

웹훅 대상 선택

webhook은 두 가지 형식을 허용합니다. WebhookTarget_All은 생성 이벤트를 구독하는 모든 웹훅에 전송하며, 웹훅이 교체되거나 순환되어도 유지되므로 적절한 기본값입니다. WebhookTarget_Ids는 전송 대상을 특정 웹훅으로 제한합니다. 하나의 워크스페이스가 여러 소비자에게 분배하고 특정 작업이 그중 하나에만 전달되어야 할 때 사용합니다.

from elevenlabs import WebhookTarget_Ids
webhook = WebhookTarget_Ids(ids=["Q8mVr2LpXcT4nB6yJdKw"])

모든 ID는 이미 생성 이벤트를 구독하고 있어야 합니다. 구독하지 않은 웹훅을 지정하면 조용히 무시되지 않고 거부됩니다. 전송되는 페이로드는 GET 엔드포인트가 반환하는 내용과 동일하므로, 한쪽에 맞춰 작성한 핸들러는 다른 쪽에서도 작동합니다. 웹훅 가이드에서는 웹훅 설정, 서명 검증 및 이벤트 처리 방법을 다룹니다.

폴링 가이드라인

생성 실행 시간은 모델, 해상도, 그리고 비디오의 경우 길이에 따라 달라집니다. 고정 루프를 사용하는 대신 요청한 조건에 맞는 간격으로 폴링하세요.

  • 이미지: 2초에 한 번보다 자주 폴링하지 마세요. 대부분 몇 초 안에 완료됩니다.
  • 비디오: 10초에 한 번보다 자주 폴링하지 마세요. 몇 초가 아닌 몇 분을 예상하고, duration_secs 및 resolution에 따라 간격을 조정하세요.

두 방식 모두에 두 가지 규칙이 적용됩니다. 생성이 오래 걸리면 백오프하세요. 간격을 약 1분까지 두 배로 늘리면 느린 생성이 수백 건의 요청으로 이어지는 것을 방지할 수 있습니다. 또한 자체 코드에서 멈춘 생성이 제한 없는 루프가 아니라 타임아웃으로 종료되도록 루프에 상한을 두세요.

이보다 빠르게 폴링해도 이점이 없습니다. 두 번 요청한다고 생성 상태가 더 빨리 바뀌지는 않습니다. 지속적으로 과도한 폴링을 하면 429 응답이 반환될 수 있으므로 지수 백오프로 처리해야 합니다.

생성 수명 주기

생성은 네 가지 상태를 거칩니다. 두 종료 상태는 서로 다른 필드를 포함하므로, 나머지 응답을 읽기 전에 status를 기준으로 분기하세요.

상태의미
pending생성이 대기열에 있습니다. 새로 생성된 모든 항목의 상태입니다.
generating모델이 실행 중입니다.
completed출력이 준비되었습니다. 응답에 content_url 및 content_mime_type이 포함됩니다.
failed생성에서 출력을 만들지 못했습니다. 응답에 실패 세부 정보가 포함됩니다.

content_url은 응답 반환 후 약 1시간이 지나면 만료되는 서명된 URL입니다. 서명된 URL 자체를 저장하는 대신 생성을 다시 가져와 새 URL을 받으세요.

실패 처리

실패한 생성은 사람이 읽을 수 있는 error_message와 함께 failure_reason 카테고리를 보고합니다.

{
"id": "JWr5N6X9ZTqf8jD2LmQb",
"status": "failed",
"failure_reason": "moderated",
"error_message": "The prompt was rejected by content moderation. You were not charged for this generation."
}
failure_reason원인
timeout모델이 제시간에 결과를 반환하지 않았습니다.
model_error모델 제공업체가 오류를 반환했거나 출력을 생성하지 않았습니다.
moderated프롬프트 또는 입력이 콘텐츠 모더레이션에 의해 거부되었습니다.
invalid_parameters생성이 모델에 도달한 후 파라미터가 거부되었습니다.
dependency_failed이 생성이 의존하는 참조 생성이 실패했습니다.
charging_failed워크스페이스에 생성 비용을 청구할 수 없었습니다.
internal_error예기치 않은 오류가 발생했습니다.

실패한 생성에는 비용이 청구되지 않습니다. 지원되지 않는 필드, 모델에서 허용하는 범위를 벗어난 값, 잘못된 참조 입력 조합처럼 사전에 감지할 수 있는 파라미터 문제는 생성이 시작되기 전에 생성 요청에서 거부됩니다.

가격

생성에는 크레딧이 청구됩니다. 비용은 모델, 해상도 및 길이 같은 선택한 파라미터, 제공한 입력에 따라 달라집니다. 생성 비용은 API와 ElevenLabs 앱에서 동일하며, 앱에서는 제출 전에 비용이 표시됩니다. 특정 모델 및 설정 조합의 비용이 표시되는 방법은 플레이그라운드의 이미지 & 비디오를 참고하세요.

생성 목록 보기

각 엔드포인트는 해당 엔드포인트를 통해 생성된 항목을 최신순으로 나열합니다. 결과는 워크스페이스와 이 API로 범위가 제한되므로 ElevenLabs 앱에서 생성한 항목은 표시되지 않습니다.

page = elevenlabs.flows.image.list(page_size=20, status="completed")
for item in page.generations:
print(item.id, item.content_url)
while page.has_more:
page = elevenlabs.flows.image.list(page_size=20, status="completed", cursor=page.next_cursor)
for item in page.generations:
print(item.id, item.content_url)

page_size는 1~100을 허용하며 기본값은 30입니다. 하나의 수명 주기 상태에 있는 생성만 반환하려면 status를 전달하고, 단일 모델의 생성만 반환하려면 model_id를 전달하세요. next_cursor는 불투명한 값으로 취급하세요. 정확한 값을 그대로 다시 전달하고 has_more가 false이면 중지하세요.

사용 가능한 모델

API는 ElevenLabs 앱에서 사용할 수 있는 모델 중 일부를 제공합니다. 각 모델은 해당 모델에 나열된 매개변수만 허용합니다. 다른 모델에서 지원하는 필드를 전송하면 유효성 검사 오류가 반환됩니다.

ByteDance 모델은 기본적으로 비활성화되어 있으며, 사용하려면 명시적인 승인이 필요합니다. 액세스가 승인되기 전까지 해당 모델 중 하나를 지정한 요청은 model_access_denied 오류와 함께 거부됩니다. 엔터프라이즈 고객은 지원팀에 문의하여 액세스를 요청할 수 있습니다.

이미지 모델

model_id참조 이미지출력 제어
gpt-image-1최대 5개, mask 포함aspect_ratio (1:1, 3:2, 2:3), quality, background
gpt-image-1.5최대 5개, mask 포함aspect_ratio (1:1, 3:2, 2:3), quality, background
gpt-image-2최대 10개, mask 포함15개 종횡비, resolution (1K, 2K, 4K), quality
gpt-image-2.5-sunburst최대 10개, mask 포함15개 종횡비, resolution (1K, 2K, 4K), quality (max까지)
gpt-image-2.5-flare최대 10개, mask 포함15개 종횡비, resolution (1K, 2K, 4K), quality (max까지)
gemini-2.5-flash-image최대 5개aspect_ratio
gemini-3-pro-image최대 10개aspect_ratio, resolution (1K, 2K, 4K)
gemini-3.1-flash-image최대 14개aspect_ratio (1:4, 4:1, 1:8, 8:1 포함), resolution (512~4K)
gemini-3.1-flash-lite-image최대 14개aspect_ratio, resolution (1K)
bytedance-seedream-5-lite최대 10개aspect_ratio, resolution (2K, 3K), seed
bytedance-seedream-5-pro최대 10개aspect_ratio, resolution (1K, 2K), seed

GPT Image 2.5 모델은 low, medium, high, xhigh, max의 quality 값을 지원하며, 기본값은 high입니다. GPT Image 2는 high까지만 지원하며 기본값은 medium입니다.

비디오 모델

model_id미디어 입력출력 제어
veo-3.1-generate-001start_frame, end_frame, role이 있는 최대 3개의 imagesduration_secs (4, 6, 8), aspect_ratio (16:9, 9:16), resolution (720p, 1080p, 4K), generate_audio
veo-3.1-fast-generate-001start_frame, end_frame, role이 있는 최대 3개의 imagesduration_secs (4, 6, 8), aspect_ratio (16:9, 9:16), resolution (720p, 1080p, 4K), generate_audio
bytedance-seedance-v2start_frame, end_frame, 최대 9개의 images, 3개의 videos, 3개의 audiosduration_secs (415), 7개 종횡비, resolution (480p4k), generate_audio
bytedance-seedance-v2-faststart_frame, end_frame, 최대 9개의 images, 3개의 videos, 3개의 audiosduration_secs (4~15), 7개 종횡비, resolution (480p, 720p), generate_audio
bytedance-seedance-v2-ministart_frame, end_frame, 최대 9개의 images, 3개의 videos, 3개의 audiosduration_secs (4~15), 7개 종횡비, resolution (480p, 720p), generate_audio
bytedance-seedance-v2.5start_frame, end_frame, 최대 30개의 images, 10개의 videos, 10개의 audiosduration_secs (4~30), 7개 종횡비, resolution (480p, 720p), generate_audio
creatify-auroraimage 및 audio, 둘 다 필수resolution (480p, 720p), guidance_scale, audio_guidance_scale

모델 기능, 사용 가능 여부 및 가격은 이미지 & 비디오 개요에서 확인하세요.

다음 단계