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}'
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.
| Field | Meaning |
|---|---|
term | The word or phrase |
doNotTranslate | Keep it verbatim in every language |
translations | Preferred rendering per language code; overrides doNotTranslate for that language |
caseSensitive | Match case exactly |
notes | Context 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
| Status | Code | Cause |
|---|---|---|
| 400 | validation_error | Nothing to update, or a value failed validation |
| 401 | authentication_error | Invalid or missing API key |
| 403 | insufficient_scope | Token lacks brand_kit:read / brand_kit:write |
| 403 | insufficient_role | The workspace role behind the token can't change settings |
| 404 | not_found | No 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.