AI Flashlight Reflector

Description

This API initiates an AI Flashlight Reflector task. After submission, the system executes the editing algorithm asynchronously. You can retrieve the result through the query API, or configure a timeout in the request to wait for the result.

Version

1.0

Image Requirements

  • JPG and PNG formats are supported.

API URL

    Production environment: https://openapi.meitu.com
    Task submission endpoint: https://openapi.meitu.com/api/v1/sdk/sync/push
    Task name (task): /v1/ai_flashlight/485030
    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[]List of media files; this API accepts one input image
YestaskstringFixed value: /v1/ai_flashlight/485030
Yestask_typestringFixed value: formula
Nosync_timeoutintDefaults to 30; synchronous timeout. The source document also states that -1 means not to wait

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

RequiredParameterTypeDescription
YesurlstringImage URL or base64 data
YesprofileobjectAttribute information

The profile attribute information is structured as follows:

RequiredParameterTypeDescription
Yesmedia_profilesobjectMedia attribute information
YesversionstringFixed value: v1

The media_profiles media attribute information is structured as follows:

RequiredParameterTypeDescription
Yesmedia_data_typestringurl indicates a URL; jpg indicates JPG base64 data

The params inference parameters are provided as a JSON string with the following structure:

RequiredFieldTypeDescription
Norsp_media_typestringDefaults to url; jpg indicates base64 data
YesparameterobjectCore algorithm parameters

Details of the parameter algorithm parameters:

RequiredParameterTypeDescription
NomodestringDefaults to 110, which represents normal flash; 111 represents a light panel; 112 represents Flash v2. The original input example once used the undefined value 100, whose meaning was not specified in the source document
Nolight_threshstringLighting-effect threshold; defaults to 80; range: 0255
Nolut_flagintLUT filter switch; defaults to 0 (off); 1 means on
Nostep_numintInference deployment; defaults to 10

Request Example

{
  "task": "/v1/ai_flashlight/485030",
  "task_type": "formula",
  "init_images": [
    {
      "url": "https://example.com/input.jpg",
      "profile": {
        "media_profiles": {
          "media_data_type": "url"
        },
        "version": "v1"
      }
    }
  ],
  "params": "{\"rsp_media_type\":\"url\",\"parameter\":{\"mode\":\"110\",\"light_thresh\":\"80\",\"lut_flag\":0,\"step_num\":10}}",
  "sync_timeout": 30
}

Response Fields

Note: 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 on success
messagestringBusiness message
tipsanyAdditional information; may be null
dataobjectTask status and algorithm result

Fields in the data object:

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[]/nullInput media echoed by the service

Fields in the result object:

FieldTypeDescription
idstringTask ID
urlsstring[]List of result image URLs
parametersobjectResult parameters
dataobjectAlgorithm processing information
msglong/stringProcessing message; the original field table specifies long, while the original response example uses string
msg_idstringMessage ID
media_info_listobject[]Media information list; the original field table places it in result, while the original response example places it in result.data
codeintAlgorithm error code; appears only in failed results

Fields in result.parameters:

FieldTypeDescription
light_flagstringWhether a lighting effect was detected; the original example value is True, and the source document provides no enumeration definition
rsp_media_typestringResponse media type
versionstringAlgorithm version

Fields in result.data:

FieldTypeDescription
durationobjectProcessing durations and timestamps for each stage
error_codeintAlgorithm error code
error_msgstringAlgorithm error message
extraobjectAdditional information
media_info_listobject[]Media information list
msg_idstringMessage ID
parameterobject/nullAlgorithm parameters in a failed result; null in the original failure example

Fields in result.data.duration:

FieldTypeDescription
alg_process_timeintAlgorithm processing time
created_timestampintCreation timestamp
pull_timestampintPull timestamp
repost_timeintForwarding time
upload_timeintUpload time
waiting_timeintWaiting time

Fields in each element of result.data.media_info_list:

FieldTypeDescription
media_datastringResult media URL
media_profilesobjectResult media attributes

Fields in media_profiles:

FieldTypeDescription
media_data_heightintResult image height
media_data_sizeintResult image size
media_data_typestringResult media data type
media_data_widthintResult image width

Response Examples

Successful Response Example

{
  "request_id": "",
  "trace_id": "c50a38db-4a62-46fa-99a5-fc65fda0eab9",
  "code": 0,
  "error_code": 0,
  "message": "success",
  "tips": null,
  "data": {
    "status": 10,
    "result": {
      "id": "t_mt1a3i5n7b8193eb31-0052-4ad7-ad60-1dc53b9b8de5",
      "urls": [
        "https://obs-large.mtlab.meitu.com/mtopen/4e200dc6bf574fee899cf9e0dabe27e6/2985aafb-d069-4dbd-4861-7f1d39637da1/2985aafb-d069-4dbd-4861-7f1d39637da1.jpeg"
      ],
      "parameters": {
        "light_flag": "True",
        "rsp_media_type": "url",
        "version": "1.0.8-5090"
      },
      "data": {
        "duration": {
          "alg_process_time": 6869,
          "created_timestamp": 1765165589,
          "pull_timestamp": 1765165589,
          "repost_time": 0,
          "upload_time": 132,
          "waiting_time": 23
        },
        "error_code": 0,
        "error_msg": "success",
        "extra": {},
        "media_info_list": [
          {
            "media_data": "https://obs-large.mtlab.meitu.com/mtopen/4e200dc6bf574fee899cf9e0dabe27e6/2985aafb-d069-4dbd-4861-7f1d39637da1/2985aafb-d069-4dbd-4861-7f1d39637da1.jpeg",
            "media_profiles": {
              "media_data_height": 2227,
              "media_data_size": 913520,
              "media_data_type": "url",
              "media_data_width": 1655
            }
          }
        ],
        "msg_id": "1bd4011d-4732-4907-a0a6-1b65033e865e"
      },
      "msg": "success",
      "msg_id": "1bd4011d-4732-4907-a0a6-1b65033e865e"
    },
    "progress": 1,
    "predict_elapsed": 10000,
    "create_time": 1765165589531,
    "task_id": "t_mt1a3i5n7b8193eb31-0052-4ad7-ad60-1dc53b9b8de5",
    "custom_task_id": "",
    "trace_id": "c50a38db-4a62-46fa-99a5-fc65fda0eab9",
    "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_mt1a3i5n7b3da6d589-46b5-4f66-a0bb-8dd22f2a172e"
    },
    "progress": 0,
    "predict_elapsed": 10000,
    "create_time": 1759202368761,
    "task_id": "t_mt1a3i5n7b3da6d589-46b5-4f66-a0bb-8dd22f2a172e",
    "custom_task_id": "",
    "trace_id": "9129a3a2-99c4-46ce-8731-0e100e2fbee7",
    "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": "ALGO_MODEL_CRASH",
  "tips": null,
  "data": {
    "status": 2,
    "result": {
      "id": "t_mt1a3i5n7be8d575cc-2ffb-4e0c-85a8-1824110e31b8",
      "code": 20001,
      "data": {
        "duration": {
          "alg_process_time": 0,
          "created_timestamp": 1759201989,
          "pull_timestamp": 1759201989,
          "repost_time": 0,
          "upload_time": 0,
          "waiting_time": 0
        },
        "error_code": 20001,
        "error_msg": "ALGO_MODEL_CRASH",
        "extra": {},
        "media_info_list": [],
        "msg_id": "c1b09cb2-6e05-4d21-55ab-r007b1f21bec",
        "parameter": null
      },
      "msg": "ALGO_MODEL_CRASH",
      "msg_id": "c1b09cb2-6e05-4d21-55ab-r007b1f21bec"
    },
    "progress": 1,
    "predict_elapsed": 10000,
    "create_time": 1759201989444,
    "task_id": "t_mt1a3i5n7be8d575cc-2ffb-4e0c-85a8-1824110e31b8",
    "custom_task_id": "",
    "trace_id": "",
    "client_info": "",
    "init_images": null
  }
}

The API-specific error listed in the source document is 20001 (PROCESS_ERROR), described as “processing error.” The original failure example uses ALGO_MODEL_CRASH for the same error code. This document preserves that source discrepancy without inferring a relationship between the two values.

General Error Codes

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": {
            "mode": "110",
            "light_thresh": "80",
            "lut_flag": 0,
            "step_num": 10,
        },
    }
    payload = {
        "task": "/v1/ai_flashlight/485030",
        "task_type": "formula",
        "init_images": [
            {
                "url": "https://example.com/input.jpg",
                "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/ai_flashlight/485030",
  "task_type": "formula",
  "init_images": [{
    "url": "https://example.com/input.jpg",
    "profile": {
      "media_profiles": {"media_data_type": "url"},
      "version": "v1"
    }
  }],
  "params": "{\"rsp_media_type\":\"url\",\"parameter\":{\"mode\":\"110\",\"light_thresh\":\"80\",\"lut_flag\":0,\"step_num\":10}}",
  "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' => [
        'mode' => '110',
        'light_thresh' => '80',
        'lut_flag' => 0,
        'step_num' => 10,
    ],
]);

$body = json_encode([
    'task' => '/v1/ai_flashlight/485030',
    'task_type' => 'formula',
    'init_images' => [
        [
            'url' => 'https://example.com/input.jpg',
            '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/ai_flashlight/485030\",\n" +
                "  \"task_type\": \"formula\",\n" +
                "  \"init_images\": [{\n" +
                "    \"url\": \"https://example.com/input.jpg\",\n" +
                "    \"profile\": {\n" +
                "      \"media_profiles\": {\"media_data_type\": \"url\"},\n" +
                "      \"version\": \"v1\"\n" +
                "    }\n" +
                "  }],\n" +
                "  \"params\": \"{\\\"rsp_media_type\\\":\\\"url\\\",\\\"parameter\\\":{\\\"mode\\\":\\\"110\\\",\\\"light_thresh\\\":\\\"80\\\",\\\"lut_flag\\\":0,\\\"step_num\\\":10}}\",\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);
        }
    }
}