MODEL IDbfl:flux@video-upscale
live

FLUX Video Upscale

Black Forest Labs
by Black Forest Labs

FLUX Video Upscale is a dedicated video enhancement model from Black Forest Labs for increasing source footage to 1080p, 2K, or 4K while preserving motion and the original audio track. It supports a source-faithful precise mode for faces, products, and brand-sensitive footage, plus a more creative enhancement mode that restores and invents finer detail for generated clips, scenery, textures, and crowd shots. The endpoint accepts clips up to 20 seconds long and can optionally use a prompt to steer the type of detail it enhances.

FLUX Video Upscale

Upscaling video with FLUX Video Upscale

How to upscale video with FLUX Video Upscale: the async request, choosing an upscale factor, the input size and length limits, and keeping motion and the original audio.

Video arrives soft more often than not. A model renders a clip at its native size, a camera export is compressed, an archive clip is low-resolution, and enlarging any of them the ordinary way just stretches the frames you already have. FLUX Video Upscale takes the other route: it rebuilds detail frame by frame as it scales the clip up, holding the motion steady and carrying the original audio through untouched.

SourceUpscaled

The rotating sneaker started as a soft 480p clip. Drag the handle and the knit mesh, the stitching, and the texture of the sole resolve into real detail on the upscaled side, while the rotation stays smooth from frame to frame.

The request

An upscale is one video in and one video out. Like every video task it runs asynchronously: the immediate response acknowledges the task, and the finished clip arrives by polling or a webhook. Put the source in inputs.video as a URL or a UUID from an earlier task, name the model, and set how far to scale with upscaleFactor.

import { createClient } from '@runware/sdk'

const client = await createClient({ apiKey: process.env.RUNWARE_API_KEY })
await client.connect()

const [result] = await client.run({
  model: 'bfl:flux@video-upscale',
  deliveryMethod: 'async',
  upscaleFactor: 2,
  inputs: {
    video: 'https://vm.runware.ai/video/os/a14d18/ws/2/vi/1a2b3c4d-5e6f-4708-9a1b-2c3d4e5f6071.mp4'
  }
})
import asyncio
import os

from runware import Runware


async def main():
    async with Runware(api_key=os.environ["RUNWARE_API_KEY"]) as client:
        results = await client.run({
            "model": "bfl:flux@video-upscale",
            "deliveryMethod": "async",
            "upscaleFactor": 2,
            "inputs": {
                "video": "https://vm.runware.ai/video/os/a14d18/ws/2/vi/1a2b3c4d-5e6f-4708-9a1b-2c3d4e5f6071.mp4"
            }
        })


asyncio.run(main())
curl https://api.runware.ai/v1 \
  -H "Authorization: Bearer $RUNWARE_API_KEY" \
  -H "Content-Type: application/json" \
  -d '[
    {
      "taskType": "upscale",
      "taskUUID": "b7c8d9e0-1f2a-4b3c-9d4e-5f6a7b8c9d0e",
      "model": "bfl:flux@video-upscale",
      "deliveryMethod": "async",
      "upscaleFactor": 2,
      "inputs": {
        "video": "https://vm.runware.ai/video/os/a14d18/ws/2/vi/1a2b3c4d-5e6f-4708-9a1b-2c3d4e5f6071.mp4"
      }
    }
  ]'
runware run bfl:flux@video-upscale \
  deliveryMethod=async \
  upscaleFactor=2 \
  inputs.video=https://vm.runware.ai/video/os/a14d18/ws/2/vi/1a2b3c4d-5e6f-4708-9a1b-2c3d4e5f6071.mp4
{
  "taskType": "upscale",
  "taskUUID": "b7c8d9e0-1f2a-4b3c-9d4e-5f6a7b8c9d0e",
  "model": "bfl:flux@video-upscale",
  "deliveryMethod": "async",
  "upscaleFactor": 2,
  "inputs": {
    "video": "https://vm.runware.ai/video/os/a14d18/ws/2/vi/1a2b3c4d-5e6f-4708-9a1b-2c3d4e5f6071.mp4"
  }
}
Response
[
  {
    "taskType": "upscale",
    "taskUUID": "b7c8d9e0-1f2a-4b3c-9d4e-5f6a7b8c9d0e",
    "videoUUID": "8e9f0a1b-2c3d-4e5f-9a6b-7c8d9e0f1a2b",
    "videoURL": "https://vm.runware.ai/video/os/a14d18/ws/2/vi/8e9f0a1b-2c3d-4e5f-9a6b-7c8d9e0f1a2b.mp4"
  }
]
  • inputs.video is the only required input. It takes a URL or a UUID from a previous generation.
  • upscaleFactor is the scale multiplier, covered below.
  • settings.creativity picks how faithful or inventive the enhancement is, covered in precise and creative modes.
  • positivePrompt is optional and steers which detail is rebuilt, covered in prompt-guided enhancement.

The source is capped at 50 MB and 20 seconds. Upscaling lifts a lower-quality clip toward a cleaner, larger one, so feed it the compressed or low-resolution version you want to improve, not a finished master. Trim or compress a source that exceeds the limits before sending it.

Choosing the upscale factor

upscaleFactor accepts any value from 1.5 to 3 in steps of 0.1, and defaults to 2. It multiplies both the width and the height, so a factor of 2 turns a 960 × 540 clip into 1920 × 1080. The output frames are capped at about 14.4 megapixels each, so a source that is already high-resolution may be scaled by less than the value you asked for, up to that ceiling.

The coastline below is a soft aerial clip taken to 2.5×:

SourceUpscaled

Foliage on the ridge, the texture of the cliffs, and the break of the surf come back defined where the source smeared them. Match the factor to the room the source has to grow: a smaller factor firms up a clip that is already close to the size you need, while a larger one rescues a genuinely small or degraded source.

Motion and audio carry over

An upscaler that flickers or drops the soundtrack is a non-starter for real footage. FLUX Video Upscale holds temporal consistency, so the detail it rebuilds stays put across frames instead of shimmering, and it passes the original audio track straight through. The busking clip below is an upscaled result, not the source. Press play and unmute:

An upscaled clip: the motion stays smooth and the source audio is untouched

The guitar and the street ambience are exactly the source's audio, unchanged by the upscale, and the hands stay locked to the strings frame after frame. Nothing about the sound or the timing is regenerated, only the picture is rebuilt.

Finishing AI-generated video

The most common source for an upscale is a generative model's own output. AI video models render soft, sub-1080 clips with limited fine detail, so the pattern is to generate at the model's native size, then lift the result here rather than pushing the generator toward a resolution it handles poorly. There is no real identity to protect and plenty of soft texture to rebuild, which is what the creative mode is built for. The dancer below came straight out of a video model at 480p:

AI sourceUpscaled

Two habits keep the result clean. Match the factor to the detail the clip actually holds: AI generations carry limited real texture, so a 2× lift usually reads cleaner than forcing 3× on a soft source. And watch the faces, where the creative rebuild that flatters scenery and motion can subtly shift a rendered face. The mode itself is covered in creativity modes.

Where it fits

Beyond generated clips, the same finishing pass lifts any soft source, whether a compressed export or an old low-resolution clip. FLUX Video Upscale rebuilds detail generatively, so it makes a clip look sharp and richly textured rather than producing a forensically exact enlargement, and it works from whatever signal survives. Feed it a clip while it still carries usable detail, not one that has already been crushed.

How aggressively it rebuilds, and which parts of the frame it favours, are the next two controls: set the balance between faithful and inventive with creativity modes, and point the enhancement at what matters with a prompt.

Tips

  1. Feed it recoverable input. The upscaler lifts soft and moderately compressed footage well, but it cannot rebuild detail that was already destroyed. Enhance before quality is crushed, not after.

  2. Match the factor to the source. Use a smaller factor to firm up a clip that is already near its target size, and 2.5 or 3 only when a small source has real distance to cover.

  3. Mind the frame ceiling. Output frames top out near 14.4 megapixels, so a high-resolution source will scale by less than the requested factor. Start from a smaller source when you need the full multiplier.

  4. Stay inside the input limits. The source must be 50 MB or less and 20 seconds or shorter. Split a long clip into segments and upscale them separately.

  5. Upscale last. Do your trimming and colour work first, then upscale as the final step so the rebuilt detail lands on the finished cut rather than getting recompressed downstream.