> ## Documentation Index
> Fetch the complete documentation index at: https://docs.vertracloud.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Completar una subida directa de Blob

> Comprueba los bytes almacenados y crea el objeto Blob. Llámala después de que todas las partes estén almacenadas. Acepta un token de subida.

Completa una subida directa. La API comprueba que todas las partes están almacenadas, que el tamaño total coincide, que el checksum coincide si lo enviaste y que el contenido no es un ejecutable. Después crea el objeto y lo devuelve. Hasta que esta llamada se realiza con éxito, el objeto no existe.

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

**upload\_id** `string` *required*

El ID de la subida.

**workspace\_id** `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

```bash theme={null}
curl -X POST "https://blob.vertracloud.app/v1/uploads/7c1d2e3f-4a5b-4c6d-8e7f-0a1b2c3d4e5f/complete" \
  -H "Authorization: Bearer $VERTRA_API_KEY"
```

### Respuesta

**response** `object`

El objeto Blob creado.

**propiedades**

**id** `string`

ID estable del objeto. Nunca cambia, aunque cambien la ruta, la visibilidad o la caducidad.

**path** `string`

Ruta completa dentro de la cuenta, por ejemplo `images/avatars/joao.png`.

**size** `number`

Tamaño en bytes.

**content\_type** `string`

Tipo MIME, deducido en el servidor a partir de la extensión del archivo.

**etag** `string`

Etiqueta de entidad del contenido almacenado.

**sha256** `string | null`

SHA-256 del contenido en hexadecimal, cuando la subida envió un checksum. `null` en caso contrario.

**visibility** `string`

`public` (se puede leer mediante su URL pública) o `private` (necesita un enlace temporal o un enlace para compartir).

**url** `string | null`

URL pública. `null` mientras el objeto sea privado.

**cache\_control** `string | null`

`immutable`, `max-age=<seconds>` o `no-cache` (`no-cache` requiere Enterprise-26 o superior). `null` significa el valor por defecto.

**content\_disposition** `string`

`inline` (lo muestra el navegador) o `attachment` (se descarga). HTML, SVG y XML siempre son `attachment`.

**filename** `string | null`

Nombre sugerido al descargar. `null` usa el último segmento de `path`.

**metadata** `object`

Hasta 5 claves, cada una `[a-z0-9-]{1,64}`, 512 bytes en total. Enterprise-12 o superior; `{}` en los demás planes.

**expires\_at** `string | null`

Momento en que el objeto se elimina, como marca de tiempo ISO 8601. `null` significa que no caduca.

**created\_at** `string`

Fecha de creación en ISO 8601.

**updated\_at** `string`

Fecha ISO 8601 del último cambio.

```json Response theme={null}
{
  "response": {
    "id": "0b6f7c1e-3d2a-4f5b-9a8c-1d2e3f4a5b6c",
    "path": "images/logo.png",
    "size": 48213,
    "content_type": "image/png",
    "etag": "9b2cf535f27731c974343645a3085d39",
    "sha256": null,
    "visibility": "public",
    "url": "https://blob.vertracloud.dev/k7p2m9x4qa/images/logo.png",
    "cache_control": null,
    "content_disposition": "inline",
    "filename": null,
    "metadata": {},
    "expires_at": null,
    "created_at": "2026-10-14T12:00:00.000Z",
    "updated_at": "2026-10-14T12:00:00.000Z"
  }
}
```

### Respuestas de error

**code** `string`

El código de error que indica el motivo del fallo. Valores posibles:

* `AUTH_TOKEN_MISSING` (`401`): No se envió la cabecera `Authorization`.
* `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:read` o `blob:write`); `details.required` lo indica.
* `WORKSPACE_PERMISSION_DENIED` (`403`): Solo con `workspace_id`: no eres miembro o tu rol no tiene el permiso de blob.
* `WORKSPACE_NOT_FOUND` (`404`): Solo con `workspace_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).
* `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. Inicia una nueva subida.
* `BLOB_UPLOAD_INCOMPLETE` (`409`): Faltan partes, o el tamaño almacenado no coincide con el `size` declarado.
* `BLOB_CHECKSUM_MISMATCH` (`400`): El contenido almacenado no coincide con el `checksum_sha256` enviado al inicio.
* `BLOCKED_FILE_TYPE` (`422`): El contenido es un ejecutable, detectado por sus bytes.
* `BLOB_OBJECT_ALREADY_EXISTS` (`409`): Otro objeto ocupó `path` mientras la subida estaba en curso, y `overwrite` no es `true`.

```json Error Response (401) theme={null}
{
  "code": "AUTH_TOKEN_MISSING"
}
```

```json Error Response (403) theme={null}
{
  "code": "API_KEY_SCOPE_DENIED"
}
```

```json Error Response (404) theme={null}
{
  "code": "WORKSPACE_NOT_FOUND"
}
```

```json Error Response (410) theme={null}
{
  "code": "BLOB_UPLOAD_EXPIRED"
}
```

```json Error Response (409) theme={null}
{
  "code": "BLOB_UPLOAD_INCOMPLETE"
}
```

```json Error Response (400) theme={null}
{
  "code": "BLOB_CHECKSUM_MISMATCH"
}
```

```json Error Response (422) theme={null}
{
  "code": "BLOCKED_FILE_TYPE"
}
```


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.