# Sessions d'envoi | Docs AudioDN

> Points de terminaison API pour créer des sessions d

Source: https://audiodeliverynetwork.com/fr/docs/api/upload-sessions/

---

# Sessions d’envoi

Les sessions d’envoi permettent l’envoi par lot de plusieurs pistes vers une collection. Vous pouvez optionnellement inclure un objet `track` imbriqué lors de la création de la session pour aussi créer cette piste et recevoir son URL d’envoi dans la réponse.

Le `player_color` résolu est accompagné de deux compagnons en lecture seule, `player_color_light` et `player_color_dark`, ajustés pour rester lisibles respectivement sur des fonds clairs et sombres.

POST `/v1/upload_session`

Crée une nouvelle session d'envoi pour l'envoi par lot de pistes. Par défaut renvoie uniquement un upload\_session\_id — créez les pistes via POST /v1/upload/:upload\_session\_id/track. Incluez optionnellement un objet track imbriqué pour aussi créer cette piste et recevoir l'URL d'envoi par piste dans cette réponse.

#### Paramètres

| Nom | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `collection_id` | uuid | Obligatoire | Identifiant de la collection. Requis sauf si la clé API est limitée à une collection. |
| `creator_id` | uuid | Facultatif | Identifiant du créateur |
| `organization_index` | string | Facultatif | Index d'organisation (niveau session) |
| `metadata` | object | Facultatif | Métadonnées supplémentaires (niveau session) |
| `expires_in` | number | Facultatif | Durée de la session en secondes (par défaut : 3600, min : 60, max : 86400) |
| `track` Piste facultative | object | Facultatif | Lorsqu'il est présent, crée aussi cette piste et ajoute ses champs d'envoi à la réponse. Champs imbriqués : file\_name, organization\_index, metadata. |
| `track.file_name` Piste facultative | string | Obligatoire | Nom de fichier original de la piste. Requis lorsque track est présent. |
| `track.organization_index` Piste facultative | string | Facultatif | Index d'organisation pour la piste (distinct du champ au niveau session). |
| `track.metadata` Piste facultative | object | Facultatif | Métadonnées pour la piste (distinctes du champ au niveau session). |

#### Exemple de requête

    

```
curl -X POST "https://api.audiodelivery.net/v1/upload_session" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "collection_id": "COLLECTION_ID",
  "expires_in": 7200
}'
```

```
const payload = {
  "collection_id": "COLLECTION_ID",
  "expires_in": 7200
};

const response = await fetch('https://api.audiodelivery.net/v1/upload_session', {
  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/upload_session")!)
    request.httpMethod = "POST"
    request.setValue("Bearer YOUR_API_KEY", forHTTPHeaderField: "Authorization")
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    let bodyJSON = """
{
  "collection_id": "COLLECTION_ID",
  "expires_in": 7200
}
"""
    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 = """{
  "collection_id": "COLLECTION_ID",
  "expires_in": 7200
}""".toRequestBody("application/json".toMediaType())
    val request = Request.Builder()
        .url("https://api.audiodelivery.net/v1/upload_session")
        .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/upload_session"),
    headers: {
      "Authorization": "Bearer YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: jsonEncode({
  "collection_id": "COLLECTION_ID",
  "expires_in": 7200
}),
  );
  if (response.statusCode < 200 || response.statusCode >= 300) {
    throw Exception('Request failed: ${response.statusCode}');
  }
  return jsonDecode(response.body) as Map<String, dynamic>;
}
```

Exemple avec un `track` imbriqué optionnel :

#### Exemple de requête

    

```
curl -X POST "https://api.audiodelivery.net/v1/upload_session" \
  -H "Authorization: Bearer YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
  "collection_id": "COLLECTION_ID",
  "track": {
    "file_name": "track-1.mp3"
  }
}'
```

```
const payload = {
  "collection_id": "COLLECTION_ID",
  "track": {
    "file_name": "track-1.mp3"
  }
};

const response = await fetch('https://api.audiodelivery.net/v1/upload_session', {
  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/upload_session")!)
    request.httpMethod = "POST"
    request.setValue("Bearer YOUR_API_KEY", forHTTPHeaderField: "Authorization")
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    let bodyJSON = """
{
  "collection_id": "COLLECTION_ID",
  "track": {
    "file_name": "track-1.mp3"
  }
}
"""
    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 = """{
  "collection_id": "COLLECTION_ID",
  "track": {
    "file_name": "track-1.mp3"
  }
}""".toRequestBody("application/json".toMediaType())
    val request = Request.Builder()
        .url("https://api.audiodelivery.net/v1/upload_session")
        .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/upload_session"),
    headers: {
      "Authorization": "Bearer YOUR_API_KEY",
      "Content-Type": "application/json",
    },
    body: jsonEncode({
  "collection_id": "COLLECTION_ID",
  "track": {
    "file_name": "track-1.mp3"
  }
}),
  );
  if (response.statusCode < 200 || response.statusCode >= 300) {
    throw Exception('Request failed: ${response.statusCode}');
  }
  return jsonDecode(response.body) as Map<String, dynamic>;
}
```

#### Piste imbriquée optionnelle

Incluez un objet `track` imbriqué pour créer cette piste pendant la création de session — la réponse ajoute les mêmes poignées d’envoi que le point de terminaison par piste. Vous pouvez toujours ajouter d’autres pistes plus tard avec `POST /v1/upload/:upload_session_id/track`. Pour les flux uniquement par lot, omettez `track` et créez chaque piste avec ce point de terminaison.

#### Réponse

```
{
"ok": true,
"upload_session_id": "uuid",
"upload_session": {
  "id": "uuid",
  "creator_id": "uuid | null",
  "collection_id": "uuid",
  "organization_index": "string | null",
  "metadata": {},
  "expires_at": "string"
},
"player_color": "string | null",
"player_color_light": "string | null",
"player_color_dark": "string | null",
"expires_at": "string"
}
```

#### Réponse lorsque vous incluez `track`

```
{
"ok": true,
"upload_session_id": "uuid",
"upload_session": {
  "id": "uuid",
  "creator_id": "uuid | null",
  "collection_id": "uuid",
  "organization_index": "string | null",
  "metadata": {},
  "expires_at": "string"
},
"player_color": "string | null",
"player_color_light": "string | null",
"player_color_dark": "string | null",
"expires_at": "string",
"track_id": "uuid",
"track": {
  "id": "uuid",
  "index": "string",
  "path": "string",
  "upload_url": "string"
},
"track_upload": {
  "method": "PUT",
  "upload_url": "string",
  "ttl": 0,
  "expires_at": "string"
},
"track_cover_upload": {
  "method": "POST",
  "upload_url": "string",
  "ttl": 0,
  "expires_at": "string"
}
}
```

GET `/v1/upload_session/:upload_session_id`

Récupère les détails d'une session d'envoi. Aucune authentification requise — l'identifiant de session sert d'identifiant.

#### Paramètres

| Nom | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `upload_session_id` | uuid | Obligatoire | L'identifiant de la session d'envoi (paramètre de chemin) |

#### Exemple de requête

    

```
curl -X GET "https://api.audiodelivery.net/v1/upload_session/SESSION_ID"
```

```
const response = await fetch('https://api.audiodelivery.net/v1/upload_session/SESSION_ID');

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

```
import Foundation

func performRequest() async throws {
    var request = URLRequest(url: URL(string: "https://api.audiodelivery.net/v1/upload_session/SESSION_ID")!)
    request.httpMethod = "GET"

    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.*

val client = OkHttpClient()

suspend fun performRequest(): String = withContext(Dispatchers.IO) {
    val request = Request.Builder()
        .url("https://api.audiodelivery.net/v1/upload_session/SESSION_ID")

        .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.get(Uri.parse("https://api.audiodelivery.net/v1/upload_session/SESSION_ID"));
  if (response.statusCode < 200 || response.statusCode >= 300) {
    throw Exception('Request failed: ${response.statusCode}');
  }
  return jsonDecode(response.body) as Map<String, dynamic>;
}
```

#### Réponse

```
{
"ok": true,
"upload_session_id": "uuid",
"upload_session": {
  "id": "uuid",
  "creator_id": "uuid | null",
  "collection_id": "uuid",
  "organization_index": "string | null",
  "metadata": {},
  "expires_at": "string"
},
"player_color": "string | null",
"player_color_light": "string | null",
"player_color_dark": "string | null",
"expires_at": "string"
}
```

POST `/v1/upload/:upload_session_id/track`

Crée une nouvelle piste dans une session d'envoi et renvoie son URL d'envoi par piste. Appelez ceci une fois par fichier (y compris tout fichier supplémentaire après une piste imbriquée optionnelle à la création de session). Aucune authentification requise — l'identifiant de session sert d'identifiant.

#### Paramètres

| Nom | Type | Obligatoire | Description |
| --- | --- | --- | --- |
| `upload_session_id` | uuid | Obligatoire | L'identifiant de la session d'envoi (paramètre de chemin) |
| `file_name` | string | Obligatoire | Nom de fichier original de la piste |
| `organization_index` | string | Facultatif | Index d'organisation |
| `metadata` | object | Facultatif | Métadonnées supplémentaires |

#### Exemple de requête

    

```
curl -X POST "https://api.audiodelivery.net/v1/upload/SESSION_ID/track" \
  -H "Content-Type: application/json" \
  -d '{
  "file_name": "track-1.mp3"
}'
```

```
const payload = {
  "file_name": "track-1.mp3"
};

const response = await fetch('https://api.audiodelivery.net/v1/upload/SESSION_ID/track', {
  method: 'POST',
  headers: {
    '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/upload/SESSION_ID/track")!)
    request.httpMethod = "POST"
    request.setValue("application/json", forHTTPHeaderField: "Content-Type")
    let bodyJSON = """
{
  "file_name": "track-1.mp3"
}
"""
    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 = """{
  "file_name": "track-1.mp3"
}""".toRequestBody("application/json".toMediaType())
    val request = Request.Builder()
        .url("https://api.audiodelivery.net/v1/upload/SESSION_ID/track")
        .post(body)
        .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/upload/SESSION_ID/track"),
    headers: {
      "Content-Type": "application/json",
    },
    body: jsonEncode({
  "file_name": "track-1.mp3"
}),
  );
  if (response.statusCode < 200 || response.statusCode >= 300) {
    throw Exception('Request failed: ${response.statusCode}');
  }
  return jsonDecode(response.body) as Map<String, dynamic>;
}
```

#### Réponse

```
{
"ok": true,
"api_request_id": "uuid",
"upload_session_id": "uuid",
"track_id": "uuid",
"track": {
  "id": "uuid",
  "index": "string",
  "path": "string",
  "upload_url": "string"
},
"upload_session": {
  "id": "uuid",
  "creator_id": "uuid | null",
  "collection_id": "uuid",
  "organization_index": "string | null",
  "metadata": {},
  "expires_at": "string"
},
"track_upload": {
  "method": "PUT",
  "upload_url": "string",
  "ttl": 0,
  "expires_at": "string"
},
"track_cover_upload": {
  "method": "POST",
  "upload_url": "string",
  "ttl": 0,
  "expires_at": "string"
}
}
```
