# Video routes and the price table The board ends with a question the user can now answer: which model should film this, and what will it cost? `scripts/price-table.mjs` answers it from the shot lengths in board.json and the dated price file `assets/video-prices.json`. Nothing in the table is typed by hand. ## How the table is worked out For each route and each rate (resolution, silent or with audio): 1. Each planned shot becomes one image-to-video clip from its keyframe. 2. Each shot is billed the way that route makes clips: - Seedance: any whole number of seconds from 4 (to 15, or 30 on Seedance 2.5). A 3 s shot is billed as 4 s. - Kling 3: 3 to 15 s. - Veo 3.1 and Veo 3.1 fast: 4, 6 or 8 s only. A 5 s shot is billed as 6 s, so a 31 s plan bills 34 s. - Wan 2.2: set in frames (17 to 161) at 16 frames per second, billed at 16 fps. A 5 s shot is 81 frames, 5.06 s. At most about 10 s per clip. 3. Cost = billed seconds × the price per second for that rate. `--resolution` picks the planned resolution (720p by default, from `brief.final_resolution`). Routes without that resolution are listed as "not listed" with what they do offer; routes with no resolution setting (Kling) always appear. `--all` lists every resolution. The table ends with the whole film on the Meleon film Skill the board hands to, before re-rolls: high-quality keyframes, a cast sheet when there are people, drafts on Seedance 2.0 mini at 480p, and finals on Seedance 2.5. It uses the same sums as that Skill's own estimate stage, so the two match. ## The routes (fal list prices checked 2026-10-18) | Route | Model id | Price per second | Audio | Clip lengths | Faces | | ----------------- | ------------------------------------------------ | ------------------------------------------------------ | ----------------------------------- | ------------------ | --------------------------------------------------------- | | Seedance 2.5 | `bytedance/seedance-2.5/image-to-video` | $0.2205 at 480p, $0.473 at 720p, $1.164 at 1080p | Included, same price | 4 to 30 s | Refuses clearly visible realistic faces | | Seedance 2.0 | `bytedance/seedance-2.0/image-to-video` | $0.3034 at 720p, $0.682 at 1080p | Included, same price | 4 to 15 s | Refuses clearly visible realistic faces | | Seedance 2.0 fast | `bytedance/seedance-2.0/fast/image-to-video` | $0.2419 at 720p | Included, same price | 4 to 15 s | Refuses clearly visible realistic faces | | Seedance 2.0 mini | `bytedance/seedance-2.0/mini/image-to-video` | $0.0721 at 480p, $0.1547 at 720p | Included, same price | 4 to 15 s | Refused a side-profile synthetic face in testing | | Kling 3 pro | `fal-ai/kling-video/v3/pro/image-to-video` | $0.112 silent, $0.168 with audio ($0.196 with voice control) | Extra | 3 to 15 s | Not tested on this endpoint | | Kling 3 turbo pro | `fal-ai/kling-video/v3/turbo/pro/image-to-video` | $0.14 | No setting (returned a sound track) | 3 to 15 s | Accepted a synthetic close-up and held it for 3 s | | Veo 3.1 fast | `fal-ai/veo3.1/fast/image-to-video` | $0.10 silent, $0.15 with audio (720p or 1080p) | Extra | 4, 6 or 8 s | Not tested on the fast version | | Veo 3.1 | `fal-ai/veo3.1/image-to-video` | $0.20 silent, $0.40 with audio (720p or 1080p) | Extra | 4, 6 or 8 s | Accepted a synthetic close-up; the face drifted within 4 s | | Wan 2.2 | `fal-ai/wan/v2.2-a14b/image-to-video` | $0.04 at 480p, $0.06 at 580p, $0.08 at 720p | None | 17 to 161 frames at 16 fps | Not tested | Each route's source page is in the price file and at the end of prices.md. Request fields differ: Kling 3 pro takes `start_image_url`, the others `image_url`; Veo takes `duration` as "4s", "6s" or "8s"; Wan takes `num_frames` and `frames_per_second`; Seedance takes `duration` as a string of seconds and `resolution`. Read the model page before wiring a route the film Skills do not already use. ## Choosing a route - **The Meleon film Skills' route** (Seedance 2.0 mini drafts at 480p, Seedance 2.5 finals at 720p): the route the Cinematic brand film and Destination teaser samples were made and checked on, with ambience at no extra cost. It is also the dearest per second. - **Cheapest silent:** usually Wan 2.2 at 720p or Veo 3.1 fast silent. Good for a quick look at motion, or a film that will carry music anyway. Not tested by Meleon for consistency across shots. - **Cheapest with sound:** often Seedance 2.0 mini at 720p, where audio costs nothing extra (it is the draft tier the film Skills test motion on, not their finals model), then Veo 3.1 fast or Kling 3 pro with audio. - **A visible face** in one shot: Kling 3 (turbo kept the face in testing) for that shot, Seedance for the rest. Expect the look to differ slightly; the film Skill's grade evens it out only partly. - **Start and end frame** (a shot that must land on a set image): Seedance and Kling 3 pro take `end_image_url`; Veo and Wan do not. Mixing routes in one film works, because the film Skills scale every clip to one size. Test one draft on any route that is new to the user before paying for a whole film on it. ## Keeping prices current Prices on fal change. The price file carries the date it was checked, the board footer prints that date, and the scripts warn when it is more than 30 days old (check-board fails after 90). To update: 1. Open each route's `source` page (`https://fal.ai/models//llms.txt`) and read the price sentence. 2. Change `rates` (and `durations` or `note` if they changed) in `assets/video-prices.json`, and set `checked` to today. 3. Re-run price-table.mjs and compose-board.mjs, so prices.md and the board footer show the new date. To add a route, give it an `id`, `name`, `model`, `source`, `durations` (`range`, `set` or `frames`), `audio` (`included`, `extra` or `none`) and `rates`; add its id to `board_footer` only if it should be on the board itself. ## The handoff, in detail `scripts/handoff.mjs --to cinematic-brand-film|destination-teaser` writes the film Skill's shot list from the approved board: | Board field | Cinematic brand film (`film.json`) | Destination teaser (`teaser.json`) | | -------------------------------- | ------------------------------------------- | -------------------------------------------------- | | `brief.name`, `brief.idea` | `brief.brand`, `brief.story` | `brief.place`, `brief.season_mood` (or `--season-mood`) | | `brief.people` fictional | `brief.person` "synthetic" (run `--stage bible` first) | `brief.people` "synthetic" | | `locks.place` | `locks.location` | `locks.place` (with `locks.product` appended, if any) | | `locks.people`, `locks.wardrobe` | `locks.cast`, `locks.wardrobe` | one `locks.people` sentence | | `locks.product`, product photo | `locks.product`, `references.product` | not used (the teaser has no product reference) | | place photos | the first one as `references.location` | `references.place` and `extra_place_photos` | | `use_place_ref` | `use_location_ref` | `use_place_ref` | | `look.grade` | must be teal-amber, warm-kodak, cool-fuji or natural (`--grade`) | any of the five | | `frame` | `board_frame` (and `keyframe` with `--use-board-frames`) | the same | | (new) | `title_card`, `end_card` with the name | `look.fade_out` | Every `{{TOKEN}}` is written out with the lock text, so the film Skill sees finished prompts. The film Skill adds its own reference sentences and look line around them, as it does for its own shot lists.