# Entrega firmada | Docs de AudioDN

> Firma URLs de entrega en tu propio servidor con una clave URL Signing para omitir por completo las sesiones de reproducción — la ruta más rápida a la reproducción para pistas públicas.

Source: https://audiodeliverynetwork.com/es/docs/integration/signed-delivery/

---

# Entrega firmada (vía rápida)

Firma URLs de entrega en tu propio servidor y omite por completo las sesiones de reproducción. Sin round trip a la API, sin token de sesión, sin cabecera `Authorization` — solo una URL que tus oyentes pueden reproducir de inmediato.

#### Ideal para

Catálogos públicos, sitios de marketing, previews y cualquier pista que te resulte cómodo servir a cualquiera con el enlace. La configuración tarda unos 20 minutos.

#### Acceso público

Cualquiera con una URL firmada válida puede reproducir el archivo hasta que caduque la firma. Firma siempre en tu servidor, elige una duración de firma razonable y elimina las claves que ya no uses. Cada solicitud firmada cuenta para el uso de reproducción y la facturación.

## Comparación con las sesiones de reproducción

Las rutas [Hybrid](/docs/integration/hybrid) y [Server-Side](/docs/integration/server-side) generan una **sesión de reproducción** — un token de corta duración por oyente creado al llamar a la API de AudioDN. Ese round trip es lo que te permite aplicar derechos (inicios de sesión, suscripciones, compras) en el momento de la reproducción.

La entrega firmada elimina ese round trip. Tú tienes un secreto HMAC por organización y firmas la URL de entrega tú mismo, así que la solicitud del oyente va **directamente a tu dominio de entrega** y se verifica en el edge. Para pistas públicas donde no necesitas autorización por reproducción, esta es la opción más rápida y sencilla.

|  | Sesión de reproducción (Hybrid / Server-Side) | Entrega firmada (esta ruta) |
| --- | --- | --- |
| Round trip a la API por oyente | Sí — generar una sesión | No — firmar localmente |
| Autorización por reproducción | Aplicada al crear la sesión | Tu responsabilidad (quién recibe un enlace) |
| Ideal para | Audio con paywall / acceso restringido | Pistas públicas y previews |
| Reproducciones contabilizadas para facturación | Sí | Sí |

Para la referencia completa — el esquema de firma, el alcance por variante y los detalles de reporting — consulta la documentación de [Signing Keys API](/docs/api/signing-keys).

## Firmar y entregar

Genera una clave de firma, firma en tu servidor, reproduce desde tu dominio de entrega.

### 1\. Crear una clave URL Signing

En el [panel de AudioDN](https://account.audiodeliverynetwork.com), ve a **Settings → API Keys** y crea una clave **URL Signing**. El secreto se muestra **una sola vez** — guárdalo de forma segura en tu servidor. Opcionalmente puedes establecer una duración de firma (`ttl`) y restringir la clave a variantes concretas.

### 2\. Encontrar tu dominio de entrega

Cada organización obtiene un subdominio de entrega dedicado con la forma `{organization_id}.audiodelivery.net`. Copia el tuyo desde **Settings → Organization → Delivery Domain**. La URL completa de un archivo es tu dominio de entrega más la ruta del archivo:

```
https://1bb2f0c4-....audiodelivery.net/7e4386f0-..../20260709145408659.uSYrzmRWTDvEyjFz_lq.aac
```

### 3\. Firmar la URL en tu servidor

Calcula un token HMAC-SHA256 sobre la ruta de la solicitud más la marca de tiempo actual, y añádelo como parámetro de query `verify`. Esta implementación de referencia usa la Web Crypto API y funciona en Node 18+, Deno, Bun y la mayoría de runtimes de edge:

```
function base64url(bytes) {
  let binary = '';
  const b = new Uint8Array(bytes);
  for (let i = 0; i < b.byteLength; i++) binary += String.fromCharCode(b[i]);
  return btoa(binary).replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
}

async function hmacSha256(key, data) {
  const cryptoKey = await crypto.subtle.importKey(
    'raw', new TextEncoder().encode(key),
    { name: 'HMAC', hash: 'SHA-256' }, false, ['sign']
  );
  return new Uint8Array(await crypto.subtle.sign('HMAC', cryptoKey, new TextEncoder().encode(data)));
}

// secret = the URL Signing key secret from the dashboard (keep this server-side)
// domain = your org delivery host, e.g. "1bb2....audiodelivery.net"
// path   = the file path, e.g. "folder-id/track-index_lq.mp3"
async function signUrl(secret, domain, path) {
  const u = new URL('https://' + domain + '/' + path);
  u.searchParams.delete('verify');

  const message = u.pathname + (u.search || '');
  const issued = Math.floor(Date.now() / 1000).toString();

  const mac = await hmacSha256(secret, message + issued);
  u.searchParams.append('verify', issued + '-' + base64url(mac)); // verify MUST be last

  return u.toString();
}
```

#### Mantén el secreto en el servidor

El secreto de firma nunca debe llegar al navegador. Si lo hace, cualquiera puede generar URLs de tu audio. Firma en una ruta de backend y devuelve solo la URL terminada al cliente.

### 4\. Servir la URL firmada al cliente

```
// Express example: hand a freshly signed URL to your frontend.
app.get('/api/track-url', async (req, res) => {
  const url = await signUrl(
    process.env.ADN_SIGNING_SECRET,      // never expose this to the client
    process.env.ADN_DELIVERY_DOMAIN,     // e.g. 1bb2....audiodelivery.net
    req.query.path                       // folder-id/track-index_lq.mp3
  );
  res.json({ url });
});
```

El frontend obtiene una URL lista para reproducir — no se expone material de clave.

### 5\. Reproducirla dondequiera que funcione una URL

Una URL firmada es solo una URL, así que encaja directamente en un elemento nativo `<audio>`, tu propio player personalizado o un enlace de descarga.

```
<!-- The signed URL works anywhere a normal audio URL does. -->
<audio controls src="https://{org}.audiodelivery.net/{file_path}?verify={issued}-{mac}">
</audio>
```

#### ¿Usas el componente Player de ADN?

El componente [Player](/docs/components/player) se autentica con una clave API Client-Side o un `play-session-id` en lugar de una URL prefirmada. Si quieres la UI del player de ADN, usa la ruta [Web](/docs/integration/web) o [Hybrid](/docs/integration/hybrid). La entrega firmada es para streaming directo sin sesión de reproducción.

### 6\. Reproducciones e informes

Las URLs firmadas omiten la sesión de reproducción, pero tus estadísticas de reproducción siguen siendo precisas — las reproducciones se miden a partir de la entrega real de audio en tu dominio y se agregan por hora. Como cada solicitud firmada es una entrega real, cuenta para tu uso de reproducción y facturación igual que un stream de sesión de reproducción.
