{"id":"full-dub-video","kind":"complete","name":{"he":"דיבוב סרטון — מקישור יוטיוב או מקובץ","en":"Dub a video — from a YouTube link or a file"},"one_line":{"he":"אותו סרטון בשפה אחרת: מביאים קישור יוטיוב — מהערוץ שלכם, סרטון Creative Commons או סרטון שיש לכם אישור עליו; הרישיון שהצהרתם נשמר עם העבודה — או מעלים קובץ.","en":"The same video in another language: bring a YouTube link — your own channel, a Creative Commons video, or one you have permission for; the licence you declare is kept with the job…"},"listed":true,"version":"1.0","updated":"2026-10-09","when_to_use":["A finished video in one skill: a YouTube link or a file — the licence kept with the job, the whole video or a part, its own frame, the dub written by Gemini watching the speaker, a stock voice of the new language, best of 3 takes, every phrase fitted to the speaker's mouth.","The video must speak another language and still sound like the speaker."],"when_not_to_use":["Only captions or only a title are wanted: a caption or hook skill is many times cheaper.","The customer cannot declare a licence for the YouTube video (not theirs, not Creative Commons, no permission)."],"example":{"video_url":"https://media.gpt.org.il/lookbook/examples/dub-video-en.mp4","credits":138,"seconds":32.4},"preview":null,"price":{"unit":"minute","from":240,"to":290,"note":"per finished minute; 30 s ≈ 125–150 credits — generated media is priced per asset, so half a minute is not half the price"},"inputs":[{"name":"youtube_url or video_url","type":"video","required":true,"limits":"a YouTube link with its licence, or an upload","notes":null},{"name":"target language","type":"language","required":true,"limits":null,"notes":"the language of the result (Hebrew in an Israeli voice, English, Russian…)"},{"name":"license","type":"choice","required":true,"limits":"own · creative-commons · licensed","notes":"declared by the customer — ask"}],"outputs":[{"name":"output.url","type":"video","required":true,"limits":"mp4, 9:16 1080p unless the request says otherwise","notes":"the file is deleted 24 hours after it is made: download it and tell the customer; publishing it is a separate step, only when asked"},{"name":"cost","type":"number","required":true,"limits":null,"notes":"GET /v1/usage?tag=<job name> → totals.credits: quote this, not the estimate"}],"steps":[{"method":"POST","path":"/v1/studio/uploads","what":"Only for a file (not a link): get an upload URL, PUT the bytes to output.upload_url with output.headers, use output.url as the video","body":{"filename":"clip.mp4"},"async":false,"optional":true},{"method":"POST","path":"/v1/youtube/videos/{id}/file","what":"The video's file (own or licensed content)","body":{"license":"own"},"async":false,"optional":false},{"method":"POST","path":"/v1/speech/transcripts","what":"Transcribe audio or video","body":{"audio_url":"<audio url — from the recipe>"},"async":true,"optional":false},{"method":"POST","path":"/v1/ai/text","what":"Generate text (chat)","body":{"model":"gemini-3.5-flash","system":"<system — from the recipe>","prompt":"<prompt — from the recipe>"},"async":false,"optional":false},{"method":"POST","path":"/v1/ai/voice","what":"Voice-over (text to speech)","body":{"text":"<text — from the recipe>"},"async":false,"optional":false},{"method":"POST","path":"/v1/studio/convert","what":"Convert, compress, change speed, extract audio","body":{"video_url":"<video url — from the recipe>"},"async":true,"optional":false},{"method":"POST","path":"/v1/studio/edit","what":"Full edit in one render","body":{"video_url":"<video url — from the recipe>"},"async":true,"optional":false},{"method":"POST","path":"/v1/social/publish","what":"Publish a post (simple)","body":{"profiles":["youtube 2","instagram 1"]},"async":false,"optional":false},{"method":"GET","path":"/v1/executions/{id}","what":"Poll a call that answered processing until it is completed (the file is output.url)","body":null,"async":false,"optional":false},{"method":"GET","path":"/v1/usage","what":"?tag=<job name>: what the whole job cost — quote it to the customer","body":null,"async":false,"optional":false}],"rules":["Show the customer the price (POST <path>/estimate with the same body, or the price above) and wait for their OK before any paid call.","Send Idempotency-Key: <job>-<step> on every POST. After a timeout send the same call with the SAME key — you get the same job back, never a second charge.","A long call answers status processing: poll GET /v1/executions/{id} every 5–10 s (or send x-wait-ms, up to 90000). Never send the job again to see whether it finished.","Send the same X-Tag: <job name> on every call of one job; GET /v1/usage?tag=<job name> is then what it really cost.","On-screen text is in the video's language and taken from what is actually said (a carousel: from the customer's brief). Never invent facts, names, prices or numbers.","Taking a YouTube video's file needs the licence the customer declares — own (their channel) · creative-commons · licensed (written permission): ask which; never choose it yourself. A Creative Commons video keeps its credit line on screen.","Publish, post or send only when the customer asked for exactly that — never on your own.","Hebrew has no capitals: keep uppercase false (it only breaks the Latin words inside a Hebrew line).","Keep text inside the middle 80% of the frame: side_margin ≥ 6, margin ≥ 12 — the platform's buttons cover the rest.","Check the words against the speech before burning them in: a phrase lost by the speech model is transcribed again with speech_models [\"universal-2\"] and the words sent as `words`."],"common_errors":[{"code":"invalid_input","why":"400: a field is missing, misspelled or out of range — the message names it","fix":"Fix exactly that field and send again; send only the fields the recipe or the docs show."},{"code":"unauthorized","why":"401: the API key is missing, wrong or revoked","fix":"Ask the customer for a valid key (keys are made at /api-keys); never print it back."},{"code":"insufficient_credits","why":"402: the balance does not cover the estimate (details.required_credits)","fix":"Tell the customer the price and that the balance is short; do not retry until they top up."},{"code":"rate_limited","why":"429: too many calls a minute","fix":"Wait the retry-after seconds, then send the same call with the same Idempotency-Key."},{"code":"failed","why":"the execution's status is failed or timeout — nothing is charged for failed work","fix":"Read error.message, fix the input, and start again with a NEW Idempotency-Key."},{"code":"upload_too_large","why":"413: the file is bigger than the call takes","fix":"Upload the original through POST /v1/studio/uploads and send its output.url; never shrink the picture's shape."},{"code":"license_mismatch","why":"400: creative-commons was declared for a video YouTube lists under its standard licence","fix":"Ask the customer whether it is their own channel (own) or they hold permission (licensed); otherwise the file cannot be taken."},{"code":"youtube_files_not_enabled","why":"403: taking YouTube files is switched on per account","fix":"Tell the customer to ask through the feedback button and name the channel; watching the link with POST /v1/ai/text works without it."},{"code":"skill_not_found","why":"404: no skill with this id or slug","fix":"Take the id from GET /v1/skills (items[].id or slug)."},{"code":"skill_not_available","why":"409: the skill is not on offer right now","fix":"Tell the customer and pick another skill from GET /v1/skills."},{"code":"skill_input_length","why":"422: the video is shorter or longer than the skill takes","fix":"Trim the video (POST /v1/studio/trim) or pick a skill that takes its length."},{"code":"duplicate_client_key","why":"409: a run with this client_key already exists","fix":"Do not start another: find it with GET /v1/agent/runs and follow it."}],"quality_check":["Every line keeps the original's meaning, names and numbers, and the punchline still lands in the new language.","The voice is clearly above the music all the way through.","The captions and every line on screen match what is said.","Watch the start, the middle and the end of the result before handing it over — not only its status.","Read `warnings` in the answer (a font swapped for the language, a picture that had to be enlarged) and tell the customer what they mean."],"tags":{"domain":"dub","level":"ai","hebrew":true,"recommended":false,"new":true,"creator":false,"topics":["complete","captions","dub","voice"]},"links":{"recipe":"/skills/full-dub-video.md","docs":"/docs?tool=video-studio","run":"/v1/skills/apihub-dub-video/run"}}