When MP4 generation is complete, the system will send a POST request to the provided callback URL to notify the result
When you submit a music video generation task to the Suno API, you can use the callBackUrl parameter to set a callback URL. The system will automatically push the results to your specified address when the task is completed.
Here are example codes for receiving callbacks in popular programming languages:
Node.js
Python
PHP
Copy
const express = require('express');const app = express();app.use(express.json());app.post('/suno-video-callback', (req, res) => { const { code, msg, data } = req.body; console.log('Received music video callback:', { taskId: data.task_id, status: code, message: msg }); if (code === 200) { // Task completed successfully console.log('Music video generation completed'); console.log(`Video URL: ${data.video_url}`); console.log('Note: Video link is valid for 14 days'); // Process generated video // Can download video, save locally, etc. } else { // Task failed console.log('Music video generation failed:', msg); // Handle failure cases... } // Return 200 status code to confirm callback received res.status(200).json({ status: 'received' });});app.listen(3000, () => { console.log('Callback server running on port 3000');});
Copy
from flask import Flask, request, jsonifyimport requestsfrom datetime import datetime, timedeltaapp = Flask(__name__)@app.route('/suno-video-callback', methods=['POST'])def handle_callback(): data = request.json code = data.get('code') msg = data.get('msg') callback_data = data.get('data', {}) task_id = callback_data.get('task_id') video_url = callback_data.get('video_url') print(f"Received music video callback: {task_id}, status: {code}, message: {msg}") if code == 200: # Task completed successfully print("Music video generation completed") print(f"Video URL: {video_url}") print("Note: Video link is valid for 14 days") # Process generated video if video_url: try: # Download video file example response = requests.get(video_url) if response.status_code == 200: filename = f"music_video_{task_id}.mp4" with open(filename, "wb") as f: f.write(response.content) print(f"Music video saved as {filename}") # Record expiration time expire_date = datetime.now() + timedelta(days=14) print(f"Video link will expire on {expire_date.strftime('%Y-%m-%d %H:%M:%S')}") except Exception as e: print(f"Video download failed: {e}") else: # Task failed print(f"Music video generation failed: {msg}") # Handle failure cases... # Return 200 status code to confirm callback received return jsonify({'status': 'received'}), 200if __name__ == '__main__': app.run(host='0.0.0.0', port=3000)
Copy
<?phpheader('Content-Type: application/json');// Get POST data$input = file_get_contents('php://input');$data = json_decode($input, true);$code = $data['code'] ?? null;$msg = $data['msg'] ?? '';$callbackData = $data['data'] ?? [];$taskId = $callbackData['task_id'] ?? '';$videoUrl = $callbackData['video_url'] ?? '';error_log("Received music video callback: $taskId, status: $code, message: $msg");if ($code === 200) { // Task completed successfully error_log("Music video generation completed"); error_log("Video URL: $videoUrl"); error_log("Note: Video link is valid for 14 days"); // Process generated video if (!empty($videoUrl)) { try { // Download video file example $videoContent = file_get_contents($videoUrl); if ($videoContent !== false) { $filename = "music_video_{$taskId}.mp4"; file_put_contents($filename, $videoContent); error_log("Music video saved as $filename"); // Record expiration time $expireDate = date('Y-m-d H:i:s', strtotime('+14 days')); error_log("Video link will expire on $expireDate"); } } catch (Exception $e) { error_log("Video download failed: " . $e->getMessage()); } }} else { // Task failed error_log("Music video generation failed: $msg"); // Handle failure cases...}// Return 200 status code to confirm callback receivedhttp_response_code(200);echo json_encode(['status' => 'received']);?>