Back to Documentation
AMADEV Docs
Reference

Sonauto API Reference

Music generation API reference — v2/v3 endpoints, streaming, lyrics alignment

📥 Sonauto API Documentation - Complete Markdown

Berikut adalah konten Markdown lengkap yang bisa Anda copy-paste dan simpan sebagai file .md:

Code
# 🎵 Sonauto API Documentation (Lengkap)

> **Beta** - Dokumentasi resmi untuk Sonauto Developer API  
> Build with the Sonauto API. Generate AI music programmatically and integrate music generation into your applications.  
> 🌐 Source: [sonauto.ai/developers](https://sonauto.ai/developers)  
> 📅 Last Updated: April 2026

---

## 📋 Daftar Isi

1. [Gambaran Umum](#-gambaran-umum)
2. [Harga & Kredit API](#-harga--kredit-api)
3. [Autentikasi](#-autentikasi)
4. [Parameter Generasi (Core)](#-parameter-generasi-core)
5. [Format Output Audio](#-format-output-audio)
6. [Status Generasi](#-status-generasi)
7. [Endpoint Generasi](#-endpoint-generasi)
   - [v3 Preview (Beta)](#-v3-preview-beta)
   - [v2 - Generate Song](#-v2-generate-song)
   - [v2/extend - Extend Song](#-v2extend-extend-song)
   - [v2/inpaint - Inpaint Section](#-v2inpaint-inpaint-section)
8. [Generation History & Data Fetching](#-generation-history--data-fetching)
   - [⚠️ Penting: Masa Simpan Lagu](#️-penting-masa-simpan-lagu)
   - [GET /v1/generations/{task_id}](#-get-v1generationstask_id)
   - [GET /v1/generations/status/{task_id}](#-get-v1generationsstatustask_id)
   - [Flow Status Generasi](#-flow-status-generasi-reference)
9. [Streaming (v3 Only)](#-streaming-v3-only)
10. [Lyrics Alignment](#-lyrics-alignment)
11. [Contoh Kode](#-contoh-kode)
12. [Best Practices & Tips](#-best-practices--tips)
13. [Referensi GitHub Examples](#-referensi-github-examples)
14. [Troubleshooting](#-troubleshooting)
15. [Dukungan & Komunitas](#-dukungan--komunitas)

---

## 🔍 Gambaran Umum

Sonauto adalah platform AI music generation yang memungkinkan developer untuk:

- ✅ Membuat lagu lengkap dari prompt teks, lirik, atau tag gaya musik
- ✅ Memperpanjang lagu yang sudah ada (`extend`)
- ✅ Mengganti bagian tertentu dari lagu (`inpaint`)
- ✅ Streaming audio real-time (v3)
- ✅ Sinkronisasi lirik ke audio (`align_lyrics`)

**API Domain:** `https://api.sonauto.ai/v1`  
**Streaming Domain:** `https://api-stream.sonauto.ai`

> ⚠️ **PENTING:** Lagu yang dihasilkan akan dihapus dari server **7 hari (168 jam)** setelah generasi. Pastikan untuk mengunduh lagu yang ingin Anda simpan!

---

## 💰 Harga & Kredit API

> Pricing untuk API saja. Generasi lagu via website Sonauto tetap **gratis**!

### 🎁 Free Trial
| Item | Detail |
|------|--------|
| Kredit Gratis | **1,500 credits** setelah registrasi |
| Estimasi Lagu | ~15 lagu (1 lagu = 100 credits) |

### 💡 Sistem Kredit
| Aksi | Kredit |
|------|--------|
| 1 lagu (1:35 menit) via v2 | 100 credits |
| 2 lagu sekaligus (`num_songs=2`) | 150 credits |
| Lagu v3 (variable length 2-4 menit) | 100 credits |

### 📦 Paket Berlangganan

| Paket | Harga/Bulan | Kredit | Kredit/Lagu | Kredit Tambahan |
|-------|-------------|--------|-------------|----------------|
| **Starter** | $11 | 20,000 | 200 lagu | $0.06 / 100 credits |
| **Pro** | $88 | 160,000 | 1,600 lagu | $0.06 / 100 credits |
| **Scale** | $330 | 660,000 | 6,600 lagu | $0.05 / 100 credits |
| **Enterprise** | $1,150 | 2,875,000 | 28,750 lagu | $0.04 / 100 credits |
| **Pay As You Go** | - | Beli sesuai kebutuhan | - | $0.06 / 100 credits |

> 📌 **Attribution Required:** Implementasi user-facing API Sonauto **wajib** mencantumkan atribusi ke Sonauto.

---

## 🔐 Autentikasi

Semua endpoint memerlukan API Key di header `Authorization`:

```http
Authorization: Bearer your_api_key_here
Content-Type: application/json

Mendapatkan API Key

  1. Daftar akun di sonauto.ai
  2. Kunjungi https://sonauto.ai/developers
  3. Generate API Key dari dashboard

🔒 Security Best Practices

  • ❌ Jangan hardcode API key di client-side code
  • ✅ Gunakan environment variables atau secret manager
  • ✅ Rotate API key secara berkala
  • ✅ Monitor usage via /credits/balance

⚙️ Parameter Generasi (Core)

Parameter Wajib (Minimal Satu)

Anda harus menyediakan minimal satu dari: tags, lyrics, atau prompt.

ParameterTipeDeskripsiContoh
tagsarray[string]Tag gaya musik["rock", "energetic", "male vocals"]
lyricsstringLirik lagu yang ingin digunakan"Verse 1: Today is the day..."
promptstringDeskripsi teks untuk generate tags/lyrics otomatis"An upbeat rock song with heavy guitar riffs"

❗ Jika hanya memberikan lyrics atau tags tanpa prompt, sistem akan menolak. Gunakan prompt: "" (string kosong) jika ingin AI sepenuhnya menentukan style/lirik.

Parameter Opsional Umum

ParameterTipeDefaultDeskripsi
instrumentalbooleanfalseJika true, hasilkan lagu instrumental (tanpa vokal). Jangan kirim lyrics.
prompt_strengthfloat2.0Nilai tinggi = lebih patuh ke prompt, tapi kurang natural. Range: 0.0 - 10.0
balance_strengthfloat0.7Tinggi = vokal lebih natural. Rendah = instrumen lebih tajam. (v2 only)
seedinteger-Seed RNG. Same tags+lyrics+seed = same song. (v2 only)
webhook_urlstring-URL untuk menerima POST status updates real-time.
num_songsinteger1Jumlah lagu yang digenerate (1 atau 2). 2 lagu = 150 credits! (v2 only)
align_lyricsbooleanfalseAktifkan lyrics alignment post-processing.
output_formatstring"ogg"Format output: mp3, flac, wav, ogg, m4a.
output_bit_rateinteger-Bitrate untuk mp3/m4a: 128, 192, 256, 320 kbps.
enable_streamingbooleanfalseAktifkan streaming real-time (v3 only).
stream_formatstring"ogg"Format streaming: ogg atau mp3 (v3 only).

🎧 Format Output Audio

FormatContainerCodecKeterangan
oggOggOpus (VBR)Default, kualitas terbaik/ukuran kecil
mp3MPEGMP3Kompatibel universal
flacFLACFLACLossless, ukuran besar
wavWAVPCMUncompressed, sangat besar
m4aMP4AACKompresi efisien, Apple-friendly

Untuk mp3 dan m4a, Anda dapat mengatur output_bit_rate (128/192/256/320 kbps).


📊 Status Generasi

Anda dapat memantau status via:

  1. Polling endpoint GET /generations/{task_id}
  2. Webhook real-time via webhook_url

Urutan Status Updates

Code
01. RECEIVED                    → Request diterima & diparsing
02. TRANSCRIBE_TASK_STARTED     → (inpaint/extend only)
03. TRANSCRIBE_STAGE_1          → (inpaint/extend only)
04. TRANSCRIBE_STAGE_2          → (inpaint/extend only)
05. TRANSCRIBE_STAGE_3          → (inpaint/extend only)
06. TRANSCRIBE_DONE             → (inpaint/extend only)
07. PROMPT                      → Konversi prompt ke tags/lyrics
08. TASK_SENT                   → Task dikirim ke GPU cluster
09. GENERATE_TASK_STARTED       → GPU worker mulai mengerjakan
10. LOADING_SOURCE              → (inpaint/extend) Fetch source audio
11. BEGINNING_GENERATION        → Persiapan akhir sebelum generate
12. GENERATING                  → 🎵 Lagu sedang digenerate!
13. GENERATING_STREAMING_READY  → (v3 only) Siap untuk streaming
14. DECOMPRESSING               → Decompress dari latent space
15. SAVING                      → Upload ke CDN
16. ✅ SUCCESS                  → Selesai! URL lagu di `song_paths`
17. ❌ FAILURE                  → Error (tidak ada kredit dipotong)

⚠️ URL di song_paths expire setelah 7 hari. Download segera!


🚀 Endpoint Generasi

🔹 v3 Preview (Beta)

⚠️ Beta: Hasil mungkin lebih rendah kualitasnya dari v2, dan parameter behavior dapat berubah tanpa notice. Gunakan default values untuk hasil terbaik.

Perbedaan v3 vs v2:

  • ❌ Tidak mendukung: seed, balance_strength, bpm, num_songs
  • ✅ Lagu variable-length (2-4 menit), kualitas audio lebih baik
  • ✅ Streaming real-time tersedia
  • ✅ Waktu generate lebih lama, tapi bisa mulai dengar lebih cepat via streaming

POST /v1/generations/v3

Code
{
  "tags": ["rock", "energetic"],
  "lyrics": "Optional lyrics here...",
  "prompt": "An upbeat rock song with heavy guitar riffs",
  "instrumental": false,
  "prompt_strength": 2.0,
  "webhook_url": "https://your-webhook.com/sonauto",
  "output_format": "ogg",
  "output_bit_rate": null,
  "enable_streaming": true,
  "stream_format": "ogg",
  "align_lyrics": false
}
Response
Code
{
  "task_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}

🔹 v2 - Generate Song

POST /v1/generations/v2

Generate lagu 1 menit 35 detik dengan model v2.

Code
{
  "tags": ["rock", "energetic"],
  "lyrics": "Optional lyrics...",
  "prompt": "An upbeat rock song with heavy guitar riffs",
  "instrumental": false,
  "prompt_strength": 2.0,
  "balance_strength": 0.7,
  "seed": 42,
  "webhook_url": "https://your-webhook.com/sonauto",
  "num_songs": 1,
  "output_format": "ogg",
  "output_bit_rate": null,
  "align_lyrics": false,
  "bpm": "auto"
}
Parameter Unik v2
ParameterTipeDeskripsi
bpmstring | integer | nullBeats per minute. Gunakan "auto" untuk auto-pick berdasarkan tags, atau null untuk tidak conditioning.
Response
Code
{
  "task_id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
}

🔹 v2/extend - Extend Song

POST /v1/generations/v2/extend

Perpanjang lagu yang sudah ada dari sisi kiri ("left") atau kanan ("right").

Code
{
  "audio_url": "https://cdn.sonauto.ai/generations2/audio_xxx.ogg",
  "audio_base64": "optional_base64_string",
  "side": "right",
  "extend_duration": 45.0,
  "crop_duration": 0.0,
  "tags": ["rock", "energetic"],
  "lyrics": "New lyrics for extension...",
  "prompt": "Continue the song with a guitar solo",
  "instrumental": false,
  "prompt_strength": 2.0,
  "balance_strength": 0.7,
  "seed": 42,
  "webhook_url": "https://your-webhook.com/sonauto",
  "num_songs": 1,
  "output_format": "ogg",
  "output_bit_rate": null,
  "align_lyrics": false
}
Parameter Unik Extend
ParameterTipeWajibDeskripsi
audio_urlstring✅*URL publik lagu source. *Gunakan audio_base64 jika tidak ada URL publik
audio_base64string✅*Base64-encoded audio file (max 40MB)
side"left" | "right"Arah extend: "left" = awal lagu, "right" = akhir lagu
extend_durationfloatDurasi audio baru yang digenerate (0 - 85.0 detik)
crop_durationfloatCrop akhir/awal audio original sebelum extend (default: 0.0)

💡 Tip: Untuk lagu yang digenerate via Sonauto, gunakan URL CDN (song_paths) sebagai audio_url, bukan file yang sudah di-download. Ini mencegah degradasi kualitas karena sistem akan reuse latent representation.


🔹 v2/inpaint - Inpaint Section

POST /v1/generations/v2/inpaint

Ganti bagian tertentu dari lagu dengan konten baru yang digenerate.

Code
{
  "audio_url": "https://cdn.sonauto.ai/generations2/audio_xxx.ogg",
  "audio_base64": "optional_base64_string",
  "sections": [[0.0, 30.0]],
  "selection_crop": false,
  "tags": ["rock", "energetic"],
  "lyrics": "New lyrics for the section",
  "prompt": "Replace with a drum break",
  "instrumental": false,
  "prompt_strength": 2.0,
  "balance_strength": 0.7,
  "seed": 42,
  "webhook_url": "https://your-webhook.com/sonauto",
  "num_songs": 1,
  "output_format": "ogg",
  "output_bit_rate": null,
  "align_lyrics": false
}
Parameter Unik Inpaint
ParameterTipeWajibDeskripsi
audio_url / audio_base64stringSource audio (sama seperti extend)
sectionsarray[array[float]]List sections yang diganti. Saat ini hanya 1 section yang didukung. Format: [[start_sec, end_sec]]
selection_cropbooleanJika true, output hanya berisi section yang di-inpaint (default: false)

⚠️ lyrics wajib untuk endpoint inpaint.


📜 Generation History & Data Fetching

⚠️ Penting: Masa Simpan Lagu

Code
🗓️ Songs will be deleted from our servers ONE WEEK (168 hours) after generation.
PoinDetail
URL ExpiryURL di song_paths tidak akan bekerja setelah 7 hari
Tidak DijaminDalam beberapa kasus lagu mungkin masih bisa diakses, tapi tidak dijamin
Rekomendasi📥 Download segera lagu yang ingin Anda simpan permanen!

🔍 GET /v1/generations/{task_id}

Retrieve hasil generasi lengkap + semua parameter yang digunakan.

📋 Request

Code
GET https://api.sonauto.ai/v1/generations/{task_id}
Authorization: Bearer your_api_key_here

💻 Code Samples

Python

Code
import requests

task_id = "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
url = f"https://api.sonauto.ai/v1/generations/{task_id}"
headers = {"Authorization": "Bearer your_api_key_here"}

response = requests.get(url, headers=headers)
print(response.json())

cURL

Code
curl -X GET "https://api.sonauto.ai/v1/generations/a1b2c3d4-e5f6-7890-abcd-ef1234567890" \
  -H "Authorization: Bearer your_api_key_here"

📦 Response Schema (SUCCESS)

Code
{
  "id": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
  "created_at": "2026-04-06T10:30:00Z",
  "status": "SUCCESS",
  "alignment_status": "SUCCESS",
  "model_version": "v3-preview",
  "song_paths": [
    "https://cdn.sonauto.ai/generations3/audio_xxx.ogg"
  ],
  "error_message": null,
  "lyrics": "Generated or provided lyrics here...",
  "prompt": "An upbeat rock song with heavy guitar riffs",
  "prompt_strength": 2.0,
  "tags": ["rock", "energetic", "male vocals"],
  "v2_params": {
    "balance_strength": 0.7,
    "seed": 42,
    "bpm": "auto"
  },
  "inpaint_params": null,
  "extend_params": null
}

📚 Field Descriptions

FieldTipeDeskripsi
idstring (UUID)Unique identifier untuk generasi ini
created_atstring (ISO 8601)Timestamp kapan generasi dibuat
statusstringStatus utama generasi: RECEIVED, GENERATING, SUCCESS, FAILURE, dll
alignment_statusstring | nullStatus lyrics alignment (null jika tidak diminta)
model_versionstringVersi model: "v2.2", "v3-preview", dll
song_pathsarray[string]URL(s) audio hasil generate ⚠️ expire 7 hari
error_messagestring | nullPesan error jika status: "FAILURE"
lyricsstringLirik yang digunakan/dihasilkan
promptstring | nullPrompt teks yang digunakan (jika ada)
prompt_strengthfloatNilai kepatuhan prompt (semakin tinggi = lebih patuh tapi kurang natural)
tagsarray[string]Array tag gaya musik yang digunakan
🔹 v2_params (Hanya untuk model v2, null untuk v3)
FieldTipeDeskripsi
balance_strengthfloatTinggi = vokal lebih natural. Rendah = instrumen lebih tajam. Rekomendasi: 0.7
seedintegerRandom seed untuk reproducibility
bpmstring | integer | nullBeats per minute: "auto", angka, atau null
🔹 inpaint_params (Hanya jika operasi inpaint)
FieldTipeDeskripsi
sectionsarray[array[float]]Sections yang di-inpaint: [[start_sec, end_sec]]
selection_cropbooleanJika true, output hanya section yang di-inpaint
audio_urlstringURL source audio yang digunakan
lyricsstringLirik untuk section yang di-inpaint
🔹 extend_params (Hanya jika operasi extend)
FieldTipeDeskripsi
sidestringArah extend: "left" atau "right"
crop_durationfloatDurasi crop dari audio original sebelum extend
audio_urlstringURL source audio yang digunakan
durationfloatDurasi extend yang diminta
lyricsstringLirik untuk bagian extend

⚡ GET /v1/generations/status/{task_id}

Cek status task secara ringan (tanpa metadata lengkap). Ideal untuk polling.

📋 Request

Code
GET https://api.sonauto.ai/v1/generations/status/{task_id}?include_alignment=true
Authorization: Bearer your_api_key_here

🔧 Query Parameters

ParameterTipeDefaultDeskripsi
task_idstring-UUID task yang ingin dicek
include_alignmentbooleanfalseJika true, return JSON dengan status + alignment_status

📦 Response

Default (tanpa include_alignment)

Code
"SUCCESS"

Returns plain string dengan status generasi.

Dengan include_alignment=true

Code
{
  "status": "SUCCESS",
  "alignment_status": "SUCCESS"
}

🔄 Flow Status Generasi (Reference)

Code
01. RECEIVED                    
02. TRANSCRIBE_TASK_STARTED     → (inpaint/extend only)
03. TRANSCRIBE_STAGE_1-3        → (inpaint/extend only)  
04. TRANSCRIBE_DONE             → (inpaint/extend only)
05. PROMPT                      → Konversi prompt ke tags/lyrics
06. TASK_SENT                   → Task dikirim ke GPU cluster
07. GENERATE_TASK_STARTED       → GPU worker mulai mengerjakan
08. LOADING_SOURCE              → (inpaint/extend) Fetch source audio
09. BEGINNING_GENERATION        → Persiapan akhir sebelum generate
10. GENERATING                  → 🎵 Lagu sedang digenerate!
11. GENERATING_STREAMING_READY  → (v3 only) Siap untuk streaming
12. DECOMPRESSING               → Decompress dari latent space
13. SAVING                      → Upload ke CDN
14. ✅ SUCCESS                  → Selesai! URL lagu di `song_paths`
15. ❌ FAILURE                  → Error (tidak ada kredit dipotong)

🌊 Streaming (v3 Only)

Streaming memungkinkan Anda memutar lagu sementara masih digenerate.

Prasyarat

  • Hanya tersedia untuk generasi v3
  • Wajib set "enable_streaming": true saat request generasi
  • Streaming endpoint hanya aktif selama generasi berjalan + beberapa detik setelah selesai

GET https://api-stream.sonauto.ai/stream/{task_id}

Parameters

ParameterLokasiWajibDeskripsi
task_idURL PathTask ID dari response generasi v3

Response Headers

Code
Content-Type: audio/ogg; codecs="opus"
# atau
Content-Type: audio/mpeg  (jika stream_format: "mp3")

Error Handling

StatusPenyebab
400 Bad RequestTrack belum siap streaming. Tunggu status GENERATING_STREAMING_READY

Contoh Penggunaan

HTML Audio Element

Code
<audio controls autoplay>
  <source 
    src="https://api-stream.sonauto.ai/stream/a1b2c3d4-e5f6-7890-abcd-ef1234567890" 
    type="audio/ogg" 
  />
  Your browser does not support the audio element.
</audio>

Python (requests)

Code
import requests

task_id = "a1b2c3d4-e5f6-7890-abcd-ef1234567890"
url = f"https://api-stream.sonauto.ai/stream/{task_id}"
headers = {"Authorization": "Bearer your_api_key_here"}

with requests.get(url, headers=headers, stream=True) as r:
    r.raise_for_status()
    with open("streaming_output.ogg", "wb") as f:
        for chunk in r.iter_content(chunk_size=8192):
            f.write(chunk)

🔤 Lyrics Alignment

Fitur opsional untuk menghasilkan word-level timing data yang mensinkronkan lirik ke audio.

Persyaratan

  • Hanya untuk lagu non-instrumental dengan lirik
  • v2: Wajib num_songs=1 saat align_lyrics=true
  • Set "align_lyrics": true di request generasi

Status Flow Alignment

Code
REQUESTED → TASK_SENT → ALIGNING → ✅ SUCCESS / ❌ FAILURE

⚠️ Jika generasi utama FAILURE, alignment_status tetap REQUESTED (alignment tidak pernah dijalankan). Selalu cek status utama dulu!

Cara Cek Alignment Status

Gunakan endpoint status dengan include_alignment=true:

Code
GET /v1/generations/status/{task_id}?include_alignment=true

Response:

Code
{
  "status": "SUCCESS",
  "alignment_status": "SUCCESS"
}

Output Alignment

Setelah alignment_status: "SUCCESS", Anda dapat mengambil data alignment via endpoint /generations/{task_id}. Data alignment berisi timestamp per kata untuk sinkronisasi lirik.


💻 Contoh Kode

Python: Generate Lagu v2

Code
import requests

url = "https://api.sonauto.ai/v1/generations/v2"
headers = {
    "Authorization": "Bearer your_api_key_here",
    "Content-Type": "application/json"
}
payload = {
    "tags": ["rock", "energetic"],
    "prompt": "An upbeat rock song with heavy guitar riffs",
    "num_songs": 1,
    "output_format": "mp3",
    "output_bit_rate": 320
}

response = requests.post(url, json=payload, headers=headers)
task_id = response.json()["task_id"]
print(f"Task ID: {task_id}")

# Polling status
import time
while True:
    status_url = f"https://api.sonauto.ai/v1/generations/status/{task_id}"
    status = requests.get(status_url, headers=headers).json()
    print(f"Status: {status}")
    if status in ["SUCCESS", "FAILURE"]:
        break
    time.sleep(5)

# Ambil hasil
if status == "SUCCESS":
    result = requests.get(
        f"https://api.sonauto.ai/v1/generations/{task_id}",
        headers=headers
    ).json()
    print(f"Download URL: {result['song_paths'][0]}")

cURL: Generate Lagu v3 dengan Streaming

Code
# 1. Request generasi
curl -X POST https://api.sonauto.ai/v1/generations/v3 \
  -H "Authorization: Bearer your_api_key_here" \
  -H "Content-Type: application/json" \
  -d '{
    "prompt": "A chill lofi beat for studying",
    "tags": ["lofi", "chill", "instrumental"],
    "instrumental": true,
    "enable_streaming": true,
    "stream_format": "mp3"
  }'

# 2. Streaming (setelah status GENERATING_STREAMING_READY)
curl -H "Authorization: Bearer your_api_key_here" \
  https://api-stream.sonauto.ai/stream/YOUR_TASK_ID \
  --output song_stream.mp3

Python: Upload Audio via Base64 (Extend/Inpaint)

Code
import base64
import requests

# Baca file audio & encode ke base64
with open("source_song.ogg", "rb") as f:
    audio_b64 = base64.b64encode(f.read()).decode("utf-8")

url = "https://api.sonauto.ai/v1/generations/v2/extend"
headers = {
    "Authorization": "Bearer your_api_key_here",
    "Content-Type": "application/json"
}
payload = {
    "audio_base64": audio_b64,
    "side": "right",
    "extend_duration": 30.0,
    "prompt": "Add a guitar solo outro",
    "tags": ["rock", "guitar"]
}

response = requests.post(url, json=payload, headers=headers)
print(response.json())

⚠️ Batas ukuran file base64: 40MB

Python: Polling dengan Exponential Backoff

Code
import time
import requests

def wait_for_completion(task_id, api_key, interval=5, timeout=300):
    """Poll status dengan exponential backoff sederhana"""
    url = f"https://api.sonauto.ai/v1/generations/status/{task_id}"
    headers = {"Authorization": f"Bearer {api_key}"}
    
    start_time = time.time()
    while time.time() - start_time < timeout:
        response = requests.get(url, headers=headers)
        status = response.json()
        
        if status in ["SUCCESS", "FAILURE"]:
            return status
        elif status == "GENERATING":
            print(f"⏳ Masih generating... ({int(time.time()-start_time)}s)")
        
        time.sleep(interval)
    
    raise TimeoutError(f"Task {task_id} belum selesai dalam {timeout} detik")

Python: Download Otomatis Setelah SUCCESS

Code
def download_song(task_id, api_key, output_path="song.ogg"):
    """Ambil hasil dan download langsung"""
    headers = {"Authorization": f"Bearer {api_key}"}
    
    # 1. Cek status dulu
    status_url = f"https://api.sonauto.ai/v1/generations/status/{task_id}"
    if requests.get(status_url, headers=headers).json() != "SUCCESS":
        return False
    
    # 2. Ambil detail + URL
    detail_url = f"https://api.sonauto.ai/v1/generations/{task_id}"
    data = requests.get(detail_url, headers=headers).json()
    
    # 3. Download audio
    song_url = data["song_paths"][0]
    audio = requests.get(song_url).content
    
    with open(output_path, "wb") as f:
        f.write(audio)
    
    print(f"✅ Downloaded: {output_path}")
    return True

🎯 Best Practices & Tips

✅ Do's

  1. Gunakan webhook untuk integrasi real-time, hindari polling berlebihan
  2. Download segera lagu yang dihasilkan (URL expire 7 hari)
  3. Gunakan CDN URL (song_paths) sebagai audio_url untuk extend/inpaint (hindari re-encode)
  4. Set align_lyrics=true jika butuh sinkronisasi lirik untuk UI/karaoke
  5. Gunakan seed di v2 untuk reproducibility selama development
  6. Monitor kredit via /credits/balance sebelum request besar
  7. Simpan task_id di database Anda untuk tracking history

❌ Don'ts

  1. Jangan hardcode API key di client-side code
  2. Jangan asumsikan song_paths permanen — selalu download & backup
  3. Jangan set prompt_strength terlalu tinggi (>3.0) — hasil bisa tidak natural
  4. Jangan gunakan num_songs=2 jika tidak perlu — lebih hemat kredit dengan 2 request terpisah
  5. Jangan lupa handle error FAILURE dengan retry logic

🔧 Troubleshooting

MasalahPenyebab MungkinSolusi
401 UnauthorizedAPI key salah/tidak ada di headerPeriksa Authorization: Bearer ...
400 Bad RequestParameter tidak validValidasi: minimal satu dari tags/lyrics/prompt
Lagu tidak naturalprompt_strength terlalu tinggiTurunkan ke 1.5 atau naikkan balance_strength ke 0.8
Streaming 400Belum ready atau v2 modelPastikan enable_streaming: true & model v3
Alignment gagalInstrumental / num_songs>1Pastikan lagu punya lirik & num_songs=1 untuk v2
404 Not Found pada task_idID salah / sudah expiredVerifikasi UUID, cek apakah sudah >7 hari
song_paths kosong tapi SUCCESSBug sementara / alignment prosesTunggu beberapa detik, polling ulang
URL song_paths tidak bisa diaksesSudah expire (>7 hari)Download segera setelah SUCCESS

📊 Polling vs Webhook Comparison

MetodeKelebihanKekuranganUse Case
WebhookReal-time, efisien, tidak perlu pollingPerlu server publik, setup lebih kompleksProduction, high-volume apps
PollingSimple, tidak perlu server eksternalLess efficient, perlu manage interval & timeoutDevelopment, testing, low-volume

💡 Rekomendasi: Gunakan webhook untuk production, polling untuk development/testing.


📦 Referensi GitHub Examples

Sonauto menyediakan repository contoh resmi:
🔗 github.com/Sonauto/sonauto-api-examples

Contoh Script Tersedia

FileDeskripsi
rock_song_generator.pyGenerate lagu rock sederhana dengan prompt
transition_generator.pyBuat transisi mulus antara 2 lagu YouTube
singing_telegram.pyBuat video "singing telegram" dengan integrasi Lemon Slice API

Instalasi Contoh

Code
git clone https://github.com/Sonauto/sonauto-api-examples.git
cd sonauto-api-examples
pip install -r requirements.txt

# Setup environment
cp .env.example .env
# Edit .env: tambahkan SONAUTO_API_KEY dan (opsional) LEMONSLICE_API_KEY

Contoh: Transition Generator

Code
# Transisi dari Smash Mouth ke Rick Astley
python transition_generator.py ec1LhrCmzwI dQw4w9WgXcQ \
  --trim-to-start 13 \
  --trim-from-end 0.5 \
  --silence 20 \
  --output my_transition.ogg

EndpointMethodDeskripsi
/v1/generations/v2POSTGenerate lagu dengan model v2
/v1/generations/v3POSTGenerate lagu dengan model v3 (beta)
/v1/generations/v2/extendPOSTExtend lagu yang sudah ada
/v1/generations/v2/inpaintPOSTInpaint/replace section lagu
/v1/generations/{task_id}GET📜 Ambil hasil generasi lengkap
/v1/generations/status/{task_id}GET⚡ Cek status task (lightweight)
/v1/credits/balanceGETCek sisa kredit akun
https://api-stream.sonauto.ai/stream/{task_id}GET🌊 Streaming audio real-time (v3)

📞 Dukungan & Komunitas

ChannelLink
🌐 Websitesonauto.ai
💬 DiscordJoin Community
🐦 Twitter/X@sonauto_ai
📧 Enterprise/Custom PlanHubungi tim Sonauto via website
🐛 Bug ReportsDiscord atau GitHub Issues

📝 Changelog & Notes

⚠️ Beta Notice
Karena API masih dalam beta, parameter dan behavior dapat berubah tanpa notice. Selalu periksa dokumentasi resmi untuk update terbaru.

Known Limitations

  • Inpaint hanya mendukung 1 section per request
  • Alignment hanya tersedia untuk lagu non-instrumental dengan lirik
  • Streaming hanya tersedia untuk model v3
  • song_paths URL expire setelah 7 hari (168 jam)

Future Features (Rumored)

  • Batch generation endpoints
  • Advanced lyrics alignment with phoneme-level timing
  • Custom model fine-tuning API
  • Webhook management dashboard

📄 License & Attribution

Code
Attribution Required:
Implementasi user-facing API Sonauto wajib mencantumkan atribusi ke Sonauto.

Contoh atribusi:
"Music generated with Sonauto AI - sonauto.ai"

📌 Quick Reference Card

Code
API Base: https://api.sonauto.ai/v1
Stream Base: https://api-stream.sonauto.ai
Auth: Authorization: Bearer YOUR_API_KEY
Credits: 1 lagu v2 = 100 credits | 2 lagu = 150 credits | v3 = 100 credits
Expiry: Download songs within 7 days!
Code
> 🔄 *Dokumentasi ini berdasarkan konten resmi sonauto.ai/developers. Selalu cek sumber untuk update terbaru.*