Skip to main content

Brand Kit

The Brand Kit is what makes generated output look like it came from your workspace rather than a generic template: music, opening and closing scenes, watermark, background, caption and article styling, default voice and language.

These defaults were always applied to API-generated videos - but nothing could read or change them, so an API-only integration was stuck with whatever the dashboard had been set to. Now it isn't.

Everything here needs brand_kit:read, or brand_kit:write to change.

Get the Brand Kit

GET /v1/brand-kit

curl https://api.vidocu.ai/v1/brand-kit \
-H "Authorization: Bearer vdo_live_your_key_here"
{
"brandKit": {
"companyContext": "Industrial label printers for pharmaceutical packaging",
"defaultLanguage": "en",
"defaultVoiceId": "pNInz6obpgDQGcFmaJgB",
"openingSceneUrl": "https://storage.vidocu.ai/...",
"backgroundMusicUrl": "https://storage.vidocu.ai/...",
"backgroundMusicVolume": 70,
"watermark": { "enabled": true, "position": "bottom-right", "opacity": 70 },
"logoUrl": "https://storage.vidocu.ai/..."
},
"counts": { "skills": 2, "glossary": 34, "pronunciations": 6 }
}

Skills, glossary and pronunciations are returned as counts, not contents - each has its own endpoint, and a Brand Kit with a 200-term glossary shouldn't ship it on every read.

Update the Brand Kit

PATCH /v1/brand-kit

Only the fields you send change. Send null to clear one.

curl -X PATCH https://api.vidocu.ai/v1/brand-kit \
-H "Authorization: Bearer vdo_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{"backgroundMusicVolume": 45, "openingSceneUrl": null}'
caution

These apply to every future export and article in the workspace, not just your next request. For a one-off change, use the per-request export overrides instead.

Pronunciations

GET /v1/brand-kit/pronunciations · PUT /v1/brand-kit/pronunciations

How specific words should be said in generated narration - product names, acronyms, anything a text-to-speech model reliably gets wrong.

curl -X PUT https://api.vidocu.ai/v1/brand-kit/pronunciations \
-H "Authorization: Bearer vdo_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{"pronunciations": [
{"word": "Vidocu", "pronunciation": "vid-oh-koo"},
{"word": "SKU", "pronunciation": "skew", "caseSensitive": true}
]}'

This is a full replacement, not an addition. Pronunciations apply as an ordered list of whole-word rewrites, so entries can interact - editing one in isolation invites surprises. Read the list, change it, send it all back.

Brand skills

GET /v1/brand-kit/skills · POST /v1/brand-kit/skills PATCH /v1/brand-kit/skills/:id · DELETE /v1/brand-kit/skills/:id

A skill is markdown instructions - writing style, terminology, pacing, structure - folded into generation as a style guide. domain is videoScript or article.

curl -X POST https://api.vidocu.ai/v1/brand-kit/skills \
-H "Authorization: Bearer vdo_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"name": "SOP house style",
"domain": "videoScript",
"content": "## Voice\nSecond person, imperative. One action per step.\n\n## Terminology\nAlways \"work order\", never \"job\"."
}'

Pass the returned id as scriptSkillId on analyze to apply it to a specific video. Content is capped at 20,000 characters.

Glossary

GET /v1/brand-kit/glossary · PUT /v1/brand-kit/glossary · POST /v1/brand-kit/glossary/import

Brand terms and how they should - or shouldn't - be translated. This feeds the translation pipeline directly, so it's the highest-leverage thing here if you translate.

FieldMeaning
termThe word or phrase
doNotTranslateKeep it verbatim in every language
translationsPreferred rendering per language code; overrides doNotTranslate for that language
caseSensitiveMatch case exactly
notesContext for the model, e.g. "our product, not the body part"
curl -X PUT https://api.vidocu.ai/v1/brand-kit/glossary \
-H "Authorization: Bearer vdo_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{"entries": [
{"term": "Pulse", "doNotTranslate": true, "notes": "our product, not a heart rate"},
{"term": "work order", "translations": {"de": "Arbeitsauftrag", "fr": "ordre de travail"}}
]}'

Max 200 entries. PUT is a full replacement.

Importing from a spreadsheet

POST /v1/brand-kit/glossary/import

curl -X POST https://api.vidocu.ai/v1/brand-kit/glossary/import \
-H "Authorization: Bearer vdo_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{"csv": "term,doNotTranslate,de,fr\nPulse,true,,\nwork order,,Arbeitsauftrag,ordre de travail", "mode": "merge"}'
{ "mode": "merge", "added": 1, "updated": 1, "cleared": 0, "dropped": 0, "total": 34, "issues": [] }

merge (the default) updates matching terms and adds new ones. replace swaps the whole glossary.

Reading the counts: cleared is fields blanked because the CSV declared a column and left it empty - that's what makes export → edit in a spreadsheet → re-import work. dropped is the only signal that the 200-entry cap was hit. issues lists rows that were skipped and why, without failing the whole import.

Errors

StatusCodeCause
400validation_errorNothing to update, or a value failed validation
401authentication_errorInvalid or missing API key
403insufficient_scopeToken lacks brand_kit:read / brand_kit:write
403insufficient_roleThe workspace role behind the token can't change settings
404not_foundNo such skill

Assets

GET /v1/brand-kit/assets · POST /v1/brand-kit/assets · DELETE /v1/brand-kit/assets/:id

The reusable files a workspace renders with: opening and closing scenes, watermarks, background music, backgrounds.

This endpoint records an asset; it does not carry the bytes. Upload the file with POST /v1/upload-url first, then register the resulting URL:

curl -X POST https://api.vidocu.ai/v1/brand-kit/assets \
-H "Authorization: Bearer vdo_live_your_key_here" \
-H "Content-Type: application/json" \
-d '{
"assetType": "opening_scene",
"fileType": "video",
"name": "Q3 intro",
"url": "https://storage.vidocu.ai/..."
}'

assetType is one of opening_scene, closing_scene, watermark, background_music, background, avatar_training. Filter the list by it.

Deleting removes the record. The stored file is left alone - other videos may still reference it, and removing it would break them.

Voices

Saved and cloned voices are served by GET /v1/voices, which returns the workspace's ready clones alongside the stock library, and DELETE /v1/voices/:id removes a clone. Creating a new clone needs an audio upload and isn't exposed yet.