┌─────────────────────────────────────────────────────────────────┐
│ Bước 1: Yêu cầu quyền upload │
│ POST /suno/uploads/audio │
│ ↓ Trả về: upload_id, upload_url │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Bước 2: Upload file lên S3 (client kết nối trực tiếp, không qua API) │
│ PUT {upload_url} │
│ ↓ Upload file audio │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Bước 3: Báo cáo hoàn tất upload │
│ POST /suno/uploads/audio/{id}/upload-finish │
│ ↓ Thông báo server file đã được upload │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Bước 4: Polling kiểm tra trạng thái upload (cho đến khi status là completed) │
│ GET /suno/uploads/audio/{id} │
│ ↓ Kiểm tra mỗi 2-3 giây một lần │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Bước 5: Khởi tạo audio clip │
│ POST /suno/uploads/audio/{id}/initialize-clip │
│ ↓ Trả về: clip_id │
└─────────────────────────────────────────────────────────────────┘
↓
┌─────────────────────────────────────────────────────────────────┐
│ Bước 6: Sử dụng clip_id để tạo tác vụ tiếp nối │
│ POST /suno/submit/music │
│ ↓ Trả về: task_id (bắt đầu tính phí) │
└─────────────────────────────────────────────────────────────────┘