Obtener las URL de las partes de una subida multiparte
curl --request POST \
--url https://blob.vertracloud.app/v1/uploads/{upload_id}/parts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"part_numbers": [
123
]
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({part_numbers: [123]})
};
fetch('https://blob.vertracloud.app/v1/uploads/{upload_id}/parts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://blob.vertracloud.app/v1/uploads/{upload_id}/parts"
payload = { "part_numbers": [123] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://blob.vertracloud.app/v1/uploads/{upload_id}/parts"
payload := strings.NewReader("{\n \"part_numbers\": [\n 123\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"response": [
{
"part_number": 1,
"url": "https://storage.example/part-1",
"size": 67108864,
"headers": {
"content-length": "67108864"
}
}
]
}
Subidas
Obtener las URL de las partes de una subida multiparte
Devuelve la URL de subida de cada parte solicitada de una subida multiparte, hasta 100 partes por llamada. Acepta un token de subida.
POST
/
v1
/
uploads
/
{upload_id}
/
parts
Obtener las URL de las partes de una subida multiparte
curl --request POST \
--url https://blob.vertracloud.app/v1/uploads/{upload_id}/parts \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"part_numbers": [
123
]
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({part_numbers: [123]})
};
fetch('https://blob.vertracloud.app/v1/uploads/{upload_id}/parts', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://blob.vertracloud.app/v1/uploads/{upload_id}/parts"
payload = { "part_numbers": [123] }
headers = {
"Authorization": "Bearer <token>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text)package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://blob.vertracloud.app/v1/uploads/{upload_id}/parts"
payload := strings.NewReader("{\n \"part_numbers\": [\n 123\n ]\n}")
req, _ := http.NewRequest("POST", url, payload)
req.Header.Add("Authorization", "Bearer <token>")
req.Header.Add("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}{
"response": [
{
"part_number": 1,
"url": "https://storage.example/part-1",
"size": 67108864,
"headers": {
"content-length": "67108864"
}
}
]
}
Devuelve una URL de subida firmada para cada parte que pidas. Envía los bytes de cada parte con un
PUT a su url, usando exactamente las headers devueltas. Los tamaños de parte son el part_size de la subida, salvo la última, que puede ser más pequeña. Los límites de partes están en limits de uso y límites.
Ámbito: blob:write. Acepta un token de subida.
Token de subida: esta ruta también acepta un token de subida (Authorization: Bearer vcup_...) en lugar de una clave de API.
string
requerido
El ID de la subida multiparte.
number[]
requerido
Números de parte para los que pedir URL, empezando en 1. Hasta 100 por llamada.
string
El ID del workspace, cuando el blob pertenece a un workspace. La llamada actúa sobre el blob del propietario del workspace y necesita el permiso de workspace
blob:read (blob:manage en las rutas que modifican datos). Omítelo para actuar sobre tu propio blob.Ejemplo de petición
curl -X POST "https://blob.vertracloud.app/v1/uploads/7c1d2e3f-4a5b-4c6d-8e7f-0a1b2c3d4e5f/parts" \
-H "Authorization: Bearer $VERTRA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"part_numbers":[1,2]}'
Respuesta
object[]
{
"response": [
{
"part_number": 1,
"url": "https://storage.example/part-1",
"size": 67108864,
"headers": {
"content-length": "67108864"
}
}
]
}
Respuestas de error
string
El código de error que indica el motivo del fallo. Valores posibles:
AUTH_TOKEN_MISSING(401): No se envió la cabeceraAuthorization.API_KEY_INVALID(401): La clave de API no existe, fue revocada o su secreto no coincide.API_KEY_SCOPE_DENIED(403): La clave no tiene el ámbito que necesita esta ruta (blob:readoblob:write);details.requiredlo indica.WORKSPACE_PERMISSION_DENIED(403): Solo conworkspace_id: no eres miembro o tu rol no tiene el permiso de blob.WORKSPACE_NOT_FOUND(404): Solo conworkspace_id: no existe ningún workspace con ese ID o no eres miembro.BLOB_UPLOAD_TOKEN_INVALID(401): El token de subida no existe, ha caducado o fue revocado (solo con un token de subida).VALIDATION_ERROR(400): Un parámetro o campo del cuerpo no superó la validación.details.pathindica el campo.BLOB_UPLOAD_NOT_FOUND(404): No hay ninguna subida con ese ID en esta cuenta, o ya se completó o se canceló.BLOB_UPLOAD_EXPIRED(410): Se superó el tiempo límite de la subida.
{
"code": "AUTH_TOKEN_MISSING"
}
{
"code": "API_KEY_SCOPE_DENIED"
}
{
"code": "WORKSPACE_NOT_FOUND"
}
{
"code": "VALIDATION_ERROR"
}
{
"code": "BLOB_UPLOAD_EXPIRED"
}
Última modificación el 28 de octubre de 2026