A Story is a multi-track timeline that arranges your generated clips into a single piece of audio. Each story is made up of story items — references to generations placed at a start time on a track, with optional trimming, per-clip volume, and a pinned effect version (take). When you are happy with the arrangement you can export the whole story as one mixed WAV file. These endpoints back the Stories tab in PeachDesk Voice Studio. All paths are proxied by PeachDesk under the /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 the X-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 of StoryResponse 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).
Returns the created StoryResponse. Invalid input returns 400.

Get a story

Fetch a single story with all of its items expanded.
string
required
The story to retrieve.
Returns a 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).
Returns the updated 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.
Returns {"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.
Returns the created 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.
Returns {"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:
Returns {"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.
Returns the reordered array of 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.
Returns the updated 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).
Returns the updated 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.
Gain is capped at 2.0 so an over-aggressive boost can’t clip the mix or blow out the exported file. Use small increments and listen back.
Returns the updated 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).
Returns an array of 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.
Returns the new 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.
Returns the updated 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.
Response: a streaming 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.