Skip to content

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-Key on POST to retry safely.
  • Errors: one JSON shape, with a code and a request id.
  • Webhooks: signed events for generations, renders and comments.

Brand#

POST/api/v1/brand/extract

Extract 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

NameInDescription
Idempotency-KeyheaderOptional. Retries with the same key and body get the first answer for 24 hours.

Body

FieldTypeDescription
urlrequiredstringWebsite 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

202 · 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
}
FieldTypeDescription
idrequiredstring (uuid)
kindrequiredstring
statusrequired"queued" | "running" | "succeeded" | "failed" | "canceled"
stagerequiredstring | null
progressrequirednumber
errorrequiredstring | null
resultrequiredobject | nullKind-specific result (stills: signed PNG URLs).
created_atrequiredstring (date-time)
finished_atrequiredstring (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.

GET/api/v1/brand-kits

List 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

200 · BrandKitList
{
  "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"
    }
  ]
}
FieldTypeDescription
datarequiredBrandKit[]

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.

POST/api/v1/brand-kits

Create 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

NameInDescription
Idempotency-KeyheaderOptional. Retries with the same key and body get the first answer for 24 hours.

Body

FieldTypeDescription
namerequiredstringThe brand's name, as videos write it.
logoUrlstring (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).
colorsrequiredobject
fontsobjectFonts. Omitted roles keep the default (Bricolage Grotesque headlines, Inter body).
isDefaultbooleanMake 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

201 · BrandKitWrite
{
  "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": []
}
FieldTypeDescription
idrequiredstring (uuid)
namerequiredstring
source_urlrequiredstring | null
is_defaultrequiredboolean
tokensrequiredobjectBrandTokens: colors, fonts, logo, motion, radius
created_atrequiredstring (date-time)
updated_atrequiredstring (date-time)
warningsrequiredstring[]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.

PATCH/api/v1/brand-kits/:id

Update 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

NameInDescription
idpathThe object's id (a UUID), required.

Body

FieldTypeDescription
namestring
logoUrlstring (uri) | null
colorsobjectOnly the colours you send change. surface, muted and accent2 are derived again when the colour they come from changes and they are not sent.
fontsobjectFonts. Omitted roles keep the default (Bricolage Grotesque headlines, Inter body).
isDefaultbooleantrue 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

200 · BrandKitWrite
{
  "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": []
}
FieldTypeDescription
idrequiredstring (uuid)
namerequiredstring
source_urlrequiredstring | null
is_defaultrequiredboolean
tokensrequiredobjectBrandTokens: colors, fonts, logo, motion, radius
created_atrequiredstring (date-time)
updated_atrequiredstring (date-time)
warningsrequiredstring[]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#

GET/api/v1/stories

List 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

200 · StoryList
{
  "data": [
    {
      "id": "3f2e1d0c-9b8a-4765-8432-10fedcba9876",
      "name": "Acme",
      "category": "launch",
      "description": "Launch a product in 30 seconds.",
      "default_duration_sec": 18.4,
      "fields": {}
    }
  ]
}
FieldTypeDescription
datarequiredobject[]

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#

POST/api/v1/videos

Create 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

NameInDescription
Idempotency-KeyheaderOptional. Retries with the same key and body get the first answer for 24 hours.

Body

FieldTypeDescription
titlestring
briefstringWhat the video should say. Moderated before generation.
storyIdstringA story id from GET /v1/stories. With fields, the video is built instantly without AI.
fieldsobjectField values for the story (requires storyId). Unknown keys are rejected.
brandKitIdstring (uuid)Brand kit to use. Defaults to the workspace's default kit when neither this nor url is given.
urlstringExtract the brand from this site first (when no brand kit is given).
tokenstringA 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.
durationSecnumberFrom 6.
localestring

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

201 · 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"
}
FieldTypeDescription
idrequiredstring (uuid)
titlerequiredstring
statusrequired"draft" | "generating" | "ready" | "failed" | "archived"
story_idrequiredstring | null
brand_kit_idrequiredstring (uuid) | null
default_formatrequired"16:9" | "9:16" | "1:1" | "4:5"Aspect ratio
duration_secrequirednumber | null
current_versionrequiredobject | null
jobrequiredobject | nullThe generation job, while one is running
created_atrequiredstring (date-time)
updated_atrequiredstring (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.

GET/api/v1/videos/:id

Get a video

The video and its current version (the full VideoDoc).

Parameters

NameInDescription
idpathThe 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

200 · 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"
}
FieldTypeDescription
idrequiredstring (uuid)
titlerequiredstring
statusrequired"draft" | "generating" | "ready" | "failed" | "archived"
story_idrequiredstring | null
brand_kit_idrequiredstring (uuid) | null
default_formatrequired"16:9" | "9:16" | "1:1" | "4:5"Aspect ratio
duration_secrequirednumber | null
current_versionrequiredobject | null
jobrequiredobject | nullThe generation job, while one is running
created_atrequiredstring (date-time)
updated_atrequiredstring (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.

PATCH/api/v1/videos/:id

Update 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

NameInDescription
idpathThe object's id (a UUID), required.

Body

FieldTypeDescription
docVideoDocA complete VideoDoc. Its code is linted server-side; the result becomes a new version.
fieldsobjectField values to change in the current version.
titlestring
notestringShown 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

200 · 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"
}
FieldTypeDescription
idrequiredstring (uuid)
titlerequiredstring
statusrequired"draft" | "generating" | "ready" | "failed" | "archived"
story_idrequiredstring | null
brand_kit_idrequiredstring (uuid) | null
default_formatrequired"16:9" | "9:16" | "1:1" | "4:5"Aspect ratio
duration_secrequirednumber | null
current_versionrequiredobject | null
jobrequiredobject | nullThe generation job, while one is running
created_atrequiredstring (date-time)
updated_atrequiredstring (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.

POST/api/v1/videos/:id/stills

Render 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

NameInDescription
idpathThe object's id (a UUID), required.
Idempotency-KeyheaderOptional. Retries with the same key and body get the first answer for 24 hours.

Body

FieldTypeDescription
timesrequirednumber[]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

202 · 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
}
FieldTypeDescription
idrequiredstring (uuid)
kindrequiredstring
statusrequired"queued" | "running" | "succeeded" | "failed" | "canceled"
stagerequiredstring | null
progressrequirednumber
errorrequiredstring | null
resultrequiredobject | nullKind-specific result (stills: signed PNG URLs).
created_atrequiredstring (date-time)
finished_atrequiredstring (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#

POST/api/v1/videos/:id/renders

Render 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

NameInDescription
idpathThe object's id (a UUID), required.
Idempotency-KeyheaderOptional. Retries with the same key and body get the first answer for 24 hours.

Body

FieldTypeDescription
formatrequired"16:9" | "9:16" | "1:1" | "4:5"Aspect ratio
resolution720 | 1080 | 2160Default 1080
fps24 | 30 | 60Default: 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

202 · 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
}
FieldTypeDescription
idrequiredstring (uuid)
video_idrequiredstring (uuid)
version_idrequiredstring (uuid)
formatrequired"16:9" | "9:16" | "1:1" | "4:5"Aspect ratio
resolutionrequiredinteger
fpsrequiredinteger
statusrequired"queued" | "running" | "succeeded" | "failed" | "canceled"
progressrequirednumber
urlrequiredstring | nullSigned 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_urlrequiredstring | nullSigned poster image URL, with the same expiry as url.
url_expires_atrequiredstring (date-time) | nullWhen url and poster_url expire (ISO 8601); null when there is no file yet.
duration_secrequirednumber | null
bytesrequiredinteger | null
errorrequiredstring | null
created_atrequiredstring (date-time)
finished_atrequiredstring (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.

GET/api/v1/renders/:id

Get 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

NameInDescription
idpathThe 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

200 · 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"
}
FieldTypeDescription
idrequiredstring (uuid)
video_idrequiredstring (uuid)
version_idrequiredstring (uuid)
formatrequired"16:9" | "9:16" | "1:1" | "4:5"Aspect ratio
resolutionrequiredinteger
fpsrequiredinteger
statusrequired"queued" | "running" | "succeeded" | "failed" | "canceled"
progressrequirednumber
urlrequiredstring | nullSigned 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_urlrequiredstring | nullSigned poster image URL, with the same expiry as url.
url_expires_atrequiredstring (date-time) | nullWhen url and poster_url expire (ISO 8601); null when there is no file yet.
duration_secrequirednumber | null
bytesrequiredinteger | null
errorrequiredstring | null
created_atrequiredstring (date-time)
finished_atrequiredstring (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.

POST/api/v1/videos/:id/variants

Render 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

NameInDescription
idpathThe object's id (a UUID), required.
Idempotency-KeyheaderOptional. Retries with the same key and body get the first answer for 24 hours.

Body

FieldTypeDescription
formatsrequired"16:9" | "9:16" | "1:1" | "4:5"[]
localesstring[]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).
resolution720 | 1080 | 2160Short 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

202 · Variants
{
  "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
    }
  ]
}
FieldTypeDescription
rendersrequiredRender[]
translationsrequiredJob[]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#

GET/api/v1/jobs/:id

Get a job

Progress and result of an asynchronous job (brand extraction, stills, generation).

Parameters

NameInDescription
idpathThe 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

200 · 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
}
FieldTypeDescription
idrequiredstring (uuid)
kindrequiredstring
statusrequired"queued" | "running" | "succeeded" | "failed" | "canceled"
stagerequiredstring | null
progressrequirednumber
errorrequiredstring | null
resultrequiredobject | nullKind-specific result (stills: signed PNG URLs).
created_atrequiredstring (date-time)
finished_atrequiredstring (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.