Nodes/comfyui-jz/jz fal Video
ComfyUI Node

jz fal Video

Kling and Hailuo clips in your graph — where the JSON check earns its keep

By j-zhang19·Created 3 months ago·Updated 14 days ago· 3
jz fal Video
  • image
  • video
  • request_id
  • info
◄modelfal-ai/kling-video/v2/master/image-to-video►
◄prompta cat walking through grass►
◄params{}►
◄custom_model►
◄api_key►
◄poll_timeout1800►
◄poll_interval5►

Why you'd leave the GPU idling for this

Video is the one place where local genuinely isn't the answer yet for a lot of jobs. There are no weights for Kling or Hailuo - MiniMax only opened H3's weights in August 2026, and it's a 42 GB model under a licence that excludes the US, EU, UK and Korea, which is not most people's evening. So if you want that specific look, a paid endpoint is the only door.

jz fal Video is the pack's fal queue client pointed at video models: same node shape as jz fal Image, different output type. The curated picks are fal-ai/kling-video/v2/master/image-to-video, the matching text-to-video variant, and fal-ai/minimax/hailuo-02/standard/image-to-video, with custom reaching any of fal's roughly 1,500 endpoints.

How it works, and why it differs from the image node

Mechanically it's identical: POST https://queue.fal.run/{model}, poll the status URL, fetch the finished result. What changes is the shape of what comes back.

The output is a native VIDEO, not an IMAGE batch. That's not fussiness - a 5-second 1080p clip decoded to a Comfy tensor is something like 3 GB of float data, and the node would be building it every run for no reason. Instead the MP4 is downloaded and wrapped with ComfyUI's InputImpl.VideoFromFile, so you wire it into a saver (core's SaveVideo takes a VIDEO directly, and the VideoHelperSuite nodes do too). That means the node needs a reasonably current ComfyUI - it imports comfy_api.latest, so a build from before the VIDEO type existed will fail at import.

The second difference is that the pre-flight validation matters more here, because video is where video money goes. params is still a JSON widget, validated against fal's published OpenAPI schema before anything billable is sent - missing required field, unknown parameter, wrong type or bad enum all raise locally and list what the model accepts. On a video model that's the difference between a free error message and a $2 typo.

The inputs that matter

  • model - the curated video shortlist above, or custom + custom_model for anything else (including later Kling, Veo, Wan and LTX endpoints).
  • prompt - motion description. It's defaulted into args, so a "prompt" key in params overrides the widget.
  • params - everything model-specific. The author's example is {"duration": "5", "cfg_scale": 0.5}; note the duration is a string, which is exactly the kind of thing the schema check catches for you.
  • image - the start frame or reference for the image-to-video models. Wire it into a text-to-video endpoint and the node raises instead of submitting: that model declares no image input at all.
  • poll_timeout - 1800 seconds by default, 5-second interval. Keep it generous; a clip can sit in queue for a while, and while fal can cancel a job, you'd rather it finish.

Outputs are video, request_id and info. The request_id is worth keeping: fal holds the result server-side, so a graph that errors after the spend is recoverable rather than a second purchase.

Install

Same as the rest of the pack. ComfyUI Manager → search comfyui-jz, or:

cd ComfyUI/custom_nodes
git clone https://github.com/j-zhang19/comfyui-jz

Restart ComfyUI. No models to download, no fal_client package to fight with - the pack's declared dependencies are just requests, pillow and numpy, which ComfyUI already ships with.

Key setup: FAL_KEY=... in a .env at the pack root, or [FAL] api_key=... in config.ini. Both are gitignored. Leave the api_key widget empty unless you enjoy your key living inside shared workflow JSON.

Where people get burned

  • The bill is per job, and video jobs are the expensive ones. This is the standard objection to API nodes pointed at video, and it's correct: the "videos per month per $20" maths is grim compared to a local Wan run. Use it for the jobs your local stack can't do, not as the default.
  • Timeout cancels. If poll_timeout trips, the node cancels the request rather than leaving it queued and charging. That's the right behaviour, but it does mean a very slow model plus a stingy timeout equals a wasted submit.
  • No retries on the billable submit. Deliberate: a retried POST whose first attempt landed would queue and bill a second video.
  • Model list looks stale? It's the live fal catalogue cached for 24 hours. Use custom + custom_model and stop waiting on the cache.
  • info is JSON, not a receipt you can trust. It's the raw result minus the video - the numbers that matter live on your fal dashboard.
Categoryjz/api

Inputs (8)

NameTypeDefaultDescription
modelCOMBOfal-ai/kling-video/v2/master/image-to-video4 options: fal-ai/kling-video/v2/master/image-to-video, fal-ai/kling-video/v2/master/text-to-video, fal-ai/minimax/hailuo-02/standard/image-to-video, custom
promptSTRINGa cat walking through grass—
paramsSTRING{}model-specific arguments as json, e.g. {"duration": "5", "cfg_scale": 0.5}. checked against the model's schema before anything is billed; the console prints what it accepts
imageoptIMAGEstart frame / reference, for the image-to-video models
custom_modeloptSTRING—
api_keyoptSTRING—
poll_timeoutoptINT180030–7200—
poll_intervaloptINT51–30—

Outputs (3)

NameTypeDescription
videoVIDEO—
request_idSTRING—
infoSTRING—