curl --request POST \
--url https://api.goenhance.ai/api/v1/videos/generations \
--header 'Content-Type: application/json' \
--data '
{
"model": "video-upscaler",
"video_url": "https://your-cdn.com/clip.mp4",
"resolution": "2k"
}
'import requests
url = "https://api.goenhance.ai/api/v1/videos/generations"
payload = {
"model": "video-upscaler",
"video_url": "https://your-cdn.com/clip.mp4",
"resolution": "2k"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
model: 'video-upscaler',
video_url: 'https://your-cdn.com/clip.mp4',
resolution: '2k'
})
};
fetch('https://api.goenhance.ai/api/v1/videos/generations', 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.goenhance.ai/api/v1/videos/generations",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'model' => 'video-upscaler',
'video_url' => 'https://your-cdn.com/clip.mp4',
'resolution' => '2k'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.goenhance.ai/api/v1/videos/generations"
payload := strings.NewReader("{\n \"model\": \"video-upscaler\",\n \"video_url\": \"https://your-cdn.com/clip.mp4\",\n \"resolution\": \"2k\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.goenhance.ai/api/v1/videos/generations")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"video-upscaler\",\n \"video_url\": \"https://your-cdn.com/clip.mp4\",\n \"resolution\": \"2k\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.goenhance.ai/api/v1/videos/generations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"video-upscaler\",\n \"video_url\": \"https://your-cdn.com/clip.mp4\",\n \"resolution\": \"2k\"\n}"
response = http.request(request)
puts response.read_body{
"code": 0,
"msg": "Success",
"data": {
"img_uuid": "c12b656c-747a-44fd-9c80-add79b0c52d5",
"cost": 5.82
}
}Video Upscaler
FlashVSR video super-resolution: upscale an existing clip to 720p, 1080p, 2K or 4K.
Pricing — per second of the source video, by target resolution (USD at $0.02/token):
| resolution | tokens/s | USD/s |
|---|---|---|
| 720p | 0.5 | $0.01 |
| 1080p | 1 | $0.02 |
| 2K | 2 | $0.04 |
| 4K | 4 | $0.08 |
⚠️ There is no duration parameter. The source video is measured server-side and the whole clip is upscaled; the measured length (rounded up to whole seconds) is what you are charged for. Clips longer than the limit are rejected rather than silently truncated.
Maximum source length depends on the target resolution:
| resolution | max source length |
|---|---|
| 720p | 60s |
| 1080p | 60s |
| 2K | 60s |
| 4K | 30s |
4K is capped lower because a 4K job is several times slower per frame; a longer clip would exceed the processing window and fail after your tokens were already deducted.
Frame rate: output is capped at 24fps. A source above 24fps is resampled down to 24fps; a source below 24fps keeps its own frame rate (a 16fps clip stays 16fps) — frames are never interpolated or duplicated. Output duration always matches the source.
Returns an img_uuid; poll GET /api/v1/jobs/detail (or use custom_callback_url) to get the result.
curl --request POST \
--url https://api.goenhance.ai/api/v1/videos/generations \
--header 'Content-Type: application/json' \
--data '
{
"model": "video-upscaler",
"video_url": "https://your-cdn.com/clip.mp4",
"resolution": "2k"
}
'import requests
url = "https://api.goenhance.ai/api/v1/videos/generations"
payload = {
"model": "video-upscaler",
"video_url": "https://your-cdn.com/clip.mp4",
"resolution": "2k"
}
headers = {"Content-Type": "application/json"}
response = requests.post(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
model: 'video-upscaler',
video_url: 'https://your-cdn.com/clip.mp4',
resolution: '2k'
})
};
fetch('https://api.goenhance.ai/api/v1/videos/generations', 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.goenhance.ai/api/v1/videos/generations",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "POST",
CURLOPT_POSTFIELDS => json_encode([
'model' => 'video-upscaler',
'video_url' => 'https://your-cdn.com/clip.mp4',
'resolution' => '2k'
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://api.goenhance.ai/api/v1/videos/generations"
payload := strings.NewReader("{\n \"model\": \"video-upscaler\",\n \"video_url\": \"https://your-cdn.com/clip.mp4\",\n \"resolution\": \"2k\"\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.post("https://api.goenhance.ai/api/v1/videos/generations")
.header("Content-Type", "application/json")
.body("{\n \"model\": \"video-upscaler\",\n \"video_url\": \"https://your-cdn.com/clip.mp4\",\n \"resolution\": \"2k\"\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.goenhance.ai/api/v1/videos/generations")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Post.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"model\": \"video-upscaler\",\n \"video_url\": \"https://your-cdn.com/clip.mp4\",\n \"resolution\": \"2k\"\n}"
response = http.request(request)
puts response.read_body{
"code": 0,
"msg": "Success",
"data": {
"img_uuid": "c12b656c-747a-44fd-9c80-add79b0c52d5",
"cost": 5.82
}
}Headers
Body
Model name. Must be video-upscaler.
video-upscaler Source video URL. Up to 100MB; av1 is not supported. Max length depends on resolution — 60s for 720p/1080p/2K, 30s for 4K. The whole clip is upscaled and its measured duration is the billing basis.
Target resolution. Defaults to 1080p. ⚠️ Choosing 4k also lowers the maximum source length from 60s to 30s.
720p, 1080p, 2k, 4k Optional. A publicly accessible HTTPS URL. When the task status changes (processing / success / failed), GoEnhance sends a POST request to this URL. The request body is identical to the response of GET /api/v1/jobs/detail. If your server does not respond with HTTP 200, the notification is retried up to 3 times, with a 3-second timeout per attempt.
"https://your-server.com/goenhance/callback"
