AI Super Resolution V2
Description
This API submits AI Super Resolution V2 image-processing tasks.
Image Requirements
- Image formats: JPG and PNG.
- Image size: 10 MB or less is recommended.
Endpoint
Production environment: https://openapi.meitu.com
Task submission endpoint: https://openapi.meitu.com/api/v1/sdk/sync/push
Task name (task): /v1/Ultra_High_Definition_V2/478332
Task type (task_type): formulaMethod
POST
Content-Type: application/json
Authentication
Request Parameters
The request body contains exactly the following five top-level fields:
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | params | string | Inference parameters serialized as a JSON string |
| Yes | init_images | object[] | Image parameter list |
| Yes | task | string | Fixed value: /v1/Ultra_High_Definition_V2/478332 |
| Yes | task_type | string | Fixed value: formula |
| No | sync_timeout | int | Defaults to 30; -1 means do not wait. If synchronous waiting times out, status 9 is returned. Use the query API to retrieve the result |
init_images image parameters
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | url | string | Image URL |
| Yes | profile | object | Attribute information |
profile attribute information
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | media_profiles | object | Image attribute information |
media_profiles image attributes
| Required | Parameter | Type | Description |
|---|---|---|---|
| Yes | media_data_type | string | Defaults to url; url means the image is provided through a URL |
params is a JSON string. Its deserialized structure is as follows:
| Required | Field | Type | Description |
|---|---|---|---|
| No | rsp_media_type | string | Common response media type. Defaults to url; url means the result media data is an image URL. The source document does not define any other value |
| Yes | parameter | object | AI Super Resolution V2 algorithm parameter object |
rsp_media_type and parameter are sibling fields. All algorithm-specific fields must be placed only inside parameter.
parameter algorithm details
| Required | Parameter | Type | Description |
|---|---|---|---|
| No | sr_num | int | Upscaling factor. 2 means HD with effect quality prioritized; 4 means ultra-high definition with resolution prioritized. Defaults to 2 |
| No | area_size | int | When sr_num=2, pass 1920. When sr_num=4, omit this field; it defaults to 2560 |
| No | save_photo_format | int | Output image format. Defaults to 1; 1 means JPG encoding and 2 means PNG encoding |
Request Example
{
"task": "/v1/Ultra_High_Definition_V2/478332",
"task_type": "formula",
"init_images": [
{
"url": "https://wheeai.meitudata.com/static/666162c4139073547bhMUcLeee3093.jpeg",
"profile": {
"media_profiles": {
"media_data_type": "url"
}
}
}
],
"params": "{\"rsp_media_type\":\"url\",\"parameter\":{\"area_size\":1920,\"sr_num\":2}}",
"sync_timeout": 30
}Response Fields
Note: Generated result images are periodically deleted after 24 hours. Download and save them promptly.| Field | Type | Description |
|---|---|---|
| request_id | string | Request identifier |
| trace_id | string | Trace identifier |
| code | int | Business status code; 0 means the request was accepted successfully |
| error_code | int | Error code; 0 on success |
| message | string | Business or error message |
| tips | any | Additional information; may be null |
| data | object/null | Task status and algorithm result; may be null if the request did not enter the task-processing flow |
data fields
| Field | Type | Description |
|---|---|---|
| status | int | -1: task not found; 0: task created; 1: processing; 2: task failed; 9: use the query API; 10: task succeeded |
| msg | string | Task status message |
| result | object | Algorithm result |
| progress | number | Task progress, such as 0.1, 0.85, or 1 |
| predict_elapsed | int | Estimated 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 | Echo of input media |
result fields for successful tasks or tasks that require querying
| Field | Type | Description |
|---|---|---|
| id | string | Task ID, which can be used to query task status |
| urls | string[] | List of result image URLs |
result fields for failed tasks
| Field | Type | Description |
|---|---|---|
| id | string | Task ID |
| ErrorCode | int | Algorithm error code |
| ErrorMsg | string | Algorithm error message |
| Data | string/null | Detailed error information; null when unavailable |
Response Examples
Successful Response (status=10)
Response Status: 200
content-type: application/json; charset=utf-8
{
"request_id": "req_1234567890",
"trace_id": "trace_1234567890",
"code": 0,
"error_code": 0,
"message": "success",
"tips": null,
"data": {
"status": 10,
"msg": "success",
"result": {
"id": "50309bd5-a827-4125-bc96-62039c93770b",
"urls": [
"https://obs.mtlab.meitu.com/mtopen/rF5GIhp5ReLKgLV91CKj5BO1q2FTLMmc/MTY5Mjg1MzIwMA==/1c39ef92-04f1-40b4-5b7e-8fcfca0c11ea.png"
]
},
"progress": 1,
"predict_elapsed": 0,
"create_time": 1692853200000,
"task_id": "50309bd5-a827-4125-bc96-62039c93770b",
"custom_task_id": "",
"trace_id": "trace_1234567890",
"client_info": "",
"init_images": null
}
}Query-Required Response (status=9)
When data.status is 9, use the query API and the returned task ID to retrieve the result.
Response Status: 200
content-type: application/json; charset=utf-8
{
"request_id": "req_1234567890",
"trace_id": "trace_1234567890",
"code": 0,
"error_code": 0,
"message": "success",
"tips": null,
"data": {
"status": 9,
"msg": "processing",
"result": {
"id": "task_1234567890"
},
"progress": 0,
"predict_elapsed": 10000,
"create_time": 1692853200000,
"task_id": "task_1234567890",
"custom_task_id": "",
"trace_id": "trace_1234567890",
"client_info": "",
"init_images": null
}
}Task Failure Response (status=2)
Response Status: 400
content-type: application/json; charset=utf-8
{
"request_id": "req_1234567890",
"trace_id": "trace_1234567890",
"code": 20001,
"error_code": 20001,
"message": "PROCESS_ERROR",
"tips": null,
"data": {
"status": 2,
"msg": "PROCESS_ERROR",
"result": {
"id": "task_1234567890",
"ErrorCode": 20001,
"ErrorMsg": "PROCESS_ERROR",
"Data": null
},
"progress": 1,
"predict_elapsed": 0,
"create_time": 1692853200000,
"task_id": "task_1234567890",
"custom_task_id": "",
"trace_id": "trace_1234567890",
"client_info": "",
"init_images": null
}
}Failure Before Task Processing
The source document also provides the following failed request response. In this case, data is null and no task status is available.
Response Status: 400
content-type: application/json; charset=utf-8
{
"request_id": "req_1234567890",
"trace_id": "trace_1234567890",
"code": 20008,
"error_code": 20008,
"message": "UNSUITABLE_IMAGE",
"tips": null,
"data": null
}API-Specific Error Codes and Messages
| Error Code | Error Message | Description |
|---|---|---|
| 20001 | PROCESS_ERROR | Processing error |
The failed request example in the source document also uses 20008 (UNSUITABLE_IMAGE), but the source does not list it in the API-specific error code table.
Common Error Codes and Messages
See API Error Codes.
SDK Examples
All examples sign the complete JSON body that is actually sent. The body contains exactly five top-level fields: task, task_type, init_images, params, and sync_timeout.
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": {
"area_size": 1920,
"sr_num": 2,
},
}
payload = {
"task": "/v1/Ultra_High_Definition_V2/478332",
"task_type": "formula",
"init_images": [
{
"url": "https://wheeai.meitudata.com/static/666162c4139073547bhMUcLeee3093.jpeg",
"profile": {
"media_profiles": {"media_data_type": "url"},
},
}
],
"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/Ultra_High_Definition_V2/478332",
"task_type": "formula",
"init_images": [{
"url": "https://wheeai.meitudata.com/static/666162c4139073547bhMUcLeee3093.jpeg",
"profile": {
"media_profiles": {"media_data_type": "url"}
}
}],
"params": "{\"rsp_media_type\":\"url\",\"parameter\":{\"area_size\":1920,\"sr_num\":2}}",
"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' => [
'area_size' => 1920,
'sr_num' => 2,
],
]);
$body = json_encode([
'task' => '/v1/Ultra_High_Definition_V2/478332',
'task_type' => 'formula',
'init_images' => [
[
'url' => 'https://wheeai.meitudata.com/static/666162c4139073547bhMUcLeee3093.jpeg',
'profile' => [
'media_profiles' => ['media_data_type' => 'url'],
],
],
],
'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/Ultra_High_Definition_V2/478332\",\n" +
" \"task_type\": \"formula\",\n" +
" \"init_images\": [{\n" +
" \"url\": \"https://wheeai.meitudata.com/static/666162c4139073547bhMUcLeee3093.jpeg\",\n" +
" \"profile\": {\n" +
" \"media_profiles\": {\"media_data_type\": \"url\"}\n" +
" }\n" +
" }],\n" +
" \"params\": \"{\\\"rsp_media_type\\\":\\\"url\\\",\\\"parameter\\\":{\\\"area_size\\\":1920,\\\"sr_num\\\":2}}\",\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);
}
}
}