API de consulta e historial de canciones

Actualizado el 2026-09-18 · equipo de Suno-API

Esta página cubre tres endpoints de consulta gratuitos:

Capacidad Método Endpoint
Consultar el estado y el resultado de una canción POST /api/music/query
Consultar las canciones que ha generado la cuenta actual GET /api/music/songs
Consultar los parámetros guardados al generar una canción GET /api/music/songs/:song_id

Si usaste el modo de recibo de aceptación (accept_mode=async) en un endpoint de generación, lo que tienes es un número de recibo, no un ID de canción. Sigue el progreso con GET /api/music/requests/{request_id} y vuelve a los endpoints de esta página cuando tengas el song_id real. Consulta «Modo de recibo de aceptación» en la API de generación en modo simple.

Autenticación y alcance de los datos

Los tres endpoints se autentican con la misma clave de API:

Authorization: Bearer YOUR_API_KEY

El historial de canciones está aislado por el user_id al que pertenece la clave de API. Varias claves de API creadas bajo la misma cuenta principal pueden leer el historial de esa cuenta, pero no el de otro usuario ni el de otra cuenta de subsitio.

Los endpoints de historial solo devuelven canciones realmente generadas. Quedan excluidos:


1. Consultar el estado de generación

Consulta el estado actual y el resultado final de uno o varios IDs de canción.

Endpoint: POST /api/music/query

Facturación: Gratis.

Headers

Parámetro Tipo Obligatorio Notas
Authorization string sí Bearer YOUR_API_KEY
Content-Type string sí application/json

Parámetros del body

Parámetro Tipo Obligatorio Por defecto Notas
model string no suno-v6 Versión del modelo
song_ids string sí - IDs de canción, separados por comas

Ejemplo de petición

curl -X POST https://www.suno-api.io/api/music/query \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "suno-v6",
    "song_ids": "clip_id_1,clip_id_2"
  }'

Ejemplo de respuesta

[
  {
    "song_id": "clip_id_1",
    "song_title": "Título de la canción",
    "status": "completed",
    "audio_url": "https://example.com/audio.mp3",
    "video_url": "https://example.com/video.mp4",
    "cover_url": "https://example.com/cover.jpg",
    "lyrics": "Texto de la letra",
    "style_tags": "Mandopop, acoustic",
    "duration": 180.5,
    "model_version": "suno-v6",
    "created_at": "2026-05-21T10:00:00Z"
  }
]

Notas de compatibilidad

La documentación antigua puede mostrar song_ids como un array. Hoy se recomienda una cadena separada por comas, que es como se llama realmente al endpoint.

song_ids debe contener IDs de canción reales. Un ID de reserva que empieza por pending: no es un song_id final y no puede usarse aquí; consultar solo IDs de reserva puede devolver un array vacío [].

El model, model_version o model_name de plataforma de una respuesta puede conservar valores históricos. Los trabajos nuevos deben usar suno-v6, suno-v6-wild o suno-v6-mini; de suno-v2 a suno-v5-5 están retirados, y ver esos nombres en el historial no significa que el modelo siga admitiendo envíos.

Mientras una tarea está en pending, submitted o processing, audio_url, video_url y cover_url pueden estar vacíos: es lo normal en una tarea sin terminar. No deduzcas un fallo solo porque la dirección esté vacía; guíate por status y vuelve a consultar cuando el estado esté completo. Solo si el estado está completo y las direcciones siguen vacías conviene contactar con soporte indicando el song_id.

⚠️ Las direcciones de audio viven 7 días — transfiere tus archivos a tiempo

El audio_url, el video_url (y otras direcciones de medios como el WAV) que devuelve este endpoint se sirven desde el almacenamiento de objetos de la plataforma y caducan a los 7 días por defecto: los archivos se reciclan y la dirección antigua devuelve 404.

  • Mueve los archivos a tu propio almacenamiento dentro de esos 7 días; no trates la dirección como un enlace permanente.
  • Una dirección caducada no obliga a regenerar la canción ni se cobra de nuevo: vuelve a llamar a este endpoint (POST /api/music/query) para obtener una dirección nueva válida de esa canción.

2. Consultar el historial de canciones de la cuenta

Lista las canciones generadas por la cuenta principal a la que pertenece la clave de API actual. Útil para crear tu propia lista de canciones, un selector o una página de historial.

Endpoint: GET /api/music/songs

Facturación: Gratis.

Parámetros de query

Parámetro Tipo Obligatorio Por defecto Notas
p integer no 1 Número de página, empieza en 1
page_size integer no 20 Elementos por página, máximo 100
q string no - Búsqueda difusa por título, o búsqueda exacta por ID completo de canción
status string no - Filtro exacto por estado, por ejemplo completed, playable

Los resultados se ordenan por created_at y por ID de registro interno de forma descendente, así el orden de paginación es estable.

Recuperar un envío que dio timeout: los endpoints de generación no dan respuesta intermedia antes de la aceptación. Si tu cliente se quedó sin tiempo o se cayó la conexión al enviar, puede que el pedido ya esté aceptado y generándose. Mira este endpoint (lo más nuevo primero): las canciones aceptadas aparecen con normalidad. Reenvía solo cuando hayas confirmado que no está, para no pagar dos veces. Consulta «Tiempos de espera y configuración de timeout» en el Resumen de la nueva API.

Ejemplo de petición

curl "https://www.suno-api.io/api/music/songs?p=1&page_size=20&status=completed" \
  -H "Authorization: Bearer YOUR_API_KEY"

Ejemplo de respuesta

{
  "success": true,
  "message": "",
  "data": {
    "page": 1,
    "page_size": 20,
    "total": 42,
    "items": [
      {
        "song_id": "8e31b3c0-example-song-id",
        "title": "La ciudad de noche",
        "status": "completed",
        "generation_type": "custom_generate",
        "model": "suno-v6",
        "duration": 187.42,
        "audio_url": "https://example.com/audio.mp3",
        "image_url": "https://example.com/cover.jpg",
        "created_at": 1784000000,
        "completed_at": 1784000120
      }
    ]
  }
}

Campos de la respuesta

Campo Tipo Notas
song_id string ID real de la canción, utilizable en la consulta de detalle
title string Título actual, que el usuario puede haber renombrado
status string Estado actual
generation_type string Tipo de generación
model string Modelo de generación
duration number Duración del audio en segundos
audio_url string Dirección del audio; puede estar vacía mientras no termina
image_url string Dirección de la carátula; puede estar vacía
created_at integer Hora de creación, timestamp Unix en segundos
completed_at integer Hora de finalización, timestamp Unix en segundos; puede faltar mientras no termina

El endpoint de listado no devuelve prompts, campos de facturación, información de cuenta ni respuestas sin procesar. Para prompts y parámetros de generación, llama al endpoint de detalle de la canción.


3. Consultar los parámetros de generación

Consulta el prompt, el estilo, el modelo y la canción de origen que la plataforma guardó al generar esa canción.

Endpoint: GET /api/music/songs/:song_id

Facturación: Gratis.

Solo pueden leerse canciones de la cuenta principal a la que pertenece la clave de API actual. Las canciones de otros usuarios o de cuentas de subsitio se tratan siempre como «canción no encontrada».

Parámetro de ruta

Parámetro Tipo Obligatorio Notas
song_id string sí ID real de la canción

Ejemplo de petición

curl "https://www.suno-api.io/api/music/songs/8e31b3c0-example-song-id" \
  -H "Authorization: Bearer YOUR_API_KEY"

Ejemplo de respuesta

{
  "success": true,
  "message": "",
  "data": {
    "song_id": "8e31b3c0-example-song-id",
    "title": "La ciudad de noche",
    "status": "completed",
    "generation_type": "custom_generate",
    "model": "suno-v6",
    "duration": 187.42,
    "audio_url": "https://example.com/audio.mp3",
    "image_url": "https://example.com/cover.jpg",
    "video_url": "",
    "wav_url": "",
    "created_at": 1784000000,
    "completed_at": 1784000120,
    "client_request_id": "example-request-id",
    "client_request_index": 0,
    "parameters": {
      "prompt": "calles de ciudad tras la lluvia, letra sobre un reencuentro",
      "style_tags": "Mandopop, acoustic, warm vocal",
      "title": "La ciudad de noche",
      "model": "suno-v6",
      "generation_type": "custom_generate",
      "source_song_id": "",
      "source_audio_url": "",
      "custom_mode": null,
      "instrumental": null,
      "negative_tags": null,
      "vocal_gender": null,
      "lyrics_mode": null,
      "wait_audio": null,
      "style_weight": null,
      "weirdness_constraint": null
    },
    "parameter_retention": {
      "core_parameters_available": true,
      "extended_parameters_available": false,
      "sources": [
        "suno_tasks"
      ],
      "unavailable_fields": [
        "custom_mode",
        "instrumental",
        "negative_tags",
        "vocal_gender",
        "lyrics_mode",
        "wait_audio",
        "style_weight",
        "weirdness_constraint"
      ]
    }
  }
}

Los campos de parameters

Campo Tipo Notas
prompt string Prompt de generación o letra
style_tags string Etiquetas de estilo
title string Título de generación guardado; una tarea histórica normal puede conservar solo el título actual
model string Modelo de generación
generation_type string Tipo de generación
source_song_id string ID de la canción de origen en tareas de cover, extensión y similares
source_audio_url string Dirección del audio de origen
custom_mode boolean/null Si se usó el modo personalizado; null cuando no se guardó
instrumental boolean/null Si la canción es instrumental; los datos históricos existentes no suelen guardarlo por separado
negative_tags string/null Estilos excluidos
vocal_gender string/null Ajuste de género vocal
lyrics_mode string/null Modo de letra; los datos históricos existentes no suelen guardarlo
wait_audio boolean/null Si esperó el audio completo; los datos históricos existentes no suelen guardarlo
style_weight number/null Peso del estilo
weirdness_constraint number/null Parámetro de creatividad / rareza

El campo prompt_view (ver prompt, añadido el 2026-09-28)

prompt_view es una estructura normalizada dedicada a «ver el prompt»: organiza los datos en secciones fijas por tipo de generación, de modo que el cliente ya no tiene que decidir qué campo mostrar. Es un campo puramente aditivo: los campos antiguos (parameters, parameter_retention) conservan nombre y significado, y los clientes que no analicen el campo nuevo no se ven afectados en absoluto.

"prompt_view": {
  "type": "custom_generate",
  "type_label": "Modo personalizado",
  "generation": {
    "model": "suno-v6", "max_mode": false, "duration": 182.4,
    "title": "Las cuatro de la mañana#701f37", "title_base": "Las cuatro de la mañana", "title_suffix": "701f37",
    "created_at": 1790421721
  },
  "inputs": {
    "user_text": "...", "user_text_kind": "lyrics",
    "user_style": "electrónica guochao, sub bass profundo, sintetizador retro",
    "style_tags": "electrónica guochao, sub bass profundo, sintetizador retro",
    "style_source": "user", "lyrics": "...",
    "negative_tags": "", "is_instrumental": false
  },
  "extended": {
    "vocal_gender": "m", "style_weight": 0.5, "audio_weight": 0.85,
    "weirdness_constraint": 0.5, "variety": 2, "lyrics_mode": "manual",
    "custom_mode": true
  },
  "reference": { "voice_name": "sv_40_34", "source_song_id": "", "source_title": "" },
  "retention": {
    "recorded_since": "2026-09-28", "missing_reason": "",
    "not_applicable_fields": ["audio_weight"]
  }
}
Campo Tipo Notas
type / type_label string Tipo de generación en bruto / etiqueta visible (generación simple, modo personalizado, modo efectos de sonido, generación con voz clonada…)
generation.model string Modelo utilizado
generation.max_mode bool Si Max Mode estaba activado
generation.duration number Duración del audio en segundos
generation.title string Título tal cual se guardó (puede incluir sufijo)
generation.title_base string Título visible sin el sufijo #xxxxxx final
generation.title_suffix string El sufijo en sí (sin #); vacío si no hay
inputs.user_text string Entrada del usuario (descripción o letra, según el tipo)
inputs.user_text_kind string lyrics / description / cover_requirements
inputs.user_style string El estilo que escribió el usuario (modo personalizado, voz, efectos)
inputs.style_tags string El estilo que se aplicó finalmente
inputs.style_source string user = lo escribió el usuario; suno_derived = lo dedujo Suno de la descripción
inputs.lyrics string Cuerpo de la letra; vacío si no hay, [Instrumental] en canciones instrumentales
inputs.negative_tags string Estilos excluidos
inputs.is_instrumental bool Si la canción es instrumental
extended.* — Parámetros extendidos, ver abajo; los campos no guardados no aparecen
reference.voice_name string Nombre de la voz (solo tipos con voz; el persona id interno no se devuelve)
reference.source_song_id / source_title string Canción de origen en tareas de cover, extensión y similares
retention.recorded_since string Fecha desde la que se guardan los parámetros extendidos (2026-09-28)
retention.missing_reason string Por qué no hay parámetros extendidos; en datos históricos es not_recorded_before_20260928
retention.not_applicable_fields string[] Parámetros que ese tipo de generación nunca necesitó (no los muestres como «parámetros ausentes»)

Campos que pueden aparecer en extended: vocal_gender, style_weight, audio_weight, weirdness_constraint, variety, lyrics_mode, custom_mode, más el grupo de efectos de sonido sound_type / sound_bpm / sound_key / sound_loop. Los valores vacíos nunca se devuelven.

Tres reglas de presentación (síguelas en lugar de deducir):

  1. Distingue de dónde viene el estilo: con style_source=suno_derived, muéstralo como «estilo (deducido por Suno a partir de tu descripción)» y nunca como «tu estilo»;
  2. Los prompts internos nunca aparecen: los tipos de cover con voz devuelven solo los 【requisitos de estilo】/【requisitos de cover】 que escribió el usuario; el andamiaje fijo que montamos para el modelo no aparece en ningún campo (los datos históricos están saneados igual);
  3. No adivines parámetros ausentes: si extended no lo contiene, no se registró entonces — usa retention para explicar por qué.

Notas sobre la retención de parámetros

parameter_retention existe para separar «se pasó un valor vacío explícitamente» de «el campo nunca se guardó históricamente»:

Las canciones históricas normales suelen conservar el prompt, el estilo, el título actual, el modelo, el tipo de generación y la canción de origen, pero no guardaron por separado todos los parámetros avanzados. La plataforma nunca adivina valores ausentes a partir de generation_type.

Algunas tareas de música extendida también guardaron el prompt original, el estilo, el título, el modelo y además custom_mode, negative_tags, vocal_gender, style_weight y weirdness_constraint. Aunque exista un registro extendido, instrumental, lyrics_mode y wait_audio pueden seguir sin poder recuperarse.

El usuario puede renombrar los títulos después. Cuando una tarea histórica normal no guardó un título original aparte, parameters.title puede ser el título actual; cuando existe un registro de tarea extendida, se prefiere el título de generación original guardado allí.

No encontrada o sin permiso

Los errores de negocio usan un sobre de respuesta uniforme. Cuando la canción no existe o no pertenece a la cuenta actual:

{
  "success": false,
  "message": "song not found"
}

Este error de negocio se devuelve hoy con HTTP 200, así que juzga el resultado por el campo success. Una clave de API ausente, inválida, caducada o deshabilitada devuelve HTTP 401.

Notas de seguridad

Los endpoints de historial y detalle nunca devuelven:

SiguienteAPI de letras con marcas de tiempo

Obtener una clave de API

Crea una clave de API en la consola después de registrarte. Cada generación cuesta 0,6 ¥ y devuelve 2 pistas, las descargas son ilimitadas y no hace falta número de teléfono.

Obtener clave de API Volver al resumen