> ## Documentation Index
> Fetch the complete documentation index at: https://docs.60db.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Get Song

> Retrieve full song details including lyrics and poll for completion

Poll this endpoint every 3–5 seconds to check generation progress and retrieve full song details (including lyrics). Song status progresses: `submitted` → `running` → `succeeded` or `failed`.

## Request

### Headers

<ParamField header="Authorization" type="string" required>
  Bearer token with your API key
</ParamField>

### Path Parameters

<ParamField path="id" type="string" required>
  Song UUID
</ParamField>

## Response

<ResponseField name="success" type="boolean">
  True on success; false if not found
</ResponseField>

<ResponseField name="data" type="object">
  <Expandable title="Song object">
    <ResponseField name="id" type="string">UUID</ResponseField>
    <ResponseField name="status" type="string">`submitted`, `running`, `succeeded`, or `failed`</ResponseField>
    <ResponseField name="progress" type="string|null">Progress message (e.g., "writing lyrics", "generating music")</ResponseField>
    <ResponseField name="title" type="string">Song title</ResponseField>
    <ResponseField name="prompt" type="string">Original prompt</ResponseField>
    <ResponseField name="lyrics" type="string">Full lyrics (only in full object)</ResponseField>
    <ResponseField name="lyrics_prompt" type="string">Lyrics generation prompt (if used)</ResponseField>
    <ResponseField name="lyrics_generated" type="boolean">Whether lyrics were generated by the model</ResponseField>
    <ResponseField name="mode" type="string">`simple` or `advanced`</ResponseField>
    <ResponseField name="instrumental" type="boolean">No vocals</ResponseField>
    <ResponseField name="vocal_gender" type="string">`Male`, `Female`, or null</ResponseField>
    <ResponseField name="voice_id" type="string">Voice used</ResponseField>
    <ResponseField name="used_voice_id" type="string">Actual voice ID after fallback</ResponseField>
    <ResponseField name="duration_seconds" type="number|null">Length in seconds (null until succeeded)</ResponseField>
    <ResponseField name="sample_rate" type="integer">Audio sample rate (44100, etc.)</ResponseField>
    <ResponseField name="audio_url" type="string|null">Signed MP3 URL (\~1h validity; re-fetch to refresh). Null until succeeded.</ResponseField>
    <ResponseField name="target_duration" type="integer|null">Requested duration hint</ResponseField>
    <ResponseField name="tags" type="string">Style tags</ResponseField>
    <ResponseField name="negative_tags" type="string">Excluded styles</ResponseField>
    <ResponseField name="seed" type="string">Seed string sent (as string)</ResponseField>
    <ResponseField name="seed_requested" type="string">Seed that was actually used</ResponseField>
    <ResponseField name="credits_charged" type="number">Always 0 (free during beta)</ResponseField>
    <ResponseField name="liked" type="boolean">User flagged as liked</ResponseField>
    <ResponseField name="played" type="boolean">User flagged as played</ResponseField>
    <ResponseField name="error_message" type="string|null">Error details if status is `failed`</ResponseField>
    <ResponseField name="created_at" type="string">ISO 8601 timestamp</ResponseField>
    <ResponseField name="completed_at" type="string|null">ISO 8601 timestamp when succeeded/failed</ResponseField>
  </Expandable>
</ResponseField>

## Example

<RequestExample>
  ```bash cURL theme={null}
  curl https://api.60db.ai/songs/song-550e8400 \
    -H "Authorization: Bearer your-api-key"
  ```

  ```javascript JavaScript theme={null}
  const song = await client.music.get('song-550e8400');
  console.log('Status:', song.data.status);
  if (song.data.status === 'succeeded') {
    console.log('Ready! Duration:', song.data.duration_seconds);
  }
  ```

  ```python Python theme={null}
  song = client.music.get('song-550e8400')
  print('Status:', song['data']['status'])
  if song['data']['status'] == 'succeeded':
      print('Ready! Duration:', song['data']['duration_seconds'])
  ```
</RequestExample>

<ResponseExample>
  ```json Response (succeeded) theme={null}
  {
    "success": true,
    "data": {
      "id": "song-550e8400",
      "batch_id": "batch-001",
      "variant_index": 0,
      "status": "succeeded",
      "progress": null,
      "mode": "simple",
      "title": "Jazzy Lo-Fi Beat",
      "prompt": "upbeat lo-fi hip hop with jazzy chords",
      "lyrics": "[Verse]\nChasing my dreams through the city lights\nMelodies floating in the night...",
      "lyrics_prompt": "upbeat lo-fi hip hop with jazzy chords",
      "lyrics_generated": true,
      "tags": null,
      "instrumental": false,
      "vocal_gender": null,
      "voice_id": null,
      "used_voice_id": "vocal-default-male",
      "negative_tags": null,
      "target_duration": null,
      "duration_seconds": 185,
      "sample_rate": 44100,
      "audio_url": "https://cdn.60db.ai/songs/song-550e8400.mp3?expires=2026-09-24T11:30:00Z",
      "seed": "",
      "seed_requested": "",
      "credits_charged": 0,
      "liked": false,
      "played": false,
      "error_message": null,
      "created_at": "2026-09-24T10:30:00Z",
      "completed_at": "2026-09-24T10:32:15Z"
    }
  }
  ```
</ResponseExample>
