Skip to main content
POST

Overview

You describe the post you want. The model writes the post and its comments, a voice narrates them, and the video opens on a card that looks like a Reddit post (or a Facebook or Instagram one), over a gameplay clip by default. The request returns a projectId right away. The video is generated and rendered in the background.

Only prompt and voiceId are required. The background defaults to the subway-s-1 gameplay clip; gameplaySettings applies to gameplay only, presetSettings to ai-images / ai-videos only, and media to media only. The card fields (cardTheme, showAuthor, cardDurationSeconds, card) only apply while showCard is true.


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).
The webhook receives { "status": "COMPLETED", "message": "Video completed", "data": { "videoId", "projectId", "status": "COMPLETED", "url", "metadata" } }. A project that fails before it has a video sends "status": "FAILED" with videoId: null. See Webhooks.

Credits and your own keys

Teams on Hooked’s keys (managed): the project is priced from the target duration and the background (media type, quality or model). The credits are taken up front; if the balance is short, the request answers 402 INSUFFICIENT_CREDITS 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 (the story, visuals, captions).
  • ElevenLabs: for the narration.
  • 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

Webhooks

Payloads and delivery rules

List Voices

Pick a voice

Quiz Video

Another background-video format

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
prompt
string
required

What the post is about (1-4,000 characters), e.g. "AITA for refusing to give my sister my wedding date?". The model writes the post and its comments from it.

Required string length: 1 - 4000
voiceId
string
required

Narrator voice: a library voice ID from /v1/voice/list or one of your team's custom voices. An unknown ID answers 400.

Required string length: 1 - 30
name
string

Project name (max 100 characters). Generated when omitted.

Maximum string length: 100
targetDuration
number
default:60

Length of the story, in seconds (10-600).

Required range: 10 <= x <= 600
language
string

2-letter ISO 639-1 code (e.g. en, es): the story is written and narrated in it. Detected from the prompt when omitted.

platform
enum<string>
default:reddit

Which platform the post is written for and which card the video opens on (upvotes reads as reactions on Facebook and likes on Instagram).

Available options:
reddit,
facebook,
instagram
showCard
boolean
default:true

Show the post card. cardTheme, showAuthor, cardDurationSeconds and card only apply while it is true.

cardTheme
enum<string>
default:dark

Only with showCard: true. Card colors.

Available options:
dark,
light
showAuthor
boolean
default:true

Only with showCard: true. Show the author on the card.

narrationScope
enum<string>
default:post_and_comments

post_and_comments reads the post and then the comments; comments_only reads only the comments.

Available options:
post_and_comments,
comments_only
card
object

Only with showCard: true. Your own values for the card: each field you send replaces the one the model writes; the rest stay generated.

cardDurationSeconds
number

Only with showCard: true. How long the card stays on screen, in seconds (1-600). When omitted, the card stays for the whole video.

Required range: 1 <= x <= 600
mediaType
enum<string>
default:gameplay

Background visuals: a gameplay clip (default), AI images, AI video clips or your own library media. motion-graphics is not offered for this format and answers 400.

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

mediaType ai-images / ai-videos only: the generated background. preset and aiModel apply to both; quality and isContinuous to ai-videos only.

gameplaySettings
object

mediaType gameplay only: the background clip. Games and their clips: minecraft (minecraft-1 … minecraft-9), subway-s (subway-s-1 … subway-s-11), temple-run (temple-run-1 … temple-run-8), gta (gta-1 … gta-12), fortnite (fortnite-1 … fortnite-5), roblox (roblox-1), free-fire (free-fire-1). A clip that does not exist plays the game's first clip. Use custom as selectedGame to play one of your own library videos: selectedVideo is then its media ID, and an ID that is not a video in your library answers 400.

media
string[]

mediaType media only, and required there: IDs of images or videos in your team's media library (max 50). An ID that is not in your library answers 400 (media: Media "<id>" not found). A media that is not COMPLETED yet (an import or upload in progress) answers 400 media: Media "<id>" is not ready (status PROCESSING).

Maximum array length: 50

Media ID from your library

aspectRatio
enum<string>
default:ratio_9_16
Available options:
ratio_9_16,
ratio_16_9,
ratio_1_1
caption
object

Captions of the narration.

audio
object

Narrator voice settings (ElevenLabs). Omitted fields keep their defaults.

addStickers
boolean
default:false

Add emoji/GIF stickers anchored to the captions.

content
object

Branding.

musicId
string

Background music: a track ID from /v1/music/list or your team's own uploaded music. An unknown ID answers 400.

Maximum string length: 30
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). Sent back in the webhook payload. The key automationId is reserved for dashboard automations and is removed.

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