-2

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.

Carregando publicação patrocinada...