Crear un Demo de una aplicación como Suno puede llevar solo una tarde.

Coloca un cuadro de entrada en la página, un botón de generación y un reproductor de audio, y ya parecerá bastante completo. Pero, en cuanto se lo entregues a usuarios reales, los problemas empezarán a surgir de lugares inesperados.

Alguien hace clic repetidamente en el botón y genera seis canciones casi idénticas; alguien cierra la página y después ya no puede encontrar el resultado; alguien sube música de origen desconocido y pide que se cante «exactamente con la voz de este cantante»; otra persona sufre un error de generación, pero descubre que ya se le han descontado los créditos.

Ninguno de estos problemas puede resolverlos por ti el modelo musical. Son problemas de lanzamiento que deben afrontar conjuntamente el producto, el backend y las operaciones.

A continuación, no hablaremos de conceptos abstractos, sino que empezaremos por las situaciones más habituales en la práctica.

Lo primero de lo que suelen quejarse los usuarios no es de la calidad del sonido, sino de «¿por qué todavía no está listo?»

Las interfaces de texto suelen responder en unos segundos, mientras que la generación de una canción completa requiere más tiempo. La documentación de integración de Ace Data Cloud recomienda utilizar tareas asíncronas y proporciona mecanismos de task_id, callbacks y consultas posteriores.

Si la página solo muestra un indicador de carga que gira continuamente, los usuarios pronto sospecharán que el programa se ha quedado bloqueado.

Una mejor interacción no consiste en mostrar porcentajes ficticios, sino en informar al usuario de las etapas por las que está pasando la tarea:

Enviando los requisitos de creación
        ↓
La tarea

ya está en la cola ↓ Generando dos versiones candidatas ↓

 ya está en la cola
        ↓
Generando dos versiones candidatas
        ↓
Guardando el audio y la portada
        ↓
Ya puedes escucharla

El frontend puede utilizar textos de estado claros:

| Estado del backend | Mensaje | |--------|--------| ya está en la cola ↓ Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de | ya está en la cola
        ↓
Generando dos versiones candidatas
        ↓
Guardando el audio y la portada
        ↓
Ya puedes escucharla

El frontend puede utilizar textos de estado claros:

Estado del backend Mensaje que ve el usuario
submitted Hemos recibido tus requisitos de creación
pending En cola, espera un momento
    ↓

Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| \`failed |  | ya está en la cola
        ↓
Generando dos versiones candidatas
        ↓
Guardando el audio y la portada
        ↓
Ya puedes escucharla

El frontend puede utilizar textos de estado claros:

Estado del backend Mensaje que ve el usuario
submitted Hemos recibido tus requisitos de creación
pending En cola, espera un momento
running Generando música
succeeded Las canciones candidatas están listas
failed Esta generación no se ha completado;
    ↓

Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {

ya está en la cola ↓ Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submit

ya está en la cola ↓ Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submitToSuno(task);
await bindProviderTaskId(task.id, upstream.task_id);

Una tarea de generación es un objeto de negocio que existe durante un periodo prolongado, no una solicitud de red temporal. Comprender este punto facilita mucho la gestión de las esperas, los reintentos y el historial.

Cuando el usuario dice «haz una canción alegre», el sistema no necesariamente sabe lo que quiere

Las indicaciones musicales admiten muchas interpretaciones.

«Alegre» puede referirse a una canción infantil, música electrónica de baile, folk animado o incluso música de fondo luminosa, habitual en los anuncios. Si la aplicación solo ofrece un cuadro de texto grande, cuando los usuarios obtienen resultados insatisfactorios, a menudo no saben qué frase deberían cambiar.

Se pueden dividir los requisitos de creación en varias preguntas más fáciles de responder:

¿Para qué se utilizará esta música?
Vídeos cortos / Podcasts / Juegos / Anuncios / Canciones

ya está en la cola ↓ Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submitToSuno(task);
await bindProviderTaskId(task.id, upstream.task_id);

Una tarea de generación es un objeto de negocio que existe durante un periodo prolongado, no una solicitud de red temporal. Comprender este punto facilita mucho la gestión de las esperas, los reintentos y el historial.

Cuando el usuario dice «haz una canción alegre», el sistema no necesariamente sabe lo que quiere

Las indicaciones musicales admiten muchas interpretaciones.

«Alegre» puede referirse a una canción infantil, música electrónica de baile, folk animado o incluso música de fondo luminosa, habitual en los anuncios. Si la aplicación solo ofrece un cuadro de texto grande, cuando los usuarios obtienen resultados insatisfactorios, a menudo no saben qué frase deberían cambiar.

Se pueden dividir los requisitos de creación en varias preguntas más fáciles de responder:

¿Para qué se utilizará esta música?
Vídeos cortos / Podcasts / Juegos / Anuncios / Canciones personales

¿Qué sensación quieres que transmita?
Relajada / En

ya está en la cola ↓ Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submitToSuno(task);
await bindProviderTaskId(task.id, upstream.task_id);

Una tarea de generación es un objeto de negocio que existe durante un periodo prolongado, no una solicitud de red temporal. Comprender este punto facilita mucho la gestión de las esperas, los reintentos y el historial.

Cuando el usuario dice «haz una canción alegre», el sistema no necesariamente sabe lo que quiere

Las indicaciones musicales admiten muchas interpretaciones.

«Alegre» puede referirse a una canción infantil, música electrónica de baile, folk animado o incluso música de fondo luminosa, habitual en los anuncios. Si la aplicación solo ofrece un cuadro de texto grande, cuando los usuarios obtienen resultados insatisfactorios, a menudo no saben qué frase deberían cambiar.

Se pueden dividir los requisitos de creación en varias preguntas más fáciles de responder:

¿Para qué se utilizará esta música?
Vídeos cortos / Podcasts / Juegos / Anuncios / Canciones personales

¿Qué sensación quieres que transmita?
Relajada / Enérgica / Cálida / Misteriosa / Contenida

¿Necesita voz humana

ya está en la cola ↓ Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submitToSuno(task);
await bindProviderTaskId(task.id, upstream.task_id);

Una tarea de generación es un objeto de negocio que existe durante un periodo prolongado, no una solicitud de red temporal. Comprender este punto facilita mucho la gestión de las esperas, los reintentos y el historial.

Cuando el usuario dice «haz una canción alegre», el sistema no necesariamente sabe lo que quiere

Las indicaciones musicales admiten muchas interpretaciones.

«Alegre» puede referirse a una canción infantil, música electrónica de baile, folk animado o incluso música de fondo luminosa, habitual en los anuncios. Si la aplicación solo ofrece un cuadro de texto grande, cuando los usuarios obtienen resultados insatisfactorios, a menudo no saben qué frase deberían cambiar.

Se pueden dividir los requisitos de creación en varias preguntas más fáciles de responder:

¿Para qué se utilizará esta música?
Vídeos cortos / Podcasts / Juegos / Anuncios / Canciones personales

¿Qué sensación quieres que transmita?
Relajada / Enérgica / Cálida / Misteriosa / Contenida

¿Necesita voz humana?
Canción completa / Algo de voz / Música instrumental

¿Qué elementos no quieres que

ya está en la cola ↓ Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submitToSuno(task);
await bindProviderTaskId(task.id, upstream.task_id);

Una tarea de generación es un objeto de negocio que existe durante un periodo prolongado, no una solicitud de red temporal. Comprender este punto facilita mucho la gestión de las esperas, los reintentos y el historial.

Cuando el usuario dice «haz una canción alegre», el sistema no necesariamente sabe lo que quiere

Las indicaciones musicales admiten muchas interpretaciones.

«Alegre» puede referirse a una canción infantil, música electrónica de baile, folk animado o incluso música de fondo luminosa, habitual en los anuncios. Si la aplicación solo ofrece un cuadro de texto grande, cuando los usuarios obtienen resultados insatisfactorios, a menudo no saben qué frase deberían cambiar.

Se pueden dividir los requisitos de creación en varias preguntas más fáciles de responder:

¿Para qué se utilizará esta música?
Vídeos cortos / Podcasts / Juegos / Anuncios / Canciones personales

¿Qué sensación quieres que transmita?
Relajada / Enérgica / Cálida / Misteriosa / Contenida

¿Necesita voz humana?
Canción completa / Algo de voz / Música instrumental

¿Qué elementos no quieres que aparezcan?
Heavy metal / Sintetizadores estridentes / Ritmos de batería intensos / Est

ya está en la cola ↓ Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submitToSuno(task);
await bindProviderTaskId(task.id, upstream.task_id);

Una tarea de generación es un objeto de negocio que existe durante un periodo prolongado, no una solicitud de red temporal. Comprender este punto facilita mucho la gestión de las esperas, los reintentos y el historial.

Cuando el usuario dice «haz una canción alegre», el sistema no necesariamente sabe lo que quiere

Las indicaciones musicales admiten muchas interpretaciones.

«Alegre» puede referirse a una canción infantil, música electrónica de baile, folk animado o incluso música de fondo luminosa, habitual en los anuncios. Si la aplicación solo ofrece un cuadro de texto grande, cuando los usuarios obtienen resultados insatisfactorios, a menudo no saben qué frase deberían cambiar.

Se pueden dividir los requisitos de creación en varias preguntas más fáciles de responder:

¿Para qué se utilizará esta música?
Vídeos cortos / Podcasts / Juegos / Anuncios / Canciones personales

¿Qué sensación quieres que transmita?
Relajada / Enérgica / Cálida / Misteriosa / Contenida

¿Necesita voz humana?
Canción completa / Algo de voz / Música instrumental

¿Qué elementos no quieres que aparezcan?
Heavy metal / Sintetizadores estridentes / Ritmos de batería intensos / Estilo vocal exagerado

Después, el backend puede combinar las respuestas para crear la indicación:

function buildPrompt(form) {
  return [
    `

ya está en la cola ↓ Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submitToSuno(task);
await bindProviderTaskId(task.id, upstream.task_id);

Una tarea de generación es un objeto de negocio que existe durante un periodo prolongado, no una solicitud de red temporal. Comprender este punto facilita mucho la gestión de las esperas, los reintentos y el historial.

Cuando el usuario dice «haz una canción alegre», el sistema no necesariamente sabe lo que quiere

Las indicaciones musicales admiten muchas interpretaciones.

«Alegre» puede referirse a una canción infantil, música electrónica de baile, folk animado o incluso música de fondo luminosa, habitual en los anuncios. Si la aplicación solo ofrece un cuadro de texto grande, cuando los usuarios obtienen resultados insatisfactorios, a menudo no saben qué frase deberían cambiar.

Se pueden dividir los requisitos de creación en varias preguntas más fáciles de responder:

¿Para qué se utilizará esta música?
Vídeos cortos / Podcasts / Juegos / Anuncios / Canciones personales

¿Qué sensación quieres que transmita?
Relajada / Enérgica / Cálida / Misteriosa / Contenida

¿Necesita voz humana?
Canción completa / Algo de voz / Música instrumental

¿Qué elementos no quieres que aparezcan?
Heavy metal / Sintetizadores estridentes / Ritmos de batería intensos / Estilo vocal exagerado

Después, el backend puede combinar las respuestas para crear la indicación:

function buildPrompt(form) {
  return [
    `Uso: ${form.useCase}`,
    `Estilo: ${form.genre}`,
    `Estado de ánimo: ${

ya está en la cola ↓ Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submitToSuno(task);
await bindProviderTaskId(task.id, upstream.task_id);

Una tarea de generación es un objeto de negocio que existe durante un periodo prolongado, no una solicitud de red temporal. Comprender este punto facilita mucho la gestión de las esperas, los reintentos y el historial.

Cuando el usuario dice «haz una canción alegre», el sistema no necesariamente sabe lo que quiere

Las indicaciones musicales admiten muchas interpretaciones.

«Alegre» puede referirse a una canción infantil, música electrónica de baile, folk animado o incluso música de fondo luminosa, habitual en los anuncios. Si la aplicación solo ofrece un cuadro de texto grande, cuando los usuarios obtienen resultados insatisfactorios, a menudo no saben qué frase deberían cambiar.

Se pueden dividir los requisitos de creación en varias preguntas más fáciles de responder:

¿Para qué se utilizará esta música?
Vídeos cortos / Podcasts / Juegos / Anuncios / Canciones personales

¿Qué sensación quieres que transmita?
Relajada / Enérgica / Cálida / Misteriosa / Contenida

¿Necesita voz humana?
Canción completa / Algo de voz / Música instrumental

¿Qué elementos no quieres que aparezcan?
Heavy metal / Sintetizadores estridentes / Ritmos de batería intensos / Estilo vocal exagerado

Después, el backend puede combinar las respuestas para crear la indicación:

function buildPrompt(form) {
  return [
    `Uso: ${form.useCase}`,
    `Estilo: ${form.genre}`,
    `Estado de ánimo: ${form.mood}`,
    `Instrumentos principales: ${form.instruments.join(", ")}`,
    `Requisitos de estructura: ${form.structure}`,
    `Ev

ya está en la cola ↓ Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submitToSuno(task);
await bindProviderTaskId(task.id, upstream.task_id);

Una tarea de generación es un objeto de negocio que existe durante un periodo prolongado, no una solicitud de red temporal. Comprender este punto facilita mucho la gestión de las esperas, los reintentos y el historial.

Cuando el usuario dice «haz una canción alegre», el sistema no necesariamente sabe lo que quiere

Las indicaciones musicales admiten muchas interpretaciones.

«Alegre» puede referirse a una canción infantil, música electrónica de baile, folk animado o incluso música de fondo luminosa, habitual en los anuncios. Si la aplicación solo ofrece un cuadro de texto grande, cuando los usuarios obtienen resultados insatisfactorios, a menudo no saben qué frase deberían cambiar.

Se pueden dividir los requisitos de creación en varias preguntas más fáciles de responder:

¿Para qué se utilizará esta música?
Vídeos cortos / Podcasts / Juegos / Anuncios / Canciones personales

¿Qué sensación quieres que transmita?
Relajada / Enérgica / Cálida / Misteriosa / Contenida

¿Necesita voz humana?
Canción completa / Algo de voz / Música instrumental

¿Qué elementos no quieres que aparezcan?
Heavy metal / Sintetizadores estridentes / Ritmos de batería intensos / Estilo vocal exagerado

Después, el backend puede combinar las respuestas para crear la indicación:

function buildPrompt(form) {
  return [
    `Uso: ${form.useCase}`,
    `Estilo: ${form.genre}`,
    `Estado de ánimo: ${form.mood}`,
    `Instrumentos principales: ${form.instruments.join(", ")}`,
    `Requisitos de estructura: ${form.structure}`,
    `Evitar: ${form.negative.join(", ")}`
  ].join(";");
}

Para los usuarios más profesionales, se pueden habilitar parámetros como style, negative_tags, `vocal_gender ya está en la cola ↓ Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submitToSuno(task);
await bindProviderTaskId(task.id, upstream.task_id);

Una tarea de generación es un objeto de negocio que existe durante un periodo prolongado, no una solicitud de red temporal. Comprender este punto facilita mucho la gestión de las esperas, los reintentos y el historial.

Cuando el usuario dice «haz una canción alegre», el sistema no necesariamente sabe lo que quiere

Las indicaciones musicales admiten muchas interpretaciones.

«Alegre» puede referirse a una canción infantil, música electrónica de baile, folk animado o incluso música de fondo luminosa, habitual en los anuncios. Si la aplicación solo ofrece un cuadro de texto grande, cuando los usuarios obtienen resultados insatisfactorios, a menudo no saben qué frase deberían cambiar.

Se pueden dividir los requisitos de creación en varias preguntas más fáciles de responder:

¿Para qué se utilizará esta música?
Vídeos cortos / Podcasts / Juegos / Anuncios / Canciones personales

¿Qué sensación quieres que transmita?
Relajada / Enérgica / Cálida / Misteriosa / Contenida

¿Necesita voz humana?
Canción completa / Algo de voz / Música instrumental

¿Qué elementos no quieres que aparezcan?
Heavy metal / Sintetizadores estridentes / Ritmos de batería intensos / Estilo vocal exagerado

Después, el backend puede combinar las respuestas para crear la indicación:

function buildPrompt(form) {
  return [
    `Uso: ${form.useCase}`,
    `Estilo: ${form.genre}`,
    `Estado de ánimo: ${form.mood}`,
    `Instrumentos principales: ${form.instruments.join(", ")}`,
    `Requisitos de estructura: ${form.structure}`,
    `Evitar: ${form.negative.join(", ")}`
  ].join(";");
}

Para los usuarios más profesionales, se pueden habilitar parámetros como style, negative_tags, vocal_gender, weirdness y style_influence. Los usuarios normales no necesitan ver los campos subyacentes; solo necesitan un lenguaje de producto más natural.

Control subyacente Texto de la interfaz
style_influence Ajustarse más al estilo
    ↓

Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submitToSuno(task);
await bindProviderTaskId(task.id, upstream.task_id);

Una tarea de generación es un objeto de negocio que existe durante un periodo prolongado, no una solicitud de red temporal. Comprender este punto facilita mucho la gestión de las esperas, los reintentos y el historial.

Cuando el usuario dice «haz una canción alegre», el sistema no necesariamente sabe lo que quiere

Las indicaciones musicales admiten muchas interpretaciones.

«Alegre» puede referirse a una canción infantil, música electrónica de baile, folk animado o incluso música de fondo luminosa, habitual en los anuncios. Si la aplicación solo ofrece un cuadro de texto grande, cuando los usuarios obtienen resultados insatisfactorios, a menudo no saben qué frase deberían cambiar.

Se pueden dividir los requisitos de creación en varias preguntas más fáciles de responder:

¿Para qué se utilizará esta música?
Vídeos cortos / Podcasts / Juegos / Anuncios / Canciones personales

¿Qué sensación quieres que transmita?
Relajada / Enérgica / Cálida / Misteriosa / Contenida

¿Necesita voz humana?
Canción completa / Algo de voz / Música instrumental

¿Qué elementos no quieres que aparezcan?
Heavy metal / Sintetizadores estridentes / Ritmos de batería intensos / Estilo vocal exagerado

Después, el backend puede combinar las respuestas para crear la indicación:

function buildPrompt(form) {
  return [
    `Uso: ${form.useCase}`,
    `Estilo: ${form.genre}`,
    `Estado de ánimo: ${form.mood}`,
    `Instrumentos principales: ${form.instruments.join(", ")}`,
    `Requisitos de estructura: ${form.structure}`,
    `Evitar: ${form.negative.join(", ")}`
  ].join(";");
}

Para los usuarios más profesionales, se pueden habilitar parámetros como style, negative_tags, vocal_gender, weirdness y style_influence. Los usuarios normales no necesitan ver los campos subyacentes; solo necesitan un lenguaje de producto más natural.

Control subyacente Texto de la interfaz
style_influence Ajustarse más al estilo seleccionado
weirdness
    ↓

Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submitToSuno(task);
await bindProviderTaskId(task.id, upstream.task_id);

Una tarea de generación es un objeto de negocio que existe durante un periodo prolongado, no una solicitud de red temporal. Comprender este punto facilita mucho la gestión de las esperas, los reintentos y el historial.

Cuando el usuario dice «haz una canción alegre», el sistema no necesariamente sabe lo que quiere

Las indicaciones musicales admiten muchas interpretaciones.

«Alegre» puede referirse a una canción infantil, música electrónica de baile, folk animado o incluso música de fondo luminosa, habitual en los anuncios. Si la aplicación solo ofrece un cuadro de texto grande, cuando los usuarios obtienen resultados insatisfactorios, a menudo no saben qué frase deberían cambiar.

Se pueden dividir los requisitos de creación en varias preguntas más fáciles de responder:

¿Para qué se utilizará esta música?
Vídeos cortos / Podcasts / Juegos / Anuncios / Canciones personales

¿Qué sensación quieres que transmita?
Relajada / Enérgica / Cálida / Misteriosa / Contenida

¿Necesita voz humana?
Canción completa / Algo de voz / Música instrumental

¿Qué elementos no quieres que aparezcan?
Heavy metal / Sintetizadores estridentes / Ritmos de batería intensos / Estilo vocal exagerado

Después, el backend puede combinar las respuestas para crear la indicación:

function buildPrompt(form) {
  return [
    `Uso: ${form.useCase}`,
    `Estilo: ${form.genre}`,
    `Estado de ánimo: ${form.mood}`,
    `Instrumentos principales: ${form.instruments.join(", ")}`,
    `Requisitos de estructura: ${form.structure}`,
    `Evitar: ${form.negative.join(", ")}`
  ].join(";");
}

Para los usuarios más profesionales, se pueden habilitar parámetros como style, negative_tags, vocal_gender, weirdness y style_influence. Los usuarios normales no necesitan ver los campos subyacentes; solo necesitan un lenguaje de producto más natural.

Control subyacente Texto de la interfaz
style_influence Ajustarse más al estilo seleccionado
weirdness Más atrevido y experimental
negative_tags Elementos que no se desean
vocal_gender Voz de
    ↓

Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submitToSuno(task);
await bindProviderTaskId(task.id, upstream.task_id);

Una tarea de generación es un objeto de negocio que existe durante un periodo prolongado, no una solicitud de red temporal. Comprender este punto facilita mucho la gestión de las esperas, los reintentos y el historial.

Cuando el usuario dice «haz una canción alegre», el sistema no necesariamente sabe lo que quiere

Las indicaciones musicales admiten muchas interpretaciones.

«Alegre» puede referirse a una canción infantil, música electrónica de baile, folk animado o incluso música de fondo luminosa, habitual en los anuncios. Si la aplicación solo ofrece un cuadro de texto grande, cuando los usuarios obtienen resultados insatisfactorios, a menudo no saben qué frase deberían cambiar.

Se pueden dividir los requisitos de creación en varias preguntas más fáciles de responder:

¿Para qué se utilizará esta música?
Vídeos cortos / Podcasts / Juegos / Anuncios / Canciones personales

¿Qué sensación quieres que transmita?
Relajada / Enérgica / Cálida / Misteriosa / Contenida

¿Necesita voz humana?
Canción completa / Algo de voz / Música instrumental

¿Qué elementos no quieres que aparezcan?
Heavy metal / Sintetizadores estridentes / Ritmos de batería intensos / Estilo vocal exagerado

Después, el backend puede combinar las respuestas para crear la indicación:

function buildPrompt(form) {
  return [
    `Uso: ${form.useCase}`,
    `Estilo: ${form.genre}`,
    `Estado de ánimo: ${form.mood}`,
    `Instrumentos principales: ${form.instruments.join(", ")}`,
    `Requisitos de estructura: ${form.structure}`,
    `Evitar: ${form.negative.join(", ")}`
  ].join(";");
}

Para los usuarios más profesionales, se pueden habilitar parámetros como style, negative_tags, vocal_gender, weirdness y style_influence. Los usuarios normales no necesitan ver los campos subyacentes; solo necesitan un lenguaje de producto más natural.

Control subyacente Texto de la interfaz
style_influence Ajustarse más al estilo seleccionado
weirdness Más atrevido y experimental
negative_tags Elementos que no se desean
vocal_gender Voz de canto preferida
instrumental No necesita voz humana

De este modo, se conserva la capacidad de control sin trasladar literalmente la documentación de la API a la interfaz del usuario.

Lo que más teme el coste no es que sea elevado, sino no saber en qué se está gastando

El coste de las llamadas de una aplicación musical no procede únicamente de la generación inicial.

Los usuarios pueden continuar una canción, sustituir fragmentos, hacer versiones de otras canciones, separar pistas o exportar otros formatos. El consumo de créditos tampoco es exactamente el mismo en todas las operaciones. Ace Data Cloud aplica diferentes reglas de facturación a operaciones como la generación estándar, el modo mejorado, la sustitución de fragmentos y la separación multipista; el precio vigente del servicio debe ser la referencia definitiva.

Por eso, la aplicación no debería limitarse a guardar «cuántas veces le quedan al usuario», sino que debería crear su propio registro de movimientos de créditos:

CREATE TABLE credit_ledger (
  id          UUID PRIMARY KEY,
  user_id     UUID NOT NULL,
  task_id

ya está en la cola ↓ Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submitToSuno(task);
await bindProviderTaskId(task.id, upstream.task_id);

Una tarea de generación es un objeto de negocio que existe durante un periodo prolongado, no una solicitud de red temporal. Comprender este punto facilita mucho la gestión de las esperas, los reintentos y el historial.

Cuando el usuario dice «haz una canción alegre», el sistema no necesariamente sabe lo que quiere

Las indicaciones musicales admiten muchas interpretaciones.

«Alegre» puede referirse a una canción infantil, música electrónica de baile, folk animado o incluso música de fondo luminosa, habitual en los anuncios. Si la aplicación solo ofrece un cuadro de texto grande, cuando los usuarios obtienen resultados insatisfactorios, a menudo no saben qué frase deberían cambiar.

Se pueden dividir los requisitos de creación en varias preguntas más fáciles de responder:

¿Para qué se utilizará esta música?
Vídeos cortos / Podcasts / Juegos / Anuncios / Canciones personales

¿Qué sensación quieres que transmita?
Relajada / Enérgica / Cálida / Misteriosa / Contenida

¿Necesita voz humana?
Canción completa / Algo de voz / Música instrumental

¿Qué elementos no quieres que aparezcan?
Heavy metal / Sintetizadores estridentes / Ritmos de batería intensos / Estilo vocal exagerado

Después, el backend puede combinar las respuestas para crear la indicación:

function buildPrompt(form) {
  return [
    `Uso: ${form.useCase}`,
    `Estilo: ${form.genre}`,
    `Estado de ánimo: ${form.mood}`,
    `Instrumentos principales: ${form.instruments.join(", ")}`,
    `Requisitos de estructura: ${form.structure}`,
    `Evitar: ${form.negative.join(", ")}`
  ].join(";");
}

Para los usuarios más profesionales, se pueden habilitar parámetros como style, negative_tags, vocal_gender, weirdness y style_influence. Los usuarios normales no necesitan ver los campos subyacentes; solo necesitan un lenguaje de producto más natural.

Control subyacente Texto de la interfaz
style_influence Ajustarse más al estilo seleccionado
weirdness Más atrevido y experimental
negative_tags Elementos que no se desean
vocal_gender Voz de canto preferida
instrumental No necesita voz humana

De este modo, se conserva la capacidad de control sin trasladar literalmente la documentación de la API a la interfaz del usuario.

Lo que más teme el coste no es que sea elevado, sino no saber en qué se está gastando

El coste de las llamadas de una aplicación musical no procede únicamente de la generación inicial.

Los usuarios pueden continuar una canción, sustituir fragmentos, hacer versiones de otras canciones, separar pistas o exportar otros formatos. El consumo de créditos tampoco es exactamente el mismo en todas las operaciones. Ace Data Cloud aplica diferentes reglas de facturación a operaciones como la generación estándar, el modo mejorado, la sustitución de fragmentos y la separación multipista; el precio vigente del servicio debe ser la referencia definitiva.

Por eso, la aplicación no debería limitarse a guardar «cuántas veces le quedan al usuario», sino que debería crear su propio registro de movimientos de créditos:

CREATE TABLE credit_ledger (
  id          UUID PRIMARY KEY,
  user_id     UUID NOT NULL,
  task_id     UUID,
  type        VARCHAR(32) NOT NULL,
  amount      DECIMAL(10, 4) NOT NULL,
  description

ya está en la cola ↓ Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submitToSuno(task);
await bindProviderTaskId(task.id, upstream.task_id);

Una tarea de generación es un objeto de negocio que existe durante un periodo prolongado, no una solicitud de red temporal. Comprender este punto facilita mucho la gestión de las esperas, los reintentos y el historial.

Cuando el usuario dice «haz una canción alegre», el sistema no necesariamente sabe lo que quiere

Las indicaciones musicales admiten muchas interpretaciones.

«Alegre» puede referirse a una canción infantil, música electrónica de baile, folk animado o incluso música de fondo luminosa, habitual en los anuncios. Si la aplicación solo ofrece un cuadro de texto grande, cuando los usuarios obtienen resultados insatisfactorios, a menudo no saben qué frase deberían cambiar.

Se pueden dividir los requisitos de creación en varias preguntas más fáciles de responder:

¿Para qué se utilizará esta música?
Vídeos cortos / Podcasts / Juegos / Anuncios / Canciones personales

¿Qué sensación quieres que transmita?
Relajada / Enérgica / Cálida / Misteriosa / Contenida

¿Necesita voz humana?
Canción completa / Algo de voz / Música instrumental

¿Qué elementos no quieres que aparezcan?
Heavy metal / Sintetizadores estridentes / Ritmos de batería intensos / Estilo vocal exagerado

Después, el backend puede combinar las respuestas para crear la indicación:

function buildPrompt(form) {
  return [
    `Uso: ${form.useCase}`,
    `Estilo: ${form.genre}`,
    `Estado de ánimo: ${form.mood}`,
    `Instrumentos principales: ${form.instruments.join(", ")}`,
    `Requisitos de estructura: ${form.structure}`,
    `Evitar: ${form.negative.join(", ")}`
  ].join(";");
}

Para los usuarios más profesionales, se pueden habilitar parámetros como style, negative_tags, vocal_gender, weirdness y style_influence. Los usuarios normales no necesitan ver los campos subyacentes; solo necesitan un lenguaje de producto más natural.

Control subyacente Texto de la interfaz
style_influence Ajustarse más al estilo seleccionado
weirdness Más atrevido y experimental
negative_tags Elementos que no se desean
vocal_gender Voz de canto preferida
instrumental No necesita voz humana

De este modo, se conserva la capacidad de control sin trasladar literalmente la documentación de la API a la interfaz del usuario.

Lo que más teme el coste no es que sea elevado, sino no saber en qué se está gastando

El coste de las llamadas de una aplicación musical no procede únicamente de la generación inicial.

Los usuarios pueden continuar una canción, sustituir fragmentos, hacer versiones de otras canciones, separar pistas o exportar otros formatos. El consumo de créditos tampoco es exactamente el mismo en todas las operaciones. Ace Data Cloud aplica diferentes reglas de facturación a operaciones como la generación estándar, el modo mejorado, la sustitución de fragmentos y la separación multipista; el precio vigente del servicio debe ser la referencia definitiva.

Por eso, la aplicación no debería limitarse a guardar «cuántas veces le quedan al usuario», sino que debería crear su propio registro de movimientos de créditos:

CREATE TABLE credit_ledger (
  id          UUID PRIMARY KEY,
  user_id     UUID NOT NULL,
  task_id     UUID,
  type        VARCHAR(32) NOT NULL,
  amount      DECIMAL(10, 4) NOT NULL,
  description TEXT,
  created_at  TIMESTAMP NOT NULL DEFAULT NOW

ya está en la cola ↓ Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submitToSuno(task);
await bindProviderTaskId(task.id, upstream.task_id);

Una tarea de generación es un objeto de negocio que existe durante un periodo prolongado, no una solicitud de red temporal. Comprender este punto facilita mucho la gestión de las esperas, los reintentos y el historial.

Cuando el usuario dice «haz una canción alegre», el sistema no necesariamente sabe lo que quiere

Las indicaciones musicales admiten muchas interpretaciones.

«Alegre» puede referirse a una canción infantil, música electrónica de baile, folk animado o incluso música de fondo luminosa, habitual en los anuncios. Si la aplicación solo ofrece un cuadro de texto grande, cuando los usuarios obtienen resultados insatisfactorios, a menudo no saben qué frase deberían cambiar.

Se pueden dividir los requisitos de creación en varias preguntas más fáciles de responder:

¿Para qué se utilizará esta música?
Vídeos cortos / Podcasts / Juegos / Anuncios / Canciones personales

¿Qué sensación quieres que transmita?
Relajada / Enérgica / Cálida / Misteriosa / Contenida

¿Necesita voz humana?
Canción completa / Algo de voz / Música instrumental

¿Qué elementos no quieres que aparezcan?
Heavy metal / Sintetizadores estridentes / Ritmos de batería intensos / Estilo vocal exagerado

Después, el backend puede combinar las respuestas para crear la indicación:

function buildPrompt(form) {
  return [
    `Uso: ${form.useCase}`,
    `Estilo: ${form.genre}`,
    `Estado de ánimo: ${form.mood}`,
    `Instrumentos principales: ${form.instruments.join(", ")}`,
    `Requisitos de estructura: ${form.structure}`,
    `Evitar: ${form.negative.join(", ")}`
  ].join(";");
}

Para los usuarios más profesionales, se pueden habilitar parámetros como style, negative_tags, vocal_gender, weirdness y style_influence. Los usuarios normales no necesitan ver los campos subyacentes; solo necesitan un lenguaje de producto más natural.

Control subyacente Texto de la interfaz
style_influence Ajustarse más al estilo seleccionado
weirdness Más atrevido y experimental
negative_tags Elementos que no se desean
vocal_gender Voz de canto preferida
instrumental No necesita voz humana

De este modo, se conserva la capacidad de control sin trasladar literalmente la documentación de la API a la interfaz del usuario.

Lo que más teme el coste no es que sea elevado, sino no saber en qué se está gastando

El coste de las llamadas de una aplicación musical no procede únicamente de la generación inicial.

Los usuarios pueden continuar una canción, sustituir fragmentos, hacer versiones de otras canciones, separar pistas o exportar otros formatos. El consumo de créditos tampoco es exactamente el mismo en todas las operaciones. Ace Data Cloud aplica diferentes reglas de facturación a operaciones como la generación estándar, el modo mejorado, la sustitución de fragmentos y la separación multipista; el precio vigente del servicio debe ser la referencia definitiva.

Por eso, la aplicación no debería limitarse a guardar «cuántas veces le quedan al usuario», sino que debería crear su propio registro de movimientos de créditos:

CREATE TABLE credit_ledger (
  id          UUID PRIMARY KEY,
  user_id     UUID NOT NULL,
  task_id     UUID,
  type        VARCHAR(32) NOT NULL,
  amount      DECIMAL(10, 4) NOT NULL,
  description TEXT,
  created_at  TIMESTAMP NOT NULL DEFAULT NOW()
);

Una generación puede experimentar los siguientes cambios contables:

Enviar tarea

ya está en la cola ↓ Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submitToSuno(task);
await bindProviderTaskId(task.id, upstream.task_id);

Una tarea de generación es un objeto de negocio que existe durante un periodo prolongado, no una solicitud de red temporal. Comprender este punto facilita mucho la gestión de las esperas, los reintentos y el historial.

Cuando el usuario dice «haz una canción alegre», el sistema no necesariamente sabe lo que quiere

Las indicaciones musicales admiten muchas interpretaciones.

«Alegre» puede referirse a una canción infantil, música electrónica de baile, folk animado o incluso música de fondo luminosa, habitual en los anuncios. Si la aplicación solo ofrece un cuadro de texto grande, cuando los usuarios obtienen resultados insatisfactorios, a menudo no saben qué frase deberían cambiar.

Se pueden dividir los requisitos de creación en varias preguntas más fáciles de responder:

¿Para qué se utilizará esta música?
Vídeos cortos / Podcasts / Juegos / Anuncios / Canciones personales

¿Qué sensación quieres que transmita?
Relajada / Enérgica / Cálida / Misteriosa / Contenida

¿Necesita voz humana?
Canción completa / Algo de voz / Música instrumental

¿Qué elementos no quieres que aparezcan?
Heavy metal / Sintetizadores estridentes / Ritmos de batería intensos / Estilo vocal exagerado

Después, el backend puede combinar las respuestas para crear la indicación:

function buildPrompt(form) {
  return [
    `Uso: ${form.useCase}`,
    `Estilo: ${form.genre}`,
    `Estado de ánimo: ${form.mood}`,
    `Instrumentos principales: ${form.instruments.join(", ")}`,
    `Requisitos de estructura: ${form.structure}`,
    `Evitar: ${form.negative.join(", ")}`
  ].join(";");
}

Para los usuarios más profesionales, se pueden habilitar parámetros como style, negative_tags, vocal_gender, weirdness y style_influence. Los usuarios normales no necesitan ver los campos subyacentes; solo necesitan un lenguaje de producto más natural.

Control subyacente Texto de la interfaz
style_influence Ajustarse más al estilo seleccionado
weirdness Más atrevido y experimental
negative_tags Elementos que no se desean
vocal_gender Voz de canto preferida
instrumental No necesita voz humana

De este modo, se conserva la capacidad de control sin trasladar literalmente la documentación de la API a la interfaz del usuario.

Lo que más teme el coste no es que sea elevado, sino no saber en qué se está gastando

El coste de las llamadas de una aplicación musical no procede únicamente de la generación inicial.

Los usuarios pueden continuar una canción, sustituir fragmentos, hacer versiones de otras canciones, separar pistas o exportar otros formatos. El consumo de créditos tampoco es exactamente el mismo en todas las operaciones. Ace Data Cloud aplica diferentes reglas de facturación a operaciones como la generación estándar, el modo mejorado, la sustitución de fragmentos y la separación multipista; el precio vigente del servicio debe ser la referencia definitiva.

Por eso, la aplicación no debería limitarse a guardar «cuántas veces le quedan al usuario», sino que debería crear su propio registro de movimientos de créditos:

CREATE TABLE credit_ledger (
  id          UUID PRIMARY KEY,
  user_id     UUID NOT NULL,
  task_id     UUID,
  type        VARCHAR(32) NOT NULL,
  amount      DECIMAL(10, 4) NOT NULL,
  description TEXT,
  created_at  TIMESTAMP NOT NULL DEFAULT NOW()
);

Una generación puede experimentar los siguientes cambios contables:

Enviar tarea      -0.56  Deducción provisional
Generación exitosa  0.00  Confirm

ya está en la cola ↓ Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submitToSuno(task);
await bindProviderTaskId(task.id, upstream.task_id);

Una tarea de generación es un objeto de negocio que existe durante un periodo prolongado, no una solicitud de red temporal. Comprender este punto facilita mucho la gestión de las esperas, los reintentos y el historial.

Cuando el usuario dice «haz una canción alegre», el sistema no necesariamente sabe lo que quiere

Las indicaciones musicales admiten muchas interpretaciones.

«Alegre» puede referirse a una canción infantil, música electrónica de baile, folk animado o incluso música de fondo luminosa, habitual en los anuncios. Si la aplicación solo ofrece un cuadro de texto grande, cuando los usuarios obtienen resultados insatisfactorios, a menudo no saben qué frase deberían cambiar.

Se pueden dividir los requisitos de creación en varias preguntas más fáciles de responder:

¿Para qué se utilizará esta música?
Vídeos cortos / Podcasts / Juegos / Anuncios / Canciones personales

¿Qué sensación quieres que transmita?
Relajada / Enérgica / Cálida / Misteriosa / Contenida

¿Necesita voz humana?
Canción completa / Algo de voz / Música instrumental

¿Qué elementos no quieres que aparezcan?
Heavy metal / Sintetizadores estridentes / Ritmos de batería intensos / Estilo vocal exagerado

Después, el backend puede combinar las respuestas para crear la indicación:

function buildPrompt(form) {
  return [
    `Uso: ${form.useCase}`,
    `Estilo: ${form.genre}`,
    `Estado de ánimo: ${form.mood}`,
    `Instrumentos principales: ${form.instruments.join(", ")}`,
    `Requisitos de estructura: ${form.structure}`,
    `Evitar: ${form.negative.join(", ")}`
  ].join(";");
}

Para los usuarios más profesionales, se pueden habilitar parámetros como style, negative_tags, vocal_gender, weirdness y style_influence. Los usuarios normales no necesitan ver los campos subyacentes; solo necesitan un lenguaje de producto más natural.

Control subyacente Texto de la interfaz
style_influence Ajustarse más al estilo seleccionado
weirdness Más atrevido y experimental
negative_tags Elementos que no se desean
vocal_gender Voz de canto preferida
instrumental No necesita voz humana

De este modo, se conserva la capacidad de control sin trasladar literalmente la documentación de la API a la interfaz del usuario.

Lo que más teme el coste no es que sea elevado, sino no saber en qué se está gastando

El coste de las llamadas de una aplicación musical no procede únicamente de la generación inicial.

Los usuarios pueden continuar una canción, sustituir fragmentos, hacer versiones de otras canciones, separar pistas o exportar otros formatos. El consumo de créditos tampoco es exactamente el mismo en todas las operaciones. Ace Data Cloud aplica diferentes reglas de facturación a operaciones como la generación estándar, el modo mejorado, la sustitución de fragmentos y la separación multipista; el precio vigente del servicio debe ser la referencia definitiva.

Por eso, la aplicación no debería limitarse a guardar «cuántas veces le quedan al usuario», sino que debería crear su propio registro de movimientos de créditos:

CREATE TABLE credit_ledger (
  id          UUID PRIMARY KEY,
  user_id     UUID NOT NULL,
  task_id     UUID,
  type        VARCHAR(32) NOT NULL,
  amount      DECIMAL(10, 4) NOT NULL,
  description TEXT,
  created_at  TIMESTAMP NOT NULL DEFAULT NOW()
);

Una generación puede experimentar los siguientes cambios contables:

Enviar tarea      -0.56  Deducción provisional
Generación exitosa  0.00  Confirmación del consumo

O bien

Enviar tarea      -0.56

ya está en la cola ↓ Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submitToSuno(task);
await bindProviderTaskId(task.id, upstream.task_id);

Una tarea de generación es un objeto de negocio que existe durante un periodo prolongado, no una solicitud de red temporal. Comprender este punto facilita mucho la gestión de las esperas, los reintentos y el historial.

Cuando el usuario dice «haz una canción alegre», el sistema no necesariamente sabe lo que quiere

Las indicaciones musicales admiten muchas interpretaciones.

«Alegre» puede referirse a una canción infantil, música electrónica de baile, folk animado o incluso música de fondo luminosa, habitual en los anuncios. Si la aplicación solo ofrece un cuadro de texto grande, cuando los usuarios obtienen resultados insatisfactorios, a menudo no saben qué frase deberían cambiar.

Se pueden dividir los requisitos de creación en varias preguntas más fáciles de responder:

¿Para qué se utilizará esta música?
Vídeos cortos / Podcasts / Juegos / Anuncios / Canciones personales

¿Qué sensación quieres que transmita?
Relajada / Enérgica / Cálida / Misteriosa / Contenida

¿Necesita voz humana?
Canción completa / Algo de voz / Música instrumental

¿Qué elementos no quieres que aparezcan?
Heavy metal / Sintetizadores estridentes / Ritmos de batería intensos / Estilo vocal exagerado

Después, el backend puede combinar las respuestas para crear la indicación:

function buildPrompt(form) {
  return [
    `Uso: ${form.useCase}`,
    `Estilo: ${form.genre}`,
    `Estado de ánimo: ${form.mood}`,
    `Instrumentos principales: ${form.instruments.join(", ")}`,
    `Requisitos de estructura: ${form.structure}`,
    `Evitar: ${form.negative.join(", ")}`
  ].join(";");
}

Para los usuarios más profesionales, se pueden habilitar parámetros como style, negative_tags, vocal_gender, weirdness y style_influence. Los usuarios normales no necesitan ver los campos subyacentes; solo necesitan un lenguaje de producto más natural.

Control subyacente Texto de la interfaz
style_influence Ajustarse más al estilo seleccionado
weirdness Más atrevido y experimental
negative_tags Elementos que no se desean
vocal_gender Voz de canto preferida
instrumental No necesita voz humana

De este modo, se conserva la capacidad de control sin trasladar literalmente la documentación de la API a la interfaz del usuario.

Lo que más teme el coste no es que sea elevado, sino no saber en qué se está gastando

El coste de las llamadas de una aplicación musical no procede únicamente de la generación inicial.

Los usuarios pueden continuar una canción, sustituir fragmentos, hacer versiones de otras canciones, separar pistas o exportar otros formatos. El consumo de créditos tampoco es exactamente el mismo en todas las operaciones. Ace Data Cloud aplica diferentes reglas de facturación a operaciones como la generación estándar, el modo mejorado, la sustitución de fragmentos y la separación multipista; el precio vigente del servicio debe ser la referencia definitiva.

Por eso, la aplicación no debería limitarse a guardar «cuántas veces le quedan al usuario», sino que debería crear su propio registro de movimientos de créditos:

CREATE TABLE credit_ledger (
  id          UUID PRIMARY KEY,
  user_id     UUID NOT NULL,
  task_id     UUID,
  type        VARCHAR(32) NOT NULL,
  amount      DECIMAL(10, 4) NOT NULL,
  description TEXT,
  created_at  TIMESTAMP NOT NULL DEFAULT NOW()
);

Una generación puede experimentar los siguientes cambios contables:

Enviar tarea      -0.56  Deducción provisional
Generación exitosa  0.00  Confirmación del consumo

O bien

Enviar tarea      -0.56  Deducción provisional
Generación fallida +0.56  Devolución automática

Estas cifras solo sirven para ilustrar el diseño del registro; el consumo real debe calcularse consultando los precios vigentes del servicio antes de realizar la solicitud.

La interfaz del usuario también debería indicarle, antes de hacer clic, cuántos créditos internos puede consumir esta operación. Una indicación clara de los costes suele generar más confianza que ocultar los precios.

Si el producto adopta un modelo de suscripción, los planes pueden diseñarse según los flujos de trabajo, en lugar de copiar simplemente los créditos del proveedor:

| Tipo de plan | Benef | |--------|--------| ya está en la cola ↓ Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submitToSuno(task);
await bindProviderTaskId(task.id, upstream.task_id);

Una tarea de generación es un objeto de negocio que existe durante un periodo prolongado, no una solicitud de red temporal. Comprender este punto facilita mucho la gestión de las esperas, los reintentos y el historial.

Cuando el usuario dice «haz una canción alegre», el sistema no necesariamente sabe lo que quiere

Las indicaciones musicales admiten muchas interpretaciones.

«Alegre» puede referirse a una canción infantil, música electrónica de baile, folk animado o incluso música de fondo luminosa, habitual en los anuncios. Si la aplicación solo ofrece un cuadro de texto grande, cuando los usuarios obtienen resultados insatisfactorios, a menudo no saben qué frase deberían cambiar.

Se pueden dividir los requisitos de creación en varias preguntas más fáciles de responder:

¿Para qué se utilizará esta música?
Vídeos cortos / Podcasts / Juegos / Anuncios / Canciones personales

¿Qué sensación quieres que transmita?
Relajada / Enérgica / Cálida / Misteriosa / Contenida

¿Necesita voz humana?
Canción completa / Algo de voz / Música instrumental

¿Qué elementos no quieres que aparezcan?
Heavy metal / Sintetizadores estridentes / Ritmos de batería intensos / Estilo vocal exagerado

Después, el backend puede combinar las respuestas para crear la indicación:

function buildPrompt(form) {
  return [
    `Uso: ${form.useCase}`,
    `Estilo: ${form.genre}`,
    `Estado de ánimo: ${form.mood}`,
    `Instrumentos principales: ${form.instruments.join(", ")}`,
    `Requisitos de estructura: ${form.structure}`,
    `Evitar: ${form.negative.join(", ")}`
  ].join(";");
}

Para los usuarios más profesionales, se pueden habilitar parámetros como style, negative_tags, vocal_gender, weirdness y style_influence. Los usuarios normales no necesitan ver los campos subyacentes; solo necesitan un lenguaje de producto más natural.

Control subyacente Texto de la interfaz
style_influence Ajustarse más al estilo seleccionado
weirdness Más atrevido y experimental
negative_tags Elementos que no se desean
vocal_gender Voz de canto preferida
instrumental No necesita voz humana

De este modo, se conserva la capacidad de control sin trasladar literalmente la documentación de la API a la interfaz del usuario.

Lo que más teme el coste no es que sea elevado, sino no saber en qué se está gastando

El coste de las llamadas de una aplicación musical no procede únicamente de la generación inicial.

Los usuarios pueden continuar una canción, sustituir fragmentos, hacer versiones de otras canciones, separar pistas o exportar otros formatos. El consumo de créditos tampoco es exactamente el mismo en todas las operaciones. Ace Data Cloud aplica diferentes reglas de facturación a operaciones como la generación estándar, el modo mejorado, la sustitución de fragmentos y la separación multipista; el precio vigente del servicio debe ser la referencia definitiva.

Por eso, la aplicación no debería limitarse a guardar «cuántas veces le quedan al usuario», sino que debería crear su propio registro de movimientos de créditos:

CREATE TABLE credit_ledger (
  id          UUID PRIMARY KEY,
  user_id     UUID NOT NULL,
  task_id     UUID,
  type        VARCHAR(32) NOT NULL,
  amount      DECIMAL(10, 4) NOT NULL,
  description TEXT,
  created_at  TIMESTAMP NOT NULL DEFAULT NOW()
);

Una generación puede experimentar los siguientes cambios contables:

Enviar tarea      -0.56  Deducción provisional
Generación exitosa  0.00  Confirmación del consumo

O bien

Enviar tarea      -0.56  Deducción provisional
Generación fallida +0.56  Devolución automática

Estas cifras solo sirven para ilustrar el diseño del registro; el consumo real debe calcularse consultando los precios vigentes del servicio antes de realizar la solicitud.

La interfaz del usuario también debería indicarle, antes de hacer clic, cuántos créditos internos puede consumir esta operación. Una indicación clara de los costes suele generar más confianza que ocultar los precios.

Si el producto adopta un modelo de suscripción, los planes pueden diseñarse según los flujos de trabajo, en lugar de copiar simplemente los créditos del proveedor:

Tipo de plan Beneficios que puede incluir
Básico Un
    ↓

Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submitToSuno(task);
await bindProviderTaskId(task.id, upstream.task_id);

Una tarea de generación es un objeto de negocio que existe durante un periodo prolongado, no una solicitud de red temporal. Comprender este punto facilita mucho la gestión de las esperas, los reintentos y el historial.

Cuando el usuario dice «haz una canción alegre», el sistema no necesariamente sabe lo que quiere

Las indicaciones musicales admiten muchas interpretaciones.

«Alegre» puede referirse a una canción infantil, música electrónica de baile, folk animado o incluso música de fondo luminosa, habitual en los anuncios. Si la aplicación solo ofrece un cuadro de texto grande, cuando los usuarios obtienen resultados insatisfactorios, a menudo no saben qué frase deberían cambiar.

Se pueden dividir los requisitos de creación en varias preguntas más fáciles de responder:

¿Para qué se utilizará esta música?
Vídeos cortos / Podcasts / Juegos / Anuncios / Canciones personales

¿Qué sensación quieres que transmita?
Relajada / Enérgica / Cálida / Misteriosa / Contenida

¿Necesita voz humana?
Canción completa / Algo de voz / Música instrumental

¿Qué elementos no quieres que aparezcan?
Heavy metal / Sintetizadores estridentes / Ritmos de batería intensos / Estilo vocal exagerado

Después, el backend puede combinar las respuestas para crear la indicación:

function buildPrompt(form) {
  return [
    `Uso: ${form.useCase}`,
    `Estilo: ${form.genre}`,
    `Estado de ánimo: ${form.mood}`,
    `Instrumentos principales: ${form.instruments.join(", ")}`,
    `Requisitos de estructura: ${form.structure}`,
    `Evitar: ${form.negative.join(", ")}`
  ].join(";");
}

Para los usuarios más profesionales, se pueden habilitar parámetros como style, negative_tags, vocal_gender, weirdness y style_influence. Los usuarios normales no necesitan ver los campos subyacentes; solo necesitan un lenguaje de producto más natural.

Control subyacente Texto de la interfaz
style_influence Ajustarse más al estilo seleccionado
weirdness Más atrevido y experimental
negative_tags Elementos que no se desean
vocal_gender Voz de canto preferida
instrumental No necesita voz humana

De este modo, se conserva la capacidad de control sin trasladar literalmente la documentación de la API a la interfaz del usuario.

Lo que más teme el coste no es que sea elevado, sino no saber en qué se está gastando

El coste de las llamadas de una aplicación musical no procede únicamente de la generación inicial.

Los usuarios pueden continuar una canción, sustituir fragmentos, hacer versiones de otras canciones, separar pistas o exportar otros formatos. El consumo de créditos tampoco es exactamente el mismo en todas las operaciones. Ace Data Cloud aplica diferentes reglas de facturación a operaciones como la generación estándar, el modo mejorado, la sustitución de fragmentos y la separación multipista; el precio vigente del servicio debe ser la referencia definitiva.

Por eso, la aplicación no debería limitarse a guardar «cuántas veces le quedan al usuario», sino que debería crear su propio registro de movimientos de créditos:

CREATE TABLE credit_ledger (
  id          UUID PRIMARY KEY,
  user_id     UUID NOT NULL,
  task_id     UUID,
  type        VARCHAR(32) NOT NULL,
  amount      DECIMAL(10, 4) NOT NULL,
  description TEXT,
  created_at  TIMESTAMP NOT NULL DEFAULT NOW()
);

Una generación puede experimentar los siguientes cambios contables:

Enviar tarea      -0.56  Deducción provisional
Generación exitosa  0.00  Confirmación del consumo

O bien

Enviar tarea      -0.56  Deducción provisional
Generación fallida +0.56  Devolución automática

Estas cifras solo sirven para ilustrar el diseño del registro; el consumo real debe calcularse consultando los precios vigentes del servicio antes de realizar la solicitud.

La interfaz del usuario también debería indicarle, antes de hacer clic, cuántos créditos internos puede consumir esta operación. Una indicación clara de los costes suele generar más confianza que ocultar los precios.

Si el producto adopta un modelo de suscripción, los planes pueden diseñarse según los flujos de trabajo, en lugar de copiar simplemente los créditos del proveedor:

Tipo de plan Beneficios que puede incluir
Básico Un determinado número de generaciones estándar al mes
Creador Más generaciones, continuación de canciones y versiones de otras canciones
    ↓

Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submitToSuno(task);
await bindProviderTaskId(task.id, upstream.task_id);

Una tarea de generación es un objeto de negocio que existe durante un periodo prolongado, no una solicitud de red temporal. Comprender este punto facilita mucho la gestión de las esperas, los reintentos y el historial.

Cuando el usuario dice «haz una canción alegre», el sistema no necesariamente sabe lo que quiere

Las indicaciones musicales admiten muchas interpretaciones.

«Alegre» puede referirse a una canción infantil, música electrónica de baile, folk animado o incluso música de fondo luminosa, habitual en los anuncios. Si la aplicación solo ofrece un cuadro de texto grande, cuando los usuarios obtienen resultados insatisfactorios, a menudo no saben qué frase deberían cambiar.

Se pueden dividir los requisitos de creación en varias preguntas más fáciles de responder:

¿Para qué se utilizará esta música?
Vídeos cortos / Podcasts / Juegos / Anuncios / Canciones personales

¿Qué sensación quieres que transmita?
Relajada / Enérgica / Cálida / Misteriosa / Contenida

¿Necesita voz humana?
Canción completa / Algo de voz / Música instrumental

¿Qué elementos no quieres que aparezcan?
Heavy metal / Sintetizadores estridentes / Ritmos de batería intensos / Estilo vocal exagerado

Después, el backend puede combinar las respuestas para crear la indicación:

function buildPrompt(form) {
  return [
    `Uso: ${form.useCase}`,
    `Estilo: ${form.genre}`,
    `Estado de ánimo: ${form.mood}`,
    `Instrumentos principales: ${form.instruments.join(", ")}`,
    `Requisitos de estructura: ${form.structure}`,
    `Evitar: ${form.negative.join(", ")}`
  ].join(";");
}

Para los usuarios más profesionales, se pueden habilitar parámetros como style, negative_tags, vocal_gender, weirdness y style_influence. Los usuarios normales no necesitan ver los campos subyacentes; solo necesitan un lenguaje de producto más natural.

Control subyacente Texto de la interfaz
style_influence Ajustarse más al estilo seleccionado
weirdness Más atrevido y experimental
negative_tags Elementos que no se desean
vocal_gender Voz de canto preferida
instrumental No necesita voz humana

De este modo, se conserva la capacidad de control sin trasladar literalmente la documentación de la API a la interfaz del usuario.

Lo que más teme el coste no es que sea elevado, sino no saber en qué se está gastando

El coste de las llamadas de una aplicación musical no procede únicamente de la generación inicial.

Los usuarios pueden continuar una canción, sustituir fragmentos, hacer versiones de otras canciones, separar pistas o exportar otros formatos. El consumo de créditos tampoco es exactamente el mismo en todas las operaciones. Ace Data Cloud aplica diferentes reglas de facturación a operaciones como la generación estándar, el modo mejorado, la sustitución de fragmentos y la separación multipista; el precio vigente del servicio debe ser la referencia definitiva.

Por eso, la aplicación no debería limitarse a guardar «cuántas veces le quedan al usuario», sino que debería crear su propio registro de movimientos de créditos:

CREATE TABLE credit_ledger (
  id          UUID PRIMARY KEY,
  user_id     UUID NOT NULL,
  task_id     UUID,
  type        VARCHAR(32) NOT NULL,
  amount      DECIMAL(10, 4) NOT NULL,
  description TEXT,
  created_at  TIMESTAMP NOT NULL DEFAULT NOW()
);

Una generación puede experimentar los siguientes cambios contables:

Enviar tarea      -0.56  Deducción provisional
Generación exitosa  0.00  Confirmación del consumo

O bien

Enviar tarea      -0.56  Deducción provisional
Generación fallida +0.56  Devolución automática

Estas cifras solo sirven para ilustrar el diseño del registro; el consumo real debe calcularse consultando los precios vigentes del servicio antes de realizar la solicitud.

La interfaz del usuario también debería indicarle, antes de hacer clic, cuántos créditos internos puede consumir esta operación. Una indicación clara de los costes suele generar más confianza que ocultar los precios.

Si el producto adopta un modelo de suscripción, los planes pueden diseñarse según los flujos de trabajo, en lugar de copiar simplemente los créditos del proveedor:

Tipo de plan Beneficios que puede incluir
Básico Un determinado número de generaciones estándar al mes
Creador Más generaciones, continuación de canciones y versiones de otras canciones
Profesional Separación de pistas, WAV, MIDI y tareas por lotes
Equipo
    ↓

Generando dos versiones candidatas ↓ Guardando el audio y la portada ↓ Ya puedes escucharla


El frontend puede utilizar textos de estado claros\:

| Estado del backend | Mensaje que ve el usuario |
|--------|--------|
| `submitted` | Hemos recibido tus requisitos de creación |
| `pending` | En cola, espera un momento |
| `running` | Generando música |
| `succeeded` | Las canciones candidatas están listas |
| `failed` | Esta generación no se ha completado; los créditos se han devuelto |

Aquí hay un pequeño detalle muy importante: después de actualizar la página, el usuario debería seguir viendo la misma tarea, en lugar de que se cree automáticamente una nueva.

Para ello, el backend debe escribir primero en la base de datos, después llamar al servicio de generación y utilizar una clave de idempotencia para interceptar las solicitudes duplicadas.

```js
if (await taskExists(idempotencyKey)) {
  return getExistingTask(idempotencyKey);
}

const task = await createLocalTask();
const upstream = await submitToSuno(task);
await bindProviderTaskId(task.id, upstream.task_id);

Una tarea de generación es un objeto de negocio que existe durante un periodo prolongado, no una solicitud de red temporal. Comprender este punto facilita mucho la gestión de las esperas, los reintentos y el historial.

Cuando el usuario dice «haz una canción alegre», el sistema no necesariamente sabe lo que quiere

Las indicaciones musicales admiten muchas interpretaciones.

«Alegre» puede referirse a una canción infantil, música electrónica de baile, folk animado o incluso música de fondo luminosa, habitual en los anuncios. Si la aplicación solo ofrece un cuadro de texto grande, cuando los usuarios obtienen resultados insatisfactorios, a menudo no saben qué frase deberían cambiar.

Se pueden dividir los requisitos de creación en varias preguntas más fáciles de responder:

¿Para qué se utilizará esta música?
Vídeos cortos / Podcasts / Juegos / Anuncios / Canciones personales

¿Qué sensación quieres que transmita?
Relajada / Enérgica / Cálida / Misteriosa / Contenida

¿Necesita voz humana?
Canción completa / Algo de voz / Música instrumental

¿Qué elementos no quieres que aparezcan?
Heavy metal / Sintetizadores estridentes / Ritmos de batería intensos / Estilo vocal exagerado

Después, el backend puede combinar las respuestas para crear la indicación:

function buildPrompt(form) {
  return [
    `Uso: ${form.useCase}`,
    `Estilo: ${form.genre}`,
    `Estado de ánimo: ${form.mood}`,
    `Instrumentos principales: ${form.instruments.join(", ")}`,
    `Requisitos de estructura: ${form.structure}`,
    `Evitar: ${form.negative.join(", ")}`
  ].join(";");
}

Para los usuarios más profesionales, se pueden habilitar parámetros como style, negative_tags, vocal_gender, weirdness y style_influence. Los usuarios normales no necesitan ver los campos subyacentes; solo necesitan un lenguaje de producto más natural.

Control subyacente Texto de la interfaz
style_influence Ajustarse más al estilo seleccionado
weirdness Más atrevido y experimental
negative_tags Elementos que no se desean
vocal_gender Voz de canto preferida
instrumental No necesita voz humana

De este modo, se conserva la capacidad de control sin trasladar literalmente la documentación de la API a la interfaz del usuario.

Lo que más teme el coste no es que sea elevado, sino no saber en qué se está gastando

El coste de las llamadas de una aplicación musical no procede únicamente de la generación inicial.

Los usuarios pueden continuar una canción, sustituir fragmentos, hacer versiones de otras canciones, separar pistas o exportar otros formatos. El consumo de créditos tampoco es exactamente el mismo en todas las operaciones. Ace Data Cloud aplica diferentes reglas de facturación a operaciones como la generación estándar, el modo mejorado, la sustitución de fragmentos y la separación multipista; el precio vigente del servicio debe ser la referencia definitiva.

Por eso, la aplicación no debería limitarse a guardar «cuántas veces le quedan al usuario», sino que debería crear su propio registro de movimientos de créditos:

CREATE TABLE credit_ledger (
  id          UUID PRIMARY KEY,
  user_id     UUID NOT NULL,
  task_id     UUID,
  type        VARCHAR(32) NOT NULL,
  amount      DECIMAL(10, 4) NOT NULL,
  description TEXT,
  created_at  TIMESTAMP NOT NULL DEFAULT NOW()
);

Una generación puede experimentar los siguientes cambios contables:

Enviar tarea      -0.56  Deducción provisional
Generación exitosa  0.00  Confirmación del consumo

O bien

Enviar tarea      -0.56  Deducción provisional
Generación fallida +0.56  Devolución automática

Estas cifras solo sirven para ilustrar el diseño del registro; el consumo real debe calcularse consultando los precios vigentes del servicio antes de realizar la solicitud.

La interfaz del usuario también debería indicarle, antes de hacer clic, cuántos créditos internos puede consumir esta operación. Una indicación clara de los costes suele generar más confianza que ocultar los precios.

Si el producto adopta un modelo de suscripción, los planes pueden diseñarse según los flujos de trabajo, en lugar de copiar simplemente los créditos del proveedor:

Tipo de plan Beneficios que puede incluir
Básico Un determinado número de generaciones estándar al mes
Creador Más generaciones, continuación de canciones y versiones de otras canciones
Profesional Separación de pistas, WAV, MIDI y tareas por lotes
Equipo Proyectos compartidos, créditos para miembros y flujos de trabajo comerciales

Haber obtenido un enlace de audio no significa que el archivo vaya a estar siempre seguro

Tras completarse la generación, si en la base de datos solo se guarda el audio_url del proveedor, es posible que no se detecten problemas a corto plazo. Sin embargo, cuando los usuarios vuelvan unos días después para descargar el archivo, es posible que el enlace haya cambiado o ya no esté disponible.

La documentación de la API de Ace Data Cloud indica que la plataforma devolverá prioritariamente una dirección CDN; si la persistencia falla, también puede devolver la dirección original del medio, por lo que se recomienda descargar y guardar el resultado cuanto antes.

Un proceso más fiable sería:

Generación completada
   ↓

Comprobar la URL del audio ↓ Descargarlo en segundo plano al almacenamiento de objetos propio ↓ Registrar el tamaño del archivo y su hash

Comprobar la URL del audio
   ↓
Descargarlo en segundo plano al almacenamiento de objetos propio
   ↓
Registrar el tamaño del archivo y su hash
   ↓
Generar una dirección de acceso propia
   ↓
Mostrarlo y permitir su descarga en el frontend

Al guardar el archivo, se pueden registrar los siguientes datos:

{
  "provider_audio_id": "audio_xxx",
  "source_url": "https

Comprobar la URL del audio ↓ Descargarlo en segundo plano al almacenamiento de objetos propio ↓ Registrar el tamaño del archivo y su hash ↓ Generar una dirección de acceso propia ↓ Mostrarlo y permitir su descarga en el frontend


Al guardar el archivo, se pueden registrar los siguientes datos\:

```json
{
  "provider_audio_id": "audio_xxx",
  "source_url": "https://...",
  "storage_key": "music/user-42/project-18/audio-x.mp3",
  "sha256": "f91

Comprobar la URL del audio ↓ Descargarlo en segundo plano al almacenamiento de objetos propio ↓ Registrar el tamaño del archivo y su hash ↓ Generar una dirección de acceso propia ↓ Mostrarlo y permitir su descarga en el frontend


Al guardar el archivo, se pueden registrar los siguientes datos\:

```json
{
  "provider_audio_id": "audio_xxx",
  "source_url": "https://...",
  "storage_key": "music/user-42/project-18/audio-x.mp3",
  "sha256": "f91d...",
  "duration": 154.92,
  "mime_type": "audio/mpeg",
  "saved_at": "

Comprobar la URL del audio ↓ Descargarlo en segundo plano al almacenamiento de objetos propio ↓ Registrar el tamaño del archivo y su hash ↓ Generar una dirección de acceso propia ↓ Mostrarlo y permitir su descarga en el frontend


Al guardar el archivo, se pueden registrar los siguientes datos\:

```json
{
  "provider_audio_id": "audio_xxx",
  "source_url": "https://...",
  "storage_key": "music/user-42/project-18/audio-x.mp3",
  "sha256": "f91d...",
  "duration": 154.92,
  "mime_type": "audio/mpeg",
  "saved_at": "2026-10-12T08:30:00Z"
}

Si la canción se utiliza posteriormente para continuar la composición o hacer una versión, también es necesario seguir guardando el ID de audio de la plataforma. La dirección de almacenamiento propia se utiliza para reproducir y descargar el archivo, mientras que el ID de audio de la plataforma se utiliza para seguir invocando las funciones de creación. Ambos tienen finalidades distintas.

Lo que más fácilmente se pasa por alto suele ser la carga de audio y los derechos de autor

Cuando solo se genera música a partir de texto, los problemas de derechos de autor parecen todavía bastante alejados del producto. Sin embargo, una vez que se habilitan la carga de audio, las versiones de canciones, Persona o las voces personalizadas, los riesgos aumentan considerablemente.

Como mínimo, el producto debe aclarar lo siguiente:

  • ¿El usuario ha creado o grabado personalmente este audio?
  • ¿Tiene el usuario derecho a autorizar a la plataforma a procesarlo y generar contenido derivado?
  • ¿El audio contiene la voz de algún cantante sin autorización?
  • ¿El usuario intenta imitar a una persona real para inducir a otros a error?
  • En caso de reclamación, ¿puede la plataforma localizar y retirar el contenido correspondiente?

Cerca del botón de carga se puede incluir una declaración explícita:

Al subir el archivo, confirmas que posees los derechos necesarios sobre el audio o que has obtenido la autorización del titular de los derechos de autor, del intérprete y del titular de los derechos sobre la voz. No subas grabaciones comerciales sin autorización ni utilices la voz de otras personas para suplantar su identidad.

También se puede guardar la información de autorización en el registro de la tarea:

{
  "source_type": "user_upload",
  "rights_confirmed": true,
  "rights_version": "202

Comprobar la URL del audio ↓ Descargarlo en segundo plano al almacenamiento de objetos propio ↓ Registrar el tamaño del archivo y su hash ↓ Generar una dirección de acceso propia ↓ Mostrarlo y permitir su descarga en el frontend


Al guardar el archivo, se pueden registrar los siguientes datos\:

```json
{
  "provider_audio_id": "audio_xxx",
  "source_url": "https://...",
  "storage_key": "music/user-42/project-18/audio-x.mp3",
  "sha256": "f91d...",
  "duration": 154.92,
  "mime_type": "audio/mpeg",
  "saved_at": "2026-10-12T08:30:00Z"
}

Si la canción se utiliza posteriormente para continuar la composición o hacer una versión, también es necesario seguir guardando el ID de audio de la plataforma. La dirección de almacenamiento propia se utiliza para reproducir y descargar el archivo, mientras que el ID de audio de la plataforma se utiliza para seguir invocando las funciones de creación. Ambos tienen finalidades distintas.

Lo que más fácilmente se pasa por alto suele ser la carga de audio y los derechos de autor

Cuando solo se genera música a partir de texto, los problemas de derechos de autor parecen todavía bastante alejados del producto. Sin embargo, una vez que se habilitan la carga de audio, las versiones de canciones, Persona o las voces personalizadas, los riesgos aumentan considerablemente.

Como mínimo, el producto debe aclarar lo siguiente:

  • ¿El usuario ha creado o grabado personalmente este audio?
  • ¿Tiene el usuario derecho a autorizar a la plataforma a procesarlo y generar contenido derivado?
  • ¿El audio contiene la voz de algún cantante sin autorización?
  • ¿El usuario intenta imitar a una persona real para inducir a otros a error?
  • En caso de reclamación, ¿puede la plataforma localizar y retirar el contenido correspondiente?

Cerca del botón de carga se puede incluir una declaración explícita:

Al subir el archivo, confirmas que posees los derechos necesarios sobre el audio o que has obtenido la autorización del titular de los derechos de autor, del intérprete y del titular de los derechos sobre la voz. No subas grabaciones comerciales sin autorización ni utilices la voz de otras personas para suplantar su identidad.

También se puede guardar la información de autorización en el registro de la tarea:

{
  "source_type": "user_upload",
  "rights_confirmed": true,
  "rights_version": "2026-10",
  "confirmed_at": "2026-10-12T08:00:00Z"
}

Suno indica que las canciones creadas y descargadas durante una suscripción de pago pueden beneficiarse de derechos relacionados con el uso comercial, pero esta licencia de uso comercial no significa que la obra vaya a recibir necesariamente protección por derechos de autor conforme a la legislación de la jurisdicción correspondiente.

Suno ofrece los planes Free, Pro y Premier. Los Credits y los derechos incluidos en las versiones gratuita y de pago pueden cambiar, por lo que debe consultarse la información que aparece en la cuenta oficial y en la página de precios de Suno.

Estas reglas ayudan al equipo a comprender los derechos que Suno ofrece a los creadores, pero las condiciones comerciales de la propia aplicación, las normas de carga y las cuestiones de cumplimiento normativo en cada región siguen requiriendo un diseño independiente.

Un diagrama para comprender de un vistazo una arquitectura lista para producción

┌──────────────┐
│ Web / App    │
│ Creación y   │
│ reproductor

Comprobar la URL del audio ↓ Descargarlo en segundo plano al almacenamiento de objetos propio ↓ Registrar el tamaño del archivo y su hash ↓ Generar una dirección de acceso propia ↓ Mostrarlo y permitir su descarga en el frontend


Al guardar el archivo, se pueden registrar los siguientes datos\:

```json
{
  "provider_audio_id": "audio_xxx",
  "source_url": "https://...",
  "storage_key": "music/user-42/project-18/audio-x.mp3",
  "sha256": "f91d...",
  "duration": 154.92,
  "mime_type": "audio/mpeg",
  "saved_at": "2026-10-12T08:30:00Z"
}

Si la canción se utiliza posteriormente para continuar la composición o hacer una versión, también es necesario seguir guardando el ID de audio de la plataforma. La dirección de almacenamiento propia se utiliza para reproducir y descargar el archivo, mientras que el ID de audio de la plataforma se utiliza para seguir invocando las funciones de creación. Ambos tienen finalidades distintas.

Lo que más fácilmente se pasa por alto suele ser la carga de audio y los derechos de autor

Cuando solo se genera música a partir de texto, los problemas de derechos de autor parecen todavía bastante alejados del producto. Sin embargo, una vez que se habilitan la carga de audio, las versiones de canciones, Persona o las voces personalizadas, los riesgos aumentan considerablemente.

Como mínimo, el producto debe aclarar lo siguiente:

  • ¿El usuario ha creado o grabado personalmente este audio?
  • ¿Tiene el usuario derecho a autorizar a la plataforma a procesarlo y generar contenido derivado?
  • ¿El audio contiene la voz de algún cantante sin autorización?
  • ¿El usuario intenta imitar a una persona real para inducir a otros a error?
  • En caso de reclamación, ¿puede la plataforma localizar y retirar el contenido correspondiente?

Cerca del botón de carga se puede incluir una declaración explícita:

Al subir el archivo, confirmas que posees los derechos necesarios sobre el audio o que has obtenido la autorización del titular de los derechos de autor, del intérprete y del titular de los derechos sobre la voz. No subas grabaciones comerciales sin autorización ni utilices la voz de otras personas para suplantar su identidad.

También se puede guardar la información de autorización en el registro de la tarea:

{
  "source_type": "user_upload",
  "rights_confirmed": true,
  "rights_version": "2026-10",
  "confirmed_at": "2026-10-12T08:00:00Z"
}

Suno indica que las canciones creadas y descargadas durante una suscripción de pago pueden beneficiarse de derechos relacionados con el uso comercial, pero esta licencia de uso comercial no significa que la obra vaya a recibir necesariamente protección por derechos de autor conforme a la legislación de la jurisdicción correspondiente.

Suno ofrece los planes Free, Pro y Premier. Los Credits y los derechos incluidos en las versiones gratuita y de pago pueden cambiar, por lo que debe consultarse la información que aparece en la cuenta oficial y en la página de precios de Suno.

Estas reglas ayudan al equipo a comprender los derechos que Suno ofrece a los creadores, pero las condiciones comerciales de la propia aplicación, las normas de carga y las cuestiones de cumplimiento normativo en cada región siguen requiriendo un diseño independiente.

Un diagrama para comprender de un vistazo una arquitectura lista para producción

┌──────────────┐
│ Web / App    │
│ Creación y   │
│ reproductor  │
└──────┬───────┘
       │
┌──────▼────────┐
│ API

Comprobar la URL del audio ↓ Descargarlo en segundo plano al almacenamiento de objetos propio ↓ Registrar el tamaño del archivo y su hash ↓ Generar una dirección de acceso propia ↓ Mostrarlo y permitir su descarga en el frontend


Al guardar el archivo, se pueden registrar los siguientes datos\:

```json
{
  "provider_audio_id": "audio_xxx",
  "source_url": "https://...",
  "storage_key": "music/user-42/project-18/audio-x.mp3",
  "sha256": "f91d...",
  "duration": 154.92,
  "mime_type": "audio/mpeg",
  "saved_at": "2026-10-12T08:30:00Z"
}

Si la canción se utiliza posteriormente para continuar la composición o hacer una versión, también es necesario seguir guardando el ID de audio de la plataforma. La dirección de almacenamiento propia se utiliza para reproducir y descargar el archivo, mientras que el ID de audio de la plataforma se utiliza para seguir invocando las funciones de creación. Ambos tienen finalidades distintas.

Lo que más fácilmente se pasa por alto suele ser la carga de audio y los derechos de autor

Cuando solo se genera música a partir de texto, los problemas de derechos de autor parecen todavía bastante alejados del producto. Sin embargo, una vez que se habilitan la carga de audio, las versiones de canciones, Persona o las voces personalizadas, los riesgos aumentan considerablemente.

Como mínimo, el producto debe aclarar lo siguiente:

  • ¿El usuario ha creado o grabado personalmente este audio?
  • ¿Tiene el usuario derecho a autorizar a la plataforma a procesarlo y generar contenido derivado?
  • ¿El audio contiene la voz de algún cantante sin autorización?
  • ¿El usuario intenta imitar a una persona real para inducir a otros a error?
  • En caso de reclamación, ¿puede la plataforma localizar y retirar el contenido correspondiente?

Cerca del botón de carga se puede incluir una declaración explícita:

Al subir el archivo, confirmas que posees los derechos necesarios sobre el audio o que has obtenido la autorización del titular de los derechos de autor, del intérprete y del titular de los derechos sobre la voz. No subas grabaciones comerciales sin autorización ni utilices la voz de otras personas para suplantar su identidad.

También se puede guardar la información de autorización en el registro de la tarea:

{
  "source_type": "user_upload",
  "rights_confirmed": true,
  "rights_version": "2026-10",
  "confirmed_at": "2026-10-12T08:00:00Z"
}

Suno indica que las canciones creadas y descargadas durante una suscripción de pago pueden beneficiarse de derechos relacionados con el uso comercial, pero esta licencia de uso comercial no significa que la obra vaya a recibir necesariamente protección por derechos de autor conforme a la legislación de la jurisdicción correspondiente.

Suno ofrece los planes Free, Pro y Premier. Los Credits y los derechos incluidos en las versiones gratuita y de pago pueden cambiar, por lo que debe consultarse la información que aparece en la cuenta oficial y en la página de precios de Suno.

Estas reglas ayudan al equipo a comprender los derechos que Suno ofrece a los creadores, pero las condiciones comerciales de la propia aplicación, las normas de carga y las cuestiones de cumplimiento normativo en cada región siguen requiriendo un diseño independiente.

Un diagrama para comprender de un vistazo una arquitectura lista para producción

┌──────────────┐
│ Web / App    │
│ Creación y   │
│ reproductor  │
└──────┬───────┘
       │
┌──────▼────────┐
│ API de negocio│
│ Usuarios,     │
│ proyectos,    │
│ cuotas

Comprobar la URL del audio ↓ Descargarlo en segundo plano al almacenamiento de objetos propio ↓ Registrar el tamaño del archivo y su hash ↓ Generar una dirección de acceso propia ↓ Mostrarlo y permitir su descarga en el frontend


Al guardar el archivo, se pueden registrar los siguientes datos\:

```json
{
  "provider_audio_id": "audio_xxx",
  "source_url": "https://...",
  "storage_key": "music/user-42/project-18/audio-x.mp3",
  "sha256": "f91d...",
  "duration": 154.92,
  "mime_type": "audio/mpeg",
  "saved_at": "2026-10-12T08:30:00Z"
}

Si la canción se utiliza posteriormente para continuar la composición o hacer una versión, también es necesario seguir guardando el ID de audio de la plataforma. La dirección de almacenamiento propia se utiliza para reproducir y descargar el archivo, mientras que el ID de audio de la plataforma se utiliza para seguir invocando las funciones de creación. Ambos tienen finalidades distintas.

Lo que más fácilmente se pasa por alto suele ser la carga de audio y los derechos de autor

Cuando solo se genera música a partir de texto, los problemas de derechos de autor parecen todavía bastante alejados del producto. Sin embargo, una vez que se habilitan la carga de audio, las versiones de canciones, Persona o las voces personalizadas, los riesgos aumentan considerablemente.

Como mínimo, el producto debe aclarar lo siguiente:

  • ¿El usuario ha creado o grabado personalmente este audio?
  • ¿Tiene el usuario derecho a autorizar a la plataforma a procesarlo y generar contenido derivado?
  • ¿El audio contiene la voz de algún cantante sin autorización?
  • ¿El usuario intenta imitar a una persona real para inducir a otros a error?
  • En caso de reclamación, ¿puede la plataforma localizar y retirar el contenido correspondiente?

Cerca del botón de carga se puede incluir una declaración explícita:

Al subir el archivo, confirmas que posees los derechos necesarios sobre el audio o que has obtenido la autorización del titular de los derechos de autor, del intérprete y del titular de los derechos sobre la voz. No subas grabaciones comerciales sin autorización ni utilices la voz de otras personas para suplantar su identidad.

También se puede guardar la información de autorización en el registro de la tarea:

{
  "source_type": "user_upload",
  "rights_confirmed": true,
  "rights_version": "2026-10",
  "confirmed_at": "2026-10-12T08:00:00Z"
}

Suno indica que las canciones creadas y descargadas durante una suscripción de pago pueden beneficiarse de derechos relacionados con el uso comercial, pero esta licencia de uso comercial no significa que la obra vaya a recibir necesariamente protección por derechos de autor conforme a la legislación de la jurisdicción correspondiente.

Suno ofrece los planes Free, Pro y Premier. Los Credits y los derechos incluidos en las versiones gratuita y de pago pueden cambiar, por lo que debe consultarse la información que aparece en la cuenta oficial y en la página de precios de Suno.

Estas reglas ayudan al equipo a comprender los derechos que Suno ofrece a los creadores, pero las condiciones comerciales de la propia aplicación, las normas de carga y las cuestiones de cumplimiento normativo en cada región siguen requiriendo un diseño independiente.

Un diagrama para comprender de un vistazo una arquitectura lista para producción

┌──────────────┐
│ Web / App    │
│ Creación y   │
│ reproductor  │
└──────┬───────┘
       │
┌──────▼────────┐
│ API de negocio│
│ Usuarios,     │
│ proyectos,    │
│ cuotas        │
└───┬────────┬──┘
    │        │
    │        └────────────

Comprobar la URL del audio ↓ Descargarlo en segundo plano al almacenamiento de objetos propio ↓ Registrar el tamaño del archivo y su hash ↓ Generar una dirección de acceso propia ↓ Mostrarlo y permitir su descarga en el frontend


Al guardar el archivo, se pueden registrar los siguientes datos\:

```json
{
  "provider_audio_id": "audio_xxx",
  "source_url": "https://...",
  "storage_key": "music/user-42/project-18/audio-x.mp3",
  "sha256": "f91d...",
  "duration": 154.92,
  "mime_type": "audio/mpeg",
  "saved_at": "2026-10-12T08:30:00Z"
}

Si la canción se utiliza posteriormente para continuar la composición o hacer una versión, también es necesario seguir guardando el ID de audio de la plataforma. La dirección de almacenamiento propia se utiliza para reproducir y descargar el archivo, mientras que el ID de audio de la plataforma se utiliza para seguir invocando las funciones de creación. Ambos tienen finalidades distintas.

Lo que más fácilmente se pasa por alto suele ser la carga de audio y los derechos de autor

Cuando solo se genera música a partir de texto, los problemas de derechos de autor parecen todavía bastante alejados del producto. Sin embargo, una vez que se habilitan la carga de audio, las versiones de canciones, Persona o las voces personalizadas, los riesgos aumentan considerablemente.

Como mínimo, el producto debe aclarar lo siguiente:

  • ¿El usuario ha creado o grabado personalmente este audio?
  • ¿Tiene el usuario derecho a autorizar a la plataforma a procesarlo y generar contenido derivado?
  • ¿El audio contiene la voz de algún cantante sin autorización?
  • ¿El usuario intenta imitar a una persona real para inducir a otros a error?
  • En caso de reclamación, ¿puede la plataforma localizar y retirar el contenido correspondiente?

Cerca del botón de carga se puede incluir una declaración explícita:

Al subir el archivo, confirmas que posees los derechos necesarios sobre el audio o que has obtenido la autorización del titular de los derechos de autor, del intérprete y del titular de los derechos sobre la voz. No subas grabaciones comerciales sin autorización ni utilices la voz de otras personas para suplantar su identidad.

También se puede guardar la información de autorización en el registro de la tarea:

{
  "source_type": "user_upload",
  "rights_confirmed": true,
  "rights_version": "2026-10",
  "confirmed_at": "2026-10-12T08:00:00Z"
}

Suno indica que las canciones creadas y descargadas durante una suscripción de pago pueden beneficiarse de derechos relacionados con el uso comercial, pero esta licencia de uso comercial no significa que la obra vaya a recibir necesariamente protección por derechos de autor conforme a la legislación de la jurisdicción correspondiente.

Suno ofrece los planes Free, Pro y Premier. Los Credits y los derechos incluidos en las versiones gratuita y de pago pueden cambiar, por lo que debe consultarse la información que aparece en la cuenta oficial y en la página de precios de Suno.

Estas reglas ayudan al equipo a comprender los derechos que Suno ofrece a los creadores, pero las condiciones comerciales de la propia aplicación, las normas de carga y las cuestiones de cumplimiento normativo en cada región siguen requiriendo un diseño independiente.

Un diagrama para comprender de un vistazo una arquitectura lista para producción

┌──────────────┐
│ Web / App    │
│ Creación y   │
│ reproductor  │
└──────┬───────┘
       │
┌──────▼────────┐
│ API de negocio│
│ Usuarios,     │
│ proyectos,    │
│ cuotas        │
└───┬────────┬──┘
    │        │
    │        └──────────────┐
    │                       │
┌───▼────────┐      ┌──────▼───────┐
│ Cola de

Comprobar la URL del audio ↓ Descargarlo en segundo plano al almacenamiento de objetos propio ↓ Registrar el tamaño del archivo y su hash ↓ Generar una dirección de acceso propia ↓ Mostrarlo y permitir su descarga en el frontend


Al guardar el archivo, se pueden registrar los siguientes datos\:

```json
{
  "provider_audio_id": "audio_xxx",
  "source_url": "https://...",
  "storage_key": "music/user-42/project-18/audio-x.mp3",
  "sha256": "f91d...",
  "duration": 154.92,
  "mime_type": "audio/mpeg",
  "saved_at": "2026-10-12T08:30:00Z"
}

Si la canción se utiliza posteriormente para continuar la composición o hacer una versión, también es necesario seguir guardando el ID de audio de la plataforma. La dirección de almacenamiento propia se utiliza para reproducir y descargar el archivo, mientras que el ID de audio de la plataforma se utiliza para seguir invocando las funciones de creación. Ambos tienen finalidades distintas.

Lo que más fácilmente se pasa por alto suele ser la carga de audio y los derechos de autor

Cuando solo se genera música a partir de texto, los problemas de derechos de autor parecen todavía bastante alejados del producto. Sin embargo, una vez que se habilitan la carga de audio, las versiones de canciones, Persona o las voces personalizadas, los riesgos aumentan considerablemente.

Como mínimo, el producto debe aclarar lo siguiente:

  • ¿El usuario ha creado o grabado personalmente este audio?
  • ¿Tiene el usuario derecho a autorizar a la plataforma a procesarlo y generar contenido derivado?
  • ¿El audio contiene la voz de algún cantante sin autorización?
  • ¿El usuario intenta imitar a una persona real para inducir a otros a error?
  • En caso de reclamación, ¿puede la plataforma localizar y retirar el contenido correspondiente?

Cerca del botón de carga se puede incluir una declaración explícita:

Al subir el archivo, confirmas que posees los derechos necesarios sobre el audio o que has obtenido la autorización del titular de los derechos de autor, del intérprete y del titular de los derechos sobre la voz. No subas grabaciones comerciales sin autorización ni utilices la voz de otras personas para suplantar su identidad.

También se puede guardar la información de autorización en el registro de la tarea:

{
  "source_type": "user_upload",
  "rights_confirmed": true,
  "rights_version": "2026-10",
  "confirmed_at": "2026-10-12T08:00:00Z"
}

Suno indica que las canciones creadas y descargadas durante una suscripción de pago pueden beneficiarse de derechos relacionados con el uso comercial, pero esta licencia de uso comercial no significa que la obra vaya a recibir necesariamente protección por derechos de autor conforme a la legislación de la jurisdicción correspondiente.

Suno ofrece los planes Free, Pro y Premier. Los Credits y los derechos incluidos en las versiones gratuita y de pago pueden cambiar, por lo que debe consultarse la información que aparece en la cuenta oficial y en la página de precios de Suno.

Estas reglas ayudan al equipo a comprender los derechos que Suno ofrece a los creadores, pero las condiciones comerciales de la propia aplicación, las normas de carga y las cuestiones de cumplimiento normativo en cada región siguen requiriendo un diseño independiente.

Un diagrama para comprender de un vistazo una arquitectura lista para producción

┌──────────────┐
│ Web / App    │
│ Creación y   │
│ reproductor  │
└──────┬───────┘
       │
┌──────▼────────┐
│ API de negocio│
│ Usuarios,     │
│ proyectos,    │
│ cuotas        │
└───┬────────┬──┘
    │        │
    │        └──────────────┐
    │                       │
┌───▼────────┐      ┌──────▼───────┐
│ Cola de    │      │ PostgreSQL   │
│ tareas     │      │ Tareas y     │
│ Reintentos

Comprobar la URL del audio ↓ Descargarlo en segundo plano al almacenamiento de objetos propio ↓ Registrar el tamaño del archivo y su hash ↓ Generar una dirección de acceso propia ↓ Mostrarlo y permitir su descarga en el frontend


Al guardar el archivo, se pueden registrar los siguientes datos\:

```json
{
  "provider_audio_id": "audio_xxx",
  "source_url": "https://...",
  "storage_key": "music/user-42/project-18/audio-x.mp3",
  "sha256": "f91d...",
  "duration": 154.92,
  "mime_type": "audio/mpeg",
  "saved_at": "2026-10-12T08:30:00Z"
}

Si la canción se utiliza posteriormente para continuar la composición o hacer una versión, también es necesario seguir guardando el ID de audio de la plataforma. La dirección de almacenamiento propia se utiliza para reproducir y descargar el archivo, mientras que el ID de audio de la plataforma se utiliza para seguir invocando las funciones de creación. Ambos tienen finalidades distintas.

Lo que más fácilmente se pasa por alto suele ser la carga de audio y los derechos de autor

Cuando solo se genera música a partir de texto, los problemas de derechos de autor parecen todavía bastante alejados del producto. Sin embargo, una vez que se habilitan la carga de audio, las versiones de canciones, Persona o las voces personalizadas, los riesgos aumentan considerablemente.

Como mínimo, el producto debe aclarar lo siguiente:

  • ¿El usuario ha creado o grabado personalmente este audio?
  • ¿Tiene el usuario derecho a autorizar a la plataforma a procesarlo y generar contenido derivado?
  • ¿El audio contiene la voz de algún cantante sin autorización?
  • ¿El usuario intenta imitar a una persona real para inducir a otros a error?
  • En caso de reclamación, ¿puede la plataforma localizar y retirar el contenido correspondiente?

Cerca del botón de carga se puede incluir una declaración explícita:

Al subir el archivo, confirmas que posees los derechos necesarios sobre el audio o que has obtenido la autorización del titular de los derechos de autor, del intérprete y del titular de los derechos sobre la voz. No subas grabaciones comerciales sin autorización ni utilices la voz de otras personas para suplantar su identidad.

También se puede guardar la información de autorización en el registro de la tarea:

{
  "source_type": "user_upload",
  "rights_confirmed": true,
  "rights_version": "2026-10",
  "confirmed_at": "2026-10-12T08:00:00Z"
}

Suno indica que las canciones creadas y descargadas durante una suscripción de pago pueden beneficiarse de derechos relacionados con el uso comercial, pero esta licencia de uso comercial no significa que la obra vaya a recibir necesariamente protección por derechos de autor conforme a la legislación de la jurisdicción correspondiente.

Suno ofrece los planes Free, Pro y Premier. Los Credits y los derechos incluidos en las versiones gratuita y de pago pueden cambiar, por lo que debe consultarse la información que aparece en la cuenta oficial y en la página de precios de Suno.

Estas reglas ayudan al equipo a comprender los derechos que Suno ofrece a los creadores, pero las condiciones comerciales de la propia aplicación, las normas de carga y las cuestiones de cumplimiento normativo en cada región siguen requiriendo un diseño independiente.

Un diagrama para comprender de un vistazo una arquitectura lista para producción

┌──────────────┐
│ Web / App    │
│ Creación y   │
│ reproductor  │
└──────┬───────┘
       │
┌──────▼────────┐
│ API de negocio│
│ Usuarios,     │
│ proyectos,    │
│ cuotas        │
└───┬────────┬──┘
    │        │
    │        └──────────────┐
    │                       │
┌───▼────────┐      ┌──────▼───────┐
│ Cola de    │      │ PostgreSQL   │
│ tareas     │      │ Tareas y     │
│ Reintentos │      │ movimientos  │
│ y compens. │      │              │
└───┬────────

Comprobar la URL del audio ↓ Descargarlo en segundo plano al almacenamiento de objetos propio ↓ Registrar el tamaño del archivo y su hash ↓ Generar una dirección de acceso propia ↓ Mostrarlo y permitir su descarga en el frontend


Al guardar el archivo, se pueden registrar los siguientes datos\:

```json
{
  "provider_audio_id": "audio_xxx",
  "source_url": "https://...",
  "storage_key": "music/user-42/project-18/audio-x.mp3",
  "sha256": "f91d...",
  "duration": 154.92,
  "mime_type": "audio/mpeg",
  "saved_at": "2026-10-12T08:30:00Z"
}

Si la canción se utiliza posteriormente para continuar la composición o hacer una versión, también es necesario seguir guardando el ID de audio de la plataforma. La dirección de almacenamiento propia se utiliza para reproducir y descargar el archivo, mientras que el ID de audio de la plataforma se utiliza para seguir invocando las funciones de creación. Ambos tienen finalidades distintas.

Lo que más fácilmente se pasa por alto suele ser la carga de audio y los derechos de autor

Cuando solo se genera música a partir de texto, los problemas de derechos de autor parecen todavía bastante alejados del producto. Sin embargo, una vez que se habilitan la carga de audio, las versiones de canciones, Persona o las voces personalizadas, los riesgos aumentan considerablemente.

Como mínimo, el producto debe aclarar lo siguiente:

  • ¿El usuario ha creado o grabado personalmente este audio?
  • ¿Tiene el usuario derecho a autorizar a la plataforma a procesarlo y generar contenido derivado?
  • ¿El audio contiene la voz de algún cantante sin autorización?
  • ¿El usuario intenta imitar a una persona real para inducir a otros a error?
  • En caso de reclamación, ¿puede la plataforma localizar y retirar el contenido correspondiente?

Cerca del botón de carga se puede incluir una declaración explícita:

Al subir el archivo, confirmas que posees los derechos necesarios sobre el audio o que has obtenido la autorización del titular de los derechos de autor, del intérprete y del titular de los derechos sobre la voz. No subas grabaciones comerciales sin autorización ni utilices la voz de otras personas para suplantar su identidad.

También se puede guardar la información de autorización en el registro de la tarea:

{
  "source_type": "user_upload",
  "rights_confirmed": true,
  "rights_version": "2026-10",
  "confirmed_at": "2026-10-12T08:00:00Z"
}

Suno indica que las canciones creadas y descargadas durante una suscripción de pago pueden beneficiarse de derechos relacionados con el uso comercial, pero esta licencia de uso comercial no significa que la obra vaya a recibir necesariamente protección por derechos de autor conforme a la legislación de la jurisdicción correspondiente.

Suno ofrece los planes Free, Pro y Premier. Los Credits y los derechos incluidos en las versiones gratuita y de pago pueden cambiar, por lo que debe consultarse la información que aparece en la cuenta oficial y en la página de precios de Suno.

Estas reglas ayudan al equipo a comprender los derechos que Suno ofrece a los creadores, pero las condiciones comerciales de la propia aplicación, las normas de carga y las cuestiones de cumplimiento normativo en cada región siguen requiriendo un diseño independiente.

Un diagrama para comprender de un vistazo una arquitectura lista para producción

┌──────────────┐
│ Web / App    │
│ Creación y   │
│ reproductor  │
└──────┬───────┘
       │
┌──────▼────────┐
│ API de negocio│
│ Usuarios,     │
│ proyectos,    │
│ cuotas        │
└───┬────────┬──┘
    │        │
    │        └──────────────┐
    │                       │
┌───▼────────┐      ┌──────▼───────┐
│ Cola de    │      │ PostgreSQL   │
│ tareas     │      │ Tareas y     │
│ Reintentos │      │ movimientos  │
│ y compens. │      │              │
└───┬────────┘      └──────────────┘
    │
┌───▼────────────────┐
│ Ace Data Cloud

Comprobar la URL del audio ↓ Descargarlo en segundo plano al almacenamiento de objetos propio ↓ Registrar el tamaño del archivo y su hash ↓ Generar una dirección de acceso propia ↓ Mostrarlo y permitir su descarga en el frontend


Al guardar el archivo, se pueden registrar los siguientes datos\:

```json
{
  "provider_audio_id": "audio_xxx",
  "source_url": "https://...",
  "storage_key": "music/user-42/project-18/audio-x.mp3",
  "sha256": "f91d...",
  "duration": 154.92,
  "mime_type": "audio/mpeg",
  "saved_at": "2026-10-12T08:30:00Z"
}

Si la canción se utiliza posteriormente para continuar la composición o hacer una versión, también es necesario seguir guardando el ID de audio de la plataforma. La dirección de almacenamiento propia se utiliza para reproducir y descargar el archivo, mientras que el ID de audio de la plataforma se utiliza para seguir invocando las funciones de creación. Ambos tienen finalidades distintas.

Lo que más fácilmente se pasa por alto suele ser la carga de audio y los derechos de autor

Cuando solo se genera música a partir de texto, los problemas de derechos de autor parecen todavía bastante alejados del producto. Sin embargo, una vez que se habilitan la carga de audio, las versiones de canciones, Persona o las voces personalizadas, los riesgos aumentan considerablemente.

Como mínimo, el producto debe aclarar lo siguiente:

  • ¿El usuario ha creado o grabado personalmente este audio?
  • ¿Tiene el usuario derecho a autorizar a la plataforma a procesarlo y generar contenido derivado?
  • ¿El audio contiene la voz de algún cantante sin autorización?
  • ¿El usuario intenta imitar a una persona real para inducir a otros a error?
  • En caso de reclamación, ¿puede la plataforma localizar y retirar el contenido correspondiente?

Cerca del botón de carga se puede incluir una declaración explícita:

Al subir el archivo, confirmas que posees los derechos necesarios sobre el audio o que has obtenido la autorización del titular de los derechos de autor, del intérprete y del titular de los derechos sobre la voz. No subas grabaciones comerciales sin autorización ni utilices la voz de otras personas para suplantar su identidad.

También se puede guardar la información de autorización en el registro de la tarea:

{
  "source_type": "user_upload",
  "rights_confirmed": true,
  "rights_version": "2026-10",
  "confirmed_at": "2026-10-12T08:00:00Z"
}

Suno indica que las canciones creadas y descargadas durante una suscripción de pago pueden beneficiarse de derechos relacionados con el uso comercial, pero esta licencia de uso comercial no significa que la obra vaya a recibir necesariamente protección por derechos de autor conforme a la legislación de la jurisdicción correspondiente.

Suno ofrece los planes Free, Pro y Premier. Los Credits y los derechos incluidos en las versiones gratuita y de pago pueden cambiar, por lo que debe consultarse la información que aparece en la cuenta oficial y en la página de precios de Suno.

Estas reglas ayudan al equipo a comprender los derechos que Suno ofrece a los creadores, pero las condiciones comerciales de la propia aplicación, las normas de carga y las cuestiones de cumplimiento normativo en cada región siguen requiriendo un diseño independiente.

Un diagrama para comprender de un vistazo una arquitectura lista para producción

┌──────────────┐
│ Web / App    │
│ Creación y   │
│ reproductor  │
└──────┬───────┘
       │
┌──────▼────────┐
│ API de negocio│
│ Usuarios,     │
│ proyectos,    │
│ cuotas        │
└───┬────────┬──┘
    │        │
    │        └──────────────┐
    │                       │
┌───▼────────┐      ┌──────▼───────┐
│ Cola de    │      │ PostgreSQL   │
│ tareas     │      │ Tareas y     │
│ Reintentos │      │ movimientos  │
│ y compens. │      │              │
└───┬────────┘      └──────────────┘
    │
┌───▼────────────────┐
│ Ace Data Cloud     │
│ Suno API / MCP     │
└───┬────────────────┘
    │ Devol

Comprobar la URL del audio ↓ Descargarlo en segundo plano al almacenamiento de objetos propio ↓ Registrar el tamaño del archivo y su hash ↓ Generar una dirección de acceso propia ↓ Mostrarlo y permitir su descarga en el frontend


Al guardar el archivo, se pueden registrar los siguientes datos\:

```json
{
  "provider_audio_id": "audio_xxx",
  "source_url": "https://...",
  "storage_key": "music/user-42/project-18/audio-x.mp3",
  "sha256": "f91d...",
  "duration": 154.92,
  "mime_type": "audio/mpeg",
  "saved_at": "2026-10-12T08:30:00Z"
}

Si la canción se utiliza posteriormente para continuar la composición o hacer una versión, también es necesario seguir guardando el ID de audio de la plataforma. La dirección de almacenamiento propia se utiliza para reproducir y descargar el archivo, mientras que el ID de audio de la plataforma se utiliza para seguir invocando las funciones de creación. Ambos tienen finalidades distintas.

Lo que más fácilmente se pasa por alto suele ser la carga de audio y los derechos de autor

Cuando solo se genera música a partir de texto, los problemas de derechos de autor parecen todavía bastante alejados del producto. Sin embargo, una vez que se habilitan la carga de audio, las versiones de canciones, Persona o las voces personalizadas, los riesgos aumentan considerablemente.

Como mínimo, el producto debe aclarar lo siguiente:

  • ¿El usuario ha creado o grabado personalmente este audio?
  • ¿Tiene el usuario derecho a autorizar a la plataforma a procesarlo y generar contenido derivado?
  • ¿El audio contiene la voz de algún cantante sin autorización?
  • ¿El usuario intenta imitar a una persona real para inducir a otros a error?
  • En caso de reclamación, ¿puede la plataforma localizar y retirar el contenido correspondiente?

Cerca del botón de carga se puede incluir una declaración explícita:

Al subir el archivo, confirmas que posees los derechos necesarios sobre el audio o que has obtenido la autorización del titular de los derechos de autor, del intérprete y del titular de los derechos sobre la voz. No subas grabaciones comerciales sin autorización ni utilices la voz de otras personas para suplantar su identidad.

También se puede guardar la información de autorización en el registro de la tarea:

{
  "source_type": "user_upload",
  "rights_confirmed": true,
  "rights_version": "2026-10",
  "confirmed_at": "2026-10-12T08:00:00Z"
}

Suno indica que las canciones creadas y descargadas durante una suscripción de pago pueden beneficiarse de derechos relacionados con el uso comercial, pero esta licencia de uso comercial no significa que la obra vaya a recibir necesariamente protección por derechos de autor conforme a la legislación de la jurisdicción correspondiente.

Suno ofrece los planes Free, Pro y Premier. Los Credits y los derechos incluidos en las versiones gratuita y de pago pueden cambiar, por lo que debe consultarse la información que aparece en la cuenta oficial y en la página de precios de Suno.

Estas reglas ayudan al equipo a comprender los derechos que Suno ofrece a los creadores, pero las condiciones comerciales de la propia aplicación, las normas de carga y las cuestiones de cumplimiento normativo en cada región siguen requiriendo un diseño independiente.

Un diagrama para comprender de un vistazo una arquitectura lista para producción

┌──────────────┐
│ Web / App    │
│ Creación y   │
│ reproductor  │
└──────┬───────┘
       │
┌──────▼────────┐
│ API de negocio│
│ Usuarios,     │
│ proyectos,    │
│ cuotas        │
└───┬────────┬──┘
    │        │
    │        └──────────────┐
    │                       │
┌───▼────────┐      ┌──────▼───────┐
│ Cola de    │      │ PostgreSQL   │
│ tareas     │      │ Tareas y     │
│ Reintentos │      │ movimientos  │
│ y compens. │      │              │
└───┬────────┘      └──────────────┘
    │
┌───▼────────────────┐
│ Ace Data Cloud     │
│ Suno API / MCP     │
└───┬────────────────┘
    │ Devolución de llamada
┌───▼───────────────┐
│ Worker de         │
│ procesamiento     │
│ de resultados

Comprobar la URL del audio ↓ Descargarlo en segundo plano al almacenamiento de objetos propio ↓ Registrar el tamaño del archivo y su hash ↓ Generar una dirección de acceso propia ↓ Mostrarlo y permitir su descarga en el frontend


Al guardar el archivo, se pueden registrar los siguientes datos\:

```json
{
  "provider_audio_id": "audio_xxx",
  "source_url": "https://...",
  "storage_key": "music/user-42/project-18/audio-x.mp3",
  "sha256": "f91d...",
  "duration": 154.92,
  "mime_type": "audio/mpeg",
  "saved_at": "2026-10-12T08:30:00Z"
}

Si la canción se utiliza posteriormente para continuar la composición o hacer una versión, también es necesario seguir guardando el ID de audio de la plataforma. La dirección de almacenamiento propia se utiliza para reproducir y descargar el archivo, mientras que el ID de audio de la plataforma se utiliza para seguir invocando las funciones de creación. Ambos tienen finalidades distintas.

Lo que más fácilmente se pasa por alto suele ser la carga de audio y los derechos de autor

Cuando solo se genera música a partir de texto, los problemas de derechos de autor parecen todavía bastante alejados del producto. Sin embargo, una vez que se habilitan la carga de audio, las versiones de canciones, Persona o las voces personalizadas, los riesgos aumentan considerablemente.

Como mínimo, el producto debe aclarar lo siguiente:

  • ¿El usuario ha creado o grabado personalmente este audio?
  • ¿Tiene el usuario derecho a autorizar a la plataforma a procesarlo y generar contenido derivado?
  • ¿El audio contiene la voz de algún cantante sin autorización?
  • ¿El usuario intenta imitar a una persona real para inducir a otros a error?
  • En caso de reclamación, ¿puede la plataforma localizar y retirar el contenido correspondiente?

Cerca del botón de carga se puede incluir una declaración explícita:

Al subir el archivo, confirmas que posees los derechos necesarios sobre el audio o que has obtenido la autorización del titular de los derechos de autor, del intérprete y del titular de los derechos sobre la voz. No subas grabaciones comerciales sin autorización ni utilices la voz de otras personas para suplantar su identidad.

También se puede guardar la información de autorización en el registro de la tarea:

{
  "source_type": "user_upload",
  "rights_confirmed": true,
  "rights_version": "2026-10",
  "confirmed_at": "2026-10-12T08:00:00Z"
}

Suno indica que las canciones creadas y descargadas durante una suscripción de pago pueden beneficiarse de derechos relacionados con el uso comercial, pero esta licencia de uso comercial no significa que la obra vaya a recibir necesariamente protección por derechos de autor conforme a la legislación de la jurisdicción correspondiente.

Suno ofrece los planes Free, Pro y Premier. Los Credits y los derechos incluidos en las versiones gratuita y de pago pueden cambiar, por lo que debe consultarse la información que aparece en la cuenta oficial y en la página de precios de Suno.

Estas reglas ayudan al equipo a comprender los derechos que Suno ofrece a los creadores, pero las condiciones comerciales de la propia aplicación, las normas de carga y las cuestiones de cumplimiento normativo en cada región siguen requiriendo un diseño independiente.

Un diagrama para comprender de un vistazo una arquitectura lista para producción

┌──────────────┐
│ Web / App    │
│ Creación y   │
│ reproductor  │
└──────┬───────┘
       │
┌──────▼────────┐
│ API de negocio│
│ Usuarios,     │
│ proyectos,    │
│ cuotas        │
└───┬────────┬──┘
    │        │
    │        └──────────────┐
    │                       │
┌───▼────────┐      ┌──────▼───────┐
│ Cola de    │      │ PostgreSQL   │
│ tareas     │      │ Tareas y     │
│ Reintentos │      │ movimientos  │
│ y compens. │      │              │
└───┬────────┘      └──────────────┘
    │
┌───▼────────────────┐
│ Ace Data Cloud     │
│ Suno API / MCP     │
└───┬────────────────┘
    │ Devolución de llamada
┌───▼───────────────┐
│ Worker de         │
│ procesamiento     │
│ de resultados     │
│ Guarda el audio   │
│ y actualiza estado│
└───┬───────────────┘
    │
┌──

Comprobar la URL del audio ↓ Descargarlo en segundo plano al almacenamiento de objetos propio ↓ Registrar el tamaño del archivo y su hash ↓ Generar una dirección de acceso propia ↓ Mostrarlo y permitir su descarga en el frontend


Al guardar el archivo, se pueden registrar los siguientes datos\:

```json
{
  "provider_audio_id": "audio_xxx",
  "source_url": "https://...",
  "storage_key": "music/user-42/project-18/audio-x.mp3",
  "sha256": "f91d...",
  "duration": 154.92,
  "mime_type": "audio/mpeg",
  "saved_at": "2026-10-12T08:30:00Z"
}

Si la canción se utiliza posteriormente para continuar la composición o hacer una versión, también es necesario seguir guardando el ID de audio de la plataforma. La dirección de almacenamiento propia se utiliza para reproducir y descargar el archivo, mientras que el ID de audio de la plataforma se utiliza para seguir invocando las funciones de creación. Ambos tienen finalidades distintas.

Lo que más fácilmente se pasa por alto suele ser la carga de audio y los derechos de autor

Cuando solo se genera música a partir de texto, los problemas de derechos de autor parecen todavía bastante alejados del producto. Sin embargo, una vez que se habilitan la carga de audio, las versiones de canciones, Persona o las voces personalizadas, los riesgos aumentan considerablemente.

Como mínimo, el producto debe aclarar lo siguiente:

  • ¿El usuario ha creado o grabado personalmente este audio?
  • ¿Tiene el usuario derecho a autorizar a la plataforma a procesarlo y generar contenido derivado?
  • ¿El audio contiene la voz de algún cantante sin autorización?
  • ¿El usuario intenta imitar a una persona real para inducir a otros a error?
  • En caso de reclamación, ¿puede la plataforma localizar y retirar el contenido correspondiente?

Cerca del botón de carga se puede incluir una declaración explícita:

Al subir el archivo, confirmas que posees los derechos necesarios sobre el audio o que has obtenido la autorización del titular de los derechos de autor, del intérprete y del titular de los derechos sobre la voz. No subas grabaciones comerciales sin autorización ni utilices la voz de otras personas para suplantar su identidad.

También se puede guardar la información de autorización en el registro de la tarea:

{
  "source_type": "user_upload",
  "rights_confirmed": true,
  "rights_version": "2026-10",
  "confirmed_at": "2026-10-12T08:00:00Z"
}

Suno indica que las canciones creadas y descargadas durante una suscripción de pago pueden beneficiarse de derechos relacionados con el uso comercial, pero esta licencia de uso comercial no significa que la obra vaya a recibir necesariamente protección por derechos de autor conforme a la legislación de la jurisdicción correspondiente.

Suno ofrece los planes Free, Pro y Premier. Los Credits y los derechos incluidos en las versiones gratuita y de pago pueden cambiar, por lo que debe consultarse la información que aparece en la cuenta oficial y en la página de precios de Suno.

Estas reglas ayudan al equipo a comprender los derechos que Suno ofrece a los creadores, pero las condiciones comerciales de la propia aplicación, las normas de carga y las cuestiones de cumplimiento normativo en cada región siguen requiriendo un diseño independiente.

Un diagrama para comprender de un vistazo una arquitectura lista para producción

┌──────────────┐
│ Web / App    │
│ Creación y   │
│ reproductor  │
└──────┬───────┘
       │
┌──────▼────────┐
│ API de negocio│
│ Usuarios,     │
│ proyectos,    │
│ cuotas        │
└───┬────────┬──┘
    │        │
    │        └──────────────┐
    │                       │
┌───▼────────┐      ┌──────▼───────┐
│ Cola de    │      │ PostgreSQL   │
│ tareas     │      │ Tareas y     │
│ Reintentos │      │ movimientos  │
│ y compens. │      │              │
└───┬────────┘      └──────────────┘
    │
┌───▼────────────────┐
│ Ace Data Cloud     │
│ Suno API / MCP     │
└───┬────────────────┘
    │ Devolución de llamada
┌───▼───────────────┐
│ Worker de         │
│ procesamiento     │
│ de resultados     │
│ Guarda el audio   │
│ y actualiza estado│
└───┬───────────────┘
    │
┌───▼───────────────┐
│ Almacenamiento de │
│ objetos y CDN     │
└───────────────────┘

Esta arquitectura no es compleja, pero resuelve varios aspectos clave que van más allá de «el frontend solicita directamente la API de música»: el Token no queda expuesto, las tareas no se pierden, las cuotas quedan registradas, los archivos pueden conservarse a largo plazo y los fallos también pueden compensarse.

Lo que realmente hace que los usuarios se queden es la experiencia más allá de la generación

Lo más difícil de una aplicación basada en Suno no suele ser la propia generación musical.

Lo que realmente influye en que los usuarios quieran seguir utilizándola es si se sienten seguros durante la espera, si pierden sus cuotas cuando se produce un fallo, si pueden seguir modificando los resultados generados, si pueden recuperar sus obras anteriores y si los límites de derechos sobre el contenido subido están claramente definidos.

Si se resuelven bien estas cuestiones, una sencilla página de generación tendrá la oportunidad de convertirse en un verdadero producto musical.

Enlaces de referencia

  • Planes oficiales de Suno
  • Explicación de los Credits de las suscripciones de Suno
  • [ExpComprobar la URL del audio ↓ Descargarlo en segundo plano al almacenamiento de objetos propio ↓ Registrar el tamaño del archivo y su hash ↓ Generar una dirección de acceso propia ↓ Mostrarlo y permitir su descarga en el frontend

Al guardar el archivo, se pueden registrar los siguientes datos\:

```json
{
  "provider_audio_id": "audio_xxx",
  "source_url": "https://...",
  "storage_key": "music/user-42/project-18/audio-x.mp3",
  "sha256": "f91d...",
  "duration": 154.92,
  "mime_type": "audio/mpeg",
  "saved_at": "2026-10-12T08:30:00Z"
}

Si la canción se utiliza posteriormente para continuar la composición o hacer una versión, también es necesario seguir guardando el ID de audio de la plataforma. La dirección de almacenamiento propia se utiliza para reproducir y descargar el archivo, mientras que el ID de audio de la plataforma se utiliza para seguir invocando las funciones de creación. Ambos tienen finalidades distintas.

Lo que más fácilmente se pasa por alto suele ser la carga de audio y los derechos de autor

Cuando solo se genera música a partir de texto, los problemas de derechos de autor parecen todavía bastante alejados del producto. Sin embargo, una vez que se habilitan la carga de audio, las versiones de canciones, Persona o las voces personalizadas, los riesgos aumentan considerablemente.

Como mínimo, el producto debe aclarar lo siguiente:

  • ¿El usuario ha creado o grabado personalmente este audio?
  • ¿Tiene el usuario derecho a autorizar a la plataforma a procesarlo y generar contenido derivado?
  • ¿El audio contiene la voz de algún cantante sin autorización?
  • ¿El usuario intenta imitar a una persona real para inducir a otros a error?
  • En caso de reclamación, ¿puede la plataforma localizar y retirar el contenido correspondiente?

Cerca del botón de carga se puede incluir una declaración explícita:

Al subir el archivo, confirmas que posees los derechos necesarios sobre el audio o que has obtenido la autorización del titular de los derechos de autor, del intérprete y del titular de los derechos sobre la voz. No subas grabaciones comerciales sin autorización ni utilices la voz de otras personas para suplantar su identidad.

También se puede guardar la información de autorización en el registro de la tarea:

{
  "source_type": "user_upload",
  "rights_confirmed": true,
  "rights_version": "2026-10",
  "confirmed_at": "2026-10-12T08:00:00Z"
}

Suno indica que las canciones creadas y descargadas durante una suscripción de pago pueden beneficiarse de derechos relacionados con el uso comercial, pero esta licencia de uso comercial no significa que la obra vaya a recibir necesariamente protección por derechos de autor conforme a la legislación de la jurisdicción correspondiente.

Suno ofrece los planes Free, Pro y Premier. Los Credits y los derechos incluidos en las versiones gratuita y de pago pueden cambiar, por lo que debe consultarse la información que aparece en la cuenta oficial y en la página de precios de Suno.

Estas reglas ayudan al equipo a comprender los derechos que Suno ofrece a los creadores, pero las condiciones comerciales de la propia aplicación, las normas de carga y las cuestiones de cumplimiento normativo en cada región siguen requiriendo un diseño independiente.

Un diagrama para comprender de un vistazo una arquitectura lista para producción

┌──────────────┐
│ Web / App    │
│ Creación y   │
│ reproductor  │
└──────┬───────┘
       │
┌──────▼────────┐
│ API de negocio│
│ Usuarios,     │
│ proyectos,    │
│ cuotas        │
└───┬────────┬──┘
    │        │
    │        └──────────────┐
    │                       │
┌───▼────────┐      ┌──────▼───────┐
│ Cola de    │      │ PostgreSQL   │
│ tareas     │      │ Tareas y     │
│ Reintentos │      │ movimientos  │
│ y compens. │      │              │
└───┬────────┘      └──────────────┘
    │
┌───▼────────────────┐
│ Ace Data Cloud     │
│ Suno API / MCP     │
└───┬────────────────┘
    │ Devolución de llamada
┌───▼───────────────┐
│ Worker de         │
│ procesamiento     │
│ de resultados     │
│ Guarda el audio   │
│ y actualiza estado│
└───┬───────────────┘
    │
┌───▼───────────────┐
│ Almacenamiento de │
│ objetos y CDN     │
└───────────────────┘

Esta arquitectura no es compleja, pero resuelve varios aspectos clave que van más allá de «el frontend solicita directamente la API de música»: el Token no queda expuesto, las tareas no se pierden, las cuotas quedan registradas, los archivos pueden conservarse a largo plazo y los fallos también pueden compensarse.

Lo que realmente hace que los usuarios se queden es la experiencia más allá de la generación

Lo más difícil de una aplicación basada en Suno no suele ser la propia generación musical.

Lo que realmente influye en que los usuarios quieran seguir utilizándola es si se sienten seguros durante la espera, si pierden sus cuotas cuando se produce un fallo, si pueden seguir modificando los resultados generados, si pueden recuperar sus obras anteriores y si los límites de derechos sobre el contenido subido están claramente definidos.

Si se resuelven bien estas cuestiones, una sencilla página de generación tendrá la oportunidad de convertirse en un verdadero producto musical.

Enlaces de referencia

  • Planes oficiales de Suno
  • Explicación de los Credits de las suscripciones de Suno
  • Explicación de Suno sobre el uso comercial con suscripciones de pago
  • Servicio Suno de Ace Data Cloud
  • API de generación de audio de Suno
  • [Guía de integración de la API de generación de canciones de SunoComprobar la URL del audio ↓ Descargarlo en segundo plano al almacenamiento de objetos propio ↓ Registrar el tamaño del archivo y su hash ↓ Generar una dirección de acceso propia ↓ Mostrarlo y permitir su descarga en el frontend

Al guardar el archivo, se pueden registrar los siguientes datos\:

```json
{
  "provider_audio_id": "audio_xxx",
  "source_url": "https://...",
  "storage_key": "music/user-42/project-18/audio-x.mp3",
  "sha256": "f91d...",
  "duration": 154.92,
  "mime_type": "audio/mpeg",
  "saved_at": "2026-10-12T08:30:00Z"
}

Si la canción se utiliza posteriormente para continuar la composición o hacer una versión, también es necesario seguir guardando el ID de audio de la plataforma. La dirección de almacenamiento propia se utiliza para reproducir y descargar el archivo, mientras que el ID de audio de la plataforma se utiliza para seguir invocando las funciones de creación. Ambos tienen finalidades distintas.

Lo que más fácilmente se pasa por alto suele ser la carga de audio y los derechos de autor

Cuando solo se genera música a partir de texto, los problemas de derechos de autor parecen todavía bastante alejados del producto. Sin embargo, una vez que se habilitan la carga de audio, las versiones de canciones, Persona o las voces personalizadas, los riesgos aumentan considerablemente.

Como mínimo, el producto debe aclarar lo siguiente:

  • ¿El usuario ha creado o grabado personalmente este audio?
  • ¿Tiene el usuario derecho a autorizar a la plataforma a procesarlo y generar contenido derivado?
  • ¿El audio contiene la voz de algún cantante sin autorización?
  • ¿El usuario intenta imitar a una persona real para inducir a otros a error?
  • En caso de reclamación, ¿puede la plataforma localizar y retirar el contenido correspondiente?

Cerca del botón de carga se puede incluir una declaración explícita:

Al subir el archivo, confirmas que posees los derechos necesarios sobre el audio o que has obtenido la autorización del titular de los derechos de autor, del intérprete y del titular de los derechos sobre la voz. No subas grabaciones comerciales sin autorización ni utilices la voz de otras personas para suplantar su identidad.

También se puede guardar la información de autorización en el registro de la tarea:

{
  "source_type": "user_upload",
  "rights_confirmed": true,
  "rights_version": "2026-10",
  "confirmed_at": "2026-10-12T08:00:00Z"
}

Suno indica que las canciones creadas y descargadas durante una suscripción de pago pueden beneficiarse de derechos relacionados con el uso comercial, pero esta licencia de uso comercial no significa que la obra vaya a recibir necesariamente protección por derechos de autor conforme a la legislación de la jurisdicción correspondiente.

Suno ofrece los planes Free, Pro y Premier. Los Credits y los derechos incluidos en las versiones gratuita y de pago pueden cambiar, por lo que debe consultarse la información que aparece en la cuenta oficial y en la página de precios de Suno.

Estas reglas ayudan al equipo a comprender los derechos que Suno ofrece a los creadores, pero las condiciones comerciales de la propia aplicación, las normas de carga y las cuestiones de cumplimiento normativo en cada región siguen requiriendo un diseño independiente.

Un diagrama para comprender de un vistazo una arquitectura lista para producción

┌──────────────┐
│ Web / App    │
│ Creación y   │
│ reproductor  │
└──────┬───────┘
       │
┌──────▼────────┐
│ API de negocio│
│ Usuarios,     │
│ proyectos,    │
│ cuotas        │
└───┬────────┬──┘
    │        │
    │        └──────────────┐
    │                       │
┌───▼────────┐      ┌──────▼───────┐
│ Cola de    │      │ PostgreSQL   │
│ tareas     │      │ Tareas y     │
│ Reintentos │      │ movimientos  │
│ y compens. │      │              │
└───┬────────┘      └──────────────┘
    │
┌───▼────────────────┐
│ Ace Data Cloud     │
│ Suno API / MCP     │
└───┬────────────────┘
    │ Devolución de llamada
┌───▼───────────────┐
│ Worker de         │
│ procesamiento     │
│ de resultados     │
│ Guarda el audio   │
│ y actualiza estado│
└───┬───────────────┘
    │
┌───▼───────────────┐
│ Almacenamiento de │
│ objetos y CDN     │
└───────────────────┘

Esta arquitectura no es compleja, pero resuelve varios aspectos clave que van más allá de «el frontend solicita directamente la API de música»: el Token no queda expuesto, las tareas no se pierden, las cuotas quedan registradas, los archivos pueden conservarse a largo plazo y los fallos también pueden compensarse.

Lo que realmente hace que los usuarios se queden es la experiencia más allá de la generación

Lo más difícil de una aplicación basada en Suno no suele ser la propia generación musical.

Lo que realmente influye en que los usuarios quieran seguir utilizándola es si se sienten seguros durante la espera, si pierden sus cuotas cuando se produce un fallo, si pueden seguir modificando los resultados generados, si pueden recuperar sus obras anteriores y si los límites de derechos sobre el contenido subido están claramente definidos.

Si se resuelven bien estas cuestiones, una sencilla página de generación tendrá la oportunidad de convertirse en un verdadero producto musical.

Enlaces de referencia

  • Planes oficiales de Suno
  • Explicación de los Credits de las suscripciones de Suno
  • Explicación de Suno sobre el uso comercial con suscripciones de pago
  • Servicio Suno de Ace Data Cloud
  • API de generación de audio de Suno
  • Guía de integración de la API de generación de canciones de Suno
  • API de carga de Suno
  • Integración de Suno MCP con Claude Code