/api/voice base path and require your PeachDesk API key in the X-API-Key header.
Audio rendering and mixing run on PeachDesk’s GPU infrastructure. You arrange clips by referencing generation IDs — there are no local files or models to manage. Select engines, voices, and effects from the Voice Studio UI; everything is served from PeachDesk’s servers.
Authentication
Every request must include your PeachDesk API key in theX-API-Key header (an interactive session token in Authorization: Bearer also works — see Authentication):
Data shapes
object
object
Stories
List stories
List all stories, ordered for the Stories tab. Returns an array ofStoryResponse objects (with item_count).
Create a story
Create a new, empty story.string
required
Story name (1–100 characters).
string | null
Optional description (up to 500 characters).
StoryResponse. Invalid input returns 400.
Get a story
Fetch a single story with all of its items expanded.string
required
The story to retrieve.
StoryDetailResponse (the story fields plus an items array of StoryItemDetail). Returns 404 if the story does not exist.
Update a story
Update a story’s name and/or description.string
required
The story to update.
string
required
New name (1–100 characters).
string | null
New description (up to 500 characters).
StoryResponse. Returns 404 if the story does not exist.
curl
Delete a story
Permanently delete a story and its item arrangement. The underlying generations are not deleted.string
required
The story to delete.
{"message": "Story deleted successfully"}. Returns 404 if the story does not exist.
curl
Story items
Story items are individual clips placed on the timeline. Each item references a generation and carries its own position, track, trim, volume, and pinned version.Add an item
Add a generation to a story as a new clip.string
required
The story to add to.
string
required
The generation to place on the timeline.
integer | null
Start position in milliseconds. If omitted, the clip is appended after the existing items.
integer | null
default:"0"
Track index for the clip.
StoryItemDetail. Returns 404 if the story or generation is not found.
curl
Remove an item
Remove a clip from the story. The underlying generation is not deleted.string
required
The parent story.
string
required
The story item to remove.
{"message": "Item removed successfully"}. Returns 404 if the item is not found.
curl
Update item timecodes (batch)
Update the start time of multiple items at once — used when dragging several clips on the timeline.string
required
The parent story.
array
required
A list of timecode updates. Each entry has:
{"message": "Item timecodes updated successfully"}. Returns 400 on an invalid update request.
curl
Reorder items
Reorder items by generation ID and recalculate their timecodes so clips sit back-to-back in the given order.string
required
The parent story.
string[]
required
The generation IDs in their new order (at least one). All IDs must belong to this story.
StoryItemDetail. Returns 400 if any generation ID does not belong to the story.
curl
Move an item
Move a single clip to a new position and/or track.string
required
The parent story.
string
required
The story item to move.
integer
required
New start position in milliseconds (≥ 0).
integer
default:"0"
Destination track index.
StoryItemDetail. Returns 404 if the item is not found.
curl
Trim an item
Trim audio from the start and/or end of a clip without changing the underlying generation.string
required
The parent story.
string
required
The story item to trim.
integer
required
Milliseconds to remove from the start (≥ 0).
integer
required
Milliseconds to remove from the end (≥ 0).
StoryItemDetail. Returns 404 if the item is missing or the trim values are invalid.
curl
Set item volume
Set a clip’s per-clip volume as a linear gain.string
required
The parent story.
string
required
The story item to adjust.
number
required
Linear gain between
0.0 (silent) and 2.0. 1.0 is the original level.StoryItemDetail. Returns 404 if the item is not found.
curl
Split an item
Split a clip at a given time, producing two adjacent clips on the same track.string
required
The parent story.
string
required
The story item to split.
integer
required
The split point in milliseconds, relative to the timeline (≥ 0).
StoryItemDetail (the two resulting clips). Returns 404 if the item is not found or the split point is invalid.
curl
Duplicate an item
Duplicate a clip, copying its trim, volume, and version settings.string
required
The parent story.
string
required
The story item to duplicate.
StoryItemDetail. Returns 404 if the item is not found.
curl
Pin an item to a version
Pin a clip to a specific generation version (take). Each take is a versioned render of the generation — for example after applying Effects. Pinning controls which audio is used for playback and export.string
required
The parent story.
string
required
The story item to pin.
string | null
The version (take) to pin. Pass
null to revert to the generation’s default take.StoryItemDetail. Returns 404 if the item or version is not found.
curl
Export
Export story audio
Mix all of the story’s items down to a single WAV file, honoring each clip’s start time, track, trim, volume, and pinned version. Mixing runs on PeachDesk’s infrastructure.string
required
The story to export.
audio/wav download. The Content-Disposition header sets the filename from the story name (e.g. Episode 1 — Final.wav).
curl
Need the full Voice Studio walkthrough? See the Stories tab guide in the PeachDesk documentation at docs.peachdeskai.com.

