Testei o Suno SDK pela Crazyrouter: o payload que funcionou e o detalhe que quase passa despercebido
Eu estava testando a documentação do Suno SDK da Crazyrouter e encontrei um ponto importante para quem quer colocar geração de música em produção: o envio da tarefa funcionou, o polling funcionou, mas o arquivo final só deve ser considerado pronto depois de validar a URL real do áudio.
Este texto resume o teste prático do endpoint suno/generate.
Ambiente do teste
Data do teste: 2026-07-06 +08:00
Base URL: https://api.crazyrouter.com
Endpoint: POST /v1/video/generations
Modelo: suno/generate
Versão: V5_5
Task ID: task_ac90b23619334516
O payload que falhou
O primeiro teste seguiu a ideia de mandar os dados principalmente dentro de input.
O retorno foi:
{"code":"invalid_request","message":"prompt is required","data":null}
Ou seja: no ambiente testado, o campo prompt no nível raiz era obrigatório.
O payload que funcionou
O formato que passou foi usar prompt no topo e repetir os detalhes dentro de metadata.
{
"model": "suno/generate",
"prompt": "[Verse]\n清晨的键盘亮起光\n请求穿过云端的墙\n[Chorus]\n用一次实测把链路唱响\n从任务到结果都清清爽爽",
"metadata": {
"model_version": "V5_5",
"customMode": true,
"instrumental": false,
"prompt": "[Verse]\n清晨的键盘亮起光\n请求穿过云端的墙\n[Chorus]\n用一次实测把链路唱响\n从任务到结果都清清爽爽",
"style": "bright synth pop, short, clean vocals, Mandarin pop",
"title": "Crazyrouter Suno SDK Smoke Test 20260706"
}
}
A resposta veio como uma tarefa assíncrona:
{
"id": "task_ac90b23619334516",
"task_id": "task_ac90b23619334516",
"object": "video",
"model": "suno/generate",
"status": "queued",
"progress": 0
}
Esse ponto é importante: queued não significa que a música está pronta. Significa apenas que a tarefa foi aceita.
Polling até finalizar
Depois, o caminho é consultar:
GET /v1/video/generations/{task_id}
No teste, a tarefa terminou assim:
{
"code": "success",
"data": {
"status": "succeeded",
"format": "mp4",
"task_id": "task_ac90b23619334516",
"url": "https://crazyrouter.com/v1/videos/task_ac90b23619334516/content"
}
}
Até aqui, a geração da tarefa foi bem-sucedida. Mas isso ainda não prova que o arquivo de áudio pode ser entregue ao usuário.
O detalhe que precisa entrar no backend
No teste, a URL pública /content não era o caminho mais confiável. O áudio real estava no resultado bruto da tarefa:
data.data.resultJson.data[0].audio_url
Essa URL direta foi validada com sucesso:
HTTP 200
Content-Type: audio/mp3
Tamanho baixado: 412326 bytes
Então, para produção, eu trataria a geração de música assim:
1. Enviar POST /v1/video/generations
2. Guardar o task_id
3. Fazer polling até status terminal
4. Se status = succeeded, localizar a URL real do áudio
5. Validar HTTP 200, Content-Type audio/* e tamanho do arquivo
6. Só depois salvar no storage ou entregar ao usuário
Conclusão
O suno/generate está utilizável, mas a integração não deve parar em status = succeeded.
O mínimo seguro é validar o arquivo final. No meu teste, o campo que realmente importou foi:
resultJson.data[0].audio_url
Se você está implementando isso em um produto, separe claramente estes dois estados:
tarefa gerada com sucesso
arquivo de áudio disponível para download
Essa diferença evita classificar erro de download como erro de geração.