# VEED Lipsync 2.0

VIDEOFeaturedveed-lipsync-2

**VEED Lipsync 2.0** from [VEED](https://www.veed.io/) is a production-quality lipsync model that re-articulates the mouth movements in a source video to match any new audio track. Simply provide a talking-head video and a replacement voice or dubbed audio clip, and it regenerates natural, accurately synced lip motion at the source video’s resolution. It is ideal for redubbing footage, localizing content into new languages, and repurposing recorded performances without a reshoot.

Best for

Redubbing existing footage with a new voice track, Localizing talking-head videos into other languages

POST

/v2/workspaces/{workspace\_id}/base-models/veed-lipsync-2/inferences

```bash
curl --request POST \
  --url https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/veed-lipsync-2/inferences \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '{
  "guidance_file_init_video": [
    {
      "url": "<file_url>"
    }
  ],
  "guidance_file_reference_audio": [
    {
      "url": "<file_url>"
    }
  ]
}'
```

```python
import requests


url = "https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/veed-lipsync-2/inferences"


payload = {
    "guidance_file_init_video": [{ "url": "<file_url>" }],
    "guidance_file_reference_audio": [{ "url": "<file_url>" }]
}
headers = {
    "Authorization": "Bearer <token>",
    "Content-Type": "application/json"
}


response = requests.post(url, json=payload, headers=headers)


print(response.json())
```

```js
const url = 'https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/veed-lipsync-2/inferences';
const options = {
  method: 'POST',
  headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
  body: '{"guidance_file_init_video":[{"url":"<file_url>"}],"guidance_file_reference_audio":[{"url":"<file_url>"}]}'
};


try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main


import (
  "fmt"
  "strings"
  "net/http"
  "io"
)


func main() {


  url := "https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/veed-lipsync-2/inferences"


  payload := strings.NewReader("{\n  \"guidance_file_init_video\": [\n    {\n      \"url\": \"<file_url>\"\n    }\n  ],\n  \"guidance_file_reference_audio\": [\n    {\n      \"url\": \"<file_url>\"\n    }\n  ]\n}")


  req, _ := http.NewRequest("POST", url, payload)


  req.Header.Add("Authorization", "Bearer <token>")
  req.Header.Add("Content-Type", "application/json")


  res, _ := http.DefaultClient.Do(req)


  defer res.Body.Close()
  body, _ := io.ReadAll(res.Body)


  fmt.Println(res)
  fmt.Println(string(body))


}
```

```php
<?php


$curl = curl_init();


curl_setopt_array($curl, [
  CURLOPT_URL => "https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/veed-lipsync-2/inferences",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "POST",
  CURLOPT_POSTFIELDS => json_encode([
    'guidance_file_init_video' => [
        [
                'url' => '<file_url>'
        ]
    ],
    'guidance_file_reference_audio' => [
        [
                'url' => '<file_url>'
        ]
    ]
  ]),
  CURLOPT_HTTPHEADER => [
    "Authorization: Bearer <token>",
    "Content-Type: application/json"
  ],
]);


$response = curl_exec($curl);
$err = curl_error($curl);


curl_close($curl);


if ($err) {
  echo "cURL Error #:" . $err;
} else {
  echo $response;
}
```

```java
OkHttpClient client = new OkHttpClient();


MediaType mediaType = MediaType.parse("application/json");
RequestBody body = RequestBody.create(mediaType, "{\n  \"guidance_file_init_video\": [\n    {\n      \"url\": \"<file_url>\"\n    }\n  ],\n  \"guidance_file_reference_audio\": [\n    {\n      \"url\": \"<file_url>\"\n    }\n  ]\n}");
Request request = new Request.Builder()
  .url("https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/veed-lipsync-2/inferences")
  .post(body)
  .addHeader("Authorization", "Bearer <token>")
  .addHeader("Content-Type", "application/json")
  .build();


Response response = client.newCall(request).execute();
```

```ruby
require 'uri'
require 'net/http'


url = URI("https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/veed-lipsync-2/inferences")


http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true


request = Net::HTTP::Post.new(url)
request["Authorization"] = 'Bearer <token>'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"guidance_file_init_video\": [\n    {\n      \"url\": \"<file_url>\"\n    }\n  ],\n  \"guidance_file_reference_audio\": [\n    {\n      \"url\": \"<file_url>\"\n    }\n  ]\n}"


response = http.request(request)
puts response.read_body
```

```csharp
var client = new RestClient("https://api.app.layer.ai/api/v2/workspaces/:workspace_id/base-models/veed-lipsync-2/inferences");
var request = new RestRequest("", Method.Post);
request.AddHeader("Authorization", "Bearer <token>");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"guidance_file_init_video\": [\n    {\n      \"url\": \"<file_url>\"\n    }\n  ],\n  \"guidance_file_reference_audio\": [\n    {\n      \"url\": \"<file_url>\"\n    }\n  ]\n}", ParameterType.RequestBody);
var response = client.Execute(request);
```

* Production

## Authorizations

* **[bearerAuth](/docs/v2/rest-api#bearerauth)**

## Parameters

### Path Parameters

**workspace\_id**

required

_Workspace Id_

Id of the workspace that owns the resource.

string format: uuid

Id of the workspace that owns the resource.

### Query Parameters

**session\_name**

Any of:

**string**

string

**null**

null

Organize this run under a named session. A new session is created if none matches.

## Request Bodyrequired

_VEED Lipsync 2.0_object

**guidance\_file\_init\_video**

required

_Source video_

The video to modify

Array<object>

\>= 1 items

_InferenceFormFileRef_

A single guidance/reference file supplied to a `reference_image_list` field.

The slot’s guidance `type` is fixed by the field it’s attached to; the caller supplies the file URL and, where the model supports per-file weighting, a weight.

object

**url**

required

_Url_

string

**weight**

_Weight_

number

nullable

**guidance\_file\_reference\_audio**

required

_Reference audio_

Guides style and voice without being modified

Array<object>

\>= 1 items

_InferenceFormFileRef_

A single guidance/reference file supplied to a `reference_image_list` field.

The slot’s guidance `type` is fixed by the field it’s attached to; the caller supplies the file URL and, where the model supports per-file weighting, a weight.

object

**url**

required

_Url_

string

**weight**

_Weight_

number

nullable

##### Example

```json
{
  "guidance_file_init_video": [
    {
      "url": "<file_url>"
    }
  ],
  "guidance_file_reference_audio": [
    {
      "url": "<file_url>"
    }
  ]
}
```

## Responses

### 202

Successful Response

_ExecuteForgeOutput_object

**inference\_id**

required

_Inference Id_

Unique identifier for this forge run.

string format: uuid

**status**

required

_InferenceStatus_

Current status: IN\_PROGRESS.

string

Allowed values: in\_progress complete failed cancelled deleted

**estimated\_price\_creative\_units**

Any of:

**number**

number

**null**

null

**poll\_interval\_seconds**

required

_Poll Interval Seconds_

Suggested polling interval in seconds.

integer

**created\_at**

required

_Created At_

Timestamp of when the run was created.

string format: date-time

**session\_id**

Any of:

**string**

string format: uuid

**null**

null

**normalized\_parameters**

Any of:

**NormalizedInferenceParameters**

_NormalizedInferenceParameters_

Inference parameters after model-specific normalization.

These reflect the actual values used for generation, including model defaults applied for any parameters not explicitly set.

object

**width**

Any of:

**null**

integer

**integer**

null

**height**

Any of:

**null**

integer

**integer**

null

**batch\_size**

Any of:

**null**

integer

**integer**

null

**num\_inference\_steps**

Any of:

**null**

integer

**integer**

null

**guidance\_scale**

Any of:

**null**

number

**number**

null

**duration\_seconds**

Any of:

**null**

number

**number**

null

**fps**

Any of:

**null**

integer

**integer**

null

**null**

null

##### Example

```json
{
  "status": "in_progress"
}
```

### 401

Unauthenticated — missing or invalid Bearer token.

object

**type**

required

string

**title**

required

string

**status**

required

integer

**detail**

required

string

##### Example

```json
{
  "type": "https://api.layer.ai/errors/ERROR_CODE",
  "title": "Error Title",
  "status": 400,
  "detail": "Human-readable description."
}
```

### 403

Forbidden — insufficient permissions.

object

**type**

required

string

**title**

required

string

**status**

required

integer

**detail**

required

string

##### Example

```json
{
  "type": "https://api.layer.ai/errors/ERROR_CODE",
  "title": "Error Title",
  "status": 400,
  "detail": "Human-readable description."
}
```

### 404

Resource not found.

object

**type**

required

string

**title**

required

string

**status**

required

integer

**detail**

required

string

##### Example

```json
{
  "type": "https://api.layer.ai/errors/ERROR_CODE",
  "title": "Error Title",
  "status": 400,
  "detail": "Human-readable description."
}
```

### 422

Invalid input parameters.

object

**type**

required

string

**title**

required

string

**status**

required

integer

**detail**

required

string

##### Example

```json
{
  "type": "https://api.layer.ai/errors/ERROR_CODE",
  "title": "Error Title",
  "status": 400,
  "detail": "Human-readable description."
}
```

### 429

Rate limited — too many concurrent requests.

object

**type**

required

string

**title**

required

string

**status**

required

integer

**detail**

required

string

##### Example

```json
{
  "type": "https://api.layer.ai/errors/ERROR_CODE",
  "title": "Error Title",
  "status": 400,
  "detail": "Human-readable description."
}
```

### 500

Internal server error.

object

**type**

required

string

**title**

required

string

**status**

required

integer

**detail**

required

string

##### Example

```json
{
  "type": "https://api.layer.ai/errors/ERROR_CODE",
  "title": "Error Title",
  "status": 400,
  "detail": "Human-readable description."
}
```
