엔드포인트
동영상 생성(비동기 작업)
POST /videos로 동영상 생성 작업을 만들고 GET /videos/{id}로 상태를 폴링한 뒤 결과를 내려받는 비동기 흐름을 설명합니다. 잔액 확인, 과금 방식, 오류 코드도 함께 다룹니다. 결과를 내려받는 예제 코드도 포함합니다.
플레이그라운드에서 사용해 보기Veo 3.1, Sora 2 Pro, Kling, Seedance, Runway, Wan, Hailuo 등으로 동영상을 생성합니다. 동영상 생성에는 수십 초에서 몇 분이 걸리므로 비동기 작업으로 실행됩니다. 작업을 만들고, 상태를 폴링한 다음, 결과를 내려받습니다.
| 단계 | 요청 |
|---|---|
| 1. 생성 | POST /api/v1/videos |
| 2. 폴링 | GET /api/v1/videos/{id} |
| 3. 다운로드 | GET /api/v1/videos/{id}/content?index=0 |
작업 만들기
POST https://api14.com/api/v1/videos
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
model | string | 예 | 동영상 모델 ID. 예: google/veo-3.1-fast. |
prompt | string | 예 | 동영상에서 일어나는 내용. |
duration | number | 아니요 | 길이(초). 기본값은 모델이 지원하는 첫 번째 길이입니다. |
resolution | string | 아니요 | 예: 720p, 1080p. 모델이 지원해야 합니다. |
aspect_ratio | string | 아니요 | 예: 16:9, 9:16. |
generate_audio | boolean | 아니요 | 지원되는 경우 사운드트랙을 생성합니다(기본값 true). |
image | string | 아니요 | URL 또는 data: URI로 된 첫 프레임(이미지 투 비디오). |
모델별로 지원하는 길이, 해상도, 화면 비율은 GET /videos/models(공개) 또는 모델 페이지에서 확인하세요.
잔액 확인
작업을 제출하기 전에 게이트웨이는 요청한 해상도(및 오디오 옵션)의 초당 가격에 길이를 곱해 가격을 추정합니다. 잔액이 추정치보다 적으면 요청은 402 insufficient_balance로 실패하고 아무것도 시작되지 않습니다.
응답
{
"id": "vid_01JABCDEF",
"status": "queued",
"polling_url": "/api/v1/videos/vid_01JABCDEF"
}
작업 폴링
GET https://api14.com/api/v1/videos/{id}
{
"id": "vid_01JABCDEF",
"status": "completed",
"generation_id": "gen-1791100000-abc",
"unsigned_urls": ["/api/v1/videos/vid_01JABCDEF/content?index=0"],
"usage": { "cost": 1.2 }
}
status | 의미 |
|---|---|
queued | 제공자를 기다리는 중. |
in_progress | 렌더링 중. |
completed | 완료. unsigned_urls에 결과물이 나열됩니다. |
failed, cancelled, expired | 결과물 없이 종료되었습니다. error를 확인하세요. 요금은 청구되지 않습니다. |
5–10초마다 폴링하세요. 작업을 만든 계정만 조회할 수 있으며, 다른 ID는 404 not_found를 반환합니다.
결과 다운로드
GET https://api14.com/api/v1/videos/{id}/content?index=0
API 키로 동영상 바이트(보통 video/mp4)를 반환합니다. 출력 URL은 항상 게이트웨이를 가리키며 업스트림 제공자를 직접 가리키지 않습니다. 파일이 아직 준비되지 않았거나 만료되었다면 content_unavailable이 반환됩니다.
예제
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api14.com/api/v1",
apiKey: process.env.API14_API_KEY,
});
// Video generation is asynchronous: submit, then poll until completed.
let job = await client.post("/videos", { body: {
"model": "google/veo-3.1-fast",
"prompt": "A drone shot over turquoise ocean waves at sunrise",
"duration": 8,
"resolution": "720p",
"aspect_ratio": "16:9"
} });
while (!["completed", "failed"].includes(job.status)) {
await new Promise((r) => setTimeout(r, 5000));
job = await client.get(`/videos/${job.id}`);
}
console.log(job.status, job.unsigned_urls);
과금
작업이 completed에 도달했을 때 제공자의 실제 비용으로 한 번만 과금됩니다. 실패, 취소, 만료된 작업은 무료입니다. 작업은 백그라운드에서도 완료되므로, 폴링하지 않은 작업도 정산되어 사용량에 표시됩니다.
오류
| 상태 | 코드 | 발생 조건 |
|---|---|---|
| 402 | insufficient_balance | 잔액이 작업의 추정 가격보다 적습니다. |
| 403 | plan_required | 요금제에 동영상 모델이 포함되어 있지 않습니다. |
| 404 | model_not_found / not_found | 알 수 없는 모델이거나 내 작업 ID가 아닙니다. |
| 502 | upstream_unavailable | 상태를 읽을 수 없습니다. 재시도하세요. |
오류를 참고하세요.