# Skill: effect/web-demo — "הדגמת אתר" (Web demo)

The “watch it work” demo in one call: a terminal types the prompt, a browser opens the page, scrolls and zooms into what matters.
הדגמת ״תראו איך זה עובד״ בקריאה אחת: טרמינל מקליד את הפרומפט, דפדפן פותח את העמוד, גולל ועושה זום למה שחשוב.

Category: Overlays & graphics · שכבות וגרפיקה · a real preview: https://media.gpt.org.il/lookbook/effects/web-demo.mp4?v=mv19exzc
Price: **60 credits per finished minute**: the render itself — 1 credit per second of 1080p output. Combined with captions, a hook or other effects: still one render, nothing more for combining.

Base URL: `https://apihub.co.il` · Auth: `Authorization: Bearer <API key>` · Docs: `/docs` (group "Video Effects")
Send `X-Tag: <job name>` on every call of one video; `GET /v1/usage?tag=<job name>` returns what it cost.
**Files are kept 24 hours** — download the finished video.

---

## 1. On its own — one call

```jsonc
POST /v1/effects/web-demo             // x-wait-ms: 110000
{
  "video_url": "https://media.gpt.org.il/samples/sample-he.mp4",
  "image_url": "https://media.gpt.org.il/lookbook/effects/assets/page-apihub.jpg",
  "start": 0.1,
  "duration": 9.7,
  "params": {
    "address": "apihub.co.il",
    "prompt": "תפתח את apihub.co.il ותעשה זום על הכותרת",
    "zoom_y": 0.25
  }
}
```

A normal render: `status: processing` → poll `GET /v1/executions/{id}` until `completed`, then read `output.url`.
Leave out `video_url` and the effect is drawn on a plain black canvas (9:16 unless `output.aspect_ratio` says otherwise).

When it plays: a stretch: `start` + `duration` (seconds of the finished video), or `at` (a word id) + `duration`, or `during` { from, to } (word ids).

## 2. With captions, a hook and other effects — the same render

```jsonc
POST /v1/studio/edit               // x-wait-ms: 110000
{
  "video_url": "<the video>",
  "language_code": "he",
  "captions": {
    "style": "classic"
  },
  "effects": [
    {
      "id": "web-demo",
      "params": {
        "address": "apihub.co.il",
        "prompt": "תפתח את apihub.co.il ותעשה זום על הכותרת",
        "zoom_y": 0.25
      },
      "start": 0.1,
      "duration": 9.7
    }
  ],
  "audio": {
    "normalize": true
  },
  "output": {
    "aspect_ratio": "9:16",
    "resolution": "1080",
    "fit": "crop",
    "quality": "high"
  }
}
```

`effects` is a list: add more entries for more effects. The engine applies them by pipeline stage (cuts and time →
camera → grade and looks → overlays → text and captions → sound), never by their order in the list. An edit has one
`transition`, one `color` grade, one `music` bed, one `speed` and one caption style: two effects that set the same
one are refused with a message that names them.

## 3. Params

| param | default | range / options | what it does |
|---|---|---|---|
| `url` | **required** | string | The page's screenshot (PNG / JPG, a full-page capture scrolls) |
| `prompt` | `"תפתח את האתר ותעשה זום על המשפט הכי חשוב"` | string | What the terminal types |
| `status` | `"פותח דפדפן…"` | string | The terminal's status line when the typing ends ("" = none) |
| `title` | `"Terminal"` | string | The terminal's title |
| `address` | `""` | string | The address typed into the browser ("" = none) |
| `cps` | `26` | 4–80 | Typing speed, letters per second |
| `scroll_to` | `0.3` | 0–1 | How far down the page it whips (0 = no scroll, 1 = the bottom) |
| `zoom_to` | `1.35` | 1–4 | The zoom into the region at the end (1 = none) |
| `zoom_x` | `0.5` | 0–1 | The region: 0 left … 1 right |
| `zoom_y` | `0.35` | 0–1 | The region: 0 top … 1 bottom of the window |
| `highlight` | `null` | value | After the zoom, box this area and dim the rest (its centre x, y and size w, h — % of the frame; null = none) |
| `layout` | `"split"` | `split` · `over` | split = the speaker moves to the bottom, the panel takes the top · over = the panel is drawn over the video |
| `panel_height` | `45` | 25–70 | The panel's height, % of the frame |
| `focus_y` | `0.42` | 0–1 | split: the band of the speaker's picture kept at the bottom, round this height (0 top … 1 bottom) |

GET `/v1/effects/web-demo` returns the same as JSON (with the full body schema). Every field has a default; numbers
outside their range are refused with the field's name.
