> ## Documentation Index
> Fetch the complete documentation index at: https://docs.apimart.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# gemini-omni-1.2-flash-ext 비디오 생성

>  - gemini-omni-1.2-flash-ext 통합 비디오 생성 모델
- 텍스트-비디오, 첫 프레임 기반 비디오 생성, 첫·마지막 프레임 기반 비디오 생성, 다중 이미지 참조, 비디오 편집 및 연장 지원
- 360p/720p/1080p/4k 해상도, 3–15초 길이 지원, 초 단위 과금
- 비동기 작업 API. 작업을 제출한 후 작업 ID로 생성 결과를 조회합니다 

```bash cURL theme={null}
curl --request POST \
  --url https://api.apimart.ai/v1/videos/generations \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '{
    "model": "gemini-omni-1.2-flash-ext",
    "prompt": "Aerial shot over a misty mountain lake at sunrise.",
    "duration": 10,
    "resolution": "1080p",
    "aspect_ratio": "9:16"
  }'
```

```python Python theme={null}
import requests

url = "https://api.apimart.ai/v1/videos/generations"

payload = {
    "model": "gemini-omni-1.2-flash-ext",
    "prompt": "Aerial shot over a misty mountain lake at sunrise.",
    "duration": 10,
    "resolution": "1080p",
    "aspect_ratio": "9:16"
}

headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript JavaScript theme={null}
const url = "https://api.apimart.ai/v1/videos/generations";

const payload = {
  model: "gemini-omni-1.2-flash-ext",
  prompt: "Aerial shot over a misty mountain lake at sunrise.",
  duration: 10,
  resolution: "1080p",
  aspect_ratio: "9:16"
};

const headers = {
  "Authorization": "Bearer <token>",
  "Content-Type": "application/json"
};

fetch(url, {
  method: "POST",
  headers: headers,
  body: JSON.stringify(payload)
})
  .then(response => response.json())
  .then(data => console.log(data))
  .catch(error => console.error("Error:", error));
```

```go Go theme={null}
package main

import (
    "bytes"
    "encoding/json"
    "fmt"
    "io/ioutil"
    "net/http"
)

func main() {
    url := "https://api.apimart.ai/v1/videos/generations"

    payload := map[string]interface{}{
        "model":        "gemini-omni-1.2-flash-ext",
        "prompt":       "Aerial shot over a misty mountain lake at sunrise.",
        "duration":     10,
        "resolution":   "1080p",
        "aspect_ratio": "9:16",
    }

    jsonData, _ := json.Marshal(payload)

    req, _ := http.NewRequest("POST", url, bytes.NewBuffer(jsonData))
    req.Header.Set("Authorization", "Bearer <token>")
    req.Header.Set("Content-Type", "application/json")

    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    body, _ := ioutil.ReadAll(resp.Body)
    fmt.Println(string(body))
}
```

```json 200 theme={null}
{
  "code": 200,
  "data": [
    {
      "status": "submitted",
      "task_id": "task_01KS1H7ZYSJWH1N779S2FSHTKA"
    }
  ]
}
```

```json 400 theme={null}
{
  "error": {
    "code": 400,
    "message": "요청 파라미터가 올바르지 않습니다",
    "type": "invalid_request_error"
  }
}
```

```json 401 theme={null}
{
  "error": {
    "code": 401,
    "message": "인증에 실패했습니다. API 키를 확인하세요",
    "type": "authentication_error"
  }
}
```

```json 402 theme={null}
{
  "error": {
    "code": 402,
    "message": "계정 잔액이 부족합니다. 충전 후 다시 시도하세요",
    "type": "payment_required"
  }
}
```

```json 429 theme={null}
{
  "error": {
    "code": 429,
    "message": "요청이 너무 많습니다. 잠시 후 다시 시도하세요",
    "type": "rate_limit_error"
  }
}
```

## 인증

**Authorization** `string` *required*

모든 요청은 Bearer Token 인증이 필요합니다.

API Key 발급:

[API Key 관리 페이지](https://apimart.ai/keys)에서 API Key를 발급받으세요.

요청 시 다음 헤더를 추가합니다:

```
Authorization: Bearer YOUR_API_KEY
```

## 요청 파라미터

**model** `string` *required*

비디오 생성 모델 이름입니다. `gemini-omni-1.2-flash-ext`로 고정됩니다.

**prompt** `string` *required*

비디오 내용 설명 또는 편집 지시입니다. 앞뒤 공백을 제거한 후 비어 있으면 안 됩니다. 텍스트-비디오에서는 장면, 인물, 동작, 카메라, 사운드를 설명하고, 이미지나 비디오를 함께 전달할 때는 동작, 스타일 또는 수정 내용을 설명합니다.

예시: `"Aerial shot over a misty mountain lake at sunrise."`

> [!WARNING]
>
> 첫 프레임, 다중 이미지 참조, 편집, 연장을 포함한 모든 모드에서 `prompt`는 필수입니다. 누락되면 400 오류가 반환됩니다.

**duration** `integer` (default: 10)

비디오 길이(초)이며 정수여야 합니다.

* 텍스트-비디오 / 첫 프레임 / 다중 이미지 참조: 출력 길이, `3`–`15`
* 첫·마지막 프레임: 출력 길이, `3`–`10`
* 연장(`extend`): **새로 추가되는 구간**의 길이, `3`–`10`
* 편집(`edit`): 전달할 수 없으며, 출력 길이는 원본 비디오를 따릅니다

별칭 `seconds`도 사용할 수 있습니다. 두 값을 함께 전달하면 같아야 합니다.

> [!WARNING]
>
> 편집 모드에서 `duration`을 전달하면 `video edit does not accept duration` 오류가 반환됩니다.

**resolution** `string` (default: 720p)

비디오 해상도입니다. 대소문자를 구분하지 않으며 초당 단가를 결정합니다.

지원 값:

* `360p`
* `720p`
* `1080p`
* `4k`(`2160p`도 가능)

> [!WARNING]
>
> 그 외 해상도를 전달하면 400 오류가 반환됩니다.

**aspect\_ratio** `string` (default: 16:9)

`16:9`(가로 화면, 기본값)와 `9:16`(세로 화면)만 지원하며, 그 외 값은 400 오류가 반환됩니다.

**omni\_reference\_task\_type** `string`

작업 유형으로, 소재를 사용하는 방식을 지정합니다.

지원 값:

* `edit` - 비디오 편집. `video_urls` 또는 `extend_from_task_id`와 함께 사용합니다
* `extend` - 비디오 끝에 새 내용을 추가해 연장합니다. `video_urls` 또는 `extend_from_task_id`와 함께 사용합니다
* `reference` - 다중 이미지 참조. `image_urls`와 함께 사용합니다
* `text_to_video` / `image_to_video` / `reference_to_video` - 텍스트-비디오 / 첫 프레임 / 참조 이미지
* `auto` - 입력에 따라 자동 판단하며, 비디오가 있으면 `edit`로 처리됩니다

비디오가 없으면 생략할 수 있으며, 입력에 따라 자동 판단됩니다.

> [!WARNING]
>
> `video_urls` 또는 `extend_from_task_id`를 전달할 때는 작업 유형(`omni_reference_task_type` 또는 호환 필드 `generation_type`)이 필수이며, 생략하면 400 오류가 반환됩니다. `edit` 또는 `extend`를 명시적으로 전달하는 것을 권장하며, `auto`는 `edit`로 처리됩니다.

**generation\_type** `string`

호환 필드로, `omni_reference_task_type`과 동일합니다. 지원 값: `frame`(`image_to_video`와 동일), `reference`, `edit`, `extend`.

> [!WARNING]
>
> `generation_type`과 `omni_reference_task_type`은 함께 전달할 수 없습니다.

**image\_urls** `array\<url\>`

다중 이미지 참조(인물, 상품, 스타일 등)용 참조 이미지 배열이며, 1–10장을 지원합니다.

공개적으로 접근 가능한 HTTP/HTTPS 이미지 URL만 지원합니다. 로컬 이미지는 먼저 업로드하여 공개 URL을 받은 후 전달하세요. 현재 Base64 Data URL은 지원하지 않으며, 전달하면 400 오류가 반환됩니다.

이미지를 1장만 전달하면 작업 유형에 따라 처리 방식이 달라집니다:

* `omni_reference_task_type` 생략: 참조 이미지로 처리
* `omni_reference_task_type`이 `auto` 또는 `image_to_video`: 첫 프레임으로 처리

첫 프레임 생성에는 이미지 개수에 의존하지 말고 `first_frame_image`를 직접 사용하는 것을 권장합니다.

> [!WARNING]
>
> `image_urls`는 `first_frame_image` 또는 `last_frame_image`와 함께 전달할 수 없으며, `image_urls`의 이미지는 첫 프레임으로 처리되지 않습니다. 편집 및 연장 시에도 이미지를 전달할 수 없습니다.

**first\_frame\_image** `string`

첫 프레임 이미지로, 생성된 비디오의 첫 프레임이 이 이미지가 됩니다. 공개적으로 접근 가능한 HTTP/HTTPS 이미지 URL만 지원하며, Base64 Data URL은 지원하지 않습니다.

`last_frame_image`와 함께 전달하면 첫·마지막 프레임 기반 비디오 생성이 됩니다.

**last\_frame\_image** `string`

마지막 프레임 이미지로, 첫·마지막 프레임 기반 비디오 생성에 사용되며 비디오는 첫 프레임에서 이 이미지로 전환됩니다. 공개적으로 접근 가능한 HTTP/HTTPS 이미지 URL만 지원하며, Base64 Data URL은 지원하지 않습니다.

첫·마지막 프레임 모드에서는:

* `duration`은 `3`–`10`을 지원하며, 생략 시 10초
* `system_prompt`와 `negative_prompt`를 전달할 수 없습니다

> [!WARNING]
>
> `last_frame_image`는 반드시 `first_frame_image`와 함께 전달해야 하며, 마지막 프레임만 전달하면 `last_frame_image requires first_frame_image` 오류가 반환됩니다. `image_urls`와 함께 전달할 수 없습니다.

**image\_with\_roles** `array\<object\>`

역할이 지정된 이미지 배열로, `first_frame_image` / `last_frame_image` / `image_urls`와 동일한 표기 방식입니다.

**배열 항목**

**url** `string` *required*

공개적으로 접근 가능한 HTTP/HTTPS 이미지 URL. Base64 Data URL은 지원하지 않습니다.

**role** `string`

`first_frame`은 첫 프레임, `last_frame`은 마지막 프레임(각 1장만 가능)이며, 그 외 값이나 빈 값은 참조 이미지로 처리됩니다.

**video\_urls** `array\<url\>`

편집 또는 연장할 비디오 배열로, 비디오 1개만 지원합니다. 단일 값 필드 `video_url`을 대신 사용할 수도 있으며, 둘 중 하나만 전달합니다.

공개적으로 접근 가능한 HTTP/HTTPS 비디오 URL만 지원합니다. 형식은 MP4 / MOV / WebM이며, 길이 15초 이하, 크기 64 MB 이하입니다.

> [!WARNING]
>
> `video_urls`를 전달할 때는 작업 유형이 필수이며, `omni_reference_task_type`을 `edit` 또는 `extend`로 지정하는 것을 권장합니다(`auto`는 `edit`로 처리). 생략하면 400 오류가 반환됩니다. 비디오를 2개 이상 전달하면 400 오류가 반환됩니다.

**extend\_from\_task\_id** `string`

본 플랫폼의 작업 ID(`task_01…`)입니다. 이전에 완료한 본인의 `gemini-omni-1.2-flash-ext` 작업을 기반으로 비디오를 다시 업로드하지 않고 편집 또는 연장을 이어갈 수 있습니다.

사용 조건:

* 작업이 현재 계정에 속해 있어야 합니다
* 작업 모델이 `gemini-omni-1.2-flash-ext`여야 합니다
* 작업 상태가 `completed`여야 합니다
* 원본 작업을 생성한 채널을 계속 사용할 수 있어야 하며, 그렇지 않으면 503 `source_channel_unavailable`이 반환됩니다
* 원본 결과물이 15초 이하여야 합니다(편집과 연장 모두 적용). 편집 모드에서는 길이를 식별할 수 있어야 합니다

채널을 사용할 수 없거나 원본 결과물의 길이를 식별할 수 없으면 원본 결과물을 다운로드한 후 `video_urls`로 업로드하세요. 원본 결과물이 15초를 초과하면 15초 이내로 자른 후 업로드하세요.

> [!WARNING]
>
> `extend_from_task_id`는 `video_urls`와 함께 전달할 수 없으며, 작업 유형이 필수입니다. `omni_reference_task_type`을 `edit` 또는 `extend`로 지정하는 것을 권장합니다(`auto`는 `edit`로 처리).

**negative\_prompt** `string`

화면에 나타나지 않기를 원하는 내용입니다.

예시: `"people, cars, color"`

> [!WARNING]
>
> 첫·마지막 프레임 모드에서는 `negative_prompt`를 전달할 수 없습니다.

**system\_prompt** `string`

화면 스타일 고정, 텍스트 표시 금지 등의 시스템 지시입니다. 문자열이어야 합니다.

예시: `"Render as a black-and-white silent film."`

> [!WARNING]
>
> 첫·마지막 프레임 모드에서는 `system_prompt`를 전달할 수 없습니다.

## 응답

**code** `integer`

응답 상태 코드입니다. 성공 시 `200`입니다.

**data** `array`

작업 배열을 반환합니다.

**배열 항목**

**status** `string`

작업 초기 상태입니다. 제출 성공 시 `submitted`입니다.

**task\_id** `string`

작업 고유 식별자입니다. 작업 상태와 결과 조회에 사용합니다.

## 작업 결과 조회

비디오 생성은 비동기 작업입니다. 제출 후 `task_id`가 반환되며, [작업 상태 조회](https://docs.apimart.ai/ko/api-reference/tasks/status.md) API로 생성 진행 상황과 결과를 조회합니다.

```bash cURL theme={null}
curl --request GET \
  --url https://api.apimart.ai/v1/tasks/task_01KS1H7ZYSJWH1N779S2FSHTKA \
  --header 'Authorization: Bearer <token>'
```

5-10초마다 폴링하고 클라이언트 타임아웃을 10분 이상으로 설정하는 것을 권장합니다. 생성 소요 시간 참고(대기 포함): 360p 15초 약 46초, 1080p 15초 약 99초, 4k 15초 약 4-5분. 생성 중에는 완료될 때까지 진행률이 오랫동안 10%에 머무를 수 있습니다.

### 성공 결과 예시

```json theme={null}
{
  "code": 200,
  "data": {
    "id": "task_01KS1H7ZYSJWH1N779S2FSHTKA",
    "status": "completed",
    "progress": 100,
    "actual_time": 99,
    "cost": 0.695,
    "result": {
      "videos": [
        {
          "url": ["https://cdn.example.com/videos/abc.mp4"]
        }
      ]
    }
  }
}
```

비디오 URL은 `data.result.videos[0].url[0]`입니다. `data.actual_time`은 작업 소요 시간(초)이며 비디오 길이가 아닙니다. 출력은 MP4(H.264, 24fps)이며 AAC 오디오 트랙과 SynthID 비가시 워터마크가 포함됩니다. 4k는 간혹 오디오 트랙이 없을 수 있습니다.

### 실패 결과 예시

```json theme={null}
{
  "code": 200,
  "data": {
    "id": "task_01KS1H7ZYSJWH1N779S2FSHTKA",
    "status": "failed",
    "progress": 100,
    "cost": 0,
    "error": {
      "code": "task_failed",
      "message": "content_rejected",
      "type": "task_failed"
    }
  }
}
```

작업이 실패하면 전액 환불됩니다.

## 과금 안내

초 단위 과금: 비용 = 선택한 해상도의 초당 단가 × 과금 초. 모든 모드는 요청한 해상도 등급으로 과금됩니다. 실제 단가는 [가격 페이지](https://apimart.ai/pricing)를 확인하세요.

| 모드 | 과금 초 |
| - | - |
| 텍스트-비디오 / 첫 프레임 / 다중 이미지 참조 | `duration`, 생략 시 10초 |
| 첫·마지막 프레임 | `duration`(최대 10초), 생략 시 10초 |
| 편집 | 원본 비디오 길이(컨테이너 오차 0.15초를 뺀 후 올림, 최소 1초. 예: 8.019초는 8초, 8.3초는 9초) |
| 연장 | 추가 초 `duration`, 생략 시 10초. 원본 비디오 부분은 과금되지 않습니다 |

## 사용 사례

### 시나리오 1: 텍스트-비디오

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "Aerial shot over a misty mountain lake at sunrise.",
  "duration": 15,
  "resolution": "1080p",
  "aspect_ratio": "9:16"
}
```

### 시나리오 2: 첫 프레임 기반 비디오

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "The camera slowly pushes in.",
  "duration": 6,
  "aspect_ratio": "9:16",
  "first_frame_image": "https://example.com/start.jpg"
}
```

### 시나리오 3: 첫·마지막 프레임 기반 비디오

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "The flower bud slowly opens into full bloom.",
  "duration": 8,
  "aspect_ratio": "16:9",
  "first_frame_image": "https://example.com/bud.jpg",
  "last_frame_image": "https://example.com/bloom.jpg"
}
```

첫·마지막 프레임 모드에서 `duration`은 3–10초를 지원하며 생략 시 10초입니다. `system_prompt` / `negative_prompt`는 전달할 수 없습니다.

### 시나리오 4: 다중 이미지 참조

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "The cat bats at the ball of yarn.",
  "duration": 8,
  "image_urls": [
    "https://example.com/cat.png",
    "https://example.com/yarn.png"
  ]
}
```

### 시나리오 5: 비디오 편집

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "Make the violin invisible. Keep everything else the same.",
  "video_urls": ["https://example.com/clip.mp4"],
  "omni_reference_task_type": "edit"
}
```

편집 시에는 `duration`을 전달하지 않으며, 출력 길이는 원본 비디오를 따릅니다.

### 시나리오 6: 비디오 연장

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "Continue the scene: the dancer bows.",
  "video_urls": ["https://example.com/clip.mp4"],
  "omni_reference_task_type": "extend",
  "duration": 4
}
```

### 시나리오 7: 기존 작업 기반 연장

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "Extend this video: the camera pans across the mountains.",
  "extend_from_task_id": "task_01KS1H7ZYSJWH1N779S2FSHTKA",
  "omni_reference_task_type": "extend",
  "duration": 6
}
```

### 시나리오 8: 시스템 지시와 네거티브 프롬프트

```json theme={null}
{
  "model": "gemini-omni-1.2-flash-ext",
  "prompt": "A busy city street at noon.",
  "system_prompt": "Render as a black-and-white silent film.",
  "negative_prompt": "people, cars, color",
  "duration": 6
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.