Crear un token de subida para subidas desde el navegador
curl --request POST \
--url https://blob.vertracloud.app/v1/upload-tokens \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"path": "<string>",
"prefix": "<string>",
"visibility": "<string>",
"max_size": 123,
"allowed_extensions": [
"<string>"
],
"cache_control": "<string>",
"content_disposition": "<string>",
"expires_at": "<string>",
"metadata": {},
"overwrite": true,
"expires_in": 123,
"max_uses": 123
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
path: '<string>',
prefix: '<string>',
visibility: '<string>',
max_size: 123,
allowed_extensions: ['<string>'],
cache_control: '<string>',
content_disposition: '<string>',
expires_at: '<string>',
metadata: {},
overwrite: true,
expires_in: 123,
max_uses: 123
})
};
fetch('https://blob.vertracloud.app/v1/upload-tokens', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://blob.vertracloud.app/v1/upload-tokens"
payload = {
"path": "<string>",
"prefix": "<string>",
"visibility": "<string>",
"max_size": 123,
"allowed_extensions": ["<string>"],
"cache_control": "<string>",
"content_disposition": "<string>",
"expires_at": "<string>",
"metadata": {},
"overwrite": True,
"expires_in": 123,
"max_uses": 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/upload-tokens"
payload := strings.NewReader("{\n \"path\": \"<string>\",\n \"prefix\": \"<string>\",\n \"visibility\": \"<string>\",\n \"max_size\": 123,\n \"allowed_extensions\": [\n \"<string>\"\n ],\n \"cache_control\": \"<string>\",\n \"content_disposition\": \"<string>\",\n \"expires_at\": \"<string>\",\n \"metadata\": {},\n \"overwrite\": true,\n \"expires_in\": 123,\n \"max_uses\": 123\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": {
"token": "vcup_9f2c7d1e4b8a6035c2f1d9e7a4b3c8d2",
"expires_at": "2026-10-14T12:15:00.000Z",
"max_uses": 1
}
}
Cuenta
Crear un token de subida para subidas desde el navegador
Crea un token de subida de corta duración que fija ruta o carpeta, tamaño, extensiones y visibilidad. Úsalo en navegadores en vez de tu clave de API.
POST
/
v1
/
upload-tokens
Crear un token de subida para subidas desde el navegador
curl --request POST \
--url https://blob.vertracloud.app/v1/upload-tokens \
--header 'Authorization: Bearer <token>' \
--header 'Content-Type: application/json' \
--data '
{
"path": "<string>",
"prefix": "<string>",
"visibility": "<string>",
"max_size": 123,
"allowed_extensions": [
"<string>"
],
"cache_control": "<string>",
"content_disposition": "<string>",
"expires_at": "<string>",
"metadata": {},
"overwrite": true,
"expires_in": 123,
"max_uses": 123
}
'const options = {
method: 'POST',
headers: {Authorization: 'Bearer <token>', 'Content-Type': 'application/json'},
body: JSON.stringify({
path: '<string>',
prefix: '<string>',
visibility: '<string>',
max_size: 123,
allowed_extensions: ['<string>'],
cache_control: '<string>',
content_disposition: '<string>',
expires_at: '<string>',
metadata: {},
overwrite: true,
expires_in: 123,
max_uses: 123
})
};
fetch('https://blob.vertracloud.app/v1/upload-tokens', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://blob.vertracloud.app/v1/upload-tokens"
payload = {
"path": "<string>",
"prefix": "<string>",
"visibility": "<string>",
"max_size": 123,
"allowed_extensions": ["<string>"],
"cache_control": "<string>",
"content_disposition": "<string>",
"expires_at": "<string>",
"metadata": {},
"overwrite": True,
"expires_in": 123,
"max_uses": 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/upload-tokens"
payload := strings.NewReader("{\n \"path\": \"<string>\",\n \"prefix\": \"<string>\",\n \"visibility\": \"<string>\",\n \"max_size\": 123,\n \"allowed_extensions\": [\n \"<string>\"\n ],\n \"cache_control\": \"<string>\",\n \"content_disposition\": \"<string>\",\n \"expires_at\": \"<string>\",\n \"metadata\": {},\n \"overwrite\": true,\n \"expires_in\": 123,\n \"max_uses\": 123\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": {
"token": "vcup_9f2c7d1e4b8a6035c2f1d9e7a4b3c8d2",
"expires_at": "2026-10-14T12:15:00.000Z",
"max_uses": 1
}
}
Crea un token de subida que un navegador u otro cliente no confiable puede usar para subir archivos, sin tu clave de API.
El token fija cada restricción que envías: un
path para un archivo o un prefix para cualquier archivo de una carpeta,
el tamaño máximo, las extensiones permitidas y la visibilidad. Solo funciona en las rutas de subida, y deja de funcionar
cuando se revoca la clave de API que lo creó. El token se muestra una sola vez.
Ámbito: blob:write.
string
Ruta exacta a la que puede subir el token. Usa este o
prefix, no ambos.string
Carpeta en la que puede subir el token. El sufijo aleatorio es obligatorio. Usa este o
path, no ambos.string
public o private. Lo fija el token.number
Archivo más grande que acepta el token, en bytes.
string[]
De 1 a 20 extensiones, en minúsculas, sin el punto.
string
cache_control fijo para los objetos subidos.string
inline o attachment fijo para los objetos subidos.string
Marca de tiempo ISO 8601 para la eliminación de los objetos subidos.
object
metadata fija para los objetos subidos. Enterprise-12 o superior.boolean
Permite que las subidas con este token reemplacen un archivo existente. Por defecto
false: sin él, el token nunca
sobrescribe un archivo que ya existe.number
Segundos que el token sigue válido, de 60 a 3600. Por defecto
900.number
Cuántas subidas permite el token, de 1 a 100. Por defecto
1.string
El ID del workspace, cuando el blob pertenece a un workspace. La petición actúa sobre el blob del propietario del
workspace y necesita el permiso
blob:read del workspace (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/upload-tokens" \
-H "Authorization: Bearer $VERTRA_API_KEY" \
-H "Content-Type: application/json" \
-d '{"prefix":"avatars/","max_size":5000000,"allowed_extensions":["png","jpg","webp"],"expires_in":900}'
Respuesta
object
{
"response": {
"token": "vcup_9f2c7d1e4b8a6035c2f1d9e7a4b3c8d2",
"expires_at": "2026-10-14T12:15:00.000Z",
"max_uses": 1
}
}
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 un workspace con ese ID, o no eres miembro.BLOB_NAMESPACE_SUSPENDED(403): El almacenamiento de blob de la cuenta está suspendido, o su plan expiró. Las subidas y otras escrituras se rechazan desde el inicio del periodo de gracia de 72 horas.VALIDATION_ERROR(400): Un parámetro o un campo del cuerpo no superó la validación.details.pathindica el campo.PLAN_RESTRICTED_FEATURE(403): Se enviómetadataen un plan inferior a Enterprise-12.RATE_LIMIT_EXCEEDED(429): Más de 60 tokens creados en un minuto;details.retry_afterindica cuántos segundos esperar.
{
"code": "AUTH_TOKEN_MISSING"
}
{
"code": "API_KEY_SCOPE_DENIED"
}
{
"code": "WORKSPACE_NOT_FOUND"
}
{
"code": "VALIDATION_ERROR"
}
Última modificación el 28 de octubre de 2026