# Skill: full/sales — "מודעת מכירה" (Complete video)

A selling clip: a counting-number hook, pop captions, Nano Banana Pro product shots, icons on the proof points, a kinetic end card with the price (or the product, when no price is given — never an invented one), music and a closing call to action.

**Includes:** counting hook · captions · AI product shots · icons on the proof points · kinetic end card (price or product) · music · CTA
**Built on:** hook `counter` ("מונה", `/skills/hook-counter.md`) + captions `pop` ("פופ", `/skills/captions-pop.md`)
**Price:** 300–380 credits per finished minute · 30 s ≈ 240–310 credits
**Uses:** `/v1/studio/remove-silence` · `/v1/ai/image` · `/v1/stock/icon` · `/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. Collect the facts, then generate (in parallel)

Product name, the one benefit, the price, the offer and the CTA — from the customer, never invented.

```jsonc
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/stock/icon { "icon": "mdi:rocket-launch", "color": "#111111", "size": 512, "background": "#FFFFFF", "padding": 16 }  // free (search ids with GET /v1/stock/search?kind=icon&q=…)
POST /v1/ai/music   { "prompt": "<mood, instruments, tempo — no vocals>", "duration": <video seconds + 2>, "instrumental": true }   // ≈ 0.8 credits/second
```

Three product shots (studio light, the product alone, 9:16), one icon per proof point.

**No price given?** Never invent one. The counter hook counts the number the video is about (`"30\nרילסים מוידאו אחד"`),
and the end card names the product instead of the price (`{ "text": "<product>", "effect": "punch", "preset": "mega" }`),
followed by the CTA in the speaker's own words.

## 3. Render

```jsonc
POST /v1/studio/edit               // x-wait-ms: 110000
{
  "video_url": "<cut url>", "transcript_id": "<id>",
  "hook": { "text": "₪<price>\n<what for>", "duration": 3, "style": "counter" },
  "captions": { "style": "pop" },
  "overlays": [ { "url": "<shot 1>", "type": "image", "start": 4.0, "duration": 2.6, "mode": "full", "fade_ms": 200 },
                { "url": "<icon>", "type": "image", "start": 9.0, "duration": 2.2, "mode": "pip", "x": 78, "y": 22, "size": 22, "rotate": 4, "float": 1.2, "shadow": true } ],
  "panels":   [ { "start": <end − 3>, "duration": 3, "color": "#111111", "fade_ms": 120 } ],
  "texts":    [ { "text": "₪<price>", "start": <end − 2.9>, "duration": 1.4, "effect": "counter", "preset": "mega", "style": { "y": 40 } },
                { "text": "<CTA — 3 words>", "start": <end − 1.5>, "duration": 1.5, "effect": "box", "preset": "pill-accent", "style": { "y": 58 } } ],
  "music": { "url": "<music>", "volume": 0.3, "duck": false },
  "audio": { "normalize": true },
  "output": { "aspect_ratio": "9:16", "resolution": "1080", "fit": "crop", "quality": "high" }
}
```

**The example on /skills** (a 58-second pitch, 27.9.2026): **295 credits** — three product shots 126, a 60-second track 46,
the cut and its transcripts 65, icons free, the render 58.

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.
