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

Method

POST

Content-Type: application/json

Authentication

Open Platform API Signing

Request Parameters

The request body contains exactly the following five top-level fields:

RequiredParameterTypeDescription
YesparamsstringInference parameters serialized as a JSON string
Yesinit_imagesobject[]Image parameter list
YestaskstringFixed value: /v1/Ultra_High_Definition_V2/478332
Yestask_typestringFixed value: formula
Nosync_timeoutintDefaults 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

RequiredParameterTypeDescription
YesurlstringImage URL
YesprofileobjectAttribute information

profile attribute information

RequiredParameterTypeDescription
Yesmedia_profilesobjectImage attribute information

media_profiles image attributes

RequiredParameterTypeDescription
Yesmedia_data_typestringDefaults to url; url means the image is provided through a URL

params is a JSON string. Its deserialized structure is as follows:

RequiredFieldTypeDescription
Norsp_media_typestringCommon 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
YesparameterobjectAI 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

RequiredParameterTypeDescription
Nosr_numintUpscaling factor. 2 means HD with effect quality prioritized; 4 means ultra-high definition with resolution prioritized. Defaults to 2
Noarea_sizeintWhen sr_num=2, pass 1920. When sr_num=4, omit this field; it defaults to 2560
Nosave_photo_formatintOutput 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.
FieldTypeDescription
request_idstringRequest identifier
trace_idstringTrace identifier
codeintBusiness status code; 0 means the request was accepted successfully
error_codeintError code; 0 on success
messagestringBusiness or error message
tipsanyAdditional information; may be null
dataobject/nullTask status and algorithm result; may be null if the request did not enter the task-processing flow

data fields

FieldTypeDescription
statusint-1: task not found; 0: task created; 1: processing; 2: task failed; 9: use the query API; 10: task succeeded
msgstringTask status message
resultobjectAlgorithm result
progressnumberTask progress, such as 0.1, 0.85, or 1
predict_elapsedintEstimated 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[]/nullEcho of input media

result fields for successful tasks or tasks that require querying

FieldTypeDescription
idstringTask ID, which can be used to query task status
urlsstring[]List of result image URLs

result fields for failed tasks

FieldTypeDescription
idstringTask ID
ErrorCodeintAlgorithm error code
ErrorMsgstringAlgorithm error message
Datastring/nullDetailed 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 CodeError MessageDescription
20001PROCESS_ERRORProcessing 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);
        }
    }
}