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): formula

Method

POST

Content-Type: application/json

Authentication

Open Platform API Signature

Request Parameters

RequiredParameterTypeDescription
YesparamsstringAlgorithm parameters (JSON string)
Yesinit_imagesobject[]Media file list
YestaskstringFixed value: /v1/video_remove_watermark/485834
Yestask_typestringFixed value: formula
Nosync_timeoutintSynchronous timeout in seconds; default: 30

The structure of each media file in init_images is as follows:

RequiredParameterTypeDescription
YesurlstringVideo URL or base64-encoded data
YesprofileobjectAttribute information

The structure of profile is as follows:

RequiredParameterTypeDescription
Yesmedia_profilesobjectMedia attribute information
YesversionstringFixed value: v1

The structure of media_profiles is as follows:

RequiredParameterTypeDescription
Yesmedia_data_typestringurl indicates a URL; the corresponding media type indicates base64-encoded data

The params inference parameter is a JSON string with the following structure:

RequiredFieldTypeDescription
Norsp_media_typestringDefault: url; the corresponding media type indicates base64-encoded data
YesparameterobjectCore 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.
FieldTypeDescription
request_idstringRequest identifier
trace_idstringTrace identifier
codeintBusiness status code; 0 indicates that the request was accepted successfully
error_codeintError code; 0 indicates success
messagestringBusiness message
tipsanyAdditional information; may be null
dataobjectTask status and algorithm result

Fields in data:

FieldTypeDescription
statusintStatus code: -1 = task not found; 0 = created; 1 = running; 2 = failed; 9 = timed out, use the Query API; 10 = succeeded
resultobjectAlgorithm result
progressnumberTask progress; 1 indicates completion
predict_elapsedintEstimated processing time, in milliseconds
create_timeint64Creation timestamp, in milliseconds
task_idstringTask ID
custom_task_idstringCustom task ID supplied by the client
trace_idstringTrace identifier within data
client_infostringClient information
init_imagesobject[]/nullInput media echo

Fields in result:

FieldTypeDescription
idstringTask ID
urlsstring[]List of result file URLs
parametersobjectRequest parameter echo
dataobjectProcessing data
msgstringProcessing result message
msg_idstringMessage ID
imagesstring[]List of result file URLs
mtlab_resobjectDetailed response information
media_info_listobject[]Media information list
error_codeintAlgorithm error code; 20001 indicates a processing error
error_msgstringAlgorithm error message; PROCESS_ERROR indicates a processing error

Fields in parameters and data.parameter:

FieldTypeDescription
has_watermasknumberWhether the video contains a watermark; 1 indicates that it does
rsp_media_typestringResponse media type; url indicates a URL
versionstringCurrent API version

Fields in result.data:

FieldTypeDescription
durationobjectProcessing duration information
error_codenumberProcessing error code
error_msgstringProcessing error message
extraobjectAdditional information
media_info_listobject[]Media information list
msg_idstringMessage ID
parameterobjectRequest parameter echo

Fields in result.data.duration:

FieldTypeDescription
alg_process_timenumberAlgorithm processing time, in milliseconds
created_timestampnumberCreation timestamp, in seconds
pull_timestampnumberRetrieval timestamp, in seconds
repost_timenumberReposting time, in milliseconds
upload_timenumberUpload time, in milliseconds
waiting_timenumberWait time, in milliseconds

Fields in media_info_list:

FieldTypeDescription
media_datastringMedia file URL
media_extraobject/nullAdditional media information
media_profilesobjectDetailed media file description

Fields in media_profiles:

FieldTypeDescription
media_data_fpsnumberMedia file frame rate (frames per second)
media_data_heightnumberMedia file height
media_data_sizenumberMedia file size, in bytes
media_data_typestringMedia file type; url indicates that the file is accessed via a URL
media_data_widthnumberMedia file width

Fields in mtlab_res:

FieldTypeDescription
ErrorCodenumberError code returned by the algorithm
ErrorMsgstringError message returned by the algorithm
error_codenumberProcessing error code
error_msgstringProcessing error message
media_info_listobject[]/nullMedia information list
msg_idstringMessage ID
parameterobject/nullRequest 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);
        }
    }
}