VoiceStudioDocs
Local reference

Projects and jobs

GET
/stats/usage

Response Body

application/json

bash
curl -X GET "https://example.com/stats/usage"
json
null
POST
/export

Request Body

application/json

source_filename*Source Filename
authorization*Authorization
mode?Mode
Default"history"

Response Body

application/json

application/json

bash
curl -X POST "https://example.com/export" \
  -H "Content-Type: application/json" \
  -d '{
    "source_filename": "string",
    "authorization": "string"
  }'
json
null
POST
/export/record

Request Body

application/json

filename*Filename
destination_path?Destination Path
Default"~/Downloads"
mode?Mode
Default"file"

Response Body

application/json

application/json

bash
curl -X POST "https://example.com/export/record" \
  -H "Content-Type: application/json" \
  -d '{
    "filename": "string"
  }'
json
null
GET
/export/history

Response Body

application/json

bash
curl -X GET "https://example.com/export/history"
json
null
POST
/export/reveal

Request Body

application/json

path*Path

Response Body

application/json

application/json

bash
curl -X POST "https://example.com/export/reveal" \
  -H "Content-Type: application/json" \
  -d '{
    "path": "string"
  }'
json
null
GET
/history

The newest 50 generations plus every starred take, newest first, kept to rows whose audio still exists on disk.

Starred takes ride along past the 50-row window so a keeper can never age off the rail. Rows whose WAV was deleted out-of-band (cleared outputs dir, manual cleanup) used to come back anyway and render dead players that 404 on every fetch; prune them here so the UI never sees them again.

Response Body

application/json

bash
curl -X GET "https://example.com/history"
json
null
DELETE
/history

Response Body

application/json

bash
curl -X DELETE "https://example.com/history"
json
null
PUT
/history/{history_id}/starred

Star/unstar a take. Starred takes survive the retention cap and always appear in GET /history regardless of the recency window.

Path Parameters

history_id*History Id

Request Body

application/json

starred*Starred

Response Body

application/json

application/json

bash
curl -X PUT "https://example.com/history/string/starred" \
  -H "Content-Type: application/json" \
  -d '{
    "starred": true
  }'
json
null
DELETE
/history/{history_id}

Path Parameters

history_id*History Id

Response Body

application/json

application/json

bash
curl -X DELETE "https://example.com/history/string"
json
null
GET
/tasks/stream/{task_id}

Universal Server-Sent Event stream for background tasks.

?after_seq=N enables resumption: on reconnect, the client replays persisted events with seq > N, then (if the job is still live) attaches to the in-memory listener for live updates. After a server restart the in-memory task is gone but the persisted tail + final jobs.status are still readable, so a mid-stream reload still sees the final state.

Path Parameters

task_id*Task Id

Query Parameters

after_seq?After Seq
Default0

Response Body

application/json

application/json

bash
curl -X GET "https://example.com/tasks/stream/string"
json
null
GET
/jobs

List persisted jobs, newest first.

status=active → running + pending (what the batch-queue UI wants). status=failed|done|cancelled|pending|running → exact match. project_id=... → scope to one project.

Query Parameters

status?string|null
project_id?string|null
limit?Limit
Default100

Response Body

application/json

application/json

bash
curl -X GET "https://example.com/jobs"
json
null
GET
/jobs/{job_id}

Path Parameters

job_id*Job Id

Response Body

application/json

application/json

bash
curl -X GET "https://example.com/jobs/string"
json
null
GET
/jobs/{job_id}/events

Persisted SSE tail. Strict ascending seq so the client can stitch it onto a live feed (which starts above the last returned seq).

Path Parameters

job_id*Job Id

Query Parameters

after_seq?After Seq
Default0
limit?Limit
Default500

Response Body

application/json

application/json

bash
curl -X GET "https://example.com/jobs/string/events"
json
null
POST
/tasks/cancel/{task_id}

Cancel a running background task (e.g. dub generation).

Path Parameters

task_id*Task Id

Response Body

application/json

application/json

bash
curl -X POST "https://example.com/tasks/cancel/string"
json
null
GET
/projects

Response Body

application/json

bash
curl -X GET "https://example.com/projects"
json
null
POST
/projects

Request Body

application/json

name*Name
video_path?string|null
audio_path?string|null
duration?number|null
state*

Response Body

application/json

application/json

bash
curl -X POST "https://example.com/projects" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "string",
    "state": {}
  }'
json
null
GET
/projects/{project_id}

Path Parameters

project_id*Project Id

Response Body

application/json

application/json

bash
curl -X GET "https://example.com/projects/string"
json
null
PATCH
/projects/{project_id}

Lightweight rename — updates only the project name (and updated_at), without re-serialising the whole state blob like PUT does.

Path Parameters

project_id*Project Id

Request Body

application/json

name*Name

Response Body

application/json

application/json

bash
curl -X PATCH "https://example.com/projects/string" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "string"
  }'
json
null
DELETE
/projects/{project_id}

Path Parameters

project_id*Project Id

Response Body

application/json

application/json

bash
curl -X DELETE "https://example.com/projects/string"
json
null
PUT
/projects/{project_id}

Path Parameters

project_id*Project Id

Request Body

application/json

name*Name
video_path?string|null
audio_path?string|null
duration?number|null
state*

Response Body

application/json

application/json

bash
curl -X PUT "https://example.com/projects/string" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "string",
    "state": {}
  }'
json
null