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.
The callback mechanism eliminates the need to poll the API for task status. The system will proactively push task completion results to your server.
Webhook Security: To ensure the authenticity and integrity of callback requests, we strongly recommend implementing webhook signature verification. See our Webhook Verification Guide for detailed implementation steps.
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']);?>