Skip to content

Music Generation Callbacks ​

System will call this callback when audio generation is complete.

When you submit a music 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.

Callback Mechanism Overview ​

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.

Callback Timing ​

The system will send callback notifications in the following situations:

  • Music generation task completed successfully
  • Music generation task failed
  • Errors occurred during task processing

Callbacks may be sent at the text, first and complete stages; only complete is guaranteed. Treat complete as the final result.

Callback Method ​

  • HTTP Method: POST
  • Content Type: application/json
  • Timeout Setting: 15 seconds

Callback Request Format ​

When the task is completed, the system will send a POST request to your callBackUrl in the following format:

Complete Success Callback ​

json
{
  "code": 200,
  "msg": "All generated successfully.",
  "data": {
    "callbackType": "complete",
    "task_id": "2fac****9f72",
    "data": [
      {
        "id": "e231****-****-****-****-****8cadc7dc",
        "audio_url": "https://example.cn/****.mp3",
        "stream_audio_url": "https://example.cn/****",
        "image_url": "https://example.cn/****.jpeg",
        "prompt": "[Verse] Night city lights shining bright",
        "model_name": "chirp-v4-5",
        "title": "Iron Man",
        "createTime": 1786343609818,
        "duration": 198.44,
        "tags": "electrifying, rock",
        "source_audio_url":"https://example.cn/****.mp3",
        "source_image_url":"https://example.cn/****.jpeg",
        "source_stream_audio_url":"https://example.cn/****"
      },
      {
        "id": "e231****-****-****-****-****8cadc7dc",
        "audio_url": "https://example.cn/****.mp3",
        "stream_audio_url": "https://example.cn/****",
        "image_url": "https://example.cn/****.jpeg",
        "prompt": "[Verse] Night city lights shining bright",
        "model_name": "chirp-v4-5",
        "title": "Iron Man",
        "createTime": 1786343609818,
        "duration": 198.44,
        "tags": "electrifying, rock",
        "source_audio_url":"https://example.cn/****.mp3",
        "source_image_url":"https://example.cn/****.jpeg",
        "source_stream_audio_url":"https://example.cn/****"
      }
    ]
  }
}

First Track Success Callback ​

json
{
  "code": 200,
  "msg": "First audio generated successfully.",
  "data": {
    "callbackType": "first",
    "task_id": "2fac****9f72",
    "data": [
      {
        "id": "e231****-****-****-****-****8cadc7dc",
        "audio_url": "https://example.cn/****.mp3",
        "stream_audio_url": "https://example.cn/****",
        "image_url": "https://example.cn/****.jpeg",
        "prompt": "[Verse] Night city lights shining bright",
        "model_name": "chirp-v4-5",
        "title": "Iron Man",
        "createTime": 1786343609818,
        "duration": 198.44,
        "tags": "electrifying, rock",
        "source_audio_url":"https://example.cn/****.mp3",
        "source_image_url":"https://example.cn/****.jpeg",
        "source_stream_audio_url":"https://example.cn/****"
      }
    ]
  }
}

Text Generation Callback ​

json
{
  "code": 200,
  "msg": "Text generated successfully.",
  "data": {
    "callbackType": "text",
    "task_id": "2fac****9f72",
    "data": [
      {
        "id": "e231****-****-****-****-****8cadc7dc",
        "audio_url": "",
        "stream_audio_url": "https://example.cn/****",
        "image_url": "https://example.cn/****.jpeg",
        "prompt": "[Verse] Night city lights shining bright",
        "model_name": "chirp-v4-5",
        "title": "Iron Man",
        "createTime": 1786343609818,
        "tags": "electrifying, rock",
        "source_image_url":"https://example.cn/****.jpeg",
        "source_stream_audio_url":"https://example.cn/****"
      },
      {
        "id": "e231****-****-****-****-****8cadc7dc",
        "audio_url": "",
        "stream_audio_url": "https://example.cn/****",
        "image_url": "https://example.cn/****.jpeg",
        "prompt": "[Verse] Night city lights shining bright",
        "model_name": "chirp-v4-5",
        "title": "Iron Man",
        "createTime": 1786343609818,
        "tags": "electrifying, rock",
        "source_image_url":"https://example.cn/****.jpeg",
        "source_stream_audio_url":"https://example.cn/****"
      }
    ]
  }
}

Failure Callback ​

json
{
  "code": 400,
  "msg": "Audio generation failed",
  "data": {
    "callbackType": "complete",
    "task_id": "2fac****9f72"
  }
}

On failure, code is not 200, callbackType is "complete" and data.data is absent. Check code before reading data.data.

Status Code Description ​

code (integer, required) ​

Callback status code indicating task processing result:

200 means success; any other value means failure (for example, 501).

msg (string, required) ​

Status message providing a more detailed description of the processing result.

data.callbackType (string, required) ​

Callback type indicating the stage of generation:

  • text: Text generation complete
  • first: First track complete
  • complete: All tracks complete

data.task_id (string, required) ​

Task ID, consistent with the task_id returned when the task was submitted.

data.data (array) ​

Array of generated audio data.

data.data[].id (string) ​

Unique identifier of the audio.

data.data[].audio_url (string) ​

Audio file URL.

data.data[].stream_audio_url (string) ​

Streaming audio URL.

data.data[].image_url (string) ​

Cover image URL.

data.data[].prompt (string) ​

Generation prompt or lyrics.

data.data[].model_name (string) ​

Name of the model used.

data.data[].title (string) ​

Music title.

data.data[].tags (string) ​

Music tags.

data.data[].createTime (integer) ​

Creation time.

data.data[].duration (number) ​

Audio duration in seconds.

data.data[].source_audio_url (string) ​

Source audio file URL.

data.data[].source_image_url (string) ​

Source cover image URL.

data.data[].source_stream_audio_url (string) ​

Source streaming audio URL.

Callback Reception Examples ​

Here are example codes for receiving callbacks in popular programming languages:

Node.js ​

javascript
const express = require('express');
const app = express();

app.use(express.json());

app.post('/suno-callback', (req, res) => {
  const { code, msg, data } = req.body;
  
  console.log('Received callback:', {
    taskId: data.task_id,
    status: code,
    message: msg,
    callbackType: data.callbackType
  });
  
  if (code === 200) {
    // Task completed successfully
    if (data.callbackType === 'complete') {
      console.log('Music generation completed:', data.data);
      
      // Process generated music data
      data.data.forEach(audio => {
        console.log(`Audio ID: ${audio.id}`);
        console.log(`Audio URL: ${audio.audio_url}`);
        console.log(`Title: ${audio.title}`);
        console.log(`Duration: ${audio.duration} seconds`);
      });
      
    } else if (data.callbackType === 'first') {
      console.log('First track completed');
      
    } else if (data.callbackType === 'text') {
      console.log('Text generation completed');
    }
    
  } else {
    // Task failed
    console.log('Task 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');
});

Python ​

python
from flask import Flask, request, jsonify
import json

app = Flask(__name__)

@app.route('/suno-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')
    callback_type = callback_data.get('callbackType')
    
    print(f"Received callback: {task_id}, status: {code}, type: {callback_type}, message: {msg}")
    
    if code == 200:
        # Task completed successfully
        if callback_type == 'complete':
            audio_list = callback_data.get('data', [])
            print(f"Music generation completed, generated {len(audio_list)} tracks")
            
            for audio in audio_list:
                print(f"Audio ID: {audio['id']}")
                print(f"Audio URL: {audio['audio_url']}")
                print(f"Title: {audio['title']}")
                print(f"Duration: {audio['duration']} seconds")
                
        elif callback_type == 'first':
            print("First track completed")
            
        elif callback_type == 'text':
            print("Text generation completed")
            
    else:
        # Task failed
        print(f"Task failed: {msg}")
        
        # Handle failure cases...
    
    # Return 200 status code to confirm callback received
    return jsonify({'status': 'received'}), 200

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=3000)

PHP ​

php
<?php
header('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'] ?? '';
$callbackType = $callbackData['callbackType'] ?? '';

error_log("Received callback: $taskId, status: $code, type: $callbackType, message: $msg");

if ($code === 200) {
    // Task completed successfully
    if ($callbackType === 'complete') {
        $audioList = $callbackData['data'] ?? [];
        error_log("Music generation completed, generated " . count($audioList) . " tracks");
        
        foreach ($audioList as $audio) {
            error_log("Audio ID: " . $audio['id']);
            error_log("Audio URL: " . $audio['audio_url']);
            error_log("Title: " . $audio['title']);
            error_log("Duration: " . $audio['duration'] . " seconds");
        }
        
    } elseif ($callbackType === 'first') {
        error_log("First track completed");
        
    } elseif ($callbackType === 'text') {
        error_log("Text generation completed");
    }
    
} else {
    // Task failed
    error_log("Task failed: $msg");
    
    // Handle failure cases...
}

// Return 200 status code to confirm callback received
http_response_code(200);
echo json_encode(['status' => 'received']);
?>

Best Practices ​

Callback URL Configuration Recommendations

  1. Use HTTPS: Ensure your callback URL uses HTTPS protocol for secure data transmission
  2. Verify Source: Verify the legitimacy of the request source in callback processing
  3. Idempotent Processing: The same task_id may receive multiple callbacks, ensure processing logic is idempotent
  4. Quick Response: Callback processing should return a 200 status code as quickly as possible to avoid timeout
  5. Asynchronous Processing: Complex business logic should be processed asynchronously to avoid blocking callback response
  6. Stage Tracking: Differentiate between different generation stages based on callbackType and arrange business logic appropriately

Important Reminders

  • Callback URL must be a publicly accessible address
  • Server must respond within 15 seconds, otherwise it will be considered a timeout
  • If 3 consecutive retries fail, the system will stop sending callbacks
  • Please ensure the stability of callback processing logic to avoid callback failures due to exceptions
  • Pay attention to handling different callbackType callbacks, especially the complete type for final results

Troubleshooting ​

If you do not receive callback notifications, please check the following:

Network Connection Issues
  • Confirm that the callback URL is accessible from the public network
  • Check firewall settings to ensure inbound requests are not blocked
  • Verify that domain name resolution is correct
Server Response Issues
  • Ensure the server returns HTTP 200 status code within 15 seconds
  • Check server logs for error messages
  • Verify that the interface path and HTTP method are correct
Content Format Issues
  • Confirm that the received POST request body is in JSON format
  • Check that Content-Type is application/json
  • Verify that JSON parsing is correct
Callback Type Processing
  • Confirm proper handling of different callbackTypes
  • Check if processing of complete type final results is missed
  • Verify that audio data parsing is correct

ModelFold — one API for all the best AI models.