> This is a page from the ElevenLabs documentation. For a complete page index, fetch https://elevenlabs.io/docs/llms.txt. For the full documentation in a single file, fetch https://elevenlabs.io/docs/llms-full.txt.

# Subir música

POST https://api.elevenlabs.io/v1/music/upload
Content-Type: multipart/form-data

Sube un archivo de música para usarlo más adelante en inpainting. El precio de la subida es el mismo que el de la generación de canciones. Todo el contenido subido se revisa para detectar infracciones de derechos de autor. Si se detecta contenido protegido por derechos de autor, se cobrará igualmente la mitad del coste de la solicitud.

Reference: https://elevenlabs.io/docs/api-reference/music/upload

## Servers

- `https://api.elevenlabs.io` (Production, default)
- `https://api.us.elevenlabs.io` (Production US)
- `https://api.eu.residency.elevenlabs.io` (Production EU)
- `https://api.in.residency.elevenlabs.io` (Production India)
- `https://api.sg.residency.elevenlabs.io` (Production Singapore)

## Request

### Body (multipart/form-data)

This endpoint expects a multipart form containing a file.

- `file` (file, required) — El archivo de audio que se va a subir.
- `extract_composition_plan` (V1MusicUploadPostRequestBodyContentMultipartFormDataSchemaExtractCompositionPlan, optional) — Indica si se debe generar y devolver el plan de composición de la canción subida. Pasa un ID de modelo (`music_v1`, `music_v2` o `music_v2_5`) para controlar qué formato de plan de composición se devuelve. Pasar `true`/`false` está obsoleto; `true` usa de forma predeterminada el formato de plan `music_v1`. Activarlo aumentará la latencia.
- `with_timestamps` (boolean, optional) — Si se transcribe la canción subida y se devuelven marcas de tiempo por palabra. Si es True, la respuesta incluirá words_timestamps, pero aumentará la latencia.
- `with_waveform_visual` (boolean, optional) — Si se devuelve la forma de onda visual de la canción subida.

## Response

### 200

El archivo de música se ha subido correctamente con un plan de composición opcional.

- `song_id` (string, required) — Identificador único de la canción subida
- `composition_plan` (MusicUploadResponseCompositionPlan, optional, nullable) — El plan de composición extraído de la canción subida. Solo está presente si se proporcionó `extract_composition_plan` en el cuerpo de la solicitud.
- `words_timestamps` (list of WordTimestamp, optional, nullable) — Marcas de tiempo por palabra transcritas de la canción subida. Solo está presente si `with_timestamps` era True en el cuerpo de la solicitud
- `waveform_visual` (list of integer, optional, nullable) — Una forma de onda de baja resolución de la canción subida para mostrar una vista previa. Contiene 4 valores por segundo de audio, de -1000 a 1000. El estéreo se mezcla en un único canal. Solo está presente si `with_waveform_visual` era True en el cuerpo de la solicitud.

## Errors

### 422 Unprocessable Entity Error

Error de validación

- `detail` (list of ValidationError, optional)

## Types

### MusicUploadResponseCompositionPlan

El plan de composición extraído de la canción subida. Solo está presente si se proporcionó `extract_composition_plan` en el cuerpo de la solicitud.

### WordTimestamp

- `word` (string, required)
- `start_ms` (integer, required)
- `end_ms` (integer, required)

### ValidationError

- `loc` (list of ValidationErrorLocItems, required)
- `msg` (string, required)
- `type` (string, required)

### MusicPrompt

Plan de composición para el modelo `music_v1`. Usar este campo con cualquier otro modelo producirá un error.

- `positive_global_styles` (list of string, required) — Los estilos y las indicaciones musicales que deben estar presentes en toda la canción. Usa el inglés para obtener mejores resultados.
- `negative_global_styles` (list of string, required) — Los estilos y las indicaciones musicales que no deben estar presentes en toda la canción. Usa el inglés para obtener mejores resultados.
- `sections` (list of SongSection, required) — Las secciones de la canción.

### CompositionPlan

Plan de composición para los modelos `music_v2` y `music_v2_5`. Usar este campo con cualquier otro modelo producirá un error.

- `chunks` (list of CompositionPlanChunksItems, required) — Los fragmentos que componen la generación.

### ValidationErrorLocItems

### SongSection

- `section_name` (string, required) — El nombre de la sección. Debe tener entre 1 y 100 caracteres.
- `positive_local_styles` (list of string, required) — Los estilos y las indicaciones musicales que deben estar presentes en esta sección. Usa el inglés para obtener mejores resultados.
- `negative_local_styles` (list of string, required) — Los estilos y las indicaciones musicales que no deben estar presentes en esta sección. Usa el inglés para obtener mejores resultados.
- `duration_ms` (integer, required) — La duración de la sección en milisegundos. Debe estar entre 3000 ms y 120000 ms.
- `lines` (list of string, required) — La letra de la sección. Máximo de 30 líneas por sección y 200 caracteres por línea.
- `source_from` (SectionSource, optional, nullable) — Fuente opcional de la que extraer la sección. Se utiliza para el inpainting.

### CompositionPlanChunksItems

### SectionSource

- `song_id` (string, required) — El ID de la canción de la que se obtendrá la sección. Puedes encontrar el ID de la canción en las cabeceras de respuesta al generar una canción.
- `range` (TimeRange, required) — El intervalo que se debe extraer de la canción de origen.
- `negative_ranges` (list of TimeRange, optional) — Los intervalos que se deben excluir del «range».

### GenerationChunk-Input

- `text` (string, required) — La configuración de texto que se generará para este fragmento. Puede contener un nombre de sección opcional entre corchetes al principio, por ejemplo, \[Verse 1], líneas de letra e indicaciones en línea entre llaves, por ejemplo, \{scratching}. Los nombres de sección deben tener entre 1 y 100 caracteres. Se permiten como máximo 30 líneas, de hasta 200 caracteres cada una.
- `duration_ms` (integer, required) — La duración del fragmento en milisegundos. Debe estar entre 3000 ms y 120000 ms.
- `positive_styles` (list of string, required) — Los estilos y las indicaciones musicales que deben estar presentes en este fragmento. Usa el inglés para obtener mejores resultados. Los estilos del primer fragmento son los más importantes, ya que definen el tono y el género generales. Los estilos de los fragmentos posteriores pueden usarse para añadir matices, progresión o énfasis, o para cambiar la dirección de la canción. Intenta incluir al menos 6-7 estilos en los primeros fragmentos hasta que se establezca la dirección. Los estilos genéricos como 'great production quality' son buenos estilos predeterminados para añadir a la lista.
- `negative_styles` (list of string, optional) — Los estilos y las indicaciones musicales que no deben estar presentes en este fragmento. Usa el inglés para obtener mejores resultados. Dejarlo vacío es una buena opción predeterminada; utiliza este campo solo si quieres evitar explícitamente un estilo o una dirección concretos.
- `context_adherence` (enum, optional, default: high) — Hasta qué punto el modelo se ajusta al contexto de los fragmentos que lo rodean. Una adherencia baja permite que el modelo se aleje del contexto y sea más creativo. Una adherencia alta hace que el modelo sea más coherente con el contexto.
  - Allowed values: `low`, `medium`, `high`
- `conditioning_ref` (AudioRefChunk, optional, nullable) — La referencia de audio que condicionará la generación. El primer fragmento es el más importante, ya que influirá en la generación de todos los fragmentos posteriores. Por tanto, si quieres aplicar el condicionamiento a toda la canción, empieza por el primer fragmento.
- `condition_strength` (enum, optional, nullable) — Con qué intensidad el modelo se ajusta a la referencia de condicionamiento. Una intensidad baja hace que el modelo sea más creativo y se aleje de la referencia. Una intensidad alta hace que el modelo sea más coherente con la referencia.
  - Allowed values: `low`, `medium`, `high`, `xhigh`

### AudioRefChunk

- `song_id` (string, required) — El ID de la canción de la que se obtendrá el fragmento. Puedes encontrar el ID de la canción en las cabeceras de respuesta al generar una canción.
- `range` (TimeRange, required) — El intervalo de tiempo que se extraerá de la canción.

### TimeRange

- `start_ms` (integer, required)
- `end_ms` (integer, required)

## Examples

**Request**

```json
{
  "file": "<file: string>"
}
```

**Response**

```json
{
  "song_id": "jR4Xz8kL2mNpQ9wVtY1b"
}
```

**SDK Code**

```python
import requests

url = "https://api.elevenlabs.io/v1/music/upload"

files = { "file": "open('string', 'rb')" }
payload = {
    "extract_composition_plan": ,
    "with_timestamps": ,
    "with_waveform_visual": 
}

response = requests.post(url, data=payload, files=files)

print(response.json())
```

```javascript
const url = 'https://api.elevenlabs.io/v1/music/upload';
const form = new FormData();
form.append('extract_composition_plan', '');
form.append('file', 'string');
form.append('with_timestamps', '');
form.append('with_waveform_visual', '');

const options = {method: 'POST'};

options.body = form;

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.elevenlabs.io/v1/music/upload"

	payload := strings.NewReader("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"extract_composition_plan\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"string\"\r\nContent-Type: application/octet-stream\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"with_timestamps\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"with_waveform_visual\"\r\n\r\n\r\n-----011000010111000001101001--\r\n")

	req, _ := http.NewRequest("POST", url, payload)

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://api.elevenlabs.io/v1/music/upload")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Post.new(url)
request.body = "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"extract_composition_plan\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"string\"\r\nContent-Type: application/octet-stream\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"with_timestamps\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"with_waveform_visual\"\r\n\r\n\r\n-----011000010111000001101001--\r\n"

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.post("https://api.elevenlabs.io/v1/music/upload")
  .body("-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"extract_composition_plan\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"string\"\r\nContent-Type: application/octet-stream\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"with_timestamps\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"with_waveform_visual\"\r\n\r\n\r\n-----011000010111000001101001--\r\n")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.elevenlabs.io/v1/music/upload', [
  'multipart' => [
    [
        'name' => 'file',
        'filename' => 'string',
        'contents' => null
    ]
  ]
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://api.elevenlabs.io/v1/music/upload");
var request = new RestRequest(Method.POST);
request.AddParameter("undefined", "-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"extract_composition_plan\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"file\"; filename=\"string\"\r\nContent-Type: application/octet-stream\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"with_timestamps\"\r\n\r\n\r\n-----011000010111000001101001\r\nContent-Disposition: form-data; name=\"with_waveform_visual\"\r\n\r\n\r\n-----011000010111000001101001--\r\n", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation
let parameters = [
  [
    "name": "extract_composition_plan",
    "value": 
  ],
  [
    "name": "file",
    "fileName": "string"
  ],
  [
    "name": "with_timestamps",
    "value": 
  ],
  [
    "name": "with_waveform_visual",
    "value": 
  ]
]

let boundary = "---011000010111000001101001"

var body = ""
var error: NSError? = nil
for param in parameters {
  let paramName = param["name"]!
  body += "--\(boundary)\r\n"
  body += "Content-Disposition:form-data; name=\"\(paramName)\""
  if let filename = param["fileName"] {
    let contentType = param["content-type"]!
    let fileContent = String(contentsOfFile: filename, encoding: String.Encoding.utf8)
    if (error != nil) {
      print(error as Any)
    }
    body += "; filename=\"\(filename)\"\r\n"
    body += "Content-Type: \(contentType)\r\n\r\n"
    body += fileContent
  } else if let paramValue = param["value"] {
    body += "\r\n\r\n\(paramValue)"
  }
}

let request = NSMutableURLRequest(url: NSURL(string: "https://api.elevenlabs.io/v1/music/upload")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.httpBody = postData as Data

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```