# Clips Export API

> Ekspor atau ekspor ulang klip yang ada dari AI Clipping dan Find Moments dengan gaya subtitel dan pengaturan render baru.

## Clips Export API

Gunakan API ini ketika Anda telah membuat tugas [AI Clipping](https://wayin.ai/id/api-docs/ai-clipping/) atau [Find Moments](https://wayin.ai/id/api-docs/find-moments/) dan ingin merender klip nanti, atau mengekspornya ulang dengan gaya subtitel berbeda, rasio aspek, AI hook, atau pengaturan ekspor lainnya.

`project_id` harus berupa ID tugas asli yang dikembalikan oleh:

- `POST /api/v2/clips`
- `POST /api/v2/clips/find-moments`

---

## Kirim Tugas Ekspor

```
POST https://wayinvideo-api.wayin.ai/api/v2/clips/export
```

### Body Permintaan

| Parameter | Tipe | Wajib | Default | Deskripsi |
|-----------|------|-------|---------|-----------|
| `project_id` | string | Ya | — | ID tugas AI Clipping atau Find Moments asli. |
| `clip_indices` | integer[] | Tidak | `null` | Indeks klip yang akan diekspor. Jika dihilangkan, sistem mengekspor semua klip dalam proyek. |
| `target_lang` | string | Tidak | `null` | Bahasa target untuk konten output termasuk subtitel (lihat [Bahasa yang Didukung](https://wayin.ai/id/api-docs/supported-languages/)). Jika `null`, bahasa output mengikuti bahasa tugas sumber. |
| `resolution` | string | Tidak | `SD_480` | Resolusi output: `SD_480`, `HD_720`, `FHD_1080`, `QHD_2K`, `UHD_4K`. |
| `enable_caption` | boolean | Tidak | `false` | Apakah akan menambahkan Animated Caption saat rendering. Jika `true`, `caption_display` dan `cc_style_tpl` berlaku; jika `false`, ekspor tidak memiliki Animated Caption. |
| `caption_display` | string | Tidak | `original` | Mode subtitel: `both`, `original`, `translation`. Hanya digunakan saat `enable_caption` adalah `true`. |
| `cc_style_tpl` | string | Tidak | `temp-7` | ID template gaya subtitel (lihat [Gaya Subtitel](https://wayin.ai/id/api-docs/subtitles-style/)). Hanya digunakan saat `enable_caption` adalah `true`. |
| `enable_ai_hook` | boolean | Tidak | `false` | Apakah akan menambahkan hook teks yang menarik perhatian dan dihasilkan secara otomatis di awal atau akhir setiap klip yang diekspor. Jika `true`, `ai_hook_script_style` dan `ai_hook_position` berlaku; jika `false`, tidak ada AI hook yang ditambahkan. |
| `ai_hook_script_style` | string | Tidak | `serious` | Gaya teks hook yang dihasilkan. Nilai yang diizinkan: `serious`, `casual`, `informative`, `conversational`, `humorous`, `parody`, `inspirational`, `dramatic`, `empathetic`, `persuasive`, `neutral`, `excited`, `calm`. Hanya digunakan saat `enable_ai_hook` adalah `true`. |
| `ai_hook_position` | string | Tidak | `beginning` | Posisi teks hook yang dihasilkan. Nilai yang diizinkan: `beginning`, `end`. Hanya digunakan saat `enable_ai_hook` adalah `true`. |
| `ai_hook_keywords` | string | Tidak | `null` | Kata kunci opsional untuk mengarahkan teks AI hook yang dihasilkan. Hanya digunakan saat `enable_ai_hook` adalah `true`. |
| `ai_hook_text_duration` | integer | Tidak | `null` | Durasi overlay teks AI hook dalam milidetik. Hanya digunakan saat `enable_ai_hook` adalah `true`. |
| `enable_ai_reframe` | boolean | Tidak | `false` | Aktifkan AI Reframe. Jika `true`, `ratio` wajib diisi; jika `false`, klip diekspor dengan rasio aspek aslinya tidak berubah. |
| `ratio` | string | Ya jika `enable_ai_reframe` adalah `true` | — | Rasio aspek: `RATIO_9_16`, `RATIO_1_1`, `RATIO_4_5`, `RATIO_16_9`. Wajib saat `enable_ai_reframe` adalah `true`. |

### Contoh Permintaan

```bash
curl -X POST https://wayinvideo-api.wayin.ai/api/v2/clips/export \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "x-wayinvideo-api-version: v2" \
  -d '{
    "project_id": "proj_abc123",
    "clip_indices": [0, 2],
    "resolution": "UHD_4K",
    "enable_caption": true,
    "caption_display": "both",
    "cc_style_tpl": "word-focus",
    "enable_ai_hook": true,
    "ai_hook_script_style": "serious",
    "ai_hook_position": "beginning",
    "enable_ai_reframe": true,
    "ratio": "RATIO_9_16"
  }'
```

### Respons Pengiriman

```json
{
  "data": {
    "export_task_id": "export_task_xyz789",
    "name": "sample export task",
    "status": "CREATED"
  }
}
```

| Field | Tipe | Deskripsi |
|-------|------|-----------|
| `export_task_id` | string | Identifier tugas ekspor unik. Gunakan nilai ini untuk melakukan polling progres ekspor. |
| `name` | string | Nama tugas ekspor |
| `status` | string | `CREATED`, `QUEUED`, `ONGOING`, `SUCCEEDED`, `FAILED` |

---

## Ambil Hasil Ekspor

Lakukan polling tugas ekspor hingga `status` menjadi `SUCCEEDED`.

```
GET https://wayinvideo-api.wayin.ai/api/v2/clips/export/{taskId}
```

### Parameter Path

| Parameter | Tipe | Wajib | Deskripsi |
|-----------|------|-------|-----------|
| `taskId` | string | Ya | `export_task_id` yang dikembalikan oleh endpoint pengiriman ekspor |

### Contoh Permintaan

```bash
curl -X GET https://wayinvideo-api.wayin.ai/api/v2/clips/export/export_task_xyz789 \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "x-wayinvideo-api-version: v2"
```

### Contoh Respons

```json
{
  "data": {
    "export_task_id": "export_task_xyz789",
    "name": "sample export task",
    "status": "SUCCEEDED",
    "expire_at": 1775831883112,
    "cost_usage": 48.0,
    "clips": [
      {
        "idx": 0,
        "title": "sample title",
        "begin_ms": 15000,
        "end_ms": 75000,
        "thumbnail": "https://cdn.example.com/thumb/clip_001.jpg",
        "tags": ["insight", "analysis"],
        "desc": "sample description",
        "score": 81,
        "export_link": "https://cdn.example.com/export/clip_001.mp4"
      }
    ]
  }
}
```

### Field Respons

| Field | Tipe | Deskripsi |
|-------|------|-----------|
| `export_task_id` | string | Identifier tugas ekspor unik |
| `name` | string | Nama tugas ekspor |
| `status` | string | `CREATED`, `QUEUED`, `ONGOING`, `SUCCEEDED`, `FAILED` |
| `error_message` | string | Alasan error (hanya ada saat `status` adalah `FAILED`) |
| `expire_at` | integer | Stempel waktu kedaluwarsa dalam milidetik (epoch). Setelah waktu ini, tugas kedaluwarsa dan hasil tidak dapat lagi diambil melalui endpoint hasil ekspor. `-1` berarti hasil tidak kedaluwarsa selama langganan berbayar masih aktif. Setelah langganan berbayar berakhir, hasil disimpan satu bulan lagi, lalu kedaluwarsa. |
| `cost_usage` | number | Kredit API yang digunakan untuk permintaan ekspor ini |
| `clips` | array | Daftar objek klip yang diekspor. Saat `status` adalah `ONGOING`, mungkin berisi hasil ekspor parsial; saat `status` adalah `SUCCEEDED`, berisi semua klip yang diekspor. |

Objek `clips` yang dikembalikan oleh endpoint hasil ekspor menggunakan struktur yang sama dengan objek klip di endpoint hasil utama, termasuk `export_link` untuk setiap klip yang telah dirender.
