DocsDevelopers
API reference
Every endpoint of the public API v1, with parameters and examples.
JSON over HTTPS at https://www.loudscene.com/api/v1. Authenticate with Authorization: Bearer ls_live_… (API keys, Pro plan and up). This page is generated from the same OpenAPI document the server validates with.
Basics#
- Authentication: a workspace API key as a Bearer token.
- Rate limits: per key, reported in
RateLimit-*headers. - Idempotency: send
Idempotency-Keyon POST to retry safely. - Errors: one JSON shape, with a code and a request id.
- Webhooks: signed events for generations, renders and comments.
Brand#
/api/v1/brand/extractExtract a brand from a website
Starts a brand_extract job. Poll GET /v1/jobs/{id}; when it succeeds the new brand kit appears in GET /v1/brand-kits. A token link (a contract address, Dexscreener or pump.fun link) reads the project's website; when that site blocks automated visitors, the kit is built from the token instead: its Dexscreener image as the logo, colours read from it, its name. For any other site that blocks us, create the kit with POST /v1/brand-kits.
Parameters
| Name | In | Description |
|---|---|---|
Idempotency-Key | header | Optional. Retries with the same key and body get the first answer for 24 hours. |
Body
| Field | Type | Description |
|---|---|---|
urlrequired | string | Website address, e.g. https://example.com (https is added when missing) |
Request
curl -X POST https://www.loudscene.com/api/v1/brand/extract \
-H "Authorization: Bearer $LOUDSCENE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"url":"https://yourbrand.com"}'Response · 202 The extraction job
{
"id": "3f2e1d0c-9b8a-4765-8432-10fedcba9876",
"kind": "brand_extract",
"status": "queued",
"stage": null,
"progress": 0,
"error": null,
"result": null,
"created_at": "2026-09-26T12:00:00Z",
"finished_at": null
}| Field | Type | Description |
|---|---|---|
idrequired | string (uuid) | |
kindrequired | string | |
statusrequired | "queued" | "running" | "succeeded" | "failed" | "canceled" | |
stagerequired | string | null | |
progressrequired | number | |
errorrequired | string | null | |
resultrequired | object | null | Kind-specific result (stills: signed PNG URLs). |
created_atrequired | string (date-time) | |
finished_atrequired | string (date-time) | null |
Errors: 400 invalid request (see error.details) · 401 missing, unknown, revoked or expired api key · 403 the workspace's plan does not include the api · 404 not found in this workspace · 429 rate limited (see retry-after). See Errors.
/api/v1/brand-kitsList brand kits
Every brand kit of the key's workspace, default first.
Request
curl -X GET https://www.loudscene.com/api/v1/brand-kits \
-H "Authorization: Bearer $LOUDSCENE_API_KEY"Response · 200 Brand kits
{
"data": [
{
"id": "3f2e1d0c-9b8a-4765-8432-10fedcba9876",
"name": "Acme",
"source_url": "https://acme.com",
"is_default": true,
"tokens": {},
"created_at": "2026-09-26T12:00:00Z",
"updated_at": "2026-09-26T12:01:30Z"
}
]
}| Field | Type | Description |
|---|---|---|
datarequired | BrandKit[] |
Errors: 400 invalid request (see error.details) · 401 missing, unknown, revoked or expired api key · 403 the workspace's plan does not include the api · 404 not found in this workspace · 429 rate limited (see retry-after). See Errors.
/api/v1/brand-kitsCreate a brand kit
A brand kit from your own logo and colours, ready at once (no job): for brands whose website can't be read, or when you'd rather set the brand yourself. logoUrl is downloaded once (https, public hosts only, PNG, JPEG or WebP up to 2 MB) and stored with the kit as its logo. Only bg, text and accent are required: surface, muted and accent2 are derived from them when omitted. Fonts come from our catalog; an unknown family keeps the default and warnings says so. Counts against the plan's brand kits. Pass the returned id as brandKitId in POST /v1/videos.
Parameters
| Name | In | Description |
|---|---|---|
Idempotency-Key | header | Optional. Retries with the same key and body get the first answer for 24 hours. |
Body
| Field | Type | Description |
|---|---|---|
namerequired | string | The brand's name, as videos write it. |
logoUrl | string (uri) | Your logo as a PNG, JPEG or WebP over https, up to 2 MB. We download it once and store it with the kit; the URL is not kept. SVG isn't accepted by URL: export a PNG (1000 px is plenty). |
colorsrequired | object | |
fonts | object | Fonts. Omitted roles keep the default (Bricolage Grotesque headlines, Inter body). |
isDefault | boolean | Make it the workspace's default kit (the first kit always is). |
Request
curl -X POST https://www.loudscene.com/api/v1/brand-kits \
-H "Authorization: Bearer $LOUDSCENE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"name":"Your Brand","logoUrl":"https://yourbrand.com/logo.png","colors":{"bg":"#0B0B0F","text":"#F5F5F4","accent":"#7CFF6B"},"fonts":{"display":"Space Grotesk","body":"Inter"},"isDefault":true}'Response · 201 The new brand kit
{
"id": "3f2e1d0c-9b8a-4765-8432-10fedcba9876",
"name": "Your Brand",
"source_url": null,
"is_default": true,
"tokens": {
"name": "Your Brand",
"colors": {
"bg": "#0B0B0F",
"surface": "#1B1B1F",
"text": "#F5F5F4",
"muted": "#979798",
"accent": "#7CFF6B",
"accent2": "#6BFFA4",
"success": "#4BD37B"
},
"fonts": {
"display": {
"family": "Space Grotesk Variable",
"weight": 700,
"fallback": "sans-serif",
"files": [
"…"
]
},
"body": {
"family": "Inter Variable",
"weight": 400,
"fallback": "sans-serif",
"files": [
"…"
]
},
"mono": {
"family": "Inter Variable",
"weight": 500,
"fallback": "sans-serif",
"files": [
"…"
]
}
},
"logo": {
"url": "https://…/storage/v1/object/sign/assets/…/logo-mh2k9x1a.png?token=…",
"assetId": "7d0f3c52-1b2e-4c47-9a51-3f7e0d6b8c21",
"width": 1000,
"height": 1000
},
"motion": "energetic",
"radius": 20
},
"created_at": "2026-09-26T12:00:00Z",
"updated_at": "2026-09-26T12:01:30Z",
"warnings": []
}| Field | Type | Description |
|---|---|---|
idrequired | string (uuid) | |
namerequired | string | |
source_urlrequired | string | null | |
is_defaultrequired | boolean | |
tokensrequired | object | BrandTokens: colors, fonts, logo, motion, radius |
created_atrequired | string (date-time) | |
updated_atrequired | string (date-time) | |
warningsrequired | string[] | What was changed from the request (an unknown font replaced by the default...). Usually empty. |
Errors: 400 invalid request (see error.details) · 401 missing, unknown, revoked or expired api key · 403 the workspace's plan does not include the api · 404 not found in this workspace · 429 rate limited (see retry-after). See Errors.
/api/v1/brand-kits/:idUpdate a brand kit
Change any of name, logoUrl (null removes the logo), colors, fonts, or make the kit the default with isDefault: true. Only what you send changes; videos already made keep their look, new ones use the kit as it is now.
Parameters
| Name | In | Description |
|---|---|---|
id | path | The object's id (a UUID), required. |
Body
| Field | Type | Description |
|---|---|---|
name | string | |
logoUrl | string (uri) | null | |
colors | object | Only the colours you send change. surface, muted and accent2 are derived again when the colour they come from changes and they are not sent. |
fonts | object | Fonts. Omitted roles keep the default (Bricolage Grotesque headlines, Inter body). |
isDefault | boolean | true makes it the workspace's default kit (false is ignored: make another kit the default instead). |
Request
curl -X PATCH https://www.loudscene.com/api/v1/brand-kits/<id> \
-H "Authorization: Bearer $LOUDSCENE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"colors":{"accent":"#FF503C"},"logoUrl":"https://yourbrand.com/logo-2026.png"}'Response · 200 The updated brand kit
{
"id": "3f2e1d0c-9b8a-4765-8432-10fedcba9876",
"name": "Your Brand",
"source_url": null,
"is_default": true,
"tokens": {
"name": "Your Brand",
"colors": {
"bg": "#0B0B0F",
"surface": "#1B1B1F",
"text": "#F5F5F4",
"muted": "#979798",
"accent": "#FF503C",
"accent2": "#FFB13C",
"success": "#4BD37B"
},
"fonts": {
"display": {
"family": "Space Grotesk Variable",
"weight": 700,
"fallback": "sans-serif",
"files": [
"…"
]
},
"body": {
"family": "Inter Variable",
"weight": 400,
"fallback": "sans-serif",
"files": [
"…"
]
},
"mono": {
"family": "Inter Variable",
"weight": 500,
"fallback": "sans-serif",
"files": [
"…"
]
}
},
"logo": {
"url": "https://…/storage/v1/object/sign/assets/…/logo-mh2kb7qz.png?token=…",
"assetId": "7d0f3c52-1b2e-4c47-9a51-3f7e0d6b8c21",
"width": 1000,
"height": 1000
},
"motion": "energetic",
"radius": 20
},
"created_at": "2026-09-26T12:00:00Z",
"updated_at": "2026-09-26T12:01:30Z",
"warnings": []
}| Field | Type | Description |
|---|---|---|
idrequired | string (uuid) | |
namerequired | string | |
source_urlrequired | string | null | |
is_defaultrequired | boolean | |
tokensrequired | object | BrandTokens: colors, fonts, logo, motion, radius |
created_atrequired | string (date-time) | |
updated_atrequired | string (date-time) | |
warningsrequired | string[] | What was changed from the request (an unknown font replaced by the default...). Usually empty. |
Errors: 400 invalid request (see error.details) · 401 missing, unknown, revoked or expired api key · 403 the workspace's plan does not include the api · 404 not found in this workspace · 429 rate limited (see retry-after). See Errors.
Stories#
/api/v1/storiesList stories
Built-in stories (templates) with their editable fields, usable as storyId in POST /v1/videos.
Request
curl -X GET https://www.loudscene.com/api/v1/stories \
-H "Authorization: Bearer $LOUDSCENE_API_KEY"Response · 200 Stories
{
"data": [
{
"id": "3f2e1d0c-9b8a-4765-8432-10fedcba9876",
"name": "Acme",
"category": "launch",
"description": "Launch a product in 30 seconds.",
"default_duration_sec": 18.4,
"fields": {}
}
]
}| Field | Type | Description |
|---|---|---|
datarequired | object[] |
Errors: 400 invalid request (see error.details) · 401 missing, unknown, revoked or expired api key · 403 the workspace's plan does not include the api · 404 not found in this workspace · 429 rate limited (see retry-after). See Errors.
Videos#
/api/v1/videosCreate a video
With storyId + fields the video is built instantly from the story (no AI, status ready). Otherwise a generate job writes it from the brief (status generating; subscribe to the video.generated webhook or poll GET /v1/videos/{id}).
Parameters
| Name | In | Description |
|---|---|---|
Idempotency-Key | header | Optional. Retries with the same key and body get the first answer for 24 hours. |
Body
| Field | Type | Description |
|---|---|---|
title | string | |
brief | string | What the video should say. Moderated before generation. |
storyId | string | A story id from GET /v1/stories. With fields, the video is built instantly without AI. |
fields | object | Field values for the story (requires storyId). Unknown keys are rejected. |
brandKitId | string (uuid) | Brand kit to use. Defaults to the workspace's default kit when neither this nor url is given. |
url | string | Extract the brand from this site first (when no brand kit is given). |
token | string | A token's contract address or link (Dexscreener, pump.fun, Torch, an explorer). Works with brandKitId or url: its live market figures go into the brief and its image becomes the brand's mark, the face of the coin. Alone, the brand comes from the token's website. |
format | "16:9" | "9:16" | "1:1" | "4:5" | Main format. Default 16:9. |
durationSec | number | From 6. |
locale | string |
Request
curl -X POST https://www.loudscene.com/api/v1/videos \
-H "Authorization: Bearer $LOUDSCENE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"url":"https://yourbrand.com","brief":"We just launched v2: twice as fast.","format":"9:16"}'Response · 201 The new video
{
"id": "3f2e1d0c-9b8a-4765-8432-10fedcba9876",
"title": "Launch day",
"status": "generating",
"story_id": null,
"brand_kit_id": "8d3f2c1e-5a4b-4c3d-9e8f-7a6b5c4d3e2f",
"default_format": "16:9",
"duration_sec": 18.4,
"current_version": null,
"job": {
"id": "3f2e1d0c-9b8a-4765-8432-10fedcba9876",
"kind": "generate",
"status": "queued",
"stage": "scenes",
"progress": 0.4,
"error": null,
"result": null,
"created_at": "2026-09-26T12:00:00Z",
"finished_at": null
},
"created_at": "2026-09-26T12:00:00Z",
"updated_at": "2026-09-26T12:01:30Z"
}| Field | Type | Description |
|---|---|---|
idrequired | string (uuid) | |
titlerequired | string | |
statusrequired | "draft" | "generating" | "ready" | "failed" | "archived" | |
story_idrequired | string | null | |
brand_kit_idrequired | string (uuid) | null | |
default_formatrequired | "16:9" | "9:16" | "1:1" | "4:5" | Aspect ratio |
duration_secrequired | number | null | |
current_versionrequired | object | null | |
jobrequired | object | null | The generation job, while one is running |
created_atrequired | string (date-time) | |
updated_atrequired | string (date-time) |
Errors: 400 invalid request (see error.details) · 401 missing, unknown, revoked or expired api key · 403 the workspace's plan does not include the api · 404 not found in this workspace · 429 rate limited (see retry-after). See Errors.
/api/v1/videos/:idGet a video
The video and its current version (the full VideoDoc).
Parameters
| Name | In | Description |
|---|---|---|
id | path | The object's id (a UUID), required. |
Request
curl -X GET https://www.loudscene.com/api/v1/videos/<id> \
-H "Authorization: Bearer $LOUDSCENE_API_KEY"Response · 200 The video
{
"id": "3f2e1d0c-9b8a-4765-8432-10fedcba9876",
"title": "Launch day",
"status": "ready",
"story_id": "product-launch",
"brand_kit_id": "8d3f2c1e-5a4b-4c3d-9e8f-7a6b5c4d3e2f",
"default_format": "16:9",
"duration_sec": 18.4,
"current_version": {
"id": "3f2e1d0c-9b8a-4765-8432-10fedcba9876",
"number": 1,
"source": "api",
"created_at": "2026-09-26T12:00:00Z",
"doc": {}
},
"job": null,
"created_at": "2026-09-26T12:00:00Z",
"updated_at": "2026-09-26T12:01:30Z"
}| Field | Type | Description |
|---|---|---|
idrequired | string (uuid) | |
titlerequired | string | |
statusrequired | "draft" | "generating" | "ready" | "failed" | "archived" | |
story_idrequired | string | null | |
brand_kit_idrequired | string (uuid) | null | |
default_formatrequired | "16:9" | "9:16" | "1:1" | "4:5" | Aspect ratio |
duration_secrequired | number | null | |
current_versionrequired | object | null | |
jobrequired | object | null | The generation job, while one is running |
created_atrequired | string (date-time) | |
updated_atrequired | string (date-time) |
Errors: 400 invalid request (see error.details) · 401 missing, unknown, revoked or expired api key · 403 the workspace's plan does not include the api · 404 not found in this workspace · 429 rate limited (see retry-after). See Errors.
/api/v1/videos/:idUpdate a video
Send a complete doc (linted server-side) or a fields patch; either way the result is saved as a new immutable version. title renames the video.
Parameters
| Name | In | Description |
|---|---|---|
id | path | The object's id (a UUID), required. |
Body
| Field | Type | Description |
|---|---|---|
doc | VideoDoc | A complete VideoDoc. Its code is linted server-side; the result becomes a new version. |
fields | object | Field values to change in the current version. |
title | string | |
note | string | Shown in the version history. |
Request
curl -X PATCH https://www.loudscene.com/api/v1/videos/<id> \
-H "Authorization: Bearer $LOUDSCENE_API_KEY" \
-H "Content-Type: application/json" \
-d '{"fields":{"headline":"Now in 12 countries"},"note":"Weekly refresh"}'Response · 200 The updated video
{
"id": "3f2e1d0c-9b8a-4765-8432-10fedcba9876",
"title": "Launch day",
"status": "ready",
"story_id": "product-launch",
"brand_kit_id": "8d3f2c1e-5a4b-4c3d-9e8f-7a6b5c4d3e2f",
"default_format": "16:9",
"duration_sec": 18.4,
"current_version": {
"id": "3f2e1d0c-9b8a-4765-8432-10fedcba9876",
"number": 1,
"source": "api",
"created_at": "2026-09-26T12:00:00Z",
"doc": {}
},
"job": null,
"created_at": "2026-09-26T12:00:00Z",
"updated_at": "2026-09-26T12:01:30Z"
}| Field | Type | Description |
|---|---|---|
idrequired | string (uuid) | |
titlerequired | string | |
statusrequired | "draft" | "generating" | "ready" | "failed" | "archived" | |
story_idrequired | string | null | |
brand_kit_idrequired | string (uuid) | null | |
default_formatrequired | "16:9" | "9:16" | "1:1" | "4:5" | Aspect ratio |
duration_secrequired | number | null | |
current_versionrequired | object | null | |
jobrequired | object | null | The generation job, while one is running |
created_atrequired | string (date-time) | |
updated_atrequired | string (date-time) |
Errors: 400 invalid request (see error.details) · 401 missing, unknown, revoked or expired api key · 403 the workspace's plan does not include the api · 404 not found in this workspace · 429 rate limited (see retry-after). See Errors.
/api/v1/videos/:id/stillsRender still frames
Starts a stills job for the current version (background priority, at most 2 running per workspace; the same request within 10 minutes returns the same job). When the job succeeds, GET /v1/jobs/{id} returns signed PNG URLs (valid 10 minutes).
Parameters
| Name | In | Description |
|---|---|---|
id | path | The object's id (a UUID), required. |
Idempotency-Key | header | Optional. Retries with the same key and body get the first answer for 24 hours. |
Body
| Field | Type | Description |
|---|---|---|
timesrequired | number[] | Seconds into the video |
format | "16:9" | "9:16" | "1:1" | "4:5" | Aspect ratio |
Request
curl -X POST https://www.loudscene.com/api/v1/videos/<id>/stills \
-H "Authorization: Bearer $LOUDSCENE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"times":[1,4.5,9],"format":"1:1"}'Response · 202 The stills job
{
"id": "3f2e1d0c-9b8a-4765-8432-10fedcba9876",
"kind": "stills",
"status": "queued",
"stage": null,
"progress": 0,
"error": null,
"result": null,
"created_at": "2026-09-26T12:00:00Z",
"finished_at": null
}| Field | Type | Description |
|---|---|---|
idrequired | string (uuid) | |
kindrequired | string | |
statusrequired | "queued" | "running" | "succeeded" | "failed" | "canceled" | |
stagerequired | string | null | |
progressrequired | number | |
errorrequired | string | null | |
resultrequired | object | null | Kind-specific result (stills: signed PNG URLs). |
created_atrequired | string (date-time) | |
finished_atrequired | string (date-time) | null |
Errors: 400 invalid request (see error.details) · 401 missing, unknown, revoked or expired api key · 403 the workspace's plan does not include the api · 404 not found in this workspace · 429 rate limited (see retry-after). See Errors.
Renders#
/api/v1/videos/:id/rendersRender an MP4
Renders the current version in one format. One credit covers every format of a version up to 60 s. An identical finished render is returned instead of rendering again.
Parameters
| Name | In | Description |
|---|---|---|
id | path | The object's id (a UUID), required. |
Idempotency-Key | header | Optional. Retries with the same key and body get the first answer for 24 hours. |
Body
| Field | Type | Description |
|---|---|---|
formatrequired | "16:9" | "9:16" | "1:1" | "4:5" | Aspect ratio |
resolution | 720 | 1080 | 2160 | Default 1080 |
fps | 24 | 30 | 60 | Default: the video's fps |
Request
curl -X POST https://www.loudscene.com/api/v1/videos/<id>/renders \
-H "Authorization: Bearer $LOUDSCENE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"format":"16:9","resolution":1080,"fps":30}'Response · 202 The render
{
"id": "3f2e1d0c-9b8a-4765-8432-10fedcba9876",
"video_id": "3f2e1d0c-9b8a-4765-8432-10fedcba9876",
"version_id": "6c5b4a39-2817-4f6e-8d5c-4b3a29180f7e",
"format": "16:9",
"resolution": 1080,
"fps": 30,
"status": "queued",
"progress": 0,
"url": null,
"poster_url": null,
"url_expires_at": "2026-09-26T16:01:30Z",
"duration_sec": null,
"bytes": null,
"error": null,
"created_at": "2026-09-26T12:00:00Z",
"finished_at": null
}| Field | Type | Description |
|---|---|---|
idrequired | string (uuid) | |
video_idrequired | string (uuid) | |
version_idrequired | string (uuid) | |
formatrequired | "16:9" | "9:16" | "1:1" | "4:5" | Aspect ratio |
resolutionrequired | integer | |
fpsrequired | integer | |
statusrequired | "queued" | "running" | "succeeded" | "failed" | "canceled" | |
progressrequired | number | |
urlrequired | string | null | Signed MP4 URL once succeeded. Render files are private: the URL stops working at url_expires_at (4 hours after this response); fetch the render again for a fresh one. |
poster_urlrequired | string | null | Signed poster image URL, with the same expiry as url. |
url_expires_atrequired | string (date-time) | null | When url and poster_url expire (ISO 8601); null when there is no file yet. |
duration_secrequired | number | null | |
bytesrequired | integer | null | |
errorrequired | string | null | |
created_atrequired | string (date-time) | |
finished_atrequired | string (date-time) | null |
Errors: 400 invalid request (see error.details) · 401 missing, unknown, revoked or expired api key · 403 the workspace's plan does not include the api · 404 not found in this workspace · 429 rate limited (see retry-after). See Errors.
/api/v1/renders/:idGet a render
Status, progress and, once succeeded, signed MP4 and poster URLs. Render files are private: the URLs expire at url_expires_at (4 hours after the response); call this again for fresh ones.
Parameters
| Name | In | Description |
|---|---|---|
id | path | The object's id (a UUID), required. |
Request
curl -X GET https://www.loudscene.com/api/v1/renders/<id> \
-H "Authorization: Bearer $LOUDSCENE_API_KEY"Response · 200 The render
{
"id": "3f2e1d0c-9b8a-4765-8432-10fedcba9876",
"video_id": "3f2e1d0c-9b8a-4765-8432-10fedcba9876",
"version_id": "6c5b4a39-2817-4f6e-8d5c-4b3a29180f7e",
"format": "16:9",
"resolution": 1080,
"fps": 30,
"status": "succeeded",
"progress": 1,
"url": "https://…/video.mp4",
"poster_url": "https://…/poster.jpg",
"url_expires_at": "2026-09-26T16:01:30Z",
"duration_sec": 18.4,
"bytes": 4839210,
"error": null,
"created_at": "2026-09-26T12:00:00Z",
"finished_at": "2026-09-26T12:01:30Z"
}| Field | Type | Description |
|---|---|---|
idrequired | string (uuid) | |
video_idrequired | string (uuid) | |
version_idrequired | string (uuid) | |
formatrequired | "16:9" | "9:16" | "1:1" | "4:5" | Aspect ratio |
resolutionrequired | integer | |
fpsrequired | integer | |
statusrequired | "queued" | "running" | "succeeded" | "failed" | "canceled" | |
progressrequired | number | |
urlrequired | string | null | Signed MP4 URL once succeeded. Render files are private: the URL stops working at url_expires_at (4 hours after this response); fetch the render again for a fresh one. |
poster_urlrequired | string | null | Signed poster image URL, with the same expiry as url. |
url_expires_atrequired | string (date-time) | null | When url and poster_url expire (ISO 8601); null when there is no file yet. |
duration_secrequired | number | null | |
bytesrequired | integer | null | |
errorrequired | string | null | |
created_atrequired | string (date-time) | |
finished_atrequired | string (date-time) | null |
Errors: 400 invalid request (see error.details) · 401 missing, unknown, revoked or expired api key · 403 the workspace's plan does not include the api · 404 not found in this workspace · 429 rate limited (see retry-after). See Errors.
/api/v1/videos/:id/variantsRender variants
Renders several formats at once, and optionally translates the video into up to 3 more languages. Each translation is a translate job that counts as one AI generation (daily limit, monthly quota, in-flight cap; past the quota a credit buys the next block); when it succeeds GET /v1/jobs/{id} returns result.video_id, the translated copy.
Parameters
| Name | In | Description |
|---|---|---|
id | path | The object's id (a UUID), required. |
Idempotency-Key | header | Optional. Retries with the same key and body get the first answer for 24 hours. |
Body
| Field | Type | Description |
|---|---|---|
formatsrequired | "16:9" | "9:16" | "1:1" | "4:5"[] | |
locales | string[] | Extra languages, at most 3 per request: each becomes a translated copy of the video through a translate job, one AI generation each (Pro and Agency). |
resolution | 720 | 1080 | 2160 | Short side in pixels (2160 = 4K) |
Request
curl -X POST https://www.loudscene.com/api/v1/videos/<id>/variants \
-H "Authorization: Bearer $LOUDSCENE_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $(uuidgen)" \
-d '{"formats":["16:9","9:16","1:1","4:5"],"locales":["de","fr"]}'Response · 202 Renders and translation jobs
{
"renders": [
{
"id": "3f2e1d0c-9b8a-4765-8432-10fedcba9876",
"video_id": "3f2e1d0c-9b8a-4765-8432-10fedcba9876",
"version_id": "6c5b4a39-2817-4f6e-8d5c-4b3a29180f7e",
"format": "16:9",
"resolution": 1080,
"fps": 30,
"status": "queued",
"progress": 0.4,
"url": "https://…/video.mp4",
"poster_url": "https://…/poster.jpg",
"url_expires_at": "2026-09-26T16:01:30Z",
"duration_sec": 18.4,
"bytes": 4839210,
"error": null,
"created_at": "2026-09-26T12:00:00Z",
"finished_at": null
}
],
"translations": [
{
"id": "3f2e1d0c-9b8a-4765-8432-10fedcba9876",
"kind": "generate",
"status": "queued",
"stage": "scenes",
"progress": 0.4,
"error": null,
"result": null,
"created_at": "2026-09-26T12:00:00Z",
"finished_at": null
}
]
}| Field | Type | Description |
|---|---|---|
rendersrequired | Render[] | |
translationsrequired | Job[] | One translate job per extra locale. When it succeeds, its result has video_id: the translated copy. |
Errors: 400 invalid request (see error.details) · 401 missing, unknown, revoked or expired api key · 403 the workspace's plan does not include the api · 404 not found in this workspace · 429 rate limited (see retry-after). See Errors.
Jobs#
/api/v1/jobs/:idGet a job
Progress and result of an asynchronous job (brand extraction, stills, generation).
Parameters
| Name | In | Description |
|---|---|---|
id | path | The object's id (a UUID), required. |
Request
curl -X GET https://www.loudscene.com/api/v1/jobs/<id> \
-H "Authorization: Bearer $LOUDSCENE_API_KEY"Response · 200 The job
{
"id": "3f2e1d0c-9b8a-4765-8432-10fedcba9876",
"kind": "generate",
"status": "running",
"stage": "scenes",
"progress": 0.4,
"error": null,
"result": null,
"created_at": "2026-09-26T12:00:00Z",
"finished_at": null
}| Field | Type | Description |
|---|---|---|
idrequired | string (uuid) | |
kindrequired | string | |
statusrequired | "queued" | "running" | "succeeded" | "failed" | "canceled" | |
stagerequired | string | null | |
progressrequired | number | |
errorrequired | string | null | |
resultrequired | object | null | Kind-specific result (stills: signed PNG URLs). |
created_atrequired | string (date-time) | |
finished_atrequired | string (date-time) | null |
Errors: 400 invalid request (see error.details) · 401 missing, unknown, revoked or expired api key · 403 the workspace's plan does not include the api · 404 not found in this workspace · 429 rate limited (see retry-after). See Errors.