---
name: ad-spot
description: Make a 15 s product commercial — three keyframes with the product (macro hero, the action, the end card with the slogan), a music bed with a drop, six shots on the beat — as an H3 Max Reference to Video draft or a Seedance 2.5 final with its own synced sound effects.
---
# The 15-second commercial

FlashBoards user skill, version 1.2.3 (2026-10-13).

On the board, read these guides with `list_skills` and `get_skill` when the assistant exposes them; otherwise use the hosted index through an available read-only retrieval tool. Use that runtime’s actual model discovery, current page context and guarded board actions for execution. Keep native readiness, approval and cost gates; do not claim a guide was read when retrieval is unavailable.

Read related guides with `get_skill({skillId:"<id>"})` or the [hosted index](https://pub-78da82d51ed14147ac554d38094b0c0b.r2.dev/user-skills/1.2.3/index.html). Reading a guide does not start or authorize a paid generation.

Read `ad` for the shared rules.

> **Quality route:** Seedance 2.5 does this job much better — on the tested spot its cuts landed close to the plan, the liquids and ice were finer and its own pour and splash sounds were in sync. Quote both before any paid video.

## Steps

1. **Keyframes**: `generate_image` with `gpt-image-25-flare`, `quality: "medium"`, `width: 1920, height: 1088`, picture 1 = the product sheet — the macro hero shot (dark studio, wet glass, rim light), the action (pour over ice), **the end card with the slogan text** — the text is drawn here, not in the video. Check the slogan with `crop_image` + `describe_media`.
2. **Music**: the ElevenLabs Music model (`run_skill_model`; or a song model from `list_generation_models`) — "dark minimal electronic, 120 BPM, a riser, one big bass drop", 15 s (ElevenLabs Music is billed per started minute: quote it). `measure_music_beats` for the beat phase; put the cuts on bars and the orbit on the drop.
3. **Six shots**: a macro droplet → the product opens → the pour → an orbit on the drop → a splash into ice water → the end card holds.
4. **Draft — H3 Max Reference to Video**: `generate_video` with `minimax-h3-max-reference-to-video`, `aspectRatio: "16:9"`, `resolution: "480P"`, `duration: 15`; `referenceGenerationIds`: [product sheet, keyframe 1, 2, 3] ("shot 1 starts exactly like Image 2", "shot 6 is exactly Image 4, with exactly this text"), `referenceAudioUrls`: [the music]. Cuts land a little early. The audio comes back as given: lay the music back with `replace_video_audio`, and add the pour, hiss and splash with ElevenLabs Sound Effects (`generate_audio` with `model: "elevenlabs-sound-effects-v2"`) at their shot times in `mix_audio_tracks`, under the music.
5. **Final — Seedance 2.5**: `generate_video` with `seedance-2-5`, `aspectRatio: "16:9"`, `resolution: "720p"`, `duration: 15`, `sound: true`; `referenceGenerationIds` the same four pictures, `referenceAudioUrls` the music; name them **@Image1…@Image4, @Audio1** in a plain-text prompt, one paragraph per shot with its seconds. Its sound is a re-composed version of the music with its own hiss, pour and splash in sync — keep it as is.

## Check

`detect_video_cuts` against the planned cuts; `extract_video_frame` of the last second and `describe_media` "Read the slogan exactly."

## Execute through MCP or on the board

Use the person's FlashBoards account; never ask for a personal provider key or run the source's local scripts. Discover `get_account`, `list_generation_models` and the tools of this client first: a published guide does not prove a feature is deployed.

**Headless, no open board.** Quote with `estimate_generation_cost` (skill models: `estimate_skill_model`), then run `generate_image`, `generate_video`, `generate_audio` or `run_skill_model` with one stable `generationAttemptId` per logical attempt. Pass `maxCostUsd` only when the current operation and selected model support it; otherwise use the quoted cost and the person's explicit approval with the supported controls. Never silently ignore an unsupported spending cap; make one `get_generation` check after `retryAfterSeconds`. Pass the person's own results by `generationId`: images in `referenceGenerationIds`, `firstFrameUrl` and `endFrameUrl`, audio in `referenceAudioUrls` or `targetAudioUrl`, videos in `referenceVideoGenerationIds`. They are read on the server; signed result links do not work as public URLs. Every `generationId` a tool returns stays valid: a later read of the same result gives a different string, and both work. Film frames and gallery pictures go in by `previewHandle`: `referencePreviewHandles` of the generation tools, a `{previewHandle}` source of `arrange_images`, `crop_image` and `pad_image`, and `describe_media`. New files come from `show_media_upload_picker` as receipts. The person's character comes in as its sheet, by `generationId` or as an upload; there is no search by name. If the person names a character without the sheet, ask for it or make one with `character-sheet`; do not scan recent results for it. Free server steps: `trim_video`, `concat_videos`, `conform_video`, `replace_video_audio`, `extract_video_frame`, `extract_video_audio`, `detect_video_cuts`, `crop_image`, `pad_image`, `arrange_images`, `cut_audio_span`, `concat_audio_tracks`, `mix_audio_tracks`, `fit_audio_duration`, `add_audio_reverb`. Check every result with `describe_media` (a question about an image; `model`, `mode` and `sourceRange` only for a video) and `transcribe_media` for speech. Both checks are paid: `describe_media` costs a fraction of a cent for an image and about 2–4 ¢ for a short video (more for a long one), `transcribe_media` under 1 ¢ a minute — count the checks you plan in the price you name before the first paid step. `describe_media` is not reliable about sound: it misses effects mixed under music and can hear voices or instruments that are not there. Check speech with `transcribe_media` and ask the person to listen for effects and music. Never repay an uncertain submission; reuse an attempt ID only for the identical request. Make each new `requestId` or `generationAttemptId` unique, for example the task, the date and a short random suffix: an ID used before, even in another chat, replays that earlier request or answers `REQUEST_ID_CONFLICT`.

**On the board.** Inspect with `list_board_sessions` and `get_board_snapshot` and carry the same `sessionId` and a fresh `activeBoardId` as `expectedBoardId`. Native cards: `execute_board_action` (`listNativeModels`, `setModel`), `prepare_board_generation` with ordered board items or owned outputs, then one `generate_on_board` within the authorized budget. Board media tools: `list_media_tools` → `start_media_tool` → `get_media_tool_run`. Put headless results on a board with `add_media_to_board`.

Keep mandatory safety settings and the live limits of each model. Prices, timings, endpoints and "free retry" claims in the sources are historical, not FlashBoards contracts. If a step this guide needs is not available or is refused (a tool error, `audio_not_configured`, a missing model or input), keep the finished assets, tell the person which step is blocked and why, and ask how to go on. A single generation that ends `failed` is not a blocked step: submit it once more with a new `generationAttemptId` (reworded if it may have hit the content checker), and stop to ask only if it fails again. A failed attempt is not always refunded, so the retry may be paid again and `maxCostUsd` caps each request on its own: count both against the budget the person approved. Never swap in another route on your own: no image model redrawing a layout or a frame, no `describe_media` in place of the frames it should check, no clip generated only to take its sound, no picture drawn where the guide takes a film frame.

## Source and related guides

- [Original Learn guide](https://flashboards-h01.vercel.app/learn/formats-and-exhibition/ai-video-ad/skills/ad-spot.md)
- Updated from the owner's skill sources of 2026-10-11.

Read: `ad`, `ad-product-sheet`, `music`. Source experiments and demo materials are historical; use the person's own approved media.
