【Recomendado】 API de perfil de voz

Atualizado em 2026-09-18 · equipe Suno-API

✅ Recomendada para novas integrações. Segundo as avaliações reais de muitos utilizadores, as músicas geradas por esta cadeia preservam muito bem a voz original: a voz da faixa final fica mais próxima da pessoa da amostra que enviou, por isso é a rota que recomendamos atualmente aos clientes.

Comparação: a API de clonagem de voz e geração com voz anterior continua a funcionar, mas o menu marca-a como "não recomendado" e já não é recomendada para novas integrações.

Nota: este documento só descreve os endpoints que tem de chamar. O tratamento de materiais, o agendamento de tarefas e a validação de conteúdo são feitos automaticamente pelo servidor; o cliente não os implementa.


0. Começar em cinco minutos

Quatro passos bastam para transformar uma amostra vocal em duas músicas finais.

① Criar a voz     POST /api/music/voice-profile/create      → obtém voice_id (status=ready)
② Versionar       POST /api/music/voice-profile/cover       → obtém 2 song_id de imediato
③ Consultar       POST /api/music/query                     → consulta até status=completed
④ Descarregar     GET  /api/music/download?song_id=…&kind=mp3

Exemplo mínimo (curl):

API_KEY="sk-a-sua-chave"
BASE="https://www.suno-api.io"

# ① Criar a voz (envie uma amostra vocal; recomenda-se 10 s ou mais e menos de 10 MB)
curl -sS -X POST "$BASE/api/music/voice-profile/create" \
  -H "Authorization: Bearer $API_KEY" \
  -F "file=@./my-voice.mp3" \
  -F "title=A minha voz" \
  -F "source_kind=upload"
# → {"success":true,"message":"","data":{"voice_id":"vp_2026…","status":"ready", …}}

# ② Versionar uma música com essa voz (song_clip_id = o clip id da música a versionar)
curl -sS -X POST "$BASE/api/music/voice-profile/cover" \
  -H "Authorization: Bearer $API_KEY" \
  -H "X-Create-Ui-Client-Request-Id: cover-$(date +%s)" \
  -H "Content-Type: application/json" \
  -d '{
        "model": "suno-v6",
        "voice_id": "vp_2026…",
        "song_clip_id": "5b773e9a-…",
        "lyrics": "[Verse 1]\ntexto da letra…",
        "style_requirements": "folk lento, guitarra acústica",
        "audio_weight": 0.85,
        "max_mode": false
      }'
# → {"code":200,"message":"success","data":{"resolved_scene":"cover","clips":[{…},{…}]}}

# ③ Consultar (envie vários ids de uma vez, separados por vírgulas)
curl -sS -X POST "$BASE/api/music/query" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"suno-v6","song_ids":"id1,id2"}'

# ④ Descarregar o mp3 quando terminar (só com status=completed obtém ficheiro)
curl -sS -L "$BASE/api/music/download?song_id=id1&kind=mp3" \
  -H "Authorization: Bearer $API_KEY" -o song1.mp3

1. Convenções comuns

1.1 Domínio e ambiente

Ambiente Base URL Utilização
Produção https://www.suno-api.io Tráfego real de clientes

Todos os caminhos abaixo são relativos ao Base URL; por exemplo, o endereço completo de POST /api/music/voice-profile/create é https://www.suno-api.io/api/music/voice-profile/create.

1.2 Autenticação

Todos os endpoints usam o mesmo cabeçalho de pedido, cujo valor é a chave API que criou na consola:

Authorization: Bearer sk-xxxxxxxx

1.3 Formatos do corpo do pedido

1.4 Dois invólucros de resposta (o cliente só precisa de conhecer estes dois)

Os endpoints de "gestão de vozes" (create / create-from-clip / list / detail / delete) usam o invólucro de negócio:

{ "success": true, "message": "", "data": { } }
{ "success": false, "message": "voice_id is required" }

O "versionamento com voz" passa pelo canal de geração e usa o invólucro de geração: o sucesso é code/message/data e a falha um objeto error:

{ "code": 200, "message": "success", "data": { } }
{ "error": { "message": "voice not found: vp_xxx", "type": "bad_response_status_code", "param": "", "code": "bad_response_status_code" } }

Como decidir: veja primeiro o código de estado HTTP, depois success === false e por fim code !== 200 ou a presença de error. Uma falha de negócio não garante um HTTP diferente de 200 (os endpoints de gestão de vozes continuam a devolver HTTP 200 em erro), por isso não pode guiar-se apenas pelo código de estado.

1.5 Idempotência

Criar uma voz (incluindo "criar a partir de áudio existente") é realmente idempotente: na mesma chave, reenviar o mesmo client_request_id cria apenas uma voz e a segunda tentativa devolve diretamente o primeiro resultado (success=true, o mesmo voice_id). O uso previsto é o cliente gerar um id próprio (um UUID, por exemplo) e reutilizar o mesmo valor ao repetir após um tempo de espera esgotado.

O envio de um versionamento não deduplica ao nível do pedido (é uma geração faturável), por isso tenha em atenção duas coisas:

  1. O identificador de envio vai no cabeçalho X-Create-Ui-Client-Request-Id: <o seu id de envio>. É escrito no registo de tarefas do servidor para facilitar a investigação posterior; não evita uma cobrança duplicada.
  2. Tempo de espera esgotado ≠ falha: o pedido pode já ter sido aceite e estar a gerar. Antes de repetir, consulte GET /api/music/songs?p=1&page_size=20 (os parâmetros de paginação são p / page_size; a grafia compatível ps também serve) para ver se já apareceu uma música nova com generation_type=voice_profile_cover, e só reenvie o mesmo pedido se não tiver aparecido.

Os corpos de create e create-from-clip também aceitam um campo client_request_id (ver §3 e §4).

1.6 Resumo da cobrança

Ação Endpoint Preço Observações
Criar uma voz (normal) POST /api/music/voice-profile/create Grátis Enviar uma amostra não consome créditos Suno
Criar uma voz (a partir de áudio existente) POST /api/music/voice-profile/create-from-clip Grátis O servidor apenas registra uma referência ao material; nada é reenviado
Clonagem reforçada Igual, enhanced=true Ao "preço de envio reforçado" (10 ¥ por chamada por predefinição) Assíncrona; devolução automática em caso de falha
Versionamento com voz POST /api/music/voice-profile/cover 1,2 ¥ por chamada; 2,4 ¥ por chamada com max_mode=true Devolve 2 músicas por chamada
Consultar / listar / detalhe / eliminar — Grátis
Descarregar (obter o link direto) O audio_url da resposta Grátis Reproduz entrega o endereço
Descarregar (converter para wav / letras, etc.) POST /api/music/free2 0,2 ¥ por música bem-sucedida Ver §8

Os preços podem ser lidos a qualquer momento num endpoint público, por isso não os fixe no código (ver §9):

curl -sS https://www.suno-api.io/api/pricing/catalog | jq '.data.catalog.meta'
# {
#   "generation_price": "0.6",
#   "voice_generation_price": "1.2",      ← preço base do versionamento com voz
#   "max_mode_factor": "2",
#   "enhanced_upload_price": "10",        ← preço da clonagem reforçada
#   "voice_auto_verify_price": "5",
#   "voice_long_term_clone_price": "5"
# }

O versionamento usa cobrança prévia + devolução em caso de falha:

1.7 Dicionário de estados

O status da voz:

Valor Significado Serve para versionar
ready Pronta ✅
processing Só aparece numa clonagem reforçada (enhanced=true); em processamento ❌ (espere por ready)
failed A criação falhou; veja error_message; a clonagem reforçada já foi devolvida ❌

O status da música (o valor devolvido pelos endpoints de consulta):

Valor Significado Descarregável
submitted / queued / processing A gerar (pode já existir um fluxo de pré-escuta) ❌
completed Terminada ✅
failed Falhou; a cobrança foi devolvida ❌

2. Resumo dos endpoints

# Método Caminho Função Cobrança
1 POST /api/music/voice-profile/create Criar uma voz (envio / URL / base64) Grátis (exceto enhanced=true)
2 POST /api/music/voice-profile/create-from-clip Criar uma voz a partir de áudio próprio Grátis
3 GET /api/music/voice-profile/list Lista de vozes Grátis
4 GET /api/music/voice-profile/{voice_id} Detalhe da voz (inclui o progresso da clonagem reforçada) Grátis
5 POST /api/music/voice-profile/delete Eliminar uma voz Grátis
6 POST /api/music/voice-profile/cover Versionar com a voz / cantar uma música nova 1,2 ¥ (MAX 2,4)
7 POST /api/music/query Consulta em lote do estado das músicas Grátis
8 GET /api/music/songs/{song_id} Detalhe de uma música Grátis
9 GET /api/music/download Descarregar o ficheiro final Grátis (mp3/link de reprodução)
10 POST /api/music/free2 Converter para wav / obter letras, etc. 0,2 ¥ por música bem-sucedida
11 POST /api/music/free2/cached Obter um endereço de descarga já arquivado Grátis
12 GET /api/music/songs A minha lista de trabalhos, paginada Grátis

3. Criar uma voz

POST /api/music/voice-profile/create

Registe um trecho de áudio vocal como "voz" e obtenha um voice_id. Para a plataforma uma voz é simplesmente "um áudio + o seu clip no catálogo", por isso depois de criada com sucesso esse áudio de origem é mantido de forma permanente (para os versionamentos seguintes).

3.1 Três formas de entrada (escolha uma)

Forma A: envio de ficheiro multipart (recomendada)

Content-Type: multipart/form-data

file=<binário de áudio>      # obrigatório
title=<nome da voz>          # opcional; se vazio usa o nome do ficheiro sem extensão
file_name=<nome original do ficheiro>
source_file_name=<nome original do ficheiro>
source_kind=upload|record    # opcional, marca de origem (envio / gravação); predefinição upload
enhanced=false|true          # opcional, true = clonagem reforçada (ver §3.5)
client_request_id=<chave de idempotência>   # opcional
voice_id=<ID próprio>        # opcional, raramente usado
curl -sS -X POST "https://www.suno-api.io/api/music/voice-profile/create" \
  -H "Authorization: Bearer $API_KEY" \
  -F "file=@./my-voice.mp3;type=audio/mpeg" \
  -F "file_name=my-voice.mp3" \
  -F "source_file_name=my-voice.mp3" \
  -F "title=A minha voz" \
  -F "source_kind=upload"

Forma B: JSON + um URL de áudio público

curl -sS -X POST "https://www.suno-api.io/api/music/voice-profile/create" \
  -H "Authorization: Bearer $API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
        "file_url": "https://your-cdn.example.com/voice/my-voice.mp3",
        "file_name": "my-voice.mp3",
        "title": "A minha voz"
      }'

Forma C: JSON + base64

{
  "file_base64": "data:audio/mpeg;base64,//uQxAAA…",
  "file_name": "my-voice.mp3",
  "title": "A minha voz"
}

3.2 Requisitos do áudio

Item Requisito Observações
Tamanho ≤ 10 MB Acima do limite a gateway trunca o corpo, o que se manifesta como "rejeitado pela Suno"; comprima ou corte primeiro
Duração Pelo menos 6 s; recomenda-se 10–60 s Abaixo de 6 s a plataforma rejeita: Uploaded audio is too short (currently 2.4 seconds). Minimum duration is 6 seconds.
Formato mp3 / wav / m4a / aac / flac / ogg Decidido pela extensão do ficheiro
Conteúdo Voz limpa; evite versões finais ou músicas originais com acompanhamento Áudio muito parecido com uma gravação existente do catálogo é rejeitado: This audio matches an existing recording in our catalog. (medido)

3.3 Resposta

{
  "success": true,
  "message": "",
  "data": {
    "voice_id": "vp_20260926080618509168500DXXrxe",
    "clip_id": "91cc5935-389f-4193-b56b-cc796c15562d",
    "song_id": "91cc5935-389f-4193-b56b-cc796c15562d",
    "account_id": "acc_1790085275308",
    "title": "A minha voz",
    "source_file_name": "my-voice.mp3",
    "audio_url": "https://suno-api-p-1437223057.cos.ap-guangzhou.myqcloud.com/create-ui/voice-source/2026/09/26/xxx.mp3",
    "image_url": "https://cdn2.suno.ai/image_91cc5935-389f-4193-b56b-cc796c15562d.jpeg",
    "duration_s": 29.18,
    "enhanced": false,
    "source_kind": "upload",
    "status": "ready",
    "client_request_id": "",
    "created_at": 1790409978,
    "updated_at": 1790409998
  }
}

Referência de campos (create / list / detail partilham o mesmo conjunto de campos):

Campo Tipo Observações
voice_id string O ID de voz; os versionamentos usam-no depois
clip_id / song_id string O clip id desse áudio de voz do lado da Suno (os dois são iguais); para diagnóstico
account_id string A conta que o suporta (para diagnóstico; o cliente não precisa de se preocupar)
title string Nome da voz
source_file_name string Nome original do ficheiro
audio_url string Link direto de longo prazo para o áudio de origem, utilizável para pré-escuta; mantido de forma permanente
image_url string Capa da voz (a que a Suno gera para o áudio vocal); quando não há capa a chave não aparece de todo
duration_s number Duração da amostra de voz em segundos
enhanced bool Se foi criada como clonagem reforçada
source_kind string upload / record / clip (obtida de áudio existente)
status string ready / processing / failed
error_message string Motivo da falha; só aparece com failed
task_id number Número de tarefa subjacente da clonagem reforçada; só tem valor com enhanced=true
pre_consumed_quota number Quota pré-cobrada (só com clonagem reforçada)
created_at / updated_at number Segundos Unix

created_at / updated_at são marcas temporais em segundos (10 dígitos), não milissegundos.

3.4 Erros frequentes

HTTP message Causa e tratamento
200 one of file_path, file_base64, or file_url is required Não foi incluído conteúdo de áudio
200 Uploaded audio is too short (currently 2.4 seconds). Minimum duration is 6 seconds. A amostra é demasiado curta; use ≥6 s (≥10 s recomendado)
200 This audio matches an existing recording in our catalog. A amostra é muito parecido com uma gravação existente do catálogo; use uma voz seca diferente e limpa
200 upload succeeded without clip or account identity A resposta da plataforma foi anómala; repita
200 audio file exceeds 30 MB limit Supera o limite do servidor (do lado do cliente fique nos 10 MB)
401 invalid token Chave API errada

3.5 Clonagem reforçada (enhanced=true)

Para casos em que "a própria amostra de voz traz letras com direitos / é preciso um envio reforçado". Cobrada ao preço de envio reforçado (10 ¥ por chamada por predefinição, com devolução automática em caso de falha):

curl -sS -X POST "https://www.suno-api.io/api/music/voice-profile/create" \
  -H "Authorization: Bearer $API_KEY" \
  -F "file=@./my-voice.mp3" -F "title=A minha voz" -F "enhanced=true"

4. Criar uma voz a partir de áudio existente

Se prefere não voltar a enviar: copie diretamente um áudio que já tenha enviado ou já tenha gerado como voz. Grátis e idempotente.

POST /api/music/voice-profile/create-from-clip
Content-Type: application/json

{
  "source_song_id": "97ee62fe-56cd-473f-a2f5-c66ac0766a2e",
  "title": "Xu Qing Qiang",
  "client_request_id": "vp-clip-1789…"
}

A resposta são todos os campos de §3.3 mais dois campos só de leitura:

Campo Observações
reused true = este áudio já era a sua voz e é reutilizado
source_type De onde vem o áudio: generate / custom_generate / voice_generate / upload_source / enhanced_upload
{
  "success": true,
  "data": {
    "voice_id": "vp_20260926081712557959800Z5gvlt",
    "clip_id": "97ee62fe-56cd-473f-a2f5-c66ac0766a2e",
    "title": "Xu Qing Qiang",
    "status": "ready",
    "enhanced": true,
    "reused": true,
    "source_type": "enhanced_upload"
  }
}

Erros (o message tal como é devolvido; recomenda-se mostrá-lo ou localizá-lo):

message Significado
source audio not found O clip não existe ou não é seu
source audio is invalid Esse áudio ainda está a ser gerado / é um produto intermédio e ainda não serve
source_song_id is required Não foi enviado source_song_id

5. Lista / detalhe / eliminação de vozes

5.1 Lista

GET /api/music/voice-profile/list
GET /api/music/voice-profile/list?include_deleted=true
{
  "success": true,
  "message": "",
  "data": {
    "items": [ { "voice_id": "vp_…", "title": "A minha voz", "status": "ready", "audio_url": "…", "image_url": "…" } ],
    "total": 1
  }
}

Os campos são exatamente os de §3.3. Por predefinição não são devolvidas as vozes eliminadas.

5.2 Detalhe

GET /api/music/voice-profile/{voice_id}

Devolve um único objeto de voz (data é o próprio objeto, não um array). Enquanto uma clonagem reforçada está em curso, acrescenta ainda:

Campo Observações
progress_percent Inteiro de 0 a 100
progress_stage Identificador da fase, por exemplo media_preparing
progress_message Texto de progresso para mostrar ao utilizador

5.3 Eliminar

POST /api/music/voice-profile/delete
Content-Type: application/json

{ "voice_id": "vp_2026…" }
{ "success": true, "message": "", "data": { "voice_id": "vp_2026…", "status": "deleted" } }

6. Versionar com uma voz (o endpoint central)

POST /api/music/voice-profile/cover
Content-Type: application/json

Um envio gera 2 músicas (igual à geração normal).

6.1 Dois cenários

Cenário Gatilho Observações
A. Versionar uma música escolhida Foi enviado song_clip_id Canta essa música com a sua voz (melodia / ritmo / secções seguem o original; a voz passa a ser a sua)
B. Cantar uma música nova com a voz Não foi enviado song_clip_id Apenas a voz + letra (opcional) + requisitos de estilo; o modelo compõe uma melodia nova nesse estilo e canta-a

O resolved_scene da resposta devolve cover ou sing, para poder confirmar que rota foi seguida.

6.2 Campos do pedido

Campo Tipo Obrigatório Predefinição Observações
model string Sim — Nome de modelo de cara ao cliente, ver §6.5. Se não for enviado devolve model is required (HTTP 500)
voice_id string Um dos dois — ID de voz (vp_…); tem de estar status=ready
voice_clip_id string Um dos dois — Também serve o clip id da voz; se enviar ambos ganha voice_id
song_clip_id string Não vazio Clip id (song_id) da música a versionar. Não enviar = cenário B
lyrics string Não vazio Letra completa, enviada carácter a carácter sem reescrever nem truncar; ≤ 3000 caracteres
cover_requirements string Não vazio Instruções de versionamento em linguagem natural, por exemplo "articular com mais clareza". São concatenadas a um prompt fixo
style_requirements string Não vazio Requisitos de estilo, por exemplo "folk lento, guitarra acústica"
title string Não vazio O título destas duas músicas no espaço de trabalho (afeta o song_title devolvido pelas consultas seguintes)
negative_tags string Não vazio Estilos excluídos, por exemplo eletrónico, rap; ≤ 1000 caracteres
vocal_gender string Não vazio m / f (também aceita male / female); vazio = qualquer
duration number Não vazio Duração pretendida em segundos, um inteiro de 1 a 480; vazio = decide a plataforma. O mínimo prático da plataforma é cerca de 30 s: com valores menores os testes continuavam a dar músicas de cerca de 30 segundos
audio_weight number Não 0,85 Audio Influence, um decimal de 0 a 1. Quanto mais alto, mais perto da amostra de voz
style_weight number Não vazio Influência do estilo, um decimal de 0 a 1
weirdness_constraint number Não vazio Criatividade, um decimal de 0 a 1 (se a interface usar percentagens, divida por 100)
variety number Não vazio Variedade, um inteiro de 0 a 4 (não uma percentagem), só nos modelos v6
max_mode boolean Não false Max Mode, preço ×2
client_request_id string Não vazio Identificador de envio; é escrito no registo de tarefas do servidor para diagnóstico (não deduplica)

Recomenda-se enviar também o cabeçalho X-Create-Ui-Client-Request-Id: <o mesmo id de envio>: só isso é escrito no registo de tarefas do servidor e serve de chave principal para a investigação posterior (ver §1.5).

Unidades a vigiar: audio_weight / style_weight / weirdness_constraint são decimais de 0 a 1, variety é um inteiro de 0 a 4 e duration vai em segundos. Misturá-los provoca rejeições ou resultados estranhos.

A letra é opcional no cenário B (o modelo desenrasca-se sozinho), mas envie sempre lyrics quando precisar de cantar um conteúdo específico.

6.3 Resposta

{
  "code": 200,
  "message": "success",
  "data": {
    "voice_id": "vp_20260926081712557959800Z5gvlt",
    "voice_clip_id": "97ee62fe-56cd-473f-a2f5-c66ac0766a2e",
    "song_clip_id": "5b773e9a-a035-4134-a4a4-29c9961d3ccb",
    "resolved_scene": "cover",
    "model": "suno-v6",
    "audio_weight": 0.85,
    "clips": [
      {
        "song_id": "0f2a…",
        "status": "processing",
        "song_title": "",
        "model_version": "suno-v6",
        "audio_url": "",
        "play_url": "https://media.suno-api.io/play/0f2a…?expires=…&signature=…",
        "lyrics": "",
        "description": "[Tarefa] Isto é um versionamento. … (a parte estrutural fixa do servidor + os requisitos de versionamento/estilo que preencheu)"
      },
      {
        "song_id": "7c91…",
        "status": "processing",
        "model_version": "suno-v6",
        "audio_url": ""
      }
    ],
    "source_updates": []
  }
}

Pontos-chave:

  1. Identifique as músicas finais com clips[].song_id (este endpoint não devolve um campo id).
  2. Obtém 2 valores de song_id de imediato, enquanto status ainda está em processing (significa apenas que foram aceites) e audio_url está vazio; tem de consultar até completed antes de descarregar. play_url é o fluxo de pré-escuta da plataforma, pode já aparecer no envio e vai expirar.
  3. description é o prompt que o servidor acaba por enviar (a parte estrutural fixa + os cover_requirements / style_requirements que preencheu); é muito útil para investigar resultados.
  4. source_updates é o resultado do tratamento de materiais do servidor e o cliente pode ignorá-lo.
  5. O title que envia é escrito no registo de tarefas do servidor e aparece como song_title nas consultas seguintes; que clips[].song_title venha vazio na resposta do envio é normal.

6.4 Erros

{ "error": { "message": "esta voz não existe ou foi eliminada (voice_id=vp_xxx)…", "type": "new_api_error", "param": "", "code": "invalid_request" } }
HTTP message Causa
500 model is required Falta model no corpo (é um campo obrigatório para a escolha do canal)
400 voice_id is required and must be a ready voice Não foi enviado voice_id, ou foi enviado um valor de marcador de posição / uma voz não pronta
400 esta voz não existe ou foi eliminada (voice_id=vp_xxx)… A voz foi eliminada, não existe ou não está na conta atual. Use outra voz disponível ou crie uma nova
400 esta voz foi eliminada (voice_id=vp_xxx)… Ao passar material diretamente com voice_clip_id, a voz desse material foi eliminada; mesmo tratamento acima
400 voice is not ready yet (status=processing) A voz ainda está a ser criada; espere por ready e repita
400 song_clip_id must be a real completed clip song_clip_id é um marcador de posição / não está terminado
400 song_clip_id must differ from the voice clip O alvo do versionamento não pode ser a própria amostra de voz
400 audio_weight must be a number between 0 and 1 Unidade errada no cursor (foi enviada uma percentagem)
400 duration must be an integer between 1 and 480 seconds A duração não é um inteiro de 1 a 480
400 vocal_gender must be one of m, f, male, female Valor de género inválido
400 variety must be an integer between 0 and 4 / variety is only supported on v6 models Valor de variedade inválido ou modelo não suportado

Saldo insuficiente devolve um erro de cobrança logo no envio e nunca deixa uma tarefa a meio.

6.5 Modelos disponíveis (nomes de cara ao cliente)

Nome de modelo Observações
suno-v6 Predefinição, recomendado
suno-v6-wild Mais solto
suno-v6-mini Leve

Use os nomes de modelo de cara ao cliente (os de cima). chirp-* são nomes internos da plataforma e não devem ser usados diretamente.


7. Consultar o progresso

7.1 Consulta em lote (recomendada)

POST /api/music/query
Content-Type: application/json

{ "model": "suno-v6", "song_ids": "id1,id2" }
[
  {
    "song_id": "0f2a…",
    "song_title": "Dois tigres",
    "status": "completed",
    "audio_url": "https://suno-api-hk-1437223057.cos.ap-hongkong.myqcloud.com/assets/0f2a…-mp3.mp3",
    "cover_url": "https://cdn2.suno.ai/image_0f2a….jpeg",
    "duration": 115.15,
    "model_version": "suno-v6",
    "generation_type": "voice_profile_cover",
    "play_url": "https://media.suno-api.io/play/…?expires=…&signature=…",
    "lyrics": "[Verse 1]…",
    "prompt": "[Verse 1]…",
    "description": "[Tarefa] Isto é um versionamento. … (o prompt final do servidor)",
    "style_tags": "…",
    "created_at": "2026-09-25T18:19:09.918Z",
    "video_url": ""
  }
]
Campo Observações
status Ver §1.7; só completed conta como terminada
audio_url Link direto mp3; só é preenchido a partir de completed
cover_url Endereço da capa
duration Duração real em segundos
generation_type As músicas produzidas por um versionamento com voz são sempre voice_profile_cover
play_url Endereço de pré-escuta assinado (expira)
song_title Título da tarefa (o title que enviou; se não enviou nenhum o servidor põe um por omissão)
lyrics / prompt Letra final / texto original da letra
description O prompt final que o servidor envia (incluindo a parte estrutural fixa)
style_tags A descrição final do estilo
created_at Uma cadeia ISO 8601 (atenção: difere dos segundos Unix do endpoint de detalhe)

Conselho de consulta: a cada 5–10 segundos, com um tempo de espera total de 10–15 minutos (a conta fria mais lenta medida demorou cerca de 4,5 minutos; muito poucas demoram mais). Não julgue a conclusão por o audio_url estar vazio: use o status.

Nota de compatibilidade: este endpoint identifica as músicas por song_id; em algumas respostas antigas apareceu um campo id, por isso row.song_id || row.id é a forma segura de o ler.

7.2 Detalhe de uma música

GET /api/music/songs/{song_id}
{
  "success": true,
  "data": {
    "song_id": "0f2a…",
    "title": "Dois tigres",
    "status": "completed",
    "generation_type": "voice_profile_cover",
    "model": "suno-v6",
    "duration": 115.15,
    "audio_url": "https://…/assets/0f2a…-mp3.mp3",
    "image_url": "https://cdn2.suno.ai/image_0f2a….jpeg",
    "wav_url": "https://www.suno-api.io/api/music/download?song_id=0f2a…&kind=wav",
    "video_url": "https://www.suno-api.io/api/music/download?song_id=0f2a…&kind=video",
    "created_at": 1790411012,
    "completed_at": 1790411500,
    "parameters": {
      "prompt": "[Verse 1]…",
      "style_tags": "…",
      "title": "Dois tigres",
      "model": "suno-v6",
      "generation_type": "voice_profile_cover",
      "source_song_id": "5b773e9a-…"
    },
    "parameter_retention": {
      "core_parameters_available": true,
      "extended_parameters_available": false,
      "sources": ["suno_tasks"],
      "unavailable_fields": ["negative_tags", "vocal_gender", "style_weight", "weirdness_constraint"]
    }
  }
}

7.3 A minha lista de trabalhos

GET /api/music/songs?p=1&page_size=20
GET /api/music/songs?status=completed&q=palavra-chave

Parâmetros de paginação: p (número da página, desde 1) / page_size (itens por página; ps é uma grafia compatível). Opcionais status e q (uma palavra-chave do título). Por predefinição ordena por data de criação descendente.

{
  "success": true,
  "data": {
    "page": 1,
    "page_size": 20,
    "total": 42,
    "items": [
      {
        "song_id": "0f2a…",
        "title": "Dois tigres",
        "status": "completed",
        "generation_type": "voice_profile_cover",
        "model": "suno-v6",
        "duration": 115.15,
        "audio_url": "https://…/assets/0f2a…-mp3.mp3",
        "image_url": "https://cdn2.suno.ai/image_0f2a….jpeg",
        "created_at": 1790411012,
        "completed_at": 1790411500
      }
    ]
  }
}

Use generation_type=voice_profile_cover para distinguir "as músicas produzidas por um versionamento com voz" de outros resultados de geração.


8. Descarregar as músicas finais

8.1 Obter o mp3 diretamente (recomendado, grátis)

Qualquer uma das três serve; escolha uma:

  1. Usar o audio_url do resultado da consulta (um link direto ao armazenamento de objetos, o mais cómodo).
  2. GET /api/music/download?song_id=<id>&kind=mp3 → devolve diretamente o fluxo de bytes de áudio (com o nome do ficheiro já em Content-Disposition).
  3. POST /api/music/download-url (para obter um endereço temporário assinado).
curl -sS -L "https://www.suno-api.io/api/music/download?song_id=0f2a…&kind=mp3" \
  -H "Authorization: Bearer $API_KEY" -o song.mp3

Valores de kind: mp3 (equivalente a song) / playback (reprodução em streaming) / wav / video / lyrics / timestamped_lyrics. timestamped_lyrics (.lrc) só está disponível para algumas músicas por agora; se falhar, gere o ficheiro você mesmo com a API de letras com marcas temporais. A resposta é o fluxo de bytes do ficheiro, com Content-Type e Content-Disposition (nome do ficheiro) já definidos; os wav_url / video_url que GET /api/music/songs/{song_id} devolve são a mesma entrada com kind=wav|video.

8.2 Converter para wav / obter letras / metadados (pago)

POST /api/music/free2
Content-Type: application/json

{ "song_ids": ["0f2a…"], "files": ["mp3", "wav", "lyrics"] }
{
  "success": true,
  "data": {
    "songs": [
      { "song_id": "0f2a…", "files": [ { "type": "mp3", "url": "https://…" }, { "type": "wav", "url": "https://…" } ] }
    ],
    "requested_songs": 1,
    "succeeded_songs": 1,
    "price": 0.2
  }
}

9. Consultar preços

GET /api/pricing/catalog

Um endpoint público que não requer autenticação. Todos os preços unitários que o cliente precisa de mostrar estão em data.catalog.meta (cadeias):

Chave Significado Valor atual
generation_price Geração normal 0,6
voice_generation_price Preço base do versionamento com voz 1,2
max_mode_factor Multiplicador do Max Mode 2
enhanced_upload_price Clonagem reforçada / envio reforçado 10
voice_auto_verify_price Verificação automática de voz 5
voice_long_term_clone_price Clonagem de voz a longo prazo 5

Os preços são ajustados no back-office, por isso leia-os ao vivo em vez de os fixar no cliente. A cobrança real do versionamento = voice_generation_price × (max_mode_factor outra vez se max_mode for verdadeiro).


10. Limites e avisos

  1. Tamanho do envio: ≤ 10 MB (o servidor aceita mais, mas a gateway de entrada trunca corpos sobredimensionados em 10 MiB, o que se manifesta como "rejeitado pela Suno", por isso bloqueie antes do seu lado).
  2. Duração da amostra: pelo menos 6 s, recomenda-se 10–60 s; se for demasiado curta a plataforma rejeita.
  3. Conteúdo da amostra: voz limpa; evite qualquer coisa muito parecida com uma gravação existente (a comparação do catálogo rejeita-a).
  4. Limites de texto: lyrics ≤ 3000 caracteres; aconselha-se que style_requirements / negative_tags / title fiquem em 1000 / 1000 / 100 caracteres respetivamente (os requisitos de estilo e de versionamento são concatenados ao prompt, por isso mantenha o total dentro de 3000 caracteres).
  5. A letra não é reescrita: canta-se o que passar (carácter a carácter), sem truncagem local.
  6. Cada música produz 2 faixas; não assuma um único resultado.
  7. O áudio de origem é mantido de forma permanente: eliminar uma voz não limpa o seu áudio de origem; assim mantêm-se possíveis os versionamentos seguintes e a rastreabilidade de conformidade.
  8. A voz tem de estar pronta: uma voz em processing não pode ser usada em versionamentos.
  9. Tempo de espera do pedido: numa conta fria o primeiro envio demorou até cerca de 4,5 minutos nos testes, por isso configure o tempo de espera do cliente em ≥ 6 minutos. Os versionamentos não deduplicam ao nível do pedido, por isso após um tempo de espera esgotado verifique se já apareceu uma música nova (§1.5) antes de decidir reenviar.
  10. Titularidade da voz: as vozes pertencem a quem as cria; um versionamento só aceita vozes prontas e não eliminadas. Uma voz que não existe, foi eliminada ou pertence a outra conta devolve 400: esta voz não existe ou foi eliminada (voice_id=…).

11. Perguntas frequentes (FAQ)

Q1. Criar uma voz custa dinheiro? A criação normal e "criar a partir de áudio existente" são grátis; só são cobrados os versionamentos (1,2 ¥ / MAX 2,4 ¥) e as clonagens reforçadas (10 ¥ por predefinição).

Q2. Posso usar como amostra uma música final com acompanhamento? Não se recomenda. Qualquer coisa com música, ou muito parecida com uma gravação existente do catálogo, é rejeitada pela plataforma (This audio matches an existing recording in our catalog.). Use uma gravação puramente vocal e seca.

Q3. Porque é que o audio_url está vazio depois de enviar um versionamento? O envio apenas significa que foi aceite e o status continua em processing. Um endereço reproduzível/descarregável aparece quando consultar /api/music/query até status=completed.

Q4. É preciso enviar letra no cenário B (sem song_clip_id)? É opcional. Envie lyrics para cantar um conteúdo específico; sem ele o modelo desenrasca-se sozinho, mas com menos controlo.

Q5. Um áudio enviado pelo cliente pode ser usado diretamente como voz? Sim: através da forma file_url do create, ou enviando-o primeiro como música e chamando depois create-from-clip.

Q6. O dinheiro é devolvido se falhar? Um pedido rejeitado de imediato (parâmetros errados / erro da plataforma) não é cobrado, segundo as medições; uma tarefa aceite que acaba por falhar devolve o valor pré-cobrado. Na falha terminal a tarefa informa status=failed mais error_message.

Q7. Depois de eliminar uma voz, ainda posso ouvir músicas geradas antes com ela? Sim. A eliminação só afeta se essa voz pode ser usada em versionamentos novos.

Q8. Que duração de música posso versionar de uma vez? duration aceita de 1 a 480 segundos; se o omitir decide a plataforma a partir da música original / do material. Atenção: as faixas finais da plataforma têm no mínimo cerca de 30 segundos; com um valor menor os testes continuavam a dar 29,96 / 29,76 segundos.


Anexo A: exemplo completo (Node.js, com consulta e descarga)

const BASE = "https://www.suno-api.io";
const KEY = process.env.SUNO_API_KEY;
const H = { Authorization: `Bearer ${KEY}` };

// ① Criar a voz (multipart)
async function createVoice(filePath, title) {
  const fd = new FormData();
  fd.set("file", new Blob([await (await import("node:fs/promises")).readFile(filePath)], { type: "audio/mpeg" }), "my-voice.mp3");
  fd.set("file_name", "my-voice.mp3");
  fd.set("source_file_name", "my-voice.mp3");
  fd.set("title", title);
  fd.set("client_request_id", `vp-create-${Date.now()}`);
  const res = await fetch(`${BASE}/api/music/voice-profile/create`, { method: "POST", headers: H, body: fd });
  const body = await res.json();
  if (!body.success) throw new Error(body.message);
  return body.data; // { voice_id, status, audio_url, ... }
}

// ② Versionar
async function cover(voiceId, songClipId, lyrics) {
  const submissionId = `vp-cover-${Date.now()}`;
  const res = await fetch(`${BASE}/api/music/voice-profile/cover`, {
    method: "POST",
    headers: { ...H, "Content-Type": "application/json", "X-Create-Ui-Client-Request-Id": submissionId },
    body: JSON.stringify({
      model: "suno-v6",
      voice_id: voiceId,
      song_clip_id: songClipId || "",
      lyrics: lyrics || "",
      style_requirements: "folk lento, guitarra acústica",
      audio_weight: 0.85,
      max_mode: false,
      client_request_id: submissionId,
    }),
  });
  const body = await res.json();
  if (body.error) throw new Error(body.error.message);
  return body.data; // { resolved_scene, clips: [{ song_id, status }] }
}

// ③ Consultar até concluir (a cada 5 segundos, no máximo 15 minutos)
async function waitUntilCompleted(songIds) {
  const deadline = Date.now() + 15 * 60 * 1000;
  while (Date.now() < deadline) {
    const res = await fetch(`${BASE}/api/music/query`, {
      method: "POST",
      headers: { ...H, "Content-Type": "application/json" },
      body: JSON.stringify({ model: "suno-v6", song_ids: songIds.join(",") }),
    });
    const songs = await res.json(); // array nu
    if (songs.every((s) => s.status === "completed" || s.status === "failed")) return songs;
    await new Promise((r) => setTimeout(r, 5000));
  }
  throw new Error("timeout waiting for cover");
}

// ④ Descarregar
async function download(songId, outPath) {
  const res = await fetch(`${BASE}/api/music/download?song_id=${encodeURIComponent(songId)}&kind=mp3`, { headers: H });
  if (!res.ok) throw new Error(`download failed: ${res.status}`);
  (await import("node:fs/promises")).writeFile(outPath, Buffer.from(await res.arrayBuffer()));
}

const voice = await createVoice("./my-voice.mp3", "A minha voz");
const result = await cover(voice.voice_id, "5b773e9a-a035-4134-a4a4-29c9961d3ccb", "[Verse 1]\nletra…");
const ids = result.clips.map((c) => c.song_id);
const songs = await waitUntilCompleted(ids);
for (const [i, s] of songs.entries()) {
  if (s.status === "completed") await download(s.song_id, `./out-${i}.mp3`);
}

Anexo B: registo de alterações

Data Alteração
2026-10-15 Semântica da eliminação explicada às claras (§5.3); um versionamento com um voice_id "eliminado / sem permissão" passa a devolver 400 antes de qualquer cobrança prévia, com a tabela de erros e as FAQ atualizadas (em conjunto com a portagem de eliminação de vozes publicada nesse dia)
2026-10-13 Adicionada a nota "porque recomendamos esta cadeia" no início: segundo as avaliações reais de muitos utilizadores, as músicas geradas por esta cadeia preservam muito melhor a voz original
2026-09-26 Primeira versão: criar uma voz (três formas de entrada) / criar a partir de áudio existente / listar, detalhe e eliminar / versionamento com voz (cenários A e B) / consulta de progresso / descarga / leitura de preços, com provas medidas
PróximoAPI de reforço de estilo

Obter uma chave de API

Crie uma chave de API no console após o cadastro. Cada geração custa ¥0,6 e devolve 2 faixas, os downloads são ilimitados e não é preciso número de telefone.

Obter chave de API Voltar à visão geral