rreAPI Docs
rreAPI Docs
HomepageWelcome

Image

flux-2z-imageqwen-image-2midjourney-v7wan-2-7-imagegpt-image-2gpt-image-2-officialgemini-2.5-flash-image-previewgemini-3-pro-image-previewgemini-3.1-flash-image-previewdoubao-seedream-5-0-liteimagen-4-0

Audio

Mureka V9 Song APIVocal Remover APIMusic Extractor APIVoice Cleaner APIMultistem Splitter APIVoice Changer API

Video

topaz-video-upscalerkling-3-0music-video-1-0wan-2-7-videokling-motion-controlpixverse-v6doubao-seedance-2.0doubao-seedance-2.0-officialdoubao-seedance-2.0-betahappyhorse-1.0happyhorse-1.0-officialviduq3grok-imagine-video-1.5-betagrok-imagine-1.0-videoVeo 3.1gemini-omni

Chat

minimax-m3deepseek-v4gpt-5.5gpt-5.4claude-opus-4-8claude-opus-4-7claude-sonnet-4-6

Text

ai-essay-writerhumanizeai-text-detector

Tools

enhance-video-1.0
X (Twitter)

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_KEY

Endpoint

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.

ValueBehaviorTier
"1"Clean and restore detail at the same resolution1× / 2×
"2"Double each dimension (default)1× / 2×
"4"Enlarge 4× toward 4K4×

"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
}
FieldTypeNotes
idstringTask identifier — keep it for polling and audit
modelstringEcho of the submitted model
statusstringprocessing / completed / failed
created_atintegerSubmission unix timestamp
outputobject | nullnull until completion. output.video_urls holds MP4s
errorobject | nullPopulated 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.

TriggerCodeMessage (illustrative)
video_url missing20002topaz-video-upscaler: video_url is required
video_url carrying a data: URI / non-public20003topaz-video-upscaler: video_url must be a public http(s) URL
upscale_factor not one of 1 / 2 / 420003topaz-video-upscaler: invalid upscale_factor (allowed: 1/2/4)
Source video probe fails (network / format)30002Could not determine source video duration for billing: …
Source video too large / unsupported by upstream80007Provider 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.

Related

  • Errors catalog
  • Authentication

Table of Contents

Quick example
Submit response
Authentication
Endpoint
Request body
model — required
video_url — required
upscale_factor — string, default "2"
Response envelope
Pricing
Validation errors
Recipes
Minimum request (2× default)
Same-size cleanup (1×)
Push to 4K (4×)
Tips
Related