공식 SDK 빠른 시작
공식 SDK는 전체 흐름(생성 → 폴링 → 다운로드)을 감싸고, 멱등 키를 자동으로 만들며 타입이 지정된 오류를 제공합니다. Node SDK는 의존성이 없고, Python SDK는 httpx에만 의존합니다. 지금은 GitHub 저장소로 제공하며, npm과 PyPI 배포는 따로 안내합니다.
Node
npm install github:openaiav/sdk-node # npm release to be announced
import { OpenAiav } from '@openaiav/sdk'
const client = new OpenAiav({ apiKey: process.env.OPENAIAV_API_KEY })
const task = await client.generations.createAndWait({
model: 'seedance-2.5-oa', prompt: 'She walks into the sunlight.',
resolution: '480p', aspectRatio: 'adaptive', durationSeconds: 4,
generateAudio: false
})
await client.generations.downloadToFile(task.id, './out.mp4')Python
pip install git+https://github.com/openaiav/sdk-python # PyPI release to be announced
from openaiav import OpenAiav
client = OpenAiav(os.environ["OPENAIAV_API_KEY"])
task = client.generations.create_and_wait({
"model": "seedance-2.5-oa", "prompt": "She walks into the sunlight.",
"resolution": "480p", "aspectRatio": "adaptive", "durationSeconds": 4,
"generateAudio": False,
})
client.generations.download_to_file(task["id"], "./out.mp4")4단계로 연동하기
- 서버의
OPENAIAV_API_KEY환경 변수로 https://api.openaiav.com/v1/models를 호출해 현재 모델 키, 가격, reference_modes를 읽습니다. - prompt, referenceMode, referenceImages를 /v1/generations로 POST합니다. 참조 이미지는 공개 HTTPS URL이며 사전 등록이 필요 없습니다. 성공하면 HTTP 201을 반환합니다.
- 반환된 id를 저장하고 poll_after_ms 후에 같은 GET /v1/generations/{id}를 폴링합니다. processing, result_pending, submission_unknown이면 계속 기다리고, 새 작업을 만들지 마세요.
- 상태가 succeeded가 되면 GET /v1/generations/{id}/content로 다운로드합니다. 전체 응답은 HTTP 200, 단일 바이트 범위는 206입니다.
인증과 멱등성
export OPENAIAV_API_KEY='oav_...'
# One Idempotency-Key per create intent: every run of this script makes a new one.
# Reuse it only when retrying this same create. No uuidgen? IDEMPOTENCY_KEY=$(python3 -c 'import uuid;print(uuid.uuid4())')
IDEMPOTENCY_KEY=$(uuidgen | tr 'A-Z' 'a-z')
echo "Idempotency-Key: $IDEMPOTENCY_KEY (reuse this value only when retrying this same create)"모든 요청에 Authorization: Bearer oav_...를 보내고 키는 서버에 보관하세요. 생성에는 generation:create, 폴링과 다운로드에는 generation:read가 필요합니다. 생성 의도마다 새 Idempotency-Key(UUID)를 만들므로 샘플은 실행할 때마다 새 키를 사용합니다. 네트워크 결과가 불확실해 같은 생성을 재시도할 때만 그 키를 다시 사용하고, 한 키를 서로 다른 본문과 함께 쓰지 마세요.
요청 헤더
| 파라미터 | 유형 | 필수 | 설명 |
|---|---|---|---|
| Authorization | string | 필수 | 모든 /v1 요청은 Bearer oav_...를 사용합니다. 키는 서버에 보관하세요. |
| Idempotency-Key | string | 작업 생성 시 필수 | 생성 의도마다 새 값(예: UUID)을 만들고, 같은 생성을 재시도할 때만 다시 사용하세요. 값과 본문이 같으면 중복 생성되거나 중복 청구되지 않습니다. |
| Content-Type | string | POST 요청 시 필수 | 생성 요청은 application/json을 사용합니다. |
엔드포인트
| 메서드 | 경로 | 성공 | 권한 범위 | 설명 |
|---|---|---|---|---|
| GET | /v1/models | 200 | 유효한 API 키라면 모두 가능 | 현재 판매 중인 모델, 가격, 해상도, 길이, reference_modes를 읽습니다. 제출하기 전에 카탈로그에서 기능을 확인하세요. |
| POST | /v1/generation-quotes | 201 | generation:create | 현재 가격을 미리 보여주지만 고정하지는 않습니다. 생성 시 다시 계산하고 생성 응답의 reserved_usd를 그대로 고정 금액으로 청구합니다. 실패한 작업은 전액 환불됩니다. quoteId는 계속 허용되고 expires_at는 새로고침 권장 시각입니다. |
| POST | /v1/generations | 201 | generation:create | 비동기 작업을 만듭니다. 참조 이미지와 referenceMode는 같은 JSON 요청에 담아 보내세요. |
| GET | /v1/generations/{id} | 200 | generation:read | poll_after_ms에 따라 같은 작업이 최종 상태가 될 때까지 폴링합니다. |
| GET | /v1/generations/{id}/content | 200 / 206 | generation:read | 작업이 성공하면 결과를 다운로드합니다. 단일 바이트 범위 요청은 206을 반환합니다. |
1단계: 모델 기능 확인
모델 기능을 코드에 하드코딩하지 마세요. reference_modes에 나온 모드만 제출하고, 호환되지 않는 조합은 제출 전에 숨기거나 막으세요. 최소 예시는 seedance-2.5-oa로 4초, 480p, 오디오 없는 요청을 보여 줍니다.
curl --fail-with-body 'https://api.openaiav.com/v1/models' \
--header "Authorization: Bearer $OPENAIAV_API_KEY"최소 공개 동영상 예시
이 예시에는 전체 흐름이 담겨 있습니다: 생성 → 같은 작업 폴링 → 다운로드. first_frame은 참조 이미지 한 장과 adaptive를 사용하고, generateAudio=false로 오디오를 요청하지 않습니다. 성공 코드는 201, 200, 200/206이며, 실패하면 먼저 HTTP를 확인한 뒤 error.code를 확인하세요.
# Keep OPENAIAV_API_KEY in an environment variable; do not paste secrets into shell history.
# One Idempotency-Key per create intent: every run of this script makes a new one.
# Reuse it only when retrying this same create. No uuidgen? IDEMPOTENCY_KEY=$(python3 -c 'import uuid;print(uuid.uuid4())')
IDEMPOTENCY_KEY=$(uuidgen | tr 'A-Z' 'a-z')
echo "Idempotency-Key: $IDEMPOTENCY_KEY (reuse this value only when retrying this same create)"
# 1. Create — success: HTTP 201. On failure, the response body contains error.code.
# Lost response (timeout or dropped connection)? Re-run this same command in this shell:
# the unchanged $IDEMPOTENCY_KEY returns the original task instead of creating a second one.
curl --fail-with-body --request POST 'https://api.openaiav.com/v1/generations' \
--header "Authorization: Bearer $OPENAIAV_API_KEY" \
--header "Idempotency-Key: $IDEMPOTENCY_KEY" \
--header 'Content-Type: application/json' \
--data '{
"model": "seedance-2.5-oa",
"prompt": "A young woman finishes a letter and walks from a stone cottage into the morning sunlight",
"resolution": "480p",
"aspectRatio": "adaptive",
"durationSeconds": 4,
"referenceMode": "first_frame",
"referenceImages": [
"https://developers.openaiav.com/samples/seedance-letter-reference.webp"
],
"generateAudio": false,
"outputFormat": "mp4"
}'
# 2. Save the returned id as TASK_ID. Poll the same id — success: HTTP 200.
curl --fail-with-body 'https://api.openaiav.com/v1/generations/TASK_ID' \
--header "Authorization: Bearer $OPENAIAV_API_KEY"
# Repeat step 2 after poll_after_ms until status is succeeded or failed.
# Never recreate a task whose status is submission_unknown.
# 3. After succeeded, download — success: HTTP 200 (or 206 with Range).
curl --fail-with-body --location 'https://api.openaiav.com/v1/generations/TASK_ID/content' \
--header "Authorization: Bearer $OPENAIAV_API_KEY" \
--output 'result.mp4'요청 파라미터
| 파라미터 | 유형 | 필수 | 설명 |
|---|---|---|---|
| model | string | 필수 | GET /v1/models의 model 값을 사용하세요. 최소 동영상 예시는 seedance-2.5-oa를 사용합니다. |
| prompt | string | 필수 | 1~4000자. 멀티모달 참조에서는 배열 순서대로 @Image1, @Image2처럼 이미지를 가리킬 수 있습니다. |
| resolution | string | 선택 | 선택한 모델의 resolutions에 있어야 합니다. 최소 동영상 예시는 480p를 사용합니다. |
| aspectRatio | string | 선택 | 선택한 모델의 aspect_ratios에 있어야 합니다. 모델이 시작 프레임 요청에 요구하면 adaptive를 사용하세요. image_size_options가 있는 이미지 모델은 resolution과 aspectRatio를 그 목록에서 한 쌍으로 골라야 합니다. 모든 해상도에서 모든 화면 비율을 쓸 수 있는 것은 아닙니다. |
| durationSeconds | integer | 선택 | 동영상 길이는 durationSeconds를 카탈로그 duration_seconds 범위의 정수 초로 지정하세요. 생략하면 모델의 최소 길이를 사용합니다. 최소 예시는 4초입니다. |
| referenceMode | first_frame | omni_reference | 동영상에 참조 이미지를 쓸 때 필수 | reference_modes에 해당 모드를 명시한 Seedance 동영상 모델에서만 사용하세요. 요청 하나에는 모드를 하나만 선택할 수 있습니다. |
| referenceImages | string[] | referenceMode와 함께 입력 | 공개 HTTPS 이미지 URL입니다. first_frame에는 이미지가 정확히 한 장 필요하며, omni_reference의 한도는 reference_images_max에서 확인하세요. |
| inputImages | string[] | 선택 | 이미지 → 이미지 생성에 쓰는 입력 이미지(참조 이미지)로, 이미지 모델에서만 사용합니다. 각 항목은 공개 HTTPS 이미지 URL이거나 data:image/png;base64,…, data:image/jpeg;base64,…, data:image/webp;base64,… 형식의 data URL입니다. 모델별 한도는 GET /v1/models의 input_images_max, input_image_max_bytes(이미지 한 장 기준, URL과 data URL 모두 적용), input_image_mime_types에서 확인하세요. 참조 이미지를 넣으면 청구 금액이 올라갈 수 있습니다. 동영상 참조 모드와 함께 쓰지 마세요. |
| generateAudio | boolean | 선택 | 오디오를 지원하는 동영상 모델에서는 기본값이 true입니다. 가장 저렴한 예시는 false를 명시해 보냅니다. 현재 카탈로그에는 별도의 오디오 추가 요금이 없으며, 청구는 항상 GET /v1/models를 기준으로 합니다. |
| outputFormat | mp4 | mov | 선택 | 카탈로그의 output_formats에서만 선택하세요. 최소 예시는 mp4를 사용합니다. |
참조 모드
first_frame
first_frame: 참조 이미지가 첫 프레임이 되어 구도를 정합니다. referenceImages에는 정확히 하나만 보내세요. aspectRatio는 모델의 aspect_ratios에서 고르며, 카탈로그에서 제공하면 adaptive로 고정됩니다(출력은 참조 이미지를 따릅니다).
first_last_frame: referenceImages를 정확히 2개 보내세요. 배열 순서대로 시작 프레임, 끝 프레임이 되며 그 사이는 모델이 채웁니다. 두 이미지의 크기가 같을 필요는 없습니다. 프레임 모드는 omni_reference와 함께 쓸 수 없습니다.
{
"model": "seedance-2.5-oa",
"prompt": "A young woman finishes a letter and walks from a stone cottage into the morning sunlight",
"resolution": "480p",
"aspectRatio": "adaptive",
"durationSeconds": 4,
"referenceMode": "first_frame",
"referenceImages": [
"https://developers.openaiav.com/samples/seedance-letter-reference.webp"
],
"generateAudio": false,
"outputFormat": "mp4"
}omni_reference
omni_reference: 참조 미디어는 첫 프레임이 되지 않으면서 피사체, 스타일, 장면의 일관성을 유지합니다. referenceImages 외에도 지원 모델은 referenceVideos와 referenceAudios를 받습니다. 유형별 한도는 아래 표에 있으며, 카탈로그에 선언되지 않은 유형은 제출 시 400이 반환됩니다. 프롬프트에서는 유형별 순서로 @Image1, @Video1, @Audio1처럼 가리킵니다.
{
"model": "seedance-2.5-oa",
"prompt": "Keep the identity and outfit from @Image1; a young woman walks from a stone cottage into the morning sunlight",
"resolution": "480p",
"aspectRatio": "16:9",
"durationSeconds": 4,
"referenceMode": "omni_reference",
"referenceImages": [
"https://developers.openaiav.com/samples/seedance-letter-reference.webp"
],
"generateAudio": false,
"outputFormat": "mp4"
}현재 호환 범위
모든 동영상 모델을 하나의 방식으로 연동합니다: 같은 엔드포인트, 같은 필드를 쓰며 모델을 바꿀 때는 model만 바꾸면 됩니다. 차이는 모두 카탈로그가 선언하며, 아래 표가 바로 그 카탈로그입니다. 모델마다 지원하는 참조 모드와 미디어 유형별 허용 개수를 보여 줍니다. 카탈로그에 선언되지 않은 기능은 제출 시 명시적으로 거부되며, 조용히 무시되지 않습니다.
시작 프레임 상세와 끝 프레임 이어 쓰기
시작 프레임 상세: first_frame과 omni_reference는 함께 쓸 수 없으므로 요청마다 하나만 선택합니다. 멀티모달 참조에서도 프롬프트로 참조 이미지를 첫 장면 쪽으로 유도할 수 있지만, 첫 프레임이 정확히 같아야 한다면 그 이미지를 first_frame 모드로 보내세요. Seedance 2.5의 시작 프레임 작업은 화면 비율이 adaptive로 고정됩니다(출력은 시작 프레임을 따릅니다). 끝 프레임 이어 쓰기: 생성할 때 returnLastFrame: true를 보내면, 성공한 작업이 last_frame_url(동영상과 같은 크기의 워터마크 없는 PNG, 24시간 보관)도 반환합니다. 이 URL을 다음 요청의 first_frame referenceImages로 바로 넣으면 사전 등록 없이 여러 컷을 이어 붙일 수 있습니다.
참조 동영상 요금
- 길이를 측정할 수 있는 참조 동영상은 고정 가격으로 과금되며, 그 금액을 미리 확인할 수 있습니다. 측정할 수 없으면 요금 없이 미리보기를 거절합니다.
POST /v1/generation-quotes로 현재 가격을 미리 확인하세요. URL 동영상은 생성 시 다시 측정하고 가격을 계산하며 생성 응답의reserved_usd가 실제 금액입니다.quoteId는 가격을 고정하지 않고expires_at는 새로고침 시각만 제안합니다.- 모델 카탈로그는 동영상별 및 총 길이, 개수와 최소 청구 시간을 정합니다. 참조 동영상 한 개의 길이는 Seedance 2.0 시리즈가 2~15초, 그 밖의 지원 모델이 2~30초입니다. 측정된 동영상이 한도를 벗어나면 요금 없이 422
REFERENCE_DURATION_OUT_OF_RANGE를 반환합니다. - 공개 HTTPS MP4/MOV 직접 링크를 사용하세요. 알려진 파일 크기가 200 MiB를 넘으면
REFERENCE_VIDEO_TOO_LARGE를 반환하며 크기를 알 수 없어도 견적을 받을 수 있습니다. 비공개 URL은REFERENCE_URL_NOT_PUBLIC, 측정 중 혼잡은 429REFERENCE_PROBE_BUSY입니다. 콘솔 업로드 한도는 32 MiB입니다. - 모든 작업은 생성 시 견적 금액인
reserved_usd가 청구되며, 성공하면 그 금액 그대로이고 실패하면 전액 환불됩니다. 미리보기의price_usd는 그 시점에 생성하면 청구될 금액과 같으며 출력 길이는 -1 대신 명시해야 합니다. - 공개 동영상 URL은 미리보기와 생성 시 각각 검사한 뒤 저장이나 에셋 등록 없이 생성 서비스에 직접 전달됩니다. 내용을 안정적으로 유지하세요. 업로드는 별도 경로를 사용하며 실제 인물 얼굴 제한은 그대로 적용됩니다.
이미지 모델 가격
- 이미지 모델은 장당 가격이며
resolution과aspectRatio에 따라 달라집니다(image_pricing.rates).gpt-image-*와nano-banana-*모델의 표시 가격은 짧은 프롬프트에 참조 이미지가 없는 경우의 가격입니다. - 이 모델들은 참조 이미지를 넣거나 프롬프트가 길면 청구 금액이 올라갑니다. 작업을 만들기 전에 같은 본문으로
POST /v1/generation-quotes를 호출하세요. 반환된price_usd가 현재 가격 기준 해당 요청의 청구 금액입니다. 실패한 작업은 전액 환불됩니다.
폴링과 다운로드
succeeded와 failed만 최종 상태입니다. submission_unknown은 접수 여부를 확인하는 중이고 result_pending은 결과를 마무리하는 중입니다. 원래 작업 ID를 보관하고 계속 조회하며 생성 요청을 다시 보내지 마세요. 성공 후에는 Open AIav 외부 주소 대신 인증된 /content 경로를 사용하세요. 결과는 24시간 보관됩니다(상세 응답의 output_expires_at을 확인하고 만료 전에 저장하세요. 만료된 다운로드는 410 OUTPUT_EXPIRED를 반환합니다).
| 상태 | 최종 상태 | 조치 |
|---|---|---|
| processing | 아니요 | 접수되었습니다. poll_after_ms 후에 다시 폴링하세요. |
| result_pending | 아니요 | 결과를 마무리하는 중입니다. 작업 ID를 보관하고 같은 작업을 계속 조회하세요. 다시 생성하지 마세요. |
| submission_unknown | 아니요 | 접수 여부를 확인하고 있습니다. 생성 요청을 다시 보내지 말고, 원래 작업 ID를 보관해 계속 폴링하세요. |
| succeeded | 예 | 성공했습니다. /content로 결과를 다운로드하세요. |
| failed | 예 | 최종 실패했으며 금액은 전액 환불되었습니다. error_code를 확인하세요. |
종료된 엔드포인트 이전
/v1/assets, /v1/assets/content, /v1/assets/{id}, /v1/asset-groups, /v1/asset-groups/{id} 엔드포인트는 종료되었습니다. 해당 이전 권한 범위를 가진 유효한 키로 호출하면 HTTP 410 / ENDPOINT_RETIRED가 반환됩니다. 새로운 연동에서는 이 경로를 호출하지 말고, referenceMode와 referenceImages를 같은 생성 요청에 넣으세요.오류 코드 참조
전체 참조: HTTP 상태, 코드, 의미, 권장 조치, SDK 오류 클래스. 이 표는 SDK의 오류 매핑과 같은 데이터를 사용하며, 알 수 없는 새 코드는 SDK가 HTTP 상태에 따라 처리합니다.
| HTTP | 코드 | 의미 | 권장 조치 | SDK |
|---|---|---|---|---|
| 401 | UNAUTHENTICATED | API 키가 없거나 인식할 수 없습니다. | Authorization: Bearer oav_…를 보내세요. 키는 서버에 보관합니다. | AuthenticationError |
| 401 | INVALID_API_KEY | API 키가 올바르지 않거나 폐기되었습니다. | 콘솔에서 키를 확인하세요. 필요하면 교체해 새 키를 받으세요. | AuthenticationError |
| 403 | INSUFFICIENT_SCOPE | 키에 이 작업에 필요한 권한 범위(scope)가 없습니다. | 생성에는 generation:create, 폴링과 다운로드에는 generation:read가 필요합니다. | PermissionError |
| 429 | RATE_LIMITED | 요청이 키의 속도 제한을 넘었습니다. | Retry-After / retryAfterSeconds에 따라 기다린 뒤 다시 시도하세요. SDK는 자동으로 처리합니다. | RateLimitError |
| 400 | IDEMPOTENCY_KEY_REQUIRED | 생성 요청에는 Idempotency-Key 헤더가 필요합니다. | 새 요청마다 고유한 키를 만들고 재시도할 때는 같은 키를 쓰세요. SDK는 자동으로 만듭니다. | InvalidRequestError |
| 409 | IDEMPOTENCY_KEY_CONFLICT | 같은 멱등 키가 다른 본문과 함께 사용되었습니다. | 파라미터가 다르면 새 키를 쓰고, 재시도할 때는 키와 본문을 똑같이 유지하세요. | InvalidRequestError |
| 400 | MODEL_NOT_FOUND | 알 수 없는 모델 ID입니다. | GET /v1/models의 ID를 사용하세요(예: seedance-2.5-oa). | InvalidRequestError |
| 503 | MODEL_NOT_AVAILABLE | 이 모델은 지금 호출할 수 없습니다. | 요금은 청구되지 않았습니다. GET /v1/models에서 모델의 status를 확인하고 나중에 다시 시도하세요. | ServerError |
| 400 | INVALID_PROMPT | 프롬프트가 비어 있거나 너무 깁니다. | 프롬프트는 1~4000자여야 합니다. | InvalidRequestError |
| 400 | INVALID_DURATION | durationSeconds가 모델 범위를 벗어났습니다. | 동영상 길이를 카탈로그 범위 안의 정수 durationSeconds로 지정하세요. | InvalidRequestError |
| 400 | INVALID_RESOLUTION | 모델이 지원하지 않는 해상도입니다. | 카탈로그의 resolutions에서 값을 고르세요. | InvalidRequestError |
| 400 | INVALID_ASPECT_RATIO | 모델이 지원하지 않는 화면 비율입니다. | 카탈로그의 aspect_ratios에서 고르세요. first_frame은 adaptive로 고정되는 경우가 많습니다. | InvalidRequestError |
| 400 | INVALID_REFERENCE_IMAGES | referenceImages는 공개 HTTPS URL 배열이어야 합니다. | 작업이 끝날 때까지 읽을 수 있는 https:// 이미지 URL을 넣으세요. | InvalidRequestError |
| 400 | INVALID_REFERENCE_IMAGE | 참조 이미지 항목 중 올바른 URL이 아닌 것이 있습니다. | 메시지에 인덱스(referenceImages[i])가 포함되어 있으니 해당 항목을 고치세요. | InvalidRequestError |
| 400 | REFERENCE_IMAGE_URL_NOT_HTTPS | 참조 이미지 URL이 공개 HTTPS가 아닙니다. | http, 사설 네트워크, data URL은 거부됩니다. 이미지를 HTTPS로 공개해 주세요. | InvalidRequestError |
| 400 | REFERENCE_MODE_REQUIRES_IMAGES | 참조 이미지 없이 referenceMode를 지정했습니다. | referenceMode와 referenceImages를 함께 보내세요. | InvalidRequestError |
| 400 | REFERENCE_MODE_NOT_SUPPORTED | 모델이 요청한 참조 모드를 지원하지 않습니다. | 카탈로그의 reference_modes에 따라 first_frame / omni_reference를 고르세요. | InvalidRequestError |
| 400 | FIRST_FRAME_REQUIRES_ONE_IMAGE | first_frame에는 참조 이미지를 정확히 한 장만 넣을 수 있습니다. | 이미지를 정확히 한 장만 보내세요. 여러 장이면 omni_reference를 사용하세요. | InvalidRequestError |
| 400 | TOO_MANY_REFERENCES | 참조 이미지 수가 카탈로그 한도를 넘었습니다. | 카탈로그의 reference_images_max를 확인하세요. | InvalidRequestError |
| 400 | INVALID_INPUT_IMAGES | inputImages는 배열이어야 합니다. | 각 항목은 HTTPS URL 또는 data:image/* base64입니다. | InvalidRequestError |
| 400 | INVALID_INPUT_IMAGE | 입력 이미지 항목 중 형식이 잘못된 것이 있습니다. | 각 항목은 HTTPS URL 또는 data:image/* base64여야 하며, 메시지에 인덱스가 포함됩니다. | InvalidRequestError |
| 400 | INPUT_IMAGE_URL_NOT_HTTPS | 입력 이미지 URL이 HTTPS가 아닙니다. | https:// URL이나 data:image/png;base64,… 같은 data URL을 사용하세요. | InvalidRequestError |
| 400 | INPUT_IMAGE_TOO_LARGE | 요청에 포함된 이미지가 10 MiB를 초과합니다. | 10 MiB 미만으로 압축해 보내세요. input_image_max_bytes가 있는 모델은 HTTPS URL에도 같은 한도를 적용하며, 초과하면 작업이 REFERENCE_INPUT_INVALID로 실패하고 전액 환불됩니다. | InvalidRequestError |
| 400 | IMAGE_INPUT_NOT_SUPPORTED | 모델이 이미지 입력을 받지 않습니다. | input_images_max>0인 이미지 모델만 inputImages를 받습니다. | InvalidRequestError |
| 400 | TOO_MANY_INPUT_IMAGES | 입력 이미지가 너무 많습니다. | 카탈로그의 input_images_max를 확인하세요. | InvalidRequestError |
| 422 | REFERENCE_DURATION_OUT_OF_RANGE | 측정된 참조 동영상 길이가 모델 제한을 초과합니다. | 카탈로그에서 동영상별 길이, 총길이와 개수 제한을 확인하고 가격을 다시 미리 확인하세요. 요금은 부과되지 않았습니다. | InvalidRequestError |
| 422 | REFERENCE_DURATION_UNVERIFIED | 참조 동영상 길이를 측정할 수 없습니다. | Range 요청을 지원하는 호스트에서 일반 MP4/MOV를 사용하세요. faststart를 권장합니다. | InvalidRequestError |
| 422 | REFERENCE_URL_NOT_PUBLIC | 참조 동영상 URL이 공개 HTTPS가 아닙니다. | 로그인 없이 접근할 수 있는 443 포트의 공개 HTTPS 파일 URL을 사용하세요. | InvalidRequestError |
| 422 | CONTENT_TYPE_MISMATCH | 참조 동영상 URL이 필요한 동영상 형식을 반환하지 않습니다. | URL이 웹페이지나 이미지가 아닌 MP4/MOV 바이트를 반환하는지 확인하세요. | InvalidRequestError |
| 422 | REFERENCE_VIDEO_TOO_LARGE | 참조 동영상이 파일 크기 제한을 초과합니다. | 공개 URL은 200 MiB, 콘솔 업로드는 32 MiB까지입니다. 압축하거나 잘라서 가격을 다시 미리 확인하세요. | InvalidRequestError |
| 429 | REFERENCE_PROBE_BUSY | 동시에 측정 중인 참조 동영상이 너무 많습니다. | retry_after_seconds 후 다시 시도하세요. 요금은 부과되지 않았습니다. | RateLimitError |
| 400 | INSUFFICIENT_BALANCE | 이 작업을 실행하기에 잔액이 부족합니다. | 지갑에서 충전하거나 코드를 등록한 뒤 다시 시도하세요. | InvalidRequestError |
| 400 | LEGACY_ASSET_REFERENCE_RETIRED | 에셋 ID 참조는 더 이상 지원하지 않습니다. | 같은 요청에 referenceMode + referenceImages(공개 HTTPS)를 보내세요. | InvalidRequestError |
| 404 | NOT_FOUND | 작업이 없거나 다른 계정의 작업입니다. | 작업 ID와 키가 같은 계정에 속하는지 확인하세요. | InvalidRequestError |
| 409 | OUTPUT_NOT_READY | 결과가 아직 준비되지 않았습니다. | 최종 상태가 될 때까지 poll_after_ms에 따라 작업을 계속 폴링하세요. | InvalidRequestError |
| 410 | OUTPUT_EXPIRED | 다운로드 기간(성공 후 24시간)이 끝났습니다. | 결과는 제때 저장하세요. 만료되면 다시 생성해야 합니다. 카운트다운 표시는 output_expires_at을 사용하세요. | OutputExpiredError |
이미지 작업 실패 코드
이미지 작업이 status=failed로 끝나면 error_code를 읽고 아래 표에서 확인하세요. 실패한 작업은 전액 환불됩니다. SDK는 같은 코드를 담은 GenerationFailedError를 발생시킵니다.
| 코드 | 의미 |
|---|---|
| CONTENT_POLICY_REJECTED | 콘텐츠가 검토를 통과하지 못했습니다. 수정한 뒤 다시 제출하세요. |
| REFERENCE_INPUT_INVALID | 참조의 형식, 크기와 모델 요구 사항을 확인하세요. |
| REFERENCE_SOURCE_UNREACHABLE | 참조 URL을 읽을 수 없습니다. 만료 여부를 확인하거나 다시 업로드하세요. |
| REFERENCE_SERVICE_UNAVAILABLE | 참조 처리 서비스를 이용할 수 없습니다. 작업 ID와 함께 지원팀에 문의하세요. 이미지를 바꿀 필요는 없습니다. |
| GENERATION_INPUT_INVALID | 생성 파라미터가 이 모델의 요구 사항에 맞지 않습니다. |
| GENERATION_RATE_LIMITED | 생성 서비스에 일시적으로 속도 제한이 걸렸습니다. 잠시 후 다시 시도하세요. |
| GENERATION_REJECTED | 생성 요청이 거부되었습니다. 이유를 확인하려면 작업 ID와 함께 지원팀에 문의하세요. |
| GENERATION_SERVICE_UNAVAILABLE | 생성 서비스를 일시적으로 이용할 수 없습니다. |
| GENERATION_FAILED | 작업을 완료하지 못했습니다. 작업 ID와 함께 지원팀에 문의하세요. |
콘솔에서만 반환되는 코드
| HTTP | 코드 | 의미 | 권장 조치 |
|---|---|---|---|
| 400 | REFERENCE_UPLOAD_NOT_FOUND | 업로드 참조가 없거나 만료되었거나 다른 계정의 것입니다. | 플레이그라운드에서 다시 업로드한 뒤 실행하세요(업로드는 잠시만 유효합니다). |
| 429 | UPLOAD_QUOTA_EXCEEDED | 사용하지 않은 업로드가 너무 많습니다. | 업로드를 사용하는 작업을 실행하거나 만료될 때까지 기다리세요. |
| 429 | WEBHOOK_ENDPOINT_LIMIT | 웹훅 엔드포인트 수가 한도에 도달했습니다. | 사용하지 않는 엔드포인트를 삭제하거나 비활성화하세요. |
| 400 | INVALID_WEBHOOK_URL | 콜백 URL이 공개적으로 접근 가능한 HTTPS 주소가 아닙니다. | 공개 HTTPS 주소를 사용하세요. 사설 호스트와 루프백 주소는 거부됩니다. |