Add sound to Kling video
August 8, 2025 (October 1, 2025)
Table of contents
This endpoint generates sound for an existing video using Kling’s AI audio generation capabilities.
Video can’t be shorter than 3 seconds or longer than 20 seconds.
https://api.useapi.net/v1/kling/videos/add-sound
Request Headers
Authorization: Bearer {API token}
Content-Type: application/json
# Alternatively you can use multipart/form-data
# Content-Type: multipart/form-data
API token
is required, see Setup useapi.net for details.
Request Body
{
"video": "https://s21-kling.klingai.com/....mp4",
"replyUrl": "https://my.domain.com/webhook-endpoint-kling",
"replyRef": "my-id-1234"
}
-
email
is optional when only one account configured.
However, if you have multiple accounts configured, this parameter becomes required. -
video
is required, the URL of the video to add sound to.
Video can be uploaded using POST /assets and the returned URL can be used here.
Video can’t be shorter than 3 seconds or longer than 20 seconds. -
cropVideoOriginalSound
is optional, whether to preserve the original video’s sound.
Defaultfalse
(original sound will be replaced). -
maxJobs
is optional, the maximum number of concurrent Kling jobs. -
replyUrl
is optional, a URL to receive webhooks when the video is completed.
See useapi.net Webhooks. -
replyRef
is optional, include a custom reference to identify the job.
Passed as-is to thereplyUrl
webhook.
Responses
-
{ "task": { "id": 1234567890, "userId": 12345, "type": "kwave_video2audio", "scene": "NORMAL_CREATION", "status": 5, "taskInfo": { "type": "kwave_video2audio", "inputs": [ { "name": "video", "inputType": "URL", "token": null, "blobStorage": null, "url": "https://v15-kling.klingai.com/…", "cover": null, "fromWorkId": null, "fromUploadId": null } ], "arguments": [ { "name": "biz", "value": "klingai" }, { "name": "imageCount", "value": "1" }, { "name": "duration", "value": "20" } ], "extraArgs": {}, "callbackPayloads": [ { "name": "video2audio_payloads", "resources": [ { "name": "originalVideoUrl", "type": "VIDEO", "url": "https://v15-kling.klingai.com/…" } ], "arguments": [ { "name": "cropVideoOriginalSound", "value": "false" } ] } ], "scene": "NORMAL_CREATION" }, "favored": false, "deleted": false, "viewed": false, "createTime": 1754630611379, "updateTime": 1754630611379, "viewTime": 0, "status_name": "submitted", "status_final": false }, "works": [], "status": 5, "message": "", "limitation": null, "userPoints": { "points": [ { "orderId": "1234567890", "type": "reward", "amount": 26600, "balance": 3150, "startTime": 1754406534079, "endTime": 1757084934079 } ], "total": 113390 }, "userTickets": { "ticket": [ { "orderId": "1234456789", "type": "priority", "packageType": "reward", "amount": 1, "balance": 1, "startTime": 1754406534079, "endTime": 1757084934079 } ] }, "editProject": null, "status_name": "submitted", "status_final": false }
-
{ "error": "Invalid video URL format" }
-
{ "error": "Unauthorized", "code": 401 }
-
Kling was unable to locate one of the referenced assets. Make sure to use POST /assets to upload assets.
{ "error": "Sorry, the requested resource was not found (VALID.ResourceNotFound)", "message": "Not Found" }
-
Kling uses a
500
response to indicate moderation and other issues with the input. It may be hard to separate actual 500 errors from moderation errors, so use theerror
field text and your best judgement to tell them apart, since themessage
field most often has very generic and perhaps misleading text.{ "error": "The content you uploaded appears to violate the community guidelines. (CM_EXT.POther)", "message": "Service busy (CM_EXT.POther)" }
When successful, the response includes a task ID which can be used to check the status using GET /tasks/task_id
.
Model
{ // TypeScript, all fields are optional
task: {
id: number // Unique task identifier
userId: number // User ID
type: string // Task type: "kwave_video2audio"
scene: string // Scene type: "NORMAL_CREATION"
status: number // Task status
taskInfo: {
type: string // Task type
inputs: {
name: string // Input name: "video"
inputType: string // Input type: "URL"
token: string | null
blobStorage: string | null
url: string // Video URL
cover: string | null
fromWorkId: number | null
fromUploadId: number | null
}[]
arguments: {
name: string // Argument name
value: string // Argument value
}[]
extraArgs: Record<string, any>
callbackPayloads: {
name: string // "video2audio_payloads"
resources: {
name: string // "originalVideoUrl"
type: string // "VIDEO"
url: string // Original video URL
marginTop?: number
countInRow?: number
mode?: string
}[]
arguments: {
name: string // Parameter name
value: string // Parameter value
}[]
}[]
scene: string // Scene type
}
favored: boolean
deleted: boolean
viewed: boolean
createTime: number // Creation timestamp
updateTime: number // Update timestamp
viewTime: number // View timestamp
status_name: string // Status name: "submitted"
status_final: boolean // Whether status is final
}
works: any[] // Work items (empty initially)
status: number // Overall status
message: string // Status message
error: string
limitation: any | null // Rate limiting info
userPoints: {
points: {
orderId: string // Order ID
type: string // Point type
amount: number // Point amount
balance: number // Remaining balance
startTime: number // Start timestamp
endTime: number // End timestamp
}[]
total: number // Total points
}
userTickets: {
ticket: {
orderId: string // Order ID
type: string // Ticket type
packageType: string // Package type
amount: number // Ticket amount
balance: number // Remaining balance
startTime: number // Start timestamp
endTime: number // End timestamp
}[]
}
editProject: any | null // Edit project info
status_name: string // Status name
status_final: boolean // Whether status is final
}
Examples
-
curl "https://api.useapi.net/v1/kling/videos/add-sound" \ -H "Accept: application/json" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer …" \ -d '{ "email": "[email protected]", "video": "https://s21-kling.klingai.com/....mp4", "replyUrl": "https://my.domain.com/webhook-endpoint-kling" }'
-
const token = "API token"; const email = "Previously configured account email"; const requestData = { email, video: "https://s21-kling.klingai.com/....mp4", replyUrl: "https://my.domain.com/webhook-endpoint-kling" }; const response = await fetch("https://api.useapi.net/v1/kling/videos/add-sound", { method: "POST", headers: { "Content-Type": "application/json", "Authorization": `Bearer ${token}`, }, body: JSON.stringify(requestData) }); const result = await response.json(); console.log("response", {response, result});
-
import requests token = "API token" email = "Previously configured account email" request_data = { "email": email, "video": "https://s21-kling.klingai.com/....mp4", "replyUrl": "https://my.domain.com/webhook-endpoint-kling" } headers = { "Content-Type": "application/json", "Authorization": f"Bearer {token}" } response = requests.post("https://api.useapi.net/v1/kling/videos/add-sound", headers=headers, json=request_data) print(response, response.json())