Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.whisul.com/llms.txt

Use this file to discover all available pages before exploring further.

Every music generation job moves through a defined set of status values. Understanding the lifecycle lets you write polling logic that reacts correctly to each state and extracts the right fields when a job finishes. This page describes each status, specifies which fields are available at each stage, and provides a complete reference for the result object returned when generation completes.

Status lifecycle

The job has been accepted and generation is in progress. The Whisul backend is actively processing your prompt.What to expect:
  • status is "running"
  • result is null
  • error is null
  • finished_at is not present
  • started_at is populated
What to do: Continue polling GET /jobs/{job_id} at a reasonable interval until status changes. See the polling guide for recommended intervals.
{
  "status": "running",
  "prompt": "a trap song",
  "result": null,
  "error": null,
  "started_at": "2026-02-17 15:39:34"
}

Timestamp fields

Both endpoints return timing information for the job.
FieldTypeWhen presentDescription
started_atstringAlwaysThe time the job began processing. Format: YYYY-MM-DD HH:MM:SS (UTC).
finished_atstringcompleted or failed onlyThe time the job finished. Not present while the job is running.

Result object fields

The result object is only present when status is "completed". For all other statuses, result is null.
FieldTypeDescription
titlestringThe AI-generated title for the song.
bpmnumberThe tempo of the generated track in beats per minute.
durationstringThe length of the song in m:ss format — for example, "2:47".
song_urlstringA URL to the generated audio file.
image_urlstringA URL to the AI-generated cover artwork for the song.
tagsstringA comma-separated string of descriptive tags characterizing the song’s style, genre, and instrumentation — for example, "trap, dark, 808s, synth, bass".
result fields are only guaranteed to be populated when status is "completed". Do not attempt to read result fields before confirming the status value.