curl --request GET \
--url https://api.evolink.ai/v1/tasks/{task_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.evolink.ai/v1/tasks/{task_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.evolink.ai/v1/tasks/{task_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.evolink.ai/v1/tasks/{task_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.evolink.ai/v1/tasks/{task_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.evolink.ai/v1/tasks/{task_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.evolink.ai/v1/tasks/{task_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"created": 1788436500,
"duration": 30,
"id": "task-unified-1788436500-yscib7uw",
"model": "gemini-3-pro-image-preview",
"object": "image.generation.task",
"progress": 100,
"result_data": [
{
"url": "http://example.com/image.jpg"
}
],
"results": [
"http://example.com/image.jpg"
],
"status": "completed",
"task_info": {
"can_cancel": false
},
"type": "image",
"usage": {
"cost": {
"credits": 10,
"usd": 0.148,
"cny": 1
},
"credits_used": 10
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid API key (request id: 20260908103000123456789abcdef)",
"param": null,
"type": "authentication_error"
}
}{
"error": {
"code": "user_disabled",
"message": "Your account has been disabled (request id: 20260908103000123456789abcdef)",
"param": null,
"type": "invalid_request_error"
}
}{
"error": {
"message": "Task not found",
"type": "invalid_request_error",
"param": "",
"code": "task_not_found"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "You have reached the request limit: max 60 requests per 1 minutes. Retry after 30 seconds. (request id: 20260908103000123456789abcdef)",
"param": null,
"retry_after": 30,
"retryable": true,
"type": "rate_limit_error"
}
}{
"error": {
"message": "Failed to get task status",
"type": "api_error",
"param": "",
"code": "internal_error"
}
}Query Task Status
Query the status, progress, and result information of asynchronous tasks by task ID
curl --request GET \
--url https://api.evolink.ai/v1/tasks/{task_id} \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.evolink.ai/v1/tasks/{task_id}"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.evolink.ai/v1/tasks/{task_id}', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.evolink.ai/v1/tasks/{task_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.evolink.ai/v1/tasks/{task_id}"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.evolink.ai/v1/tasks/{task_id}")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.evolink.ai/v1/tasks/{task_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"created": 1788436500,
"duration": 30,
"id": "task-unified-1788436500-yscib7uw",
"model": "gemini-3-pro-image-preview",
"object": "image.generation.task",
"progress": 100,
"result_data": [
{
"url": "http://example.com/image.jpg"
}
],
"results": [
"http://example.com/image.jpg"
],
"status": "completed",
"task_info": {
"can_cancel": false
},
"type": "image",
"usage": {
"cost": {
"credits": 10,
"usd": 0.148,
"cny": 1
},
"credits_used": 10
}
}{
"error": {
"code": "unauthorized",
"message": "Invalid API key (request id: 20260908103000123456789abcdef)",
"param": null,
"type": "authentication_error"
}
}{
"error": {
"code": "user_disabled",
"message": "Your account has been disabled (request id: 20260908103000123456789abcdef)",
"param": null,
"type": "invalid_request_error"
}
}{
"error": {
"message": "Task not found",
"type": "invalid_request_error",
"param": "",
"code": "task_not_found"
}
}{
"error": {
"code": "rate_limit_exceeded",
"message": "You have reached the request limit: max 60 requests per 1 minutes. Retry after 30 seconds. (request id: 20260908103000123456789abcdef)",
"param": null,
"retry_after": 30,
"retryable": true,
"type": "rate_limit_error"
}
}{
"error": {
"message": "Failed to get task status",
"type": "api_error",
"param": "",
"code": "internal_error"
}
}Authorizations
##All APIs require Bearer Token authentication##
Get API Key:
Visit API Key Management Page to get your API Key
Add to request header:
Authorization: Bearer YOUR_API_KEY
Path Parameters
Task ID, ignore {} when querying, append the id from the async task response body at the end of the path
Response
Task status details
Task creation timestamp
1756817821
Task ID
"task-unified-1756817821-4x3rx6ny"
Model used
"gemini-3-pro-image-preview"
Task type
image.generation.task, video.generation.task, audio.generation.task "image.generation.task"
Task progress percentage
0 <= x <= 100100
Task status. Note: while the task is still pending upstream the query API already reports "processing", so clients normally only see processing / completed / failed.
pending, processing, completed, failed "completed"
Task type
image, video, audio, text "image"
Task duration in seconds. Only present when status is "completed" or "failed".
30
Actual generated video length in seconds. Only present for some video models (e.g. Kling) in a final state.
5
Deadline for conversion to a final video (UTC, RFC 3339). Returned only for a Seedance 2.5 draft (created with draft: true) when its status is completed. After this time, it can no longer be converted using Seedance 2.5 Draft-to-Video
"2026-09-23T17:19:36Z"
ID of the draft task from which this final video was converted. Returned only for Seedance 2.5 Draft-to-Video tasks
"task-unified-1774857405-abc123"
List of result URLs. Only present when status is "completed" and the model produces URL results; the field is absent otherwise.
["http://example.com/image.jpg"]
Model-specific full result object. For image models it is an array of objects such as [{"url": ...}] (same URLs as results); some models return richer objects (e.g. Suno returns song objects). Absent when the model has no structured result.
[{ "url": "http://example.com/image.jpg" }]
Usage and billing information. Only present when status is "completed". Always contains credits_used and cost; token fields appear only for token-billed models (e.g. gpt-image-2). Some models add further model-specific fields.
Show child attributes
Show child attributes
Error information when the task fails (only present when status is "failed"). Note: error.code here is a string-type business error code, different from HTTP status codes. See the Error Codes Reference for the complete list.
Show child attributes
Show child attributes
Task detailed information
Show child attributes
Show child attributes
Midjourney V7 variation / pan / outpaint: prompt is optional. Missing, empty, whitespace-only, or controlled-speed/version-flags-only prompts always use Fast and the Fast price, including requests with speed=turbo. With non-empty prompt text, omitted speed or fast uses Fast; turbo uses Turbo at twice the Fast price. Playground offers Fast only. The source must be completed and owned by the current user; promptless operations support image-generation and supported variation, pan, and outpaint results. Historical tasks retain their recorded execution speed and billing.
draft, fast, turbo