AI Product Image - Detection and Cutout

Description

This API is used to submit AI product image cutout requests.

Version

1.0

Image Requirements

Image formats: JPG and PNG.

API URL

    Production environment: https://openapi.meitu.com
    Task submission endpoint: https://openapi.meitu.com/api/v1/sdk/sync/push
    Task name (task): /design/enterprise/ai_product/sod
    Task type (task_type): formula

Method

POST

Content-Type: application/json

Authentication

Open Platform API Signature

Credits cannot be used to pay for API calls. Please visit the MV console to activate this API and purchase or manage resource packages.

Request Parameters

RequiredParameterTypeDescription
YesparamsstringAlgorithm parameters (JSON string)
Yesinit_imagesobject[]List of media files. For this API, pass one image to be cut out.
YestaskstringFixed value: /design/enterprise/ai_product/sod
Yestask_typestringFixed value: formula
Nosync_timeoutintDefaults to 30. Synchronous timeout duration.

The structure of each media file in init_images is described below.

RequiredParameterTypeDescription
YesurlstringImage URL or base64 data
YesprofileobjectAttribute information

profile attribute information

RequiredParameterTypeDescription
Yesmedia_profilesobjectMedia attribute information
YesversionstringFixed value: v1

media_profiles media attribute information

RequiredParameterTypeDescription
Yesmedia_data_typestringurl indicates a URL; jpg or png indicates base64 data in the corresponding format.

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

RequiredFieldTypeDescription
Norsp_media_typestringDefaults to url; jpg indicates base64 data.
YesparameterobjectCore algorithm parameter object

parameter algorithm parameter details

This algorithm has no additional parameters. Pass an empty object {} for parameter.

Request Example

{
  "task": "/design/enterprise/ai_product/sod",
  "task_type": "formula",
  "init_images": [
    {
      "url": "https://beauty-public.zone1.meitudata.com/Marvel/1687154827715.png",
      "profile": {
        "media_profiles": {
          "media_data_type": "url"
        },
        "version": "v1"
      }
    }
  ],
  "params": "{\"rsp_media_type\":\"url\",\"parameter\":{}}",
  "sync_timeout": 30
}

Response Fields

Note: Generated results are cleaned up periodically. 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. The value is 0 on 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 successfully; 1, processing; 2, failed; 9, timed out—use the query API; 10, succeeded.
resultobjectAlgorithm result
progressnumberTask progress
predict_elapsedintEstimated processing time, in milliseconds
create_timeint64Creation timestamp, in milliseconds
task_idstringTask ID
custom_task_idstringClient-defined task ID
trace_idstringTrace identifier
client_infostringClient information
init_imagesobject[]/nullEchoed input media

Fields in result

FieldTypeDescription
reqidstringUnique ID of the original algorithm request, used for troubleshooting
codeintOriginal algorithm status code. 0 indicates success; 11002 indicates that image cutout failed.
messagestringOriginal algorithm error message, returned on failure
urlstringComplete URL of the cutout result
heightintImage height, in pixels
widthintImage width, in pixels
xintX-coordinate of the image's starting point
yintY-coordinate of the image's starting point

Response Examples

Successful Response Example

{
  "request_id": "318fe2e6-bd9a-4572-b2ae-57cb7631347c",
  "trace_id": "318fe2e6-bd9a-4572-b2ae-57cb7631347c",
  "code": 0,
  "error_code": 0,
  "message": "success",
  "tips": null,
  "data": {
    "status": 10,
    "result": {
      "reqid": "318fe2e6-bd9a-4572-b2ae-57cb7631347c",
      "code": 0,
      "url": "抠图地址",
      "height": 550,
      "width": 286,
      "x": 1,
      "y": 0
    },
    "progress": 100,
    "predict_elapsed": 0,
    "create_time": 1687154827715,
    "task_id": "task_318fe2e6",
    "custom_task_id": "",
    "trace_id": "318fe2e6-bd9a-4572-b2ae-57cb7631347c",
    "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": "318fe2e6-bd9a-4572-b2ae-57cb7631347c",
  "trace_id": "318fe2e6-bd9a-4572-b2ae-57cb7631347c",
  "code": 0,
  "error_code": 0,
  "message": "processing",
  "tips": null,
  "data": {
    "status": 9,
    "result": {},
    "progress": 0,
    "predict_elapsed": 0,
    "create_time": 1687154827715,
    "task_id": "task_318fe2e6",
    "custom_task_id": "",
    "trace_id": "318fe2e6-bd9a-4572-b2ae-57cb7631347c",
    "client_info": "",
    "init_images": null
  }
}

Failed Response Example

Response Status: 400

Content-Type: application/json; charset=utf-8

{
  "request_id": "30dbb0b6-04be-4b7a-b59d-497081e48f1d",
  "trace_id": "30dbb0b6-04be-4b7a-b59d-497081e48f1d",
  "code": 11002,
  "error_code": 11002,
  "message": "抠图失败",
  "tips": null,
  "data": {
    "status": 2,
    "result": {
      "reqid": "30dbb0b6-04be-4b7a-b59d-497081e48f1d",
      "code": 11002,
      "message": "抠图失败"
    },
    "progress": 0,
    "predict_elapsed": 0,
    "create_time": 1687154827715,
    "task_id": "task_30dbb0b6",
    "custom_task_id": "",
    "trace_id": "30dbb0b6-04be-4b7a-b59d-497081e48f1d",
    "client_info": "",
    "init_images": null
  }
}

General Error Codes and Messages

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": "/design/enterprise/ai_product/sod",
        "task_type": "formula",
        "init_images": [
            {
                "url": "https://beauty-public.zone1.meitudata.com/Marvel/1687154827715.png",
                "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": "/design/enterprise/ai_product/sod",
  "task_type": "formula",
  "init_images": [{
    "url": "https://beauty-public.zone1.meitudata.com/Marvel/1687154827715.png",
    "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' => '/design/enterprise/ai_product/sod',
    'task_type' => 'formula',
    'init_images' => [
        [
            'url' => 'https://beauty-public.zone1.meitudata.com/Marvel/1687154827715.png',
            '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\": \"/design/enterprise/ai_product/sod\",\n" +
                "  \"task_type\": \"formula\",\n" +
                "  \"init_images\": [{\n" +
                "    \"url\": \"https://beauty-public.zone1.meitudata.com/Marvel/1687154827715.png\",\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);
        }
    }
}