topaz-video-upscaler
Topaz Video Upscaler — upscale and enhance any clip to 4K. Send a source video URL and an upscale factor (1×, 2×, 4×); the API returns a sharper, higher-resolution render. Billed per second of source footage.
Topaz Video Upscaler upscales and enhances a source video — restoring
detail and pushing resolution toward 4K. One async endpoint, two parameters:
a video_url and an upscale_factor ("1" / "2" / "4"). Billing is per
second of the source clip's server-probed length × the upscale tier. See
current pricing on the
model page.
Quick example
curl https://reapi.ai/api/v1/videos/generations \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "topaz-video-upscaler",
"video_url": "https://your-cdn.com/source-480p.mp4",
"upscale_factor": "2"
}'import requests
resp = requests.post(
"https://reapi.ai/api/v1/videos/generations",
headers={
"Authorization": "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
json={
"model": "topaz-video-upscaler",
"video_url": "https://your-cdn.com/source-480p.mp4",
"upscale_factor": "2",
},
timeout=30,
)
print(resp.json())const r = await fetch("https://reapi.ai/api/v1/videos/generations", {
method: "POST",
headers: {
Authorization: "Bearer YOUR_API_KEY",
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "topaz-video-upscaler",
video_url: "https://your-cdn.com/source-480p.mp4",
upscale_factor: "2",
}),
});
console.log(await r.json());package main
import (
"bytes"
"encoding/json"
"fmt"
"io"
"net/http"
)
func main() {
body, _ := json.Marshal(map[string]any{
"model": "topaz-video-upscaler",
"video_url": "https://your-cdn.com/source-480p.mp4",
"upscale_factor": "2",
})
req, _ := http.NewRequest("POST",
"https://reapi.ai/api/v1/videos/generations", bytes.NewReader(body))
req.Header.Set("Authorization", "Bearer YOUR_API_KEY")
req.Header.Set("Content-Type", "application/json")
resp, _ := http.DefaultClient.Do(req)
defer resp.Body.Close()
out, _ := io.ReadAll(resp.Body)
fmt.Println(string(out))
}Submit response
{
"id": "task_018f5a3a1b6e7d9f8c2b4d6e8f0a2c4e",
"model": "topaz-video-upscaler",
"status": "processing",
"created_at": 1735000000
}Poll GET /api/v1/tasks/{id} (see the Tasks reference) until
status === "completed". The completed payload's output.video_urls holds the
upscaled MP4 URL.
Authentication
Every call needs a Bearer token. Generate keys at reapi.ai/settings/apikeys.
Authorization: Bearer YOUR_API_KEYEndpoint
POST /api/v1/videos/generations
GET /api/v1/tasks/{id}Submission is async. The POST returns immediately with a task_id; the task
endpoint returns the same envelope until completion. Polling does not consume
credits.
Request body
model — required
string. Must be "topaz-video-upscaler".
video_url — required
string. Public HTTP(S) URL of the source video to upscale — MP4, MOV, or
MKV, up to 50MB. The output preserves the source clip's duration and frame
timing. The billable second count is the source video's server-probed
duration, not a client estimate.
No data: URIs. reApi rejects base64 inputs platform-wide. Upload to public
storage (your own CDN, S3, R2…) and pass the URL.
upscale_factor — string, default "2"
How much each frame is enlarged. The factor also selects the per-second pricing tier.
| Value | Behavior | Tier |
|---|---|---|
"1" | Clean and restore detail at the same resolution | 1× / 2× |
"2" | Double each dimension (default) | 1× / 2× |
"4" | Enlarge 4× toward 4K | 4× |
"1" and "2" share one per-second rate; "4" is a higher tier.
Response envelope
Submit and poll share the same shape — only status and output fill in over
time.
{
"id": "task_018f5a3a1b6e7d9f8c2b4d6e8f0a2c4e",
"model": "topaz-video-upscaler",
"status": "completed",
"created_at": 1735000000,
"output": {
"video_urls": ["https://cdn.reapi.ai/media/tasks/018f5a3a1b6e7d9f8c2b4d6e8f0a2c4e/0.mp4"]
},
"error": null
}| Field | Type | Notes |
|---|---|---|
id | string | Task identifier — keep it for polling and audit |
model | string | Echo of the submitted model |
status | string | processing / completed / failed |
created_at | integer | Submission unix timestamp |
output | object | null | null until completion. output.video_urls holds MP4s |
error | object | null | Populated on failed — { code, message } |
Pricing
Per-second × upscale tier. The billable second count is the source video's
server-probed length — reApi measures the uploaded clip server-side rather
than trusting a client value. The 1× / 2× factors share one per-second rate;
4× is a higher tier.
Bill formula (1 credit = $0.001):
billable_seconds = ceil(server_probed_source_seconds)
bill_usd = per_second_usd(tier) × billable_seconds // tier from upscale_factor
credits = ceil(bill_usd × 1000)See current per-second rates for each tier on the
model page. Failed jobs refund
automatically. A probe failure returns 400 PRICING_UNAVAILABLE (code 30002)
with no charge.
The playground's draft estimate may show a default before the upload finishes — the authoritative number is computed at submit, after the server probes the file.
Validation errors
All cases below return HTTP 400. Pattern-match on code, not message —
message strings carry request-specific context and are not a stable contract.
| Trigger | Code | Message (illustrative) |
|---|---|---|
video_url missing | 20002 | topaz-video-upscaler: video_url is required |
video_url carrying a data: URI / non-public | 20003 | topaz-video-upscaler: video_url must be a public http(s) URL |
upscale_factor not one of 1 / 2 / 4 | 20003 | topaz-video-upscaler: invalid upscale_factor (allowed: 1/2/4) |
| Source video probe fails (network / format) | 30002 | Could not determine source video duration for billing: … |
| Source video too large / unsupported by upstream | 80007 | Provider rejected the request as invalid |
The full envelope is { "error": { "code", "message", "request_id" } } — see
Errors catalog for the wire format and request_id
correlation tips.
Recipes
Minimum request (2× default)
{
"model": "topaz-video-upscaler",
"video_url": "https://your-cdn.com/source-480p.mp4"
}Same-size cleanup (1×)
{
"model": "topaz-video-upscaler",
"video_url": "https://your-cdn.com/source-1080p-grainy.mp4",
"upscale_factor": "1"
}Push to 4K (4×)
{
"model": "topaz-video-upscaler",
"video_url": "https://your-cdn.com/source-540p.mp4",
"upscale_factor": "4"
}Tips
- Cost tracks the source clip. A 6s source bills ~6 seconds; trim or compress long footage before submitting to cap spend.
- Pick the factor by need.
1×restores detail at the same size,2×is the balanced default,4×targets 4K from low-resolution sources. - Mind the 50MB input cap. Re-encode or split oversized clips; the upstream
rejects files over the limit (
80007), refunded automatically. - Length is preserved. Upscaling changes resolution and detail, not duration — a 10s input returns a 10s output.