curl --request POST \
--url https://api.goenhance.ai/api/v1/videos/generations \
--header 'Content-Type: application/json' \
--data '
{
"model": "video-upscaler-pro",
"video_url": "https://your-cdn.com/clip.mp4",
"enhance_type": "anime"
}
'import requests
url = "https://api.goenhance.ai/api/v1/videos/generations"
payload = {
"model": "video-upscaler-pro",
"video_url": "https://your-cdn.com/clip.mp4",
"enhance_type": "anime"
}
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-pro',
video_url: 'https://your-cdn.com/clip.mp4',
enhance_type: 'anime'
})
};
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-pro',
'video_url' => 'https://your-cdn.com/clip.mp4',
'enhance_type' => 'anime'
]),
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-pro\",\n \"video_url\": \"https://your-cdn.com/clip.mp4\",\n \"enhance_type\": \"anime\"\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-pro\",\n \"video_url\": \"https://your-cdn.com/clip.mp4\",\n \"enhance_type\": \"anime\"\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-pro\",\n \"video_url\": \"https://your-cdn.com/clip.mp4\",\n \"enhance_type\": \"anime\"\n}"
response = http.request(request)
puts response.read_bodyVideo Upscaler Pro
Enhance an existing video with one of four modes. general, anime and portrait double the width and height (for example 1080p becomes 4K) while keeping the frame rate; frame_interpolation keeps the resolution and doubles the frame rate for smoother motion, with the same duration. The original audio track is kept and the result is an H.264 MP4 with all source metadata removed.
enhance_type | Best for | Output |
|---|---|---|
general (default) | Everyday footage with compression, noise or blur | 2× width and height |
anime | Anime, cartoons and CG animation — preserves line work and flat colour | 2× width and height |
portrait | People, interviews and close-ups — focuses on facial detail | 2× width and height |
frame_interpolation | Choppy or low-frame-rate motion | Same resolution, 2× frame rate |
Pricing — per second of the source video (USD at $0.02/token). Upscaling modes are priced by the shorter side of the source:
| Mode | Source shorter side | tokens/s | USD/s |
|---|---|---|---|
general / anime / portrait | up to 540 px | 3 | $0.06 |
general / anime / portrait | 541–720 px | 4 | $0.08 |
general / anime / portrait | 721–1080 px | 6 | $0.12 |
frame_interpolation | any | 2 | $0.04 |
⚠️ There is no duration parameter. The source video is measured server-side and the whole clip is processed; the measured length, rounded up to whole seconds, is what you are charged for. For example, a 10.2-second 1080p clip with general is billed as 11 seconds:
- 66 tokens
- = $1.32
Limits — requests outside these are rejected before any tokens are deducted:
| limit | |
|---|---|
video_url | https:// only, up to 300MB, av1 is not supported |
| Resolution | landscape or portrait; shorter side 128–1080 px, longer side at most 2048 px (up to 2048×1080) |
| Length | 1-60s; at most 30s when the frame rate is above 30fps |
| Frame rate | up to 60fps; frame_interpolation needs a constant frame rate |
Processing time: much slower than real time — roughly 30 seconds per second of 1080p video when upscaling to 4K, less for smaller sources. Use custom_callback_url rather than tight polling.
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-pro",
"video_url": "https://your-cdn.com/clip.mp4",
"enhance_type": "anime"
}
'import requests
url = "https://api.goenhance.ai/api/v1/videos/generations"
payload = {
"model": "video-upscaler-pro",
"video_url": "https://your-cdn.com/clip.mp4",
"enhance_type": "anime"
}
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-pro',
video_url: 'https://your-cdn.com/clip.mp4',
enhance_type: 'anime'
})
};
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-pro',
'video_url' => 'https://your-cdn.com/clip.mp4',
'enhance_type' => 'anime'
]),
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-pro\",\n \"video_url\": \"https://your-cdn.com/clip.mp4\",\n \"enhance_type\": \"anime\"\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-pro\",\n \"video_url\": \"https://your-cdn.com/clip.mp4\",\n \"enhance_type\": \"anime\"\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-pro\",\n \"video_url\": \"https://your-cdn.com/clip.mp4\",\n \"enhance_type\": \"anime\"\n}"
response = http.request(request)
puts response.read_bodyHeaders
Body
Model name. Must be video-upscaler-pro.
video-upscaler-pro Source video URL. Must be an https:// link that is publicly reachable. Up to 300MB; shorter side 128–1080 px and longer side at most 2048 px; 1-60s long (at most 30s above 30fps); up to 60fps; av1 is not supported. The whole clip is processed and its measured duration is the billing basis.
Enhancement mode. general, anime and portrait double the width and height; frame_interpolation doubles the frame rate at the same resolution. Defaults to general.
general, anime, portrait, frame_interpolation 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"
