# v2.1-standard/image-to-video

{% hint style="info" %}
This documentation is valid for the following list of our models:

* `kling-video/v2.1/standard/image-to-video`
{% endhint %}

## Model Overview

A cost-efficient variant of the Kling 2.1 model, yet supports 1080p.

## Setup your API Key

If you don’t have an API key for the AI/ML API yet, feel free to use our [Quickstart guide](https://docs.aimlapi.com/quickstart/setting-up).

## How to Make a Call

<details>

<summary>Step-by-Step Instructions</summary>

Generating a video using this model involves sequentially calling two endpoints:&#x20;

* The first one is for creating and sending a video generation task to the server (returns a generation ID).
* The second one is for requesting the generated video from the server using the generation ID received from the first endpoint.&#x20;

Below, you can find two corresponding API schemas and an example with both endpoint calls.

</details>

## API Schemas

### Create a video generation task and send it to the server

## POST /v2/generate/video/kling/generation

>

OpenAPI:

```json
{"openapi":"3.0.0","info":{"title":"AI/ML Gateway","version":"1.0"},"servers":[{"url":"https://api.aimlapi.com"}],"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"<YOUR_AIMLAPI_KEY>","type":"http","description":"Bearer key"}}},"paths":{"/v2/generate/video/kling/generation":{"post":{"operationId":"KlingControllerV2_createGeneration_v2","parameters":[],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"model":{"enum":["kling-video/v2.1/standard/image-to-video"]},"image_url":{"type":"string","description":"A direct link to an online image or a Base64-encoded local image that will serve as the visual base or the first frame for the video."},"tail_image_url":{"type":"string","description":"URL of the image to be used as the last frame of the video."},"static_mask":{"type":"string","description":"URL of the image for Static Brush Application Area (Mask image created by users using the motion brush)."},"dynamic_masks":{"type":"array","items":{"type":"object","properties":{"mask":{"type":"string"},"trajectories":{"type":"array","items":{"type":"object","properties":{"x":{"type":"integer"},"y":{"type":"integer"}},"required":["x","y"]},"minItems":2,"maxItems":77}},"required":["mask","trajectories"]},"maxItems":6,"description":"List of dynamic masks."},"camera_control":{"type":"object","properties":{"type":{"type":"string","enum":["simple","down_back","forward_up","right_turn_forward","left_turn_forward"]},"config":{"type":"object","properties":{"horizontal":{"type":"number","minimum":-10,"maximum":10},"vertical":{"type":"number","minimum":-10,"maximum":10},"pan":{"type":"number","minimum":-10,"maximum":10},"tilt":{"type":"number","minimum":-10,"maximum":10},"roll":{"type":"number","minimum":-10,"maximum":10},"zoom":{"type":"number","minimum":-10,"maximum":10}}}},"description":"Advanced camera control parameters."},"negative_prompt":{"type":"string","description":"The description of elements to avoid in the generated video."},"duration":{"type":"integer","description":"The length of the output video in seconds.","enum":[5,10]},"cfg_scale":{"type":"number","minimum":0,"maximum":1,"default":0.5,"description":"The CFG (Classifier Free Guidance) scale is a measure of how close you want the model to stick to your prompt."},"external_task_id":{"type":"string","description":"Customized Task ID"},"prompt":{"type":"string","description":"The text description of the scene, subject, or action to generate in the video."}},"required":["model","image_url"]}}}},"responses":{"201":{"description":""}},"tags":["Kling"]}}}}
```

### Retrieve the generated video from the server

After sending a request for video generation, this task is added to the queue. This endpoint lets you check the status of a video generation task using its `generation_id`, obtained from the endpoint described above.\
If the video generation task status is `complete`, the response will include the final result — with the generated video URL and additional metadata.

## GET /v2/generate/video/kling/generation

>

OpenAPI:

```json
{"openapi":"3.0.0","info":{"title":"AI/ML Gateway","version":"1.0"},"servers":[{"url":"https://api.aimlapi.com"}],"security":[{"access-token":[]}],"components":{"securitySchemes":{"access-token":{"scheme":"bearer","bearerFormat":"<YOUR_AIMLAPI_KEY>","type":"http","description":"Bearer key"}}},"paths":{"/v2/generate/video/kling/generation":{"get":{"operationId":"KlingControllerV2_fetchGeneration_v2","parameters":[{"name":"generation_id","required":true,"in":"query","schema":{"type":"string"}}],"responses":{"200":{"description":""}},"tags":["Kling"]}}}}
```

## Code Example (Python)

The code below creates a video generation task, then automatically polls the server every **10** seconds until it finally receives the video URL.

{% hint style="warning" %}
Generation may take around 3–4 minutes for a 5-second video and 6-8 minutes for a 10-second video.
{% endhint %}

{% tabs %}
{% tab title="Python" %}
<pre class="language-python" data-overflow="wrap"><code class="lang-python">import requests
import time

base_url = "https://api.aimlapi.com/v2"
api_key = "&#x3C;YOUR_AIMLAPI_KEY>"

# Creating and sending a video generation task to the server
def generate_video():
    url = f"{base_url}/generate/video/kling/generation"
    headers = {
        "Authorization": f"Bearer {api_key}", 
    }
<strong>
</strong>    data = {
        "model": "kling-video/v2.1/standard/image-to-video",
        "prompt": "Mona Lisa puts on glasses with her hands.",
        "image_url": "https://s2-111386.kwimgs.com/bs2/mmu-aiplatform-temp/kling/20240620/1.jpeg",
        "duration": "5",       
    }
 
    response = requests.post(url, json=data, headers=headers)
    
    if response.status_code >= 400:
        print(f"Error: {response.status_code} - {response.text}")
    else:
        response_data = response.json()
        # print(response_data)
        return response_data
    

# Requesting the result of the task from the server using the generation_id
def get_video(gen_id):
    url = f"{base_url}/generate/video/kling/generation"
    params = {
        "generation_id": gen_id,
    }
    
    # Insert your AIML API Key instead of &#x3C;YOUR_AIMLAPI_KEY>:
    headers = {
        "Authorization": f"Bearer {api_key}", 
        "Content-Type": "application/json"
        }

    response = requests.get(url, params=params, headers=headers)
    # print("Generation:", response.json())
    return response.json()



def main():
     # Running video generation and getting a task id
    gen_response = generate_video()
    gen_id = gen_response.get("id")
    print("Generation ID:  ", gen_id)

    # Trying to retrieve the video from the server every 10 sec
    if gen_id:
        start_time = time.time()

        timeout = 1000
        while time.time() - start_time &#x3C; timeout:
            response_data = get_video(gen_id)

            if response_data is None:
                print("Error: No response from API")
                break
        
            status = response_data.get("status")
            print("Status:", status)

            if status == "waiting" or status == "active" or  status == "queued" or status == "generating":
                print("Still waiting... Checking again in 10 seconds.")
                time.sleep(10)
            else:
                print("Processing complete:/n", response_data)
                return response_data
   
        print("Timeout reached. Stopping.")
        return None     


if __name__ == "__main__":
    main()
</code></pre>
{% endtab %}
{% endtabs %}

<details>

<summary>Response</summary>

{% code overflow="wrap" %}
```json5
Generation ID:   789339022468063304
Status: queued
Still waiting... Checking again in 10 seconds.
Status: generating
Still waiting... Checking again in 10 seconds.
Status: generating
Still waiting... Checking again in 10 seconds.
Status: generating
Still waiting... Checking again in 10 seconds.
Status: generating
Still waiting... Checking again in 10 seconds.
Status: generating
Still waiting... Checking again in 10 seconds.
Status: generating
Still waiting... Checking again in 10 seconds.
Status: generating
Still waiting... Checking again in 10 seconds.
Status: generating
Still waiting... Checking again in 10 seconds.
Status: generating
Still waiting... Checking again in 10 seconds.
Status: generating
Still waiting... Checking again in 10 seconds.
Status: generating
Still waiting... Checking again in 10 seconds.
Status: generating
Still waiting... Checking again in 10 seconds.
Status: generating
Still waiting... Checking again in 10 seconds.
Status: generating
Still waiting... Checking again in 10 seconds.
Status: generating
Still waiting... Checking again in 10 seconds.
Status: generating
Still waiting... Checking again in 10 seconds.
Status: completed
Processing complete:/n {'id': '789339022468063304', 'status': 'completed', 'video': {'url': 'https://v15-kling.klingai.com/bs2/upload-ylab-stunt-sgp/se/stream_lake_m2v_img2video_v21_master/56b24375-28fc-4569-a483-38d44fd8d4f1_raw_video.mp4?x-kcdn-pid=112372'}}
```
{% endcode %}

</details>

<details>

<summary>Generated Video</summary>

**Original**: [1180x1756](https://drive.google.com/file/d/18O8DdqFSNr845sH_VJT9jQOoDrEJS2xc/view?usp=sharing)

**Low-res GIF preview**:

<div align="left"><figure><img src="https://3927338786-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FROMd1X5PuqtikJ48n2N9%2Fuploads%2F5hS2jHGGyGH77qeblIiy%2Fv2.1-standard-image-to-video_preview.gif?alt=media&#x26;token=d6c222e3-08c0-4cfb-adc6-50fcb9a9e3a9" alt=""><figcaption><p><code>"prompt": "Mona Lisa puts on glasses with her hands."</code></p></figcaption></figure></div>

</details>
