WWeavy Studio

API reference

Generate songs from lyrics and a style with YuE2, HeartMuLa or ACE-Step; cover, extend, repaint and re-arrange existing audio; split stems; write lyrics. Authenticate with an API key from the studio (Authorization: Bearer ws_...).

Base URL https://studio.weavyaudio.com/api/v1 · OpenAPI 3.1: /api/v1/openapi.json · Quickstart: API quickstart

Authentication

Create a key in the studio (API keys) and send it on every request: Authorization: Bearer ws_…. Keys can be revoked at any time.

Endpoints

POST/generations

Create a song (one or more takes). Queues one render per take on separate GPUs. Returns immediately; poll each id until its status is done.

Request body

FieldTypeDefault · rangeDescription
engine"yue2" | "heartmula" | "ace""yue2" Model: yue2 (CC BY-NC), heartmula (Apache 2.0) or ace (MIT).
task"create" | "cover" | "reference" | "extend" | "repaint" | "accompany""create" create a new song, or work from `source`: cover, reference (ace), extend (ace), repaint (ace), accompany (ace).
sourceobject Source audio for every task except create.
editobject Options for extend / repaint / accompany / covers.
heartobject HeartMuLa-only options.
aceobject ACE-Step-only options.
titlerequiredstring length 1–120Song title.
artiststring length 0–120Artist / act name (label only).
languagestring length 0–40Vocal language, e.g. "English" or "Polish". Put first in the style.
stylerequiredstring length 3–1000Genre, instruments, voice, mood, BPM, key - comma separated.
lyricsrequiredstring length 1–6000Lyrics with section tags: [Verse], [Chorus], [Bridge]...
cot"full" | "melody" | "off""full" full = write a melody-and-chord score first (most stable); melody = melody only; off = direct.
cfg_scalenumber2 1–4Style strength (classifier-free guidance), YuE2 and HeartMuLa. 1 = off.
takesinteger2 1–8How many versions to render (each on its own GPU slot).
seedinteger 0–2147483647Fixed seed for the first take; omitted = random.
lock_seedbooleanfalse Use the same seed for every take (only settings differ).
max_len_sinteger300 30–360Upper bound for the song length in seconds.
abcstring length 0–20000Optional ABC score (melody + chords) to sing instead of planning one.
abc_samplingobject Sampling for the score stage.
semantic_samplingobject Sampling for the audio-token stage.

Responses

  • 201 Queued.
  • 401 Missing or invalid API key.
  • 422 Validation error.
  • 429 Hourly limit reached.
curl -X POST https://studio.weavyaudio.com/api/v1/generations \
  -H "Authorization: Bearer $WEAVY_KEY" -H "Content-Type: application/json" \
  -d '{"title":"City Lights","language":"English","style":"warm piano pop, expressive female voice, 88 BPM","lyrics":"[Verse]\nNeon fades along the lane\n\n[Chorus]\nLet the day come into view","takes":2,"cfg_scale":2}'

GET/generations

List generations. Newest first. To page, pass before = created_at of the last item.

ParameterInTypeDescription
limitqueryinteger 1–200
beforequeryinteger Unix ms cursor.

Responses

  • 200 A page of generations.
  • 401 Missing or invalid API key.
curl https://studio.weavyaudio.com/api/v1/generations?limit=20 -H "Authorization: Bearer $WEAVY_KEY"

GET/generations/{id}

Get one generation.

ParameterInTypeDescription
idpathstring Generation id.

Responses

  • 200 The generation.
  • 401 Unauthorized.
  • 404 Not found.
curl https://studio.weavyaudio.com/api/v1/generations/GEN_ID -H "Authorization: Bearer $WEAVY_KEY"

DELETE/generations/{id}

Delete a generation and its files. Cancels it first if it is still running.

ParameterInTypeDescription
idpathstring Generation id.

Responses

  • 204 Deleted.
  • 401 Unauthorized.
  • 404 Not found.
curl -X DELETE https://studio.weavyaudio.com/api/v1/generations/GEN_ID -H "Authorization: Bearer $WEAVY_KEY"

POST/generations/{id}/stems

Split a finished take into stems. Vocals, drums, bass, guitar, piano, other. Runs in the background; read the take again for its `stems` field.

ParameterInTypeDescription
idpathstring Generation id.

Responses

  • 202 Started.
  • 401 Unauthorized.
  • 409 Not finished, or already splitting.
  • 503 Stem service not configured.
curl -X POST https://studio.weavyaudio.com/api/v1/generations/GEN_ID/stems -H "Authorization: Bearer $WEAVY_KEY"

POST/uploads

Upload an audio file (max 60 MB).

Request body · multipart/form-data

FieldTypeDefault · rangeDescription
filerequiredstring

Responses

  • 201 Stored (converted to MP3 320k).
  • 401 Unauthorized.
  • 413 Too large.
  • 415 Not audio.
  • 422 Undecodable.
curl -X POST https://studio.weavyaudio.com/api/v1/uploads -H "Authorization: Bearer $WEAVY_KEY" -F file=@demo.mp3

GET/uploads

List your uploads.

Responses

  • 200 Newest first.
  • 401 Unauthorized.

GET/voices

List ACE-Step voices.

Responses

  • 200 All voices; only status "ready" can be used.
  • 401 Unauthorized.
curl https://studio.weavyaudio.com/api/v1/voices -H "Authorization: Bearer $WEAVY_KEY"

POST/lyrics

Write or rewrite lyrics with Claude. 30 drafts per hour. Returns lyrics with section tags, ready for any engine.

Request body

FieldTypeDefault · rangeDescription
ideastring length 0–1000What the song is about.
languagestring length 0–40
stylestring length 0–1000
artiststring length 0–120
currentstring length 0–6000Existing lyrics (mode rewrite).
mode"new" | "rewrite"

Responses

  • 200 Draft.
  • 401 Unauthorized.
  • 429 Hourly limit reached.
  • 502 Writer failed.
curl -X POST https://studio.weavyaudio.com/api/v1/lyrics -H "Authorization: Bearer $WEAVY_KEY" -H "Content-Type: application/json" \
  -d '{"idea":"a night drive after a breakup","language":"Polish","style":"synthwave, male vocal"}'

POST/generations/{id}/cancel

Cancel a queued or running generation.

ParameterInTypeDescription
idpathstring Generation id.

Responses

  • 200 The generation.
  • 401 Unauthorized.
  • 404 Not found.
curl -X POST https://studio.weavyaudio.com/api/v1/generations/GEN_ID/cancel -H "Authorization: Bearer $WEAVY_KEY"

The Generation object

FieldTypeDefault · rangeDescription
idrequiredstring Generation id (one per take).
batch_idrequiredstring Shared by all takes created in one request.
statusrequired"queued" | "running" | "done" | "failed" | "cancelled"
enginerequired"yue2" | "heartmula" | "ace"
taskrequired"create" | "cover" | "reference" | "extend" | "repaint" | "accompany" What the take was made with: a new song or work on a source.
source_refrequiredobject | null The source audio, if any.
stemsrequiredobject | null Separated stems after POST /generations/{id}/stems.
stagerequired"transcribing" | "planning" | "generating" | "encoding" | "uploading" | null Current stage while running.
titlerequiredstring
artistrequiredstring | null
languagerequiredstring | null
stylerequiredstring
cotrequired"full" | "melody" | "off"
cfg_scalerequirednumber
seedrequiredinteger -9007199254740991–9007199254740991
max_len_srequiredinteger -9007199254740991–9007199254740991
abc_samplingrequiredobject | null
semantic_samplingrequiredobject | null
progressrequiredobject | null
errorrequiredstring | null
duration_srequirednumber | null Song length in seconds (done only).
render_srequirednumber | null GPU time in seconds (done only).
audiorequiredobject | null Absolute download URLs (done only).
lyricsstring
abc_instring | null
abc_outstring | null The ABC score the model sang.
created_atrequiredinteger -9007199254740991–9007199254740991Unix ms.
finished_atrequiredinteger | null

The Voice object

FieldTypeDefault · rangeDescription
idrequiredstring Use as ace.voice.
namerequiredstring
artistrequiredstring | null
statusrequired"training" | "ready" | "failed"
errorrequiredstring | null
has_lorarequiredboolean
referencerequiredboolean

The Sampling object

FieldTypeDefault · rangeDescription
temperaturenumber 0–2Randomness. 0 = greedy.
top_pnumber 0.1–1Nucleus sampling cut-off.
top_kinteger 1–500Only the k most likely tokens are considered.
repetition_penaltynumber 1–3Penalty for tokens repeated inside the window.
penalty_windowinteger 1–1000How many recent tokens the penalty looks at.

Errors and limits

Errors are JSON {"error": "...", "issues": [...]}. Codes: 401 bad or missing key · 404 not found · 422 validation (see issues) · 429 more than 40 takes in the last hour.