# Skill: full/veo — "B-roll עם Veo" (Complete video)

Generated B-roll: three 4-second Veo clips and two Nano Banana Pro stills cut in over the talking head on the moments that need a picture, a focus hook, elegant serif captions, graded, with an original score. Veo 3.1 Fast by default; the full Veo 3.1 follows the prompt more closely at about three times the price of the clips.

**Includes:** hook · captions · 3 Veo clips (Veo 3.1 Fast, or Veo 3.1) · Nano Banana Pro images · music · colour grade
**Built on:** hook `blur` ("פוקוס", `/skills/hook-blur.md`) + captions `elegant` ("אלגנטי", `/skills/captions-elegant.md`)
**Price:** 630–1750 credits per finished minute · 30 s ≈ 530–1400 credits
**Uses:** `/v1/studio/remove-silence` · `/v1/ai/video` · `/v1/ai/image` · `/v1/ai/music` · `/v1/studio/edit`

Base URL: `https://apihub.co.il` · Auth: `Authorization: Bearer <API key>` · Docs: `/docs`
Send the same `X-Tag: <job name>` header on every call of one video; `GET /v1/usage?tag=<job name>` then
returns exactly what it cost. Times in request bodies are **seconds on the edited (output) timeline**.
Unknown fields are rejected with the name of the right field — read the error instead of guessing.
**Files are kept 24 hours** (renders, uploads, generated clips/images/music) — download the finished video.

**Models.** This template runs on the newest models: `quality: "best"` on every AI call — Veo 3.1 for clips,
Nano Banana Pro for images, ElevenLabs v3 for Hebrew voice. Each is priced per asset, so a 30-second video
costs almost as much as a 60-second one. `quality: "balanced"` is the cheaper cut of the same recipe.

---

## 1. Cut and transcribe

```jsonc
POST /v1/studio/remove-silence     // x-wait-ms: 110000
{ "video_url": "<source>", "language_code": "he", "min_pause_ms": 350, "padding_ms": 70, "remove_fillers": true,
  "output": { "resolution": "source", "aspect_ratio": "original", "quality": "high" } }
POST /v1/speech/transcripts        { "audio_url": "<cut url>", "language_code": "he" }   → transcript_id
GET  /v1/speech/transcripts/{id}/sentences                                              → the edit map (ms)
```

**Check the words against the speech before you use them.** Now and then the default model loses a phrase of
Hebrew: a second or more of talking with no words in the sentences, or words squeezed to zero length (`start` = `end`).
Transcribe the same cut again with `"speech_models": ["universal-2"]` (≈ 1 credit a minute), take its words for that
stretch, fix a misheard name (a brand, a product), and send the list as `"words": [{ "text", "start", "end" }]` (ms) in
the render instead of `transcript_id` — the captions are built from your words in the style's own rhythm.

**Everything below is timed on the cut video's clock.**

## 2. Plan three moments, then generate (in parallel)

From the sentences pick three claims that need motion no photograph gives (a process, a place, a product in
use), 5+ seconds apart, first after 3 s, none in the last 3 s. Write each as a **moving shot** in English:
subject, camera move, light. Two stills (Nano Banana Pro) cover the abstract lines in between.

```jsonc
POST /v1/ai/video   { "quality": "best", "prompt": "<a moving shot: subject, camera move, light>", "aspect_ratio": "9:16", "resolution": "720p", "duration": "4" }   // Veo 3.1 ≈ 480 credits (send x-wait-ms: 110000; ~1–3 min)
POST /v1/ai/image   { "quality": "best", "prompt": "<photoreal 9:16 still, no text, no logos>", "aspect_ratio": "9:16", "resolution": "1K" }   // Nano Banana Pro ≈ 42 credits
POST /v1/ai/music   { "prompt": "<mood, instruments, tempo — no vocals>", "duration": <video seconds + 2>, "instrumental": true }   // ≈ 0.8 credits/second
```

**Say the price before you spend it:** three Veo 3.1 clips ≈ 1,440 credits. On `quality: "balanced"`
(Veo 3.1 Fast) the same three are ≈ 360. Ask the customer which they want unless they already said "the best".

## 3. Render

```jsonc
POST /v1/studio/edit               // x-wait-ms: 110000
{
  "video_url": "<cut url>", "transcript_id": "<id>",
  "hook": { "text": "<the line the video is about>", "duration": 3, "style": "blur" },
  "captions": { "style": "elegant" },
  "overlays": [
    { "url": "<veo clip 1>", "type": "video", "start": 4.0,  "duration": 3.0, "mode": "full",  "fade_ms": 220 },
    { "url": "<image 1>",    "type": "image", "start": 11.5, "duration": 2.6, "mode": "split", "split_side": "top", "split_ratio": 0.55, "speaker_focus": 0.3, "fade_ms": 180 },
    { "url": "<veo clip 2>", "type": "video", "start": 19.0, "duration": 3.0, "mode": "full",  "fade_ms": 220 }
  ],
  "color": { "preset": "cinematic", "sharpen": 0.3 },
  "music": { "url": "<music>", "volume": 0.3, "duck": false, "fade_in_ms": 800, "fade_out_ms": 2400 },
  "audio": { "normalize": true },
  "output": { "aspect_ratio": "9:16", "resolution": "1080", "fit": "crop", "quality": "high" }
}
```

A full-screen clip hides the speaker: keep each to 2.2–3 s and never over the punchline.

**English words in a Hebrew video** (AI, a brand): `elegant` is set in Noto Serif Hebrew, which has no Latin letters, so
the engine swaps the whole caption font (it says so in `warnings`). Send `"captions": { "style": { "preset": "elegant",
"font": "Frank Ruhl Libre", "weight": 700, "outline": 5, "shadow": 6, "future_opacity": 0.6 } }` — the same serif look in a
font that draws both, and it stays readable on a white shirt or a bright sky.

**The example on /skills** (a 58-second phone video, 27.9.2026): three Veo 3.1 Fast clips (`balanced`, 720p, 4 s), two Nano
Banana Pro stills, a 60-second score, the cut and one render — **613 credits**; the clips are 360 of them.

Send `x-wait-ms: 110000` to wait for the render in the same call; if the response is still
`processing`, poll `GET /v1/executions/{id}` until `status` is `completed` and read `output.url`.

## Check the bill

`GET /v1/usage?tag=<job name>` — per call, per operation and the total, in credits. Quote that to the
customer, not the estimate above.

## Rules that keep captions readable on every platform

- **Safe zone.** Keep text inside the middle 80% of the frame: `side_margin` ≥ 6 handles the sides; `margin`
  ≥ 12 keeps the bottom clear of the platform UI (username, buttons, progress bar).
- **A line never leaves the frame** — a line too wide for the side margins is set smaller automatically. Do
  not shrink the size yourself, wrap instead (`max_chars_per_line`).
- **Hebrew has no capitals** — keep `uppercase: false`; it only breaks Latin words mixed into a sentence.
- **Fonts.** `GET /v1/studio/fonts` lists the bundled families and which scripts they draw. A font that
  cannot draw the caption's language is swapped and reported in `warnings`.
- The customer's transcript wins: to fix a word, `GET /v1/speech/transcripts/{id}/captions`, edit the text,
  and send the list back as `captions.captions` — timing is kept when the word count is unchanged.
