Save a Kling 4.0 Voice

October 15, 2026

Table of contents

  1. Request Headers
  2. Request Body
  3. Responses
  4. Model
  5. Examples
  6. Try It

This endpoint saves your own Kling 4.0 voice from an audio clip. Kling cleans up the clip and saves it to your Kling account as a voice with source: USER.

Use the returned id (or the name) as voice_1, voice_2 or voice_3 in POST /videos/omni with omni_version: v4. A saved voice belongs to the Kling account that saved it, so pass the same email to POST /videos/omni.

Saved voices are listed first by GET /videos/voices, and you can remove one with DELETE /videos/voices.

https://api.useapi.net/v1/kling/videos/voices

Request Headers
Authorization: Bearer {API token}
Content-Type: application/json
# Alternatively you can use multipart/form-data
# Content-Type: multipart/form-data
Request Body
{
  "email": "[email protected]",
  "audioUrl": "https://example.com/my-voice.mp3",
  "name": "My voice"
}
  • email is optional when only one account configured.
    However, if you have multiple accounts configured, this parameter becomes required.

  • audioUrl is required, a URL of an audio file 4.5 to 30 seconds long.
    Supported formats: mp3, wav, m4a, flac, aac, ogg.

  • name is required, the voice name.
    Maximum length: 30 characters.

Responses
  • 200 OK

    {
      "email": "[email protected]",
      "id": "301234567890",
      "name": "My voice",
      "source": "USER",
      "audioUrl": "https://v15-kling.klingai.com/.../voice.quality.wav",
      "coverUrl": "https://s15-kling.klingai.com/kimg/.../cover.png",
      "duration": 8300
    }
    
  • 400 Bad Request

    The clip is shorter than 4.5 seconds or longer than 30 seconds, audioUrl can’t be fetched, or it is not an audio file.

    {
      "error": "audioUrl duration 2.8s must be between 4.5 and 30 seconds"
    }
    
  • 401 Unauthorized

    {
      "error": "Unauthorized",
      "code": 401
    }
    
Model
{ // TypeScript, all fields are optional
  email: string       // Kling account the voice was saved to
  id: string          // Use as voice_1 … voice_3 in POST /videos/omni (or use name)
  name: string
  source: 'USER'      // Your saved voice
  audioUrl: string    // The cleaned-up voice sample (.wav)
  coverUrl: string    // Cover image
  duration: number    // Voice length in milliseconds
}
Examples
  • curl -X POST "https://api.useapi.net/v1/kling/videos/voices" \
       -H "Content-Type: application/json" \
       -H "Authorization: Bearer …" \
       -d '{
         "email": "[email protected]",
         "audioUrl": "https://example.com/my-voice.mp3",
         "name": "My voice"
       }'
    
  • const token = "API token";
    const email = "Previously configured account email";
    const apiUrl = "https://api.useapi.net/v1/kling/videos/voices";
    const response = await fetch(apiUrl, {
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "Authorization": `Bearer ${token}`,
      },
      body: JSON.stringify({
        email: email,
        audioUrl: "https://example.com/my-voice.mp3",
        name: "My voice"
      })
    });
    const result = await response.json();
    console.log("response", {response, result});
    
  • import requests
    token = "API token"
    email = "Previously configured account email"
    apiUrl = "https://api.useapi.net/v1/kling/videos/voices"
    headers = {
        "Content-Type": "application/json",
        "Authorization" : f"Bearer {token}"
    }
    data = {
        "email": email,
        "audioUrl": "https://example.com/my-voice.mp3",
        "name": "My voice"
    }
    response = requests.post(apiUrl, headers=headers, json=data)
    print(response, response.json())
    
Try It