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): formulaMethod
POST
Content-Type: application/json
Authentication
Request Parameters
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | params | string | Algorithm parameters (JSON string) |
| Yes | init_images | object[] | List of media files; this API accepts one input image |
| Yes | task | string | Fixed value: /v1/ai_flashlight/485030 |
| Yes | task_type | string | Fixed value: formula |
| No | sync_timeout | int | Defaults 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:
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | url | string | Image URL or base64 data |
| Yes | profile | object | Attribute information |
The profile attribute information is structured as follows:
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | media_profiles | object | Media attribute information |
| Yes | version | string | Fixed value: v1 |
The media_profiles media attribute information is structured as follows:
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | media_data_type | string | url indicates a URL; jpg indicates JPG base64 data |
The params inference parameters are provided as a JSON string with the following structure:
| Required | Field | Type | Description |
|---|---|---|---|
| No | rsp_media_type | string | Defaults to url; jpg indicates base64 data |
| Yes | parameter | object | Core algorithm parameters |
Details of the parameter algorithm parameters:
| Required | Parameter | Type | Description |
|---|---|---|---|
| No | mode | string | Defaults 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 |
| No | light_thresh | string | Lighting-effect threshold; defaults to 80; range: 0–255 |
| No | lut_flag | int | LUT filter switch; defaults to 0 (off); 1 means on |
| No | step_num | int | Inference 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.| 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 on success |
| message | string | Business message |
| tips | any | Additional information; may be null |
| data | object | Task status and algorithm result |
Fields in the data object:
| Field | Type | Description |
|---|---|---|
| status | int | Status code: -1, task not found; 0, created successfully; 1, processing; 2, failed; 9, timed out—use the Query API; 10, succeeded |
| result | object | Algorithm result |
| progress | number | Task progress |
| predict_elapsed | int | Estimated processing time, in milliseconds |
| create_time | int64 | Creation timestamp, in milliseconds |
| task_id | string | Task ID |
| custom_task_id | string | Client-defined task ID |
| trace_id | string | Trace identifier |
| client_info | string | Client information |
| init_images | object[]/null | Input media echoed by the service |
Fields in the result object:
| Field | Type | Description |
|---|---|---|
| id | string | Task ID |
| urls | string[] | List of result image URLs |
| parameters | object | Result parameters |
| data | object | Algorithm processing information |
| msg | long/string | Processing message; the original field table specifies long, while the original response example uses string |
| msg_id | string | Message ID |
| media_info_list | object[] | Media information list; the original field table places it in result, while the original response example places it in result.data |
| code | int | Algorithm error code; appears only in failed results |
Fields in result.parameters:
| Field | Type | Description |
|---|---|---|
| light_flag | string | Whether a lighting effect was detected; the original example value is True, and the source document provides no enumeration definition |
| rsp_media_type | string | Response media type |
| version | string | Algorithm version |
Fields in result.data:
| Field | Type | Description |
|---|---|---|
| duration | object | Processing durations and timestamps for each stage |
| error_code | int | Algorithm error code |
| error_msg | string | Algorithm error message |
| extra | object | Additional information |
| media_info_list | object[] | Media information list |
| msg_id | string | Message ID |
| parameter | object/null | Algorithm parameters in a failed result; null in the original failure example |
Fields in result.data.duration:
| Field | Type | Description |
|---|---|---|
| alg_process_time | int | Algorithm processing time |
| created_timestamp | int | Creation timestamp |
| pull_timestamp | int | Pull timestamp |
| repost_time | int | Forwarding time |
| upload_time | int | Upload time |
| waiting_time | int | Waiting time |
Fields in each element of result.data.media_info_list:
| Field | Type | Description |
|---|---|---|
| media_data | string | Result media URL |
| media_profiles | object | Result media attributes |
Fields in media_profiles:
| Field | Type | Description |
|---|---|---|
| media_data_height | int | Result image height |
| media_data_size | int | Result image size |
| media_data_type | string | Result media data type |
| media_data_width | int | Result 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);
}
}
}