【Recomendado】 API de perfil de voz
✅ 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.
- Data do documento: 2026-09-26
- Âmbito: criar a sua própria voz → usá-la para versionar uma música escolhida / cantar uma música nova → consultar o progresso → descarregar os resultados
- Todos os endpoints, campos e respostas foram verificados com chamadas reais (o que está marcado como "medido" foi verificado em detalhe)
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
- O prefixo
Beareré opcional; o prefixosk-também (Authorization: sk-xxxfunciona igual). - Chave ausente ou inválida → HTTP 401, com um corpo como
{"success":false,"message":"…"}(o texto varia com o idioma do pedido). - Cada chave só pode ver e só pode operar sobre as músicas e vozes da sua própria conta.
1.3 Formatos do corpo do pedido
- Criar uma voz: recomenda-se
multipart/form-data(enviar um ficheiro);application/json(um URL ou base64) também é aceite. - Os restantes endpoints:
application/json.
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:
- 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. - 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ãop/page_size; a grafia compatívelpstambém serve) para ver se já apareceu uma música nova comgeneration_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:
- Um pedido rejeitado (parâmetros errados, um 4xx/5xx da plataforma, saldo insuficiente em si) não é cobrado: ao enviar com uma voz inexistente o saldo não mudou nada nos testes (delta = 0);
- Uma tarefa aceite que acaba por falhar (incluindo um erro de serviço da plataforma) passa pela via de devolução do servidor e devolve o valor pré-cobrado.
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"
}'
- O URL tem de ser um link direto HTTPS acessível publicamente; o servidor descarrega-o uma vez e guarda-o no nosso armazenamento de objetos.
- Também pode colocar o endereço no campo
audio_url, com o mesmo efeito (se enviar ambos, ganhafile_url). - Quando o endereço já está no armazenamento de objetos desta plataforma (
*.myqcloud.com/create-ui/voice-source/...) não é descarregado de novo: é registado diretamente.
Forma C: JSON + base64
{
"file_base64": "data:audio/mpeg;base64,//uQxAAA…",
"file_name": "my-voice.mp3",
"title": "A minha voz"
}
- Aceita tanto o prefixo
data:audio/xxx;base64,como base64 puro. - O tamanho é limitado (base64 inflaciona 1,33×), por isso use a forma A para ficheiros grandes.
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_atsã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):
- A resposta é imediatamente
status=processing+task_id(ainda semclip_id) e corre de forma assíncrona; - Enquanto corre, use
GET /api/music/voice-profile/{voice_id}para consultar o progresso, que devolveprogress_percent/progress_stage/progress_message; - Ao terminar,
statuspassa areadyeclip_id,audio_url,image_urlficam preenchidos; - Em caso de falha,
status=failedeerror_messagediz algo como "o envio reforçado falhou; o valor foi devolvido automaticamente, tente novamente mais tarde"; - Uma clonagem reforçada demora bastante mais do que uma criação normal (minutos), por isso não a espere com um tempo de espera síncrono.
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…"
}
source_song_id: o clip id de um áudio terminado da sua conta (equivalente aosong_idda música).- Reenviar o mesmo clip não cria um registo novo: devolve diretamente a voz existente com
reused: true(medido).
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" } }
- Depois de eliminada, a voz desaparece da lista e já não pode ser usada em versionamentos novos: enviar com esse
voice_iddevolve 400 (ver §6.4). - As músicas já geradas com ela não são afetadas de forma alguma; reprodução, descarga, continuação, substituição e separação continuam a funcionar.
- Eliminar uma voz inexistente, ou que não pertence a esta conta, devolve
{"success":false,"message":"voice not found"}.
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:
- Identifique as músicas finais com
clips[].song_id(este endpoint não devolve um campoid). - Obtém 2 valores de
song_idde imediato, enquantostatusainda está emprocessing(significa apenas que foram aceites) eaudio_urlestá vazio; tem de consultar atécompletedantes de descarregar.play_urlé o fluxo de pré-escuta da plataforma, pode já aparecer no envio e vai expirar. descriptioné o prompt que o servidor acaba por enviar (a parte estrutural fixa + oscover_requirements/style_requirementsque preencheu); é muito útil para investigar resultados.source_updatesé o resultado do tratamento de materiais do servidor e o cliente pode ignorá-lo.- O
titleque envia é escrito no registo de tarefas do servidor e aparece comosong_titlenas consultas seguintes; queclips[].song_titlevenha 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_idsé uma cadeia separada por vírgulas (não um array).- A resposta é um array nu (diretamente
[...], sem invólucrosuccess/data):
[
{
"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 campoid, por issorow.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"]
}
}
}
- Aqui
created_at/completed_atsão segundos Unix (ao contrário das cadeias ISO da consulta em lote, por isso os clientes devem distingui-los). wav_url/video_urlsão as entradas de descarga desta plataforma (relativas ao domínio atual) e umGETobtém o ficheiro; são cadeias vazias quando a plataforma não produziu esse material.parameter_retentionindica a que parâmetros de envio essa música pode ser rastreada:core_parameters_available=truesignifica que os parâmetros centrais (letra / estilo / origem) são consultáveis, e comextended_parameters_available=falseos parâmetros estendidos listados acima não foram retidos (os versionamentos com voz estão atualmente nesta categoria).
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:
- Usar o
audio_urldo resultado da consulta (um link direto ao armazenamento de objetos, o mais cómodo). GET /api/music/download?song_id=<id>&kind=mp3→ devolve diretamente o fluxo de bytes de áudio (com o nome do ficheiro já emContent-Disposition).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
}
}
filesaceita:mp3/wav/lyrics/metadata, até 10 músicas de cada vez.- Cobrado por música bem-sucedida (0,2 ¥ cada); uma música que falha por completo não é cobrada, e um formato que falha aparece apenas em
songs[].errors. - Para voltar a obter ficheiros já obtidos antes, use primeiro o gratuito
POST /api/music/free2/cached(os mesmossong_ids+files) para conseguir endereços arquivados; o seusongs[].missing_fileslista os formatos que não estão em cache e têm de ser preparados de novo.
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
- 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).
- Duração da amostra: pelo menos 6 s, recomenda-se 10–60 s; se for demasiado curta a plataforma rejeita.
- Conteúdo da amostra: voz limpa; evite qualquer coisa muito parecida com uma gravação existente (a comparação do catálogo rejeita-a).
- Limites de texto:
lyrics≤ 3000 caracteres; aconselha-se questyle_requirements/negative_tags/titlefiquem 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). - A letra não é reescrita: canta-se o que passar (carácter a carácter), sem truncagem local.
- Cada música produz 2 faixas; não assuma um único resultado.
- 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.
- A voz tem de estar pronta: uma voz em
processingnão pode ser usada em versionamentos. - 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.
- 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 |
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