Video Watermark Removal
Description
This API starts a video watermark removal task. The algorithm runs after the task is submitted. If the task does not finish within the synchronous wait time, use the Query API to retrieve the result.
Version
1.0
Media Requirements
- Video formats: MP4, MOV, and others.
- Media file size: less than 30 MB.
API URL
Production environment: https://openapi.meitu.com
Task submission endpoint: https://openapi.meitu.com/api/v1/sdk/sync/push
Task name (task): /v1/video_remove_watermark/485834
Task type (task_type): formulaMethod
POST
Content-Type: application/json
Authentication
Request Parameters
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | params | string | Algorithm parameters (JSON string) |
| Yes | init_images | object[] | Media file list |
| Yes | task | string | Fixed value: /v1/video_remove_watermark/485834 |
| Yes | task_type | string | Fixed value: formula |
| No | sync_timeout | int | Synchronous timeout in seconds; default: 30 |
The structure of each media file in init_images is as follows:
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | url | string | Video URL or base64-encoded data |
| Yes | profile | object | Attribute information |
The structure of profile is as follows:
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | media_profiles | object | Media attribute information |
| Yes | version | string | Fixed value: v1 |
The structure of media_profiles is as follows:
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | media_data_type | string | url indicates a URL; the corresponding media type indicates base64-encoded data |
The params inference parameter is a JSON string with the following structure:
| Required | Field | Type | Description |
|---|---|---|---|
| No | rsp_media_type | string | Default: url; the corresponding media type indicates base64-encoded data |
| Yes | parameter | object | Core algorithm parameter object |
Algorithm parameters in parameter:
The source documentation does not define any additional algorithm parameters. Pass an empty object {} when calling the API.
Request Example
{
"task": "/v1/video_remove_watermark/485834",
"task_type": "formula",
"init_images": [
{
"url": "https://obs.mtlab.meitu.com/public/EtRGxLI8ulQ43pGhuZfym9aYUD2PUbMP/MTcyNTM3MjAwMA==/661349ed-1c72-4b61-5e4d-9578f8a99c55.mp4",
"profile": {
"media_profiles": {
"media_data_type": "url"
},
"version": "v1"
}
}
],
"params": "{\"rsp_media_type\":\"url\",\"parameter\":{}}",
"sync_timeout": 30
}Response Fields
Generated results are periodically deleted. Download and save them promptly.| Field | Type | Description |
|---|---|---|
| request_id | string | Request identifier |
| trace_id | string | Trace identifier |
| code | int | Business status code; 0 indicates that the request was accepted successfully |
| error_code | int | Error code; 0 indicates success |
| message | string | Business message |
| tips | any | Additional information; may be null |
| data | object | Task status and algorithm result |
Fields in data:
| Field | Type | Description |
|---|---|---|
| status | int | Status code: -1 = task not found; 0 = created; 1 = running; 2 = failed; 9 = timed out, use the Query API; 10 = succeeded |
| result | object | Algorithm result |
| progress | number | Task progress; 1 indicates completion |
| predict_elapsed | int | Estimated processing time, in milliseconds |
| create_time | int64 | Creation timestamp, in milliseconds |
| task_id | string | Task ID |
| custom_task_id | string | Custom task ID supplied by the client |
| trace_id | string | Trace identifier within data |
| client_info | string | Client information |
| init_images | object[]/null | Input media echo |
Fields in result:
| Field | Type | Description |
|---|---|---|
| id | string | Task ID |
| urls | string[] | List of result file URLs |
| parameters | object | Request parameter echo |
| data | object | Processing data |
| msg | string | Processing result message |
| msg_id | string | Message ID |
| images | string[] | List of result file URLs |
| mtlab_res | object | Detailed response information |
| media_info_list | object[] | Media information list |
| error_code | int | Algorithm error code; 20001 indicates a processing error |
| error_msg | string | Algorithm error message; PROCESS_ERROR indicates a processing error |
Fields in parameters and data.parameter:
| Field | Type | Description |
|---|---|---|
| has_watermask | number | Whether the video contains a watermark; 1 indicates that it does |
| rsp_media_type | string | Response media type; url indicates a URL |
| version | string | Current API version |
Fields in result.data:
| Field | Type | Description |
|---|---|---|
| duration | object | Processing duration information |
| error_code | number | Processing error code |
| error_msg | string | Processing error message |
| extra | object | Additional information |
| media_info_list | object[] | Media information list |
| msg_id | string | Message ID |
| parameter | object | Request parameter echo |
Fields in result.data.duration:
| Field | Type | Description |
|---|---|---|
| alg_process_time | number | Algorithm processing time, in milliseconds |
| created_timestamp | number | Creation timestamp, in seconds |
| pull_timestamp | number | Retrieval timestamp, in seconds |
| repost_time | number | Reposting time, in milliseconds |
| upload_time | number | Upload time, in milliseconds |
| waiting_time | number | Wait time, in milliseconds |
Fields in media_info_list:
| Field | Type | Description |
|---|---|---|
| media_data | string | Media file URL |
| media_extra | object/null | Additional media information |
| media_profiles | object | Detailed media file description |
Fields in media_profiles:
| Field | Type | Description |
|---|---|---|
| media_data_fps | number | Media file frame rate (frames per second) |
| media_data_height | number | Media file height |
| media_data_size | number | Media file size, in bytes |
| media_data_type | string | Media file type; url indicates that the file is accessed via a URL |
| media_data_width | number | Media file width |
Fields in mtlab_res:
| Field | Type | Description |
|---|---|---|
| ErrorCode | number | Error code returned by the algorithm |
| ErrorMsg | string | Error message returned by the algorithm |
| error_code | number | Processing error code |
| error_msg | string | Processing error message |
| media_info_list | object[]/null | Media information list |
| msg_id | string | Message ID |
| parameter | object/null | Request parameter echo |
Response Examples
Successful Response Example
{
"request_id": "",
"trace_id": "",
"code": 0,
"error_code": 0,
"message": "success",
"tips": null,
"data": {
"status": 10,
"result": {
"id": "t_mt1a3i5n7b21d712e6-xxxx-4924-a90e-f94620d5f929",
"urls": [
"https://obs-large.mtlab.meitu.com/mtopen/ff56d688358849259556be0f50065a60/abf1726b-180a-4fb4-598a-7a575808bd09.mp4"
],
"parameters": {
"has_watermask": 1,
"rsp_media_type": "url",
"version": "videowmclear version: 2.5.3"
},
"data": {
"duration": {
"alg_process_time": 114312,
"created_timestamp": 1767060022,
"pull_timestamp": 1767060023,
"repost_time": 0,
"upload_time": 204,
"waiting_time": 3126
},
"error_code": 0,
"error_msg": "success",
"extra": {},
"media_info_list": [
{
"media_data": "https://obs-large.mtlab.meitu.com/mtopen/ff56d688358849259556be0f50065a60/abf1726b-180a-4fb4-598a-7a575808bd09.mp4",
"media_extra": null,
"media_profiles": {
"media_data_fps": 30,
"media_data_height": 1280,
"media_data_size": 2792580,
"media_data_type": "url",
"media_data_width": 720
}
}
],
"msg_id": "42589892-xxxx-4109-61e8-r00904d8d432",
"parameter": {
"has_watermask": 1,
"rsp_media_type": "url",
"version": "videowmclear version: 2.5.3"
}
},
"msg": "success",
"msg_id": "42589892-xxxx-4109-61e8-r00904d8d432",
"images": [
"https://obs-large.mtlab.meitu.com/mtopen/ff56d688358849259556be0f50065a60/abf1726b-180a-4fb4-598a-7a575808bd09.mp4"
],
"mtlab_res": {
"ErrorCode": 0,
"ErrorMsg": "",
"error_code": 0,
"error_msg": "",
"media_info_list": null,
"msg_id": "42589892-xxxx-4109-61e8-r00904d8d432",
"parameter": null
},
"media_info_list": [
{
"media_data": "https://obs-large.mtlab.meitu.com/mtopen/ff56d688358849259556be0f50065a60/abf1726b-180a-4fb4-598a-7a575808bd09.mp4",
"media_extra": null,
"media_profiles": {
"media_data_fps": 30,
"media_data_height": 1280,
"media_data_size": 2792580,
"media_data_type": "url",
"media_data_width": 720
}
}
]
},
"progress": 1,
"predict_elapsed": 10000,
"create_time": 1767060022600,
"task_id": "t_mt1a3i5n7b21d712e6-xxxx-4924-a90e-f94620d5f929",
"custom_task_id": "",
"trace_id": "",
"client_info": "",
"init_images": null
}
}Query-Required Response Example
Use the Query API to retrieve the result.
Response Status: 200
Content-Type: application/json; charset=utf-8
{
"request_id": "",
"trace_id": "",
"code": 0,
"error_code": 0,
"message": "success",
"tips": null,
"data": {
"status": 9,
"result": {
"id": "t_mt1a3i5n7b21d712e6-xxxx-4924-a90e-f94620d5f929"
},
"progress": 0,
"predict_elapsed": 10000,
"create_time": 1767060022600,
"task_id": "t_mt1a3i5n7b21d712e6-xxxx-4924-a90e-f94620d5f929",
"custom_task_id": "",
"trace_id": "366cfb8d-xxxx-4beb-b266-05c177afb8a1",
"client_info": "",
"init_images": null
}
}Failed Response Example
Response Status: 400
Content-Type: application/json; charset=utf-8
{
"request_id": "",
"trace_id": "",
"code": 20001,
"error_code": 20001,
"message": "PROCESS_ERROR",
"tips": null,
"data": {
"status": 2,
"result": {
"error_code": 20001,
"error_msg": "PROCESS_ERROR"
},
"progress": 0,
"predict_elapsed": 0,
"create_time": 1767060022600,
"task_id": "t_mt1a3i5n7b21d712e6-xxxx-4924-a90e-f94620d5f929",
"custom_task_id": "",
"trace_id": "",
"client_info": "",
"init_images": null
}
}General Error Codes
API-specific error: 20001 (PROCESS_ERROR), indicating a processing error.
See API Error Codes for details.
SDK Examples
Python
import json
import requests
from sign_sdk import sign
def api_call_example():
key = "your_api_key"
secret = "your_api_secret"
url = "https://openapi.meitu.com/api/v1/sdk/sync/push"
method = "POST"
headers = {
"Content-Type": "application/json",
sign.HeaderHost: "openapi.meitu.com",
}
inner_params = {
"rsp_media_type": "url",
"parameter": {},
}
payload = {
"task": "/v1/video_remove_watermark/485834",
"task_type": "formula",
"init_images": [
{
"url": "https://example.com/input.mp4",
"profile": {
"media_profiles": {"media_data_type": "url"},
"version": "v1",
},
}
],
"params": json.dumps(inner_params, ensure_ascii=False),
"sync_timeout": 30,
}
body = json.dumps(payload, ensure_ascii=False)
signer = sign.Signer(key, secret)
signed_request = signer.sign(url, method, headers, body)
response = requests.Session().send(signed_request)
print(f"Status: {response.status_code}")
print(f"Response: {response.text}")
if __name__ == "__main__":
api_call_example()Go
package main
import (
"fmt"
"io"
"net/http"
"github.com/mtlab/api/signer"
)
func main() {
key := "your_api_key"
secret := "your_api_secret"
signObj := signer.NewSigner(key, secret)
url := "https://openapi.meitu.com/api/v1/sdk/sync/push"
method := http.MethodPost
headers := make(http.Header)
headers.Set(signer.HeaderHost, "openapi.meitu.com")
headers.Set("Content-Type", "application/json")
body := `{
"task": "/v1/video_remove_watermark/485834",
"task_type": "formula",
"init_images": [{
"url": "https://example.com/input.mp4",
"profile": {
"media_profiles": {"media_data_type": "url"},
"version": "v1"
}
}],
"params": "{\"rsp_media_type\":\"url\",\"parameter\":{}}",
"sync_timeout": 30
}`
req, err := signObj.Sign(url, method, headers, body)
if err != nil {
fmt.Println("Failed to sign request:", err)
return
}
resp, err := http.DefaultClient.Do(req)
if err != nil {
fmt.Println("Failed to send request:", err)
return
}
defer resp.Body.Close()
responseBody, err := io.ReadAll(resp.Body)
if err != nil {
fmt.Println("Read response failed:", err)
return
}
fmt.Println("Response:", resp.StatusCode, string(responseBody))
}PHP
<?php
require 'signer.php';
$key = 'your_api_key';
$secret = 'your_api_secret';
$signer = new Signer($key, $secret);
$url = 'https://openapi.meitu.com/api/v1/sdk/sync/push';
$method = 'POST';
$headers = ['Content-Type' => 'application/json'];
$innerParams = json_encode([
'rsp_media_type' => 'url',
'parameter' => (object) [],
]);
$body = json_encode([
'task' => '/v1/video_remove_watermark/485834',
'task_type' => 'formula',
'init_images' => [
[
'url' => 'https://example.com/input.mp4',
'profile' => [
'media_profiles' => ['media_data_type' => 'url'],
'version' => 'v1',
],
],
],
'params' => $innerParams,
'sync_timeout' => 30,
]);
$curl = $signer->sign($url, $method, $headers, $body);
$response = curl_exec($curl);
$status = curl_getinfo($curl, CURLINFO_HTTP_CODE);
if ($status === 0) {
echo 'Error: ' . curl_error($curl);
} else {
echo "Status: {$status}\n";
echo "Response: {$response}\n";
}
curl_close($curl);
?>Java
package com.meitu.openai.common;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
public class Main {
public static void main(String[] args) throws Exception {
Signer signer = new Signer("your_api_key", "your_api_secret");
String url = "https://openapi.meitu.com/api/v1/sdk/sync/push";
String method = "POST";
Map<String, String> headers = new HashMap<>();
headers.put("Content-Type", "application/json");
headers.put(Signer.HeaderHost, "openapi.meitu.com");
String body = "{\n" +
" \"task\": \"/v1/video_remove_watermark/485834\",\n" +
" \"task_type\": \"formula\",\n" +
" \"init_images\": [{\n" +
" \"url\": \"https://example.com/input.mp4\",\n" +
" \"profile\": {\n" +
" \"media_profiles\": {\"media_data_type\": \"url\"},\n" +
" \"version\": \"v1\"\n" +
" }\n" +
" }],\n" +
" \"params\": \"{\\\"rsp_media_type\\\":\\\"url\\\",\\\"parameter\\\":{}}\",\n" +
" \"sync_timeout\": 30\n" +
"}";
Map<String, String> signedHeaders = signer.sign(url, method, headers, body);
HttpURLConnection connection = (HttpURLConnection) new URL(url).openConnection();
connection.setRequestMethod(method);
for (Map.Entry<String, String> entry : signedHeaders.entrySet()) {
connection.setRequestProperty(entry.getKey(), entry.getValue());
}
connection.setDoOutput(true);
connection.getOutputStream().write(body.getBytes(StandardCharsets.UTF_8));
int status = connection.getResponseCode();
InputStream stream = status >= 400
? connection.getErrorStream()
: connection.getInputStream();
try (BufferedReader reader = new BufferedReader(new InputStreamReader(stream))) {
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
System.out.println("Response: " + status + " " + response);
}
}
}