Saved Content
Your library of lines and sound effects — searchable, versioned, with an active version per item
Overview
Saved Content is the organization's audio library. It holds two kinds of items:
| Type | What it is | Belongs to |
|---|---|---|
| Line | A generated or uploaded voice line with its text | A project and character (required) |
| SFX | A sound effect with an optional description and tags | Optionally a project |
Content arrives from three places: Save Line on the TTS form or Live Endpoint preview, Save SFX on the Audio Effects page, and direct Upload from the dashboard.
Versioning and the Active Version
Every item keeps a version history. When saving, you choose Save as New (a fresh item at version 1) or Update Existing (a new version appended to an item you pick). Each version is a complete snapshot: audio, text, source, and duration.
One version is the active version — the one that plays, downloads, and appears everywhere by default. The rule:
Latest is active unless you change it
Saving a new version makes it the active one. On the item's detail page you can pin any older version as active; it stays active until you change it or save another version.
Working with versions
- •The dashboard list shows
v2 of 3under items with more than one version. - •The detail page lists every version with per-version listen and download, plus Set Active on inactive versions.
- •Versions cannot be deleted individually; deleting the item removes all versions and their audio.
Finding and Managing Content
- •Text search covers name, line text / SFX description, tags, project name, and character name.
- •Type tabs (All / Lines / SFX) and project/character filters narrow the list; columns sort.
- •Each row plays (the active version), downloads with the real file extension, and deletes.
- •Uploads accept WAV, MP3, OGG, FLAC, M4A, AAC, and WMA up to 50MB.
API Access
Content is scoped by type: lines need lines:read / lines:write, sound effects need sfx:read / sfx:write. A key with only one of them sees only that type — even in unfiltered list calls.
/api/v1/content?contentType=&projectId=&characterId=lines:read | sfx:read/api/v1/content/{'{id}'}read (by item type)/api/v1/contentwrite (by contentType)multipart/form-data: audio, name, contentType (line | sfx), projectId?, characterId?, textToScreen?, tags?, source?, durationMs?. Lines require project, character, and text.
/api/v1/content/{'{id}'}/versionswrite (by item type)multipart/form-data: audio plus optional text/source/duration. The new version becomes active.
/api/v1/content/{'{id}'}write (by item type)| Field | Type | Description |
|---|---|---|
activeVersion* | integer | Version number to make active |
/api/v1/content/{'{id}'}write (by item type)Upload a new version of an existing line and pin an older one back:
# Add a version (becomes active)
curl -s https://<host>/api/v1/content/<id>/versions \
-H "Authorization: Bearer $API_KEY" \
-F "audio=@retake.mp3" \
-F "textToScreen=Welcome back, adventurer!"
# Changed your mind - make version 2 active again
curl -s -X PATCH https://<host>/api/v1/content/<id> \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-d '{"activeVersion": 2}'- 1Generation endpoints can save directly:
POST /api/v1/ttswithsave.namestores the result as a line (needslines:write);POST /api/v1/sfx/generatewithsavestores an SFX. - 2MCP tools
list_content,get_content,set_active_content_version, anddelete_contentexpose the same operations to AI agents.
