Brands and the asset library
Brands are the accounts a stack posts as; pools are the shared asset libraries their slots point at. These calls set up both, in bulk if you have many brands.
create_brand
Create a new brand (account container), optionally inside a folder (created if missing) and with any brand settings in the same call. Connect its social accounts via apply_zernio_profile.
| Parameter | Type | Description |
|---|---|---|
name (required) |
string | Brand name. |
folder |
string | Optional brand folder. |
posting_time |
string | Daily posting time HH:MM — or several comma-separated times ('18:00, 19:30'): plan day N posts at entry N, cycling. Empty = the platform slot table. |
posting_delay_minutes |
integer | Minutes between this brand's posts in a batch. |
posting_time_rules |
array of object | Custom posting times per platform and/or post type. Each rule: {platforms: [...], post_types: [...], times: ['HH:MM', ...]} — empty platforms/post_types = any. The most specific matching rule wins (platform+type > platform > type > generic, ties by list order); plan day N takes the rule's Nth time, cycling; a matched rule pins exact times (posting_delay_minutes staggers only the base posting_time). Replaces ALL rules; [] clears. |
timezone |
string | IANA timezone, e.g. Europe/Berlin. |
content_language |
string | The language this brand publishes in (language axis) — name or code, normalized; empty = the briefing's language. |
voiceover_voice |
string | TTS voice id for the AI voiceover (empty = global default). |
metricool_blog_id |
string | Metricool brand (blog) id for the Metricool API upload mode — see list_metricool_brands. |
youtube_category |
string | YouTube category (Metricool vocabulary, e.g. GAMING, PEOPLE_BLOGS) — the Metricool import drops YouTube rows without one; empty = PEOPLE_BLOGS default. |
logo_path |
string | Logo image file — also the watermark-widget fallback. |
identity_niche |
string | Short niche description. |
identity_audience |
string | Audience & tone — how the brand addresses its audience. |
identity_ai_enabled |
boolean | Feed the identity into AI texts (default on). |
identity_color_primary |
string | Primary color #RRGGBB. |
identity_color_accent |
string | Accent color #RRGGBB — default motion-title accent. |
platforms |
object | Per-platform account config, merged per platform: {"tiktok": {"enabled": true, "channel_name": "…", "late_account_id": "…"}}. Prefer apply_zernio_profile — it imports all of this from the connected Zernio profile. |
duplicate_brand
Deep-copy a brand (pools + meta) under a new name — the fast path when setting up many similar brands. The copy keeps the source's Zernio accounts until apply_zernio_profile points it at its own Zernio profile. Settings fields tweak the copy in the same call.
| Parameter | Type | Description |
|---|---|---|
source (required) |
string | Brand to copy. |
new_name (required) |
string | Name of the copy. |
posting_time |
string | Daily posting time HH:MM — or several comma-separated times ('18:00, 19:30'): plan day N posts at entry N, cycling. Empty = the platform slot table. |
posting_delay_minutes |
integer | Minutes between this brand's posts in a batch. |
posting_time_rules |
array of object | Custom posting times per platform and/or post type. Each rule: {platforms: [...], post_types: [...], times: ['HH:MM', ...]} — empty platforms/post_types = any. The most specific matching rule wins (platform+type > platform > type > generic, ties by list order); plan day N takes the rule's Nth time, cycling; a matched rule pins exact times (posting_delay_minutes staggers only the base posting_time). Replaces ALL rules; [] clears. |
timezone |
string | IANA timezone, e.g. Europe/Berlin. |
content_language |
string | The language this brand publishes in (language axis) — name or code, normalized; empty = the briefing's language. |
voiceover_voice |
string | TTS voice id for the AI voiceover (empty = global default). |
metricool_blog_id |
string | Metricool brand (blog) id for the Metricool API upload mode — see list_metricool_brands. |
youtube_category |
string | YouTube category (Metricool vocabulary, e.g. GAMING, PEOPLE_BLOGS) — the Metricool import drops YouTube rows without one; empty = PEOPLE_BLOGS default. |
logo_path |
string | Logo image file — also the watermark-widget fallback. |
identity_niche |
string | Short niche description. |
identity_audience |
string | Audience & tone — how the brand addresses its audience. |
identity_ai_enabled |
boolean | Feed the identity into AI texts (default on). |
identity_color_primary |
string | Primary color #RRGGBB. |
identity_color_accent |
string | Accent color #RRGGBB — default motion-title accent. |
platforms |
object | Per-platform account config, merged per platform: {"tiktok": {"enabled": true, "channel_name": "…", "late_account_id": "…"}}. Prefer apply_zernio_profile — it imports all of this from the connected Zernio profile. |
rename_brand
Rename a brand — every stack's brand-keyed data (texts, channels, widget states) is rewritten along with it.
| Parameter | Type | Description |
|---|---|---|
brand (required) |
string | Current brand name. |
new_name (required) |
string | New brand name. |
Deleting a brand needs a confirmation flag the assistant may only set after you said yes. Stacks keep the brand's name until you adjust them in the editor — nothing is rewritten behind your back.
delete_brand
DELETE a brand: its accounts config, asset pools and tree entry. Stacks keep the brand name until adjusted in the editor (warning-only semantics). Requires confirm=true after the user confirmed.
| Parameter | Type | Description |
|---|---|---|
brand (required) |
string | Brand to delete. |
confirm (required) |
boolean | Required true. Only pass it after the user explicitly confirmed this deletion in chat. |
move_brand_to_folder
Move a brand into a folder of the brand tree (created if missing). Empty folder = back to the root level.
| Parameter | Type | Description |
|---|---|---|
brand (required) |
string | Brand name. |
folder |
string | Folder name ('' = root). |
set_brand
Update a brand's settings: posting time/delay, timezone, content language, voiceover voice, Metricool blog id, logo, the brand identity (niche, audience & tone, colors, AI toggle) and per-platform account config. new_name renames the brand (stack data follows). Only the fields passed change.
| Parameter | Type | Description |
|---|---|---|
brand (required) |
string | Brand name (see list_brands). |
new_name |
string | Rename the brand. |
posting_time |
string | Daily posting time HH:MM — or several comma-separated times ('18:00, 19:30'): plan day N posts at entry N, cycling. Empty = the platform slot table. |
posting_delay_minutes |
integer | Minutes between this brand's posts in a batch. |
posting_time_rules |
array of object | Custom posting times per platform and/or post type. Each rule: {platforms: [...], post_types: [...], times: ['HH:MM', ...]} — empty platforms/post_types = any. The most specific matching rule wins (platform+type > platform > type > generic, ties by list order); plan day N takes the rule's Nth time, cycling; a matched rule pins exact times (posting_delay_minutes staggers only the base posting_time). Replaces ALL rules; [] clears. |
timezone |
string | IANA timezone, e.g. Europe/Berlin. |
content_language |
string | The language this brand publishes in (language axis) — name or code, normalized; empty = the briefing's language. |
voiceover_voice |
string | TTS voice id for the AI voiceover (empty = global default). |
metricool_blog_id |
string | Metricool brand (blog) id for the Metricool API upload mode — see list_metricool_brands. |
youtube_category |
string | YouTube category (Metricool vocabulary, e.g. GAMING, PEOPLE_BLOGS) — the Metricool import drops YouTube rows without one; empty = PEOPLE_BLOGS default. |
logo_path |
string | Logo image file — also the watermark-widget fallback. |
identity_niche |
string | Short niche description. |
identity_audience |
string | Audience & tone — how the brand addresses its audience. |
identity_ai_enabled |
boolean | Feed the identity into AI texts (default on). |
identity_color_primary |
string | Primary color #RRGGBB. |
identity_color_accent |
string | Accent color #RRGGBB — default motion-title accent. |
platforms |
object | Per-platform account config, merged per platform: {"tiktok": {"enabled": true, "channel_name": "…", "late_account_id": "…"}}. Prefer apply_zernio_profile — it imports all of this from the connected Zernio profile. |
save_pool
Create a named pool (name + kind) or update one ('pool' by id/name): rename, replace or append items/folders. A folder is a LIVE folder — re-scanned on every render, new downloads count automatically. Assign pools to brand slots via assign_pools.
| Parameter | Type | Description |
|---|---|---|
pool |
string | Existing pool (id or name) to update; omit to create. |
name |
string | Pool name (create/rename). |
kind |
enum: media, audio, hashtags |
Pool kind (create only; media = video + image). |
items |
array of string | File paths (or hashtag strings for kind=hashtags). |
folders |
array of string | Live folder paths (media/audio pools). |
append |
boolean | Add items/folders instead of replacing them. |
duplicate_pool
Duplicate a named asset pool (items + live folders) under a new name; the copy is unassigned.
| Parameter | Type | Description |
|---|---|---|
pool (required) |
string | Pool id or name. |
name |
string | Name of the copy (default ' |
delete_pool
Delete a named pool from the library and remove its assignments from every brand slot. Files on disk are never touched. DESTRUCTIVE: requires confirm=true, which you only pass after the user explicitly confirmed in chat; check used_by via list_pools first.
| Parameter | Type | Description |
|---|---|---|
pool (required) |
string | Pool id or name. |
confirm (required) |
boolean | Must be true — only after the user confirmed in chat. |
assign_pools
Point a brand's slot at named pools (the brand editor's assign dropdown): slot = backgrounds/cta/brainrot/sounds/outro_clips/hook_clips/endcard_clips/hashtags. Replaces the slot's assignments (append=true adds; clear=true with no pools empties the slot). Assignments apply on every platform unless tagged with 'platforms' (only these) or 'except' (all but these); a variant renders the union of every assignment serving its platform.
| Parameter | Type | Description |
|---|---|---|
brand (required) |
string | Brand name. |
slot (required) |
string | Slot key (see description). |
pools |
array of string | Pool ids or names (see list_pools). |
platforms |
array of string | Tag the written assignments: only these platforms. |
except |
array of string | Tag the written assignments: every platform but these. |
append |
boolean | Add to the slot instead of replacing it. |
clear |
boolean | Allow an empty 'pools' list to clear the slot. |
A brand-scoped call never rewrites a shared pool. Loose file paths and folders land in the brand's own pool, created on the spot; folders stay live and are re-scanned on every render.
set_brand_pools
Fill a brand's asset slots (backgrounds, cta, brainrot, sounds, outro_clips, hook_clips, endcard_clips, hashtags). Slots reference NAMED POOLS: a value that is a pool name/id assigns that pool; file paths, directories (kept as live folders, re-scanned every render) and hashtags land in the brand's own pool, created on the spot. Default replaces the slot's assignments; append=true adds. An assignment applies on every platform unless tagged: 'platforms' (only these) or 'except' (all but these) — a variant renders the union of every assignment serving its platform, there is no per-platform context or inheritance.
| Parameter | Type | Description |
|---|---|---|
brand (required) |
string | Brand name. |
platforms |
array of string | Tag the written assignments: only these platforms. |
except |
array of string | Tag the written assignments: every platform but these. |
pools (required) |
object | Values by slot key — pool names/ids, file paths, directories or hashtags, e.g. {"backgrounds": ["Valorant BGs", "D:/assets/bg"], "hashtags": ["#fyp"]}. |
append |
boolean | Add to existing assignments instead of replacing. |
distribute_assets
The app's asset funnel, pool edition: distribute media files or hashtags INTO named pools. mode=shared fills ONE pool (existing 'pool' or a 'new_pool_name') and assigns it to the given brands; mode=exclusive deals the items round-robin into one pool per brand (the slot's assigned pool, or a fresh one), so channels do not post identical material. Videos can be split into clips first. Slot kinds: backgrounds, cta, brainrot, sounds, outro_clips, hook_clips, endcard_clips, hashtags.
| Parameter | Type | Description |
|---|---|---|
kind (required) |
string | Slot kind (see description). |
mode |
enum: shared, exclusive |
shared = one pool for all; exclusive = per-brand pools, round-robin. |
brands |
array of string | Brands to assign the shared pool to (optional), or the per-brand targets in exclusive mode (required there). |
pool |
string | Shared mode: target pool id or name (see list_pools). |
new_pool_name |
string | Shared mode: create a new pool with this name instead. |
files |
array of string | Media file paths (every kind except hashtags). |
hashtags |
array of string | Hashtags (kind=hashtags). |
platform |
string | Platform tag of the assignment: 'all' (default) = the pool serves every platform of the brand, a platform key (e.g. tiktok) = only there. |
split |
boolean | Split videos into clips before distributing. |
clip_seconds |
integer | Clip length in seconds when splitting (default 10). |
estimate_funnel
How many clips the asset funnel would cut the given video files into at clip_seconds (distribute_assets with split).
| Parameter | Type | Description |
|---|---|---|
files (required) |
array of string | |
clip_seconds |
integer | Clip length in seconds (default 10). |
set_brand_caption_style
Pin a caption style for a brand (the default for stacks without an explicit style choice - a style set on the stack itself wins) and/or override caption colors (primary/highlight/outline/back/glow, #RRGGBB; colors recolor whatever style runs). clear=true removes the pin.
| Parameter | Type | Description |
|---|---|---|
brand (required) |
string | Brand name. |
style |
string | Style key (see list_caption_styles). |
colors |
object | Color overrides, e.g. {"highlight": "#FF0000"}. |
clear |
boolean | Remove the pin. |
apply_zernio_profile
Connect one Zernio profile to an existing brand: imports the profile's connected social accounts into the brand's platform config (found platforms enabled with account id + channel name, the rest disabled).
| Parameter | Type | Description |
|---|---|---|
brand (required) |
string | Brand name. |
profile (required) |
string | Zernio profile id or name (see list_zernio_profiles). |
import_zernio_profiles
Bulk brand setup from Zernio: create or update one brand per profile (existing brands matched by profile id, then name) and import each profile's connected accounts. all=true imports every profile — the one-call answer to 'set up my 10 brands'.
| Parameter | Type | Description |
|---|---|---|
profiles |
array of string | Profile ids or names (see list_zernio_profiles). |
all |
boolean | Import every profile. |