Skip to main content
POST

Overview

Clone Video takes a short video that works (a TikTok, an Instagram Reel, a YouTube Short or video) and makes a new one in its image: Hooked analyses its story, structure and pacing, writes a new narration from it, reads it with your voice and generates a new visual for each scene. The look is taken from the source video, so there is no style preset to pick: you choose AI images or AI video clips, and optionally the model. What it does not do: it does not copy the original’s voice, music or footage, and it cannot clone a video that is private, deleted or behind a login.
  • sourceVideoUrl is a TikTok, Instagram or YouTube link. Any other host answers 400.
  • targetDurationSeconds sets the length of the new video (default 30 seconds) and its price.
  • mustInclude is something the new video has to mention, such as your product or a call to action.
The request returns a projectId right away. The video is analysed, generated and rendered in the background.

More request bodies



What happens next

  1. Keep the projectId.
  2. Either poll GET /v1/project/{projectId} until video.status is COMPLETED (or the project status is failed), or pass a webhook and wait for the call.
  3. Download the file from video.url (or data.url in the webhook).
If the source video cannot be read (private, deleted, region-locked), the project fails, the webhook is called with "status": "FAILED" and the credits are refunded. See Webhooks for every payload.

Credits and your own keys

Teams on Hooked’s keys (managed): the project is priced from targetDurationSeconds, the media type and the quality or model, and the credits are taken up front. If the balance is short, the request answers 402 INSUFFICIENT_CREDITS with creditsNeeded and creditsAvailable and nothing is created. If the project fails later, the credits are refunded automatically. Teams on their own keys (BYOK): no credits are charged. The team needs these keys in Settings → AI keys:
  • OpenRouter: always (analysis, script, images, video clips, captions).
  • ElevenLabs: for the voiceover.
  • Gemini: when presetSettings.aiModel is gemini_omni_flash.
A missing key answers 402 missing_credentials with the list in missingProviders, before anything is created.

Errors

Send an Idempotency-Key header to retry safely: if a request times out or answers 5xx, sending it again with the same key and body returns the first answer instead of creating (and charging) the project twice.

Next Steps

Get Project

Follow the project until the video is ready

Clone Video example

More requests for this format

List Voices

Pick a voice

Script to Video

Bring your own script instead

Authorizations

x-api-key
string
header
required

Headers

Idempotency-Key
string

Makes the request safe to retry. 1-255 printable ASCII characters, one per operation (your job id, or a UUID you store), reused on every retry. Within 24 hours the same key with the same body answers with the first response and the header Idempotent-Replayed: true, without running or charging again. Keys are scoped to your team and the endpoint. 5xx answers and refusals before anything ran (401, 402, 403, 409, 429) are not kept. See Idempotency.

Required string length: 1 - 255
Pattern: ^[\x20-\x7E]+$

Body

application/json
sourceVideoUrl
string<uri>
required

The video to clone: a TikTok, Instagram or YouTube link. Any other host answers 400 (sourceVideoUrl: Only TikTok, Instagram, and YouTube URLs are supported).

Maximum string length: 2000
voiceId
string
required

The narrator: a library voice from /v1/voice/list or one of your team's custom voices. An ID that is neither answers 400 (voiceId: Voice "<id>" not found.).

Required string length: 1 - 30
targetDurationSeconds
integer
default:30

Length of the new video in seconds. It also sets the price.

Required range: 1 <= x <= 600
mustInclude
string

Something the new video has to mention or show, e.g. your product or a call to action (max 500 characters).

Maximum string length: 500
mediaType
enum<string>
default:ai-images

ai-images: one AI image per scene. ai-videos: one AI video clip per scene, chained frame to frame. Any other value answers 400.

Available options:
ai-images,
ai-videos
presetSettings
object

The model of the visuals. The style is taken from the source video, so there is no preset.

name
string

Project name (max 100 characters). Generated from the source when omitted.

Maximum string length: 100
musicId
string

Background music: a track from /v1/music/list or your team's own uploaded music. An ID that is neither answers 400 (musicId: Music "<id>" not found.).

Maximum string length: 30
aspectRatio
enum<string>
default:ratio_9_16

Vertical, horizontal or square.

Available options:
ratio_9_16,
ratio_16_9,
ratio_1_1
language
string

Two-letter ISO 639-1 code of the narration, e.g. en, es.

caption
object

Burned-in captions of the narration. Not used with motion-graphics (it typesets its own copy) or a speaking cast.

addStickers
boolean
default:false

Add emoji/GIF stickers anchored to the captions. Not used with motion-graphics or a speaking cast.

content
object

Branding.

webhook
string<uri>

HTTPS URL on a public host, called when the video is ready or the project fails (max 500 characters). Requests are signed: verify the Hooked-Signature header (HMAC-SHA256 of ".") with the signing secret from Settings → Webhooks; Hooked-Event and Hooked-Delivery headers name the event and the delivery. No redirects are followed; 10 s timeout; 3 immediate attempts. See the Webhooks guide for the payload.

Maximum string length: 500
metadata
object

Any JSON object of your own (max 5 KB). Stored on the project and sent back in the webhook payload. The key automationId is reserved for dashboard automations and is removed.

audio
object

Narrator voice settings (ElevenLabs). Any field you leave out keeps its default. Not used by a speaking cast.

Response

Project created. Follow it with GET /v1/project/{projectId} or wait for the webhook.

success
enum<boolean>
required
Available options:
true
data
object
required
message
string
required