# Claves API | Docs de AudioDN

> Genera claves Client-Side Player y Client-Side Upload de forma programática desde tu servidor.

Source: https://audiodeliverynetwork.com/es/docs/api/api-keys/

---

# Claves API

Crea nuevas claves API de servidor a servidor usando una clave **API Access** existente. Esto te permite aprovisionar claves **Client-Side Player** y **Client-Side Upload** bajo demanda — por ejemplo, generar una clave de player con alcance por cliente.

#### Las claves Inline Share y URL Signing solo están en el panel

Las claves **Inline Share** (ver [Inline Share](/docs/api/share)) y **URL Signing** (ver [Signing Keys](/docs/api/signing-keys)) se documentan aquí como referencia, pero **no se pueden crear ni gestionar a través de la API**. Deben crearse desde **Settings → API Keys** en el [panel de AudioDN](https://account.audiodeliverynetwork.com), porque aprovisionan configuración de edge (reglas de firma) que la API no gestiona.

#### Las claves API Access se crean en el panel

Primero debes crear una clave **API Access** desde **Settings → API Keys** en el [panel de AudioDN](https://account.audiodeliverynetwork.com). Esa clave autentica este endpoint. Las propias claves API Access no se pueden crear vía la API.

## Tipos de clave creables

-   `player` — Clave Client-Side Player para reproducción
-   `uploader` — Clave Client-Side Upload para subidas

Los tipos `api` (API Access), `share` (Inline Share) y `signing` (URL Signing) no se pueden crear aquí — se gestionan solo desde la página **Settings → API Keys** del panel.

## Caducidad y alcance

Vía la API, `expires_at` es **opcional** para ambos tipos de clave — omítelo para crear una clave que no caduque por tiempo. Opcionalmente puedes limitar una clave a un `collection_id` concreto (y además a un `track_id`). Si tu clave API Access ya tiene alcance a una colección, la nueva clave no puede tener un alcance fuera de ella.

**Descargas:** una clave de player puede permitir descargas opcionalmente. Esto se configura desde el panel al crear la clave (el interruptor _Allow downloads_) y no es configurable a través de este endpoint de la API. El permiso de descarga de la clave es autoritativo: el atributo `downloadable` del player solo _solicita_ descargas, y una sesión de reproducción es descargable solo cuando la clave lo permite _y_ la solicitud lo activa.

POST `/v1/api_key`

Crea una nueva clave API de player o uploader

#### Parámetros

| Nombre | Tipo | Obligatorio | Descripción |
| --- | --- | --- | --- |
| `title` | string | Obligatorio | Nombre de la clave API |
| `api_key_type_id` | string | Obligatorio | Uno de 'player' o 'uploader'. Las claves share y signing solo están en el panel. |
| `collection_id` | uuid | Opcional | Limitar la clave a una colección concreta |
| `track_id` | uuid | Opcional | Limitar la clave a una pista concreta (requiere collection\_id) |
| `creator_id` | uuid | Opcional | Limitar la clave a un creator concreto |
| `variants` | array of strings | Opcional | Opcional. Limitar una clave de player a variantes concretas. |
| `expires_at` | string | Opcional | Fecha/hora de caducidad ISO 8601. Opcional; omítelo para una clave que no caduque por tiempo. |

#### Ejemplo de solicitud

    

```
curl -X POST "https://api.audiodelivery.net/v1/api_key" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "title": "Customer Player Key",
  "api_key_type_id": "player",
  "collection_id": "COLLECTION_ID"
}'
```

```
const payload = {
  "title": "Customer Player Key",
  "api_key_type_id": "player",
  "collection_id": "COLLECTION_ID"
};

const response = await fetch('https://api.audiodelivery.net/v1/api_key', {
  method: 'POST',
  headers: {
    'Authorization': 'Bearer YOUR_API_KEY',
    'Content-Type': 'application/json',
  },
  body: JSON.stringify(payload)
});

const data = await response.json();
```

```
import Foundation

func performRequest() async throws {
    var request = URLRequest(url: URL(string: "https://api.audiodelivery.net/v1/api_key")!)
    request.httpMethod = "POST"
    request.setValue("Bearer YOUR_API_KEY", forHTTPHeaderField: "Authorization")
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    let bodyJSON = """
{
  "title": "Customer Player Key",
  "api_key_type_id": "player",
  "collection_id": "COLLECTION_ID"
}
"""
    request.httpBody = bodyJSON.data(using: .utf8)
    let (data, _) = try await URLSession.shared.data(for: request)
    let json = try JSONSerialization.jsonObject(with: data) as! [String: Any]
    // use json
}
```

```
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import okhttp3.*
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.RequestBody.Companion.toRequestBody

val client = OkHttpClient()

suspend fun performRequest(): String = withContext(Dispatchers.IO) {
    val body = """{
  "title": "Customer Player Key",
  "api_key_type_id": "player",
  "collection_id": "COLLECTION_ID"
}""".toRequestBody("application/json".toMediaType())
    val request = Request.Builder()
        .url("https://api.audiodelivery.net/v1/api_key")
        .post(body)
        .addHeader("Authorization", "Bearer YOUR_API_KEY")
        .addHeader("Content-Type", "application/json")
        .build()
    val response = client.newCall(request).execute()
    response.body?.string() ?: error("Empty response body")
}
```

```
import 'dart:convert';
import 'package:http/http.dart' as http;

Future<Map<String, dynamic>> performRequest() async {
  final response = await http.post(
    Uri.parse("https://api.audiodelivery.net/v1/api_key"),
    headers: {
      "Authorization": "Bearer YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: jsonEncode({
  "title": "Customer Player Key",
  "api_key_type_id": "player",
  "collection_id": "COLLECTION_ID"
}),
  );
  if (response.statusCode < 200 || response.statusCode >= 300) {
    throw Exception('Request failed: ${response.statusCode}');
  }
  return jsonDecode(response.body) as Map<String, dynamic>;
}
```

#### Respuesta

```
{
"ok": true,
"api_request_id": "uuid",
"api_key": "string"
}
```

#### Se muestra una sola vez

La `api_key` completa se devuelve solo en esta respuesta y nunca se almacena en texto plano. Guárdala de forma segura — no se puede recuperar de nuevo.
