Endpoints de la API
Reemplazar sección
API de reemplazo de sección
https://udioapi.pro/api/v2/replace-sectionVuelve a generar una parte de una canción que ya creaste, como unos segundos con un fallo o un verso que quieres cantado de otra forma, y recibe la canción completa con esa parte rehecha.
Cómo funciona
- Elige una ventana de tiempo en una canción terminada. La canción se vuelve a renderizar alrededor de esa ventana y se devuelve como pistas completas, normalmente dos variaciones, mediante el mismo flujo de tareas que la generación de música.
- Unos 10 segundos a cada lado de la ventana también se vuelven a renderizar para que la nueva parte encaje. Todo lo demás se mantiene igual, salvo una nueva codificación del audio.
- Reglas de la ventana, comprobadas antes de cobrar créditos: al menos 10 segundos, como máximo el 50% de la canción y como máximo 480 segundos, e infill_end_s no puede superar la duración de la canción.
- Si no envías lyrics, la letra que se canta dentro de la ventana se completa automáticamente a partir de los tiempos de cada palabra de la canción. Envíala tú cuando quieras otras palabras.
- Un resultado cuya duración difiere de la original en más de 15 segundos se descarta. Si no queda ningún resultado, la tarea termina como FAILED y se reembolsan tus créditos; mover el inicio o el final de la ventana unos segundos suele resolverlo.
- 5 créditos por solicitud, cobrados cuando se acepta la solicitud. Las solicitudes rechazadas en la validación y las tareas que fallan se reembolsan automáticamente.
- Solo se pueden editar canciones creadas con /v2/generate o /v2/extend con la misma clave de API. El audio subido y los resultados de reemplazos anteriores no se admiten como origen.
Inicio rápido
{
"origin_task_id": "gen2cd84c4e3ecb94ed6a9137a8f12138ca1bksv",
"audio_id": "24015dc4-1b81-4033-9f41-cf47a3fae958",
"infill_start_s": 70,
"infill_end_s": 85,
"prompt": "Same melody and arrangement, cleaner vocal in this part"
}style, title y full_lyrics son opcionales. Si se omiten, se usan los valores de la canción original.
Respuesta
{
"code": 200,
"message": "success",
"workId": "rep2a15b5bbc14304ca89fcc7b7eae29c8a7bksv",
"data": {
"task_id": "rep2a15b5bbc14304ca89fcc7b7eae29c8a7bksv"
}
}Consulta el workId devuelto cada 5–10 segundos hasta que el estado sea SUCCESS o FAILED, con la API de estado de tareas
Parámetros
Parámetros obligatorios
origin_task_idobligatoriostringtask_id de la canción terminada que quieres editar, tal como lo devuelve /v2/generate o /v2/extend.
audio_idobligatoriostringid de la canción dentro de esa tarea (response_data[].id). Una tarea suele devolver dos canciones; elige la que quieres editar.
infill_start_sobligatorionumberInicio de la sección en segundos: 0 o más, con hasta dos decimales.
infill_end_sobligatorionumberFin de la sección en segundos. Debe estar al menos 10 segundos después de infill_start_s y no pasar del final de la canción.
promptobligatoriostringCómo debe cambiar la sección, hasta 1000 caracteres, por ejemplo "Same melody and arrangement, cleaner vocal in this part".
Parámetros opcionales
lyricsopcionalstringLetra que se cantará dentro de la sección, hasta 5000 caracteres. Por defecto, la letra que se canta ahora en la ventana.
styleopcionalstringEstilo musical del resultado, hasta 1000 caracteres. Por defecto, el estilo de la canción original.
titleopcionalstringTítulo del resultado, hasta 80 caracteres. Por defecto, el título original.
full_lyricsopcionalstringLetra completa de la canción editada, hasta 5000 caracteres. Por defecto, la letra original.
callback_urlopcionalstringURL pública que recibe el resultado final, con los mismos elementos que response_data en el estado de la tarea. La consulta funciona con o sin ella.
Resultados
Cuando la tarea tiene éxito, response_data contiene las nuevas canciones completas. Cada elemento tiene su propio id, audio_url y duration. Si solo una variación conservó la duración original, solo se devuelve esa.
{
"code": 200,
"message": "success",
"data": {
"type": "SUCCESS",
"request_body": {
"origin_task_id": "gen2cd84c4e3ecb94ed6a9137a8f12138ca1bksv",
"audio_id": "24015dc4-1b81-4033-9f41-cf47a3fae958",
"infill_start_s": 70,
"infill_end_s": 85,
"prompt": "Same melody and arrangement, cleaner vocal in this part"
},
"response_data": [
{
"id": "3a8248e4-07b0-4ceb-92b7-34b7615d2552",
"audio_url": "https://…/3a8248e4-07b0-4ceb-92b7-34b7615d2552.mp3",
"image_url": "https://…/3a8248e4-07b0-4ceb-92b7-34b7615d2552.jpeg",
"status": "complete",
"title": "Harbor Lights",
"duration": 119.6,
"model_name": "chirp-v6-mini"
},
{
"id": "eac654a1-5c07-4b6c-896a-59061d323e11",
"audio_url": "https://…/eac654a1-5c07-4b6c-896a-59061d323e11.mp3",
"image_url": "https://…/eac654a1-5c07-4b6c-896a-59061d323e11.jpeg",
"status": "complete",
"title": "Harbor Lights",
"duration": 120.84,
"model_name": "chirp-v6-mini"
}
]
}
}Si todos los resultados cambiaron la duración de la canción o la sección no se pudo renderizar, la tarea queda como FAILED y se reembolsan los créditos:
{
"code": 200,
"message": "success",
"data": {
"type": "FAILED",
"response_data": [
{
"status": "FAILED",
"fail_message": "Generation failed. Your credits have been refunded. The result changed the song length (119.6s -> 225.36s / 224.6s), so it was discarded. Try moving the section start or end by a few seconds.",
"error_message": "Generation failed. Your credits have been refunded. The result changed the song length (119.6s -> 225.36s / 224.6s), so it was discarded. Try moving the section start or end by a few seconds."
},
{
"status": "FAILED",
"fail_message": "Generation failed. Your credits have been refunded. The result changed the song length (119.6s -> 225.36s / 224.6s), so it was discarded. Try moving the section start or end by a few seconds.",
"error_message": "Generation failed. Your credits have been refunded. The result changed the song length (119.6s -> 225.36s / 224.6s), so it was discarded. Try moving the section start or end by a few seconds."
}
]
}
}Ejemplos de código
cURL
curl -X POST "https://udioapi.pro/api/v2/replace-section" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"origin_task_id": "gen2cd84c4e3ecb94ed6a9137a8f12138ca1bksv",
"audio_id": "24015dc4-1b81-4033-9f41-cf47a3fae958",
"infill_start_s": 70,
"infill_end_s": 85,
"prompt": "Same melody and arrangement, cleaner vocal in this part"
}'JavaScript
const response = await fetch('https://udioapi.pro/api/v2/replace-section', {
method: 'POST',
headers: {
'Authorization': 'Bearer YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"origin_task_id": "gen2cd84c4e3ecb94ed6a9137a8f12138ca1bksv",
"audio_id": "24015dc4-1b81-4033-9f41-cf47a3fae958",
"infill_start_s": 70,
"infill_end_s": 85,
"prompt": "Same melody and arrangement, cleaner vocal in this part"
})
});
const { workId } = await response.json();
// Poll https://udioapi.pro/api/v2/feed?workId=... every 5-10 seconds until SUCCESS or FAILED.Python
import requests
response = requests.post(
"https://udioapi.pro/api/v2/replace-section",
headers={"Authorization": "Bearer YOUR_API_KEY"},
json={
"origin_task_id": "gen2cd84c4e3ecb94ed6a9137a8f12138ca1bksv",
"audio_id": "24015dc4-1b81-4033-9f41-cf47a3fae958",
"infill_start_s": 70,
"infill_end_s": 85,
"prompt": "Same melody and arrangement, cleaner vocal in this part"
},
)
work_id = response.json()["workId"]
# Poll https://udioapi.pro/api/v2/feed?workId=... every 5-10 seconds until SUCCESS or FAILED.Respuestas de error
{
"code": 400,
"message": "The section must be at least 10 seconds long (requested 9.99s)."
}{
"code": 400,
"message": "The section can cover at most 50% of the song and 480s (max 59.8s for this song, requested 65s)."
}{
"code": 400,
"message": "\"infill_end_s\" must not exceed the song length (119.6s)."
}{
"code": 400,
"message": "The provided \"origin_task_id\" is invalid or could not be found. Use the task_id of a completed song generated with your API key."
}{
"code": 400,
"message": "\"audio_id\" 1234 does not belong to this task. Use one of the song ids returned for \"origin_task_id\"."
}{
"code": 400,
"message": "Only songs generated with this API can be edited: send \"origin_task_id\" and \"audio_id\", without \"upload_url\" or \"model\"."
}{
"code": 402,
"message": "No available credits"
}{
"code": 401,
"message": "Invalid API key"
}