173 lines
6.2 KiB
Markdown
173 lines
6.2 KiB
Markdown
---
|
||
title: "Kling AI Multi-Elements API Reference"
|
||
aliases: [kling-multi-elements, kling-video-element-editing, kling-add-swap-remove]
|
||
tags: [kling, api, video-editing, multi-elements, ai-video]
|
||
sources: ["raw/Kling AI Next-Gen AI Video & AI Image Generator 5.md"]
|
||
created: 2026-04-26
|
||
updated: 2026-04-26
|
||
---
|
||
|
||
## Overview
|
||
|
||
The Multi-Elements API lets you **add**, **swap**, or **remove** specific objects within an existing video using AI segmentation. You mark elements by clicking coordinates, then submit an editing task.
|
||
|
||
Base URL: `https://api-singapore.klingai.com`
|
||
|
||
Supported model: `kling-v1-6` only.
|
||
|
||
---
|
||
|
||
## Workflow (5 Steps)
|
||
|
||
1. **Init** — `POST /v1/videos/multi-elements/init-selection` — parse video, get `session_id`
|
||
2. **Add selection** — `POST /v1/videos/multi-elements/add-selection` — click a point on a frame to mark an object
|
||
3. **Preview** — `POST /v1/videos/multi-elements/preview-selection` — see masked overlay before committing
|
||
4. **Create task** — `POST /v1/videos/multi-elements` — choose `edit_mode` + prompt + optional reference images
|
||
5. **Query** — `GET /v1/videos/multi-elements/{task_id}` — poll until `succeed`
|
||
|
||
Optional cleanup steps: `delete-selection` (remove specific points) or `clear-selection` (wipe all).
|
||
|
||
---
|
||
|
||
## Step 1 — Init Selection
|
||
|
||
`POST /v1/videos/multi-elements/init-selection`
|
||
|
||
| Field | Type | Notes |
|
||
|-------|------|-------|
|
||
| `video_id` | string (optional) | Kling-generated video, last 30 days only |
|
||
| `video_url` | string (optional) | Public `.mp4` / `.mov` URL |
|
||
|
||
**Video constraints:**
|
||
- Duration: 2–5 s or 7–10 s
|
||
- Resolution: 720–2160 px (both dimensions)
|
||
- Frame rate: 24, 30, or 60 fps
|
||
|
||
**Response fields:**
|
||
- `session_id` — valid for **24 hours**, used in all subsequent calls
|
||
- `fps`, `original_duration`, `total_frame` — required when creating the task
|
||
- `normalized_video` — URL of the processed video
|
||
|
||
---
|
||
|
||
## Step 2 — Add Selection
|
||
|
||
`POST /v1/videos/multi-elements/add-selection`
|
||
|
||
| Field | Type | Notes |
|
||
|-------|------|-------|
|
||
| `session_id` | string | Required |
|
||
| `frame_index` | int | Which frame to mark (max 10 frames total) |
|
||
| `points` | array | `{x, y}` in `[0,1]` range (top-left = 0,0); up to 10 points per frame |
|
||
|
||
**Response:** returns `rle_mask_list` — RLE-encoded segmentation masks + PNG base64 per object.
|
||
|
||
### Decoding the RLE Mask (TypeScript)
|
||
|
||
```typescript
|
||
export type RLEObject = { size: [h: number, w: number]; counts: string }
|
||
|
||
export function decode(rleObj: RLEObject): Uint8Array {
|
||
// Returns flat Uint8Array (row-major): 1 = masked pixel, 0 = background
|
||
// ... see full implementation in source article
|
||
}
|
||
```
|
||
|
||
### Rendering the Mask Overlay (Canvas)
|
||
|
||
```typescript
|
||
function drawMask(rleMask: string, height: number, width: number) {
|
||
const decodeData = decode({ counts: rleMask, size: [height, width] })
|
||
// Paint pixels with RGBA (116, 255, 82, 163) where decodeData[y*w+x] === 1
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## Step 3 — Delete / Clear Selection (optional)
|
||
|
||
`POST /v1/videos/multi-elements/delete-selection`
|
||
- Same body as add-selection; `points` must **exactly match** coordinates used when adding.
|
||
|
||
`POST /v1/videos/multi-elements/clear-selection`
|
||
- Only requires `session_id` — wipes all marked areas.
|
||
|
||
---
|
||
|
||
## Step 4 — Preview Selection (optional)
|
||
|
||
`POST /v1/videos/multi-elements/preview-selection`
|
||
|
||
Returns: `video` (masked overlay), `video_cover`, `tracking_output` (per-frame mask).
|
||
|
||
---
|
||
|
||
## Step 5 — Create Task
|
||
|
||
`POST /v1/videos/multi-elements`
|
||
|
||
| Field | Type | Notes |
|
||
|-------|------|-------|
|
||
| `model_name` | enum | `kling-v1-6` |
|
||
| `session_id` | string | Required |
|
||
| `edit_mode` | enum | `addition` / `swap` / `removal` |
|
||
| `image_list` | array | Required for add/swap; omit for removal |
|
||
| `prompt` | string | Use `<<<video_1>>>` / `<<<image_1>>>` references; max 2500 chars |
|
||
| `negative_prompt` | string | Optional, max 2500 chars |
|
||
| `mode` | enum | `std` (cost-effective) / `pro` (high-quality) |
|
||
| `duration` | enum | `5` or `10` seconds |
|
||
| `callback_url` | string | Optional webhook |
|
||
| `external_task_id` | string | Optional custom ID |
|
||
|
||
### edit_mode Details
|
||
|
||
| Mode | image_list | Prompt template |
|
||
|------|-----------|-----------------|
|
||
| `addition` | 1–2 images (pre-cropped) | `Using the context of <<<video_1>>>, seamlessly add [x] from <<<image_1>>>` |
|
||
| `swap` | 1 image only | `swap [x] from <<<image_1>>> for [x] from <<<video_1>>>` |
|
||
| `removal` | not required | `Delete [x] from <<<video_1>>>` |
|
||
|
||
**Image requirements (for add/swap):**
|
||
- Formats: `.jpg` / `.jpeg` / `.png`
|
||
- Max 10 MB; min 300 px; aspect ratio 1:2.5–2.5:1
|
||
- Base64: raw string only — **no** `data:image/png;base64,` prefix
|
||
|
||
---
|
||
|
||
## Step 6 — Query Task
|
||
|
||
`GET /v1/videos/multi-elements/{task_id}`
|
||
`GET /v1/videos/multi-elements?pageNum=1&pageSize=30`
|
||
|
||
Task statuses: `submitted` → `processing` → `succeed` / `failed`
|
||
|
||
Result video URL expires after **30 days** — download and store promptly.
|
||
|
||
---
|
||
|
||
## Key Takeaways
|
||
|
||
- Session-based workflow: init once → mark objects → edit → query. Session lives 24 h.
|
||
- Three edit modes: **add** (needs 1–2 ref images), **swap** (1 ref image), **remove** (no images needed).
|
||
- Object selection uses normalized `[0,1]` click coordinates on specific frame indices — up to 10 frames, 10 points each.
|
||
- Response masks are RLE-encoded; decode to `Uint8Array` for canvas rendering.
|
||
- Only `kling-v1-6` supports multi-elements; duration must be 5 s or 10 s matching source video length bracket.
|
||
- Generated videos auto-delete after 30 days; use `callback_url` for async workflows.
|
||
- Base64 images must be raw (no data-URI prefix).
|
||
|
||
---
|
||
|
||
## Related
|
||
|
||
- [[wiki/web-agency/kling-text-to-video-api|Kling Text-to-Video API]] — generate new videos from prompts
|
||
- [[wiki/web-agency/kling-image-to-video-api|Kling Image-to-Video API]] — animate still images
|
||
- [[wiki/web-agency/kling-multi-image-to-video-api|Kling Multi-Image-to-Video API]] — composite 2–4 reference images
|
||
- [[wiki/web-agency/kling-motion-control-api|Kling Motion Control API]] — pose/motion transfer
|
||
- [[wiki/web-agency/claude-code-nanobanana-website-workflow|Claude Code + Nanobanana 2 Workflow]] — end-to-end agency workflow using Kling
|
||
|
||
---
|
||
|
||
## Sources
|
||
|
||
- Raw: `raw/Kling AI Next-Gen AI Video & AI Image Generator 5.md`
|
||
- Origin: Kling AI API docs — `/v1/videos/multi-elements`
|