---
title: "Web demo · הדגמת אתר"
method: POST
path: "/v1/effects/web-demo"
tags: ["Effects · Overlays & graphics"]
---

# Web demo · הדגמת אתר

`POST /v1/effects/web-demo`

## Request

- Base URL: `https://apihub.co.il`
- URL: `https://apihub.co.il/v1/effects/web-demo`
- Auth: HTTP bearer

The “watch it work” demo in one call: a terminal types the prompt, a browser opens the page, scrolls and zooms into what matters.

הדגמת ״תראו איך זה עובד״ בקריאה אחת: טרמינל מקליד את הפרומפט, דפדפן פותח את העמוד, גולל ועושה זום למה שחשוב.

One effect, one render: send the video (or nothing, for the canvas), the effect's `params` and when it plays (`start` + `duration` seconds, or `at` / `during` words) — every field has a default. The same effect stacks with others in `effects` of POST /v1/studio/edit. Preview: GET /v1/effects/web-demo.

**Billing:** Per second of output, like /v1/studio/edit — the effect is burned into the same render (+ transcription seconds when a captions effect transcribes automatically). A heavy effect (one that adds render time — measured) adds effect seconds: the seconds it is on screen × its weight, priced like output seconds; GET /v1/effects/{id} states its weight and price. Failed renders are not charged. · **Rate limit:** 30/min · **Asynchronous**

## Headers

- `Idempotency-Key` string
- `X-Tag` string
- `x-wait-ms` integer

## Request body

- object
  - `at` object: Start at a word (instead of a time)
    - `edge` 'start' | 'end', required: The moment the word starts, or the moment it ends
    - `word` string, required: The word's id (w0001…)
    - `offset_ms` number: Shift in ms, applied after the cuts (default 0)
  - `keep` object[]: Keep only these spans of the video (seconds) — every join between them is a cut a transition plays on
    - `end` number, required
    - `start` number, required
  - `trim` object: Use only this part of the video (seconds)
    - `end` number
    - `start` number
  - `start` number: seconds on the output — when it starts (default: the effect's own)
  - `words` object[]: Your own timed words (ms) instead of a transcript
    - `id` string
    - `end` number, required
    - `text` string, required
    - `start` number, required
  - `during` object: Start and end with a stretch of words (instead of a time and a duration)
    - `to` string, required: Id of the last word
    - `from` string, required: Id of the first word
    - `pad_end_ms` number: End this much later (default 0)
    - `pad_start_ms` number: Start this much earlier (default 0)
  - `output` object
    - `fit` 'crop' | 'blur' | 'pad': When the aspect ratio changes: crop the edges, blurred copy behind, or solid bars
    - `fps` number
    - `format` 'mp4' | 'webm' | 'mov' | 'gif' | 'mp3' | 'wav' | 'm4a' | 'jpg' | 'png'
    - `quality` 'draft' | 'standard' | 'high': high (default) = best picture; draft renders fastest for previews
    - `background` string: Bar colour for fit=pad
    - `resolution` '480' | '720' | '1080' | 'source': Short side in pixels (1080 = Full HD). `source` keeps the input size, max 1080
    - `aspect_ratio` 'original' | '9:16' | '16:9' | '1:1' | '4:5' | '4:3': 9:16 for Reels/TikTok/Shorts, 1:1 or 4:5 for feed, 16:9 for YouTube
  - `params` object: The effect's own settings (every field has a default)
    - `cps` number: Typing speed, letters per second
    - `url` string, uri: The page's screenshot (PNG / JPG, a full-page capture scrolls)
    - `title` string: The terminal's title
    - `layout` 'split' | 'over': split = the speaker moves to the bottom, the panel takes the top · over = the panel is drawn over the video
    - `prompt` string: What the terminal types
    - `status` string: The terminal's status line when the typing ends ("" = none)
    - `zoom_x` number: The region: 0 left … 1 right
    - `zoom_y` number: The region: 0 top … 1 bottom of the window
    - `address` string: The address typed into the browser ("" = none)
    - `focus_y` number: split: the band of the speaker's picture kept at the bottom, round this height (0 top … 1 bottom)
    - `zoom_to` number: The zoom into the region at the end (1 = none)
    - `highlight` object, nullable: After the zoom, box this area and dim the rest (its centre x, y and size w, h — % of the frame; null = none)
      - `h` number, required
      - `w` number, required
      - `x` number, required
      - `y` number, required
    - `scroll_to` number: How far down the page it whips (0 = no scroll, 1 = the bottom)
    - `panel_height` number: The panel's height, % of the frame
  - `duration` number: seconds — how long it lasts
  - `image_url` string, uri: The photo (JPG / PNG) — same as params.url
  - `video_url` string, uri: The video to put it on — leave out for the plain canvas
  - `language_code` string: Spoken language for the automatic transcript, e.g. he, en
  - `transcript_id` string: Reuse a transcript (captions effects)

## Response `200`

Completed (or 202 while processing)

- object
  - `id` string: Execution id — stable across internal retries; use it with GET /v1/executions/{id}
  - `status` 'pending' | 'processing' | 'completed' | 'partial' | 'failed' | 'cancelled' | 'timeout'
  - `operation` string
  - `tag` string, nullable: Your X-Tag, if sent
  - `created_at` string, date-time
  - `completed_at` string, date-time, nullable
  - `output` object: Operation result (see each operation). While a Studio render is processing: `stage` (queued · transcribing · downloading · preparing · cleaning_voice · mixing_audio · rendering · finishing), `phase` (the engine's: download · prepare · voice · audio · encode · qa · upload, or null), `progress` (a percent, 0–100) and `progress_fraction` (0–1), `eta_seconds` (seconds left, never below 0) and `estimate_seconds`
  - `error` string, nullable
  - `usage` object
    - `credits_charged` number, nullable
    - `credits_reserved` number
    - `estimated_credits` number
    - `cost_source` 'provider_reported' | 'calculated' | 'estimated' | 'null', nullable
    - `provider_usage` object, nullable: Normalised consumption, e.g. { VIDEO_SECOND: 22.4 }
  - `balance` object
    - `available` number
    - `reserved` number

## Other responses

- `202`: Processing — poll GET /v1/executions/{id}
- `400`: Invalid input
- `402`: Insufficient credits / project budget
- `404`: Resource not found (or not yours)
- `429`: Rate limited
- `503`: Service temporarily paused

---

[API](https://skmtc.dev/apihub/apis/apihub-one-api-for-chat-image-video-ai.md) · [All operations](https://skmtc.dev/apihub/apis/apihub-one-api-for-chat-image-video-ai/llms.txt) · [OpenAPI document](https://skmtc.dev/apihub/apis/apihub-one-api-for-chat-image-video-ai/revisions/a8caa42835ce?raw)
