> ## 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.

# Iniciar um upload direto para o Blob

> Inicia um upload de até 10 GB que vai direto para o armazenamento. Retorna as URLs para enviar os bytes. Aceita um token de upload.

Inicia um upload direto: os bytes saem do seu cliente direto para o armazenamento, sem passar pela API. Arquivos até o limite de parte única do plano voltam no modo `single`, com uma `url`. Arquivos maiores voltam no modo `multipart`, com tamanho e quantidade de partes. Depois envie os bytes e chame [Concluir um upload direto](https://docs.vertracloud.app/pt-br/api-reference/endpoint/blob/uploads/complete.md). O armazenamento reservado conta na cota até o upload ser concluído, abortado ou expirar.

**Escopo:** `blob:write`. Aceita um token de upload.

**Token de upload:** esta rota também aceita um token de upload (`Authorization: Bearer vcup_...`) em vez de uma chave de API.

**path** `string` *required*

Caminho de destino, com as mesmas regras de [Upload em uma única requisição](https://docs.vertracloud.app/pt-br/api-reference/endpoint/blob/objects/upload.md).

**size** `number` *required*

Tamanho exato do arquivo em bytes, de 0 até 10 GB. Os bytes armazenados precisam bater com ele.

**visibility** `string`

`public` ou `private`. Padrão `private`.

**overwrite** `boolean`

Substitui um objeto que já esteja em `path`. Padrão `false`.

**rename\_on\_conflict** `boolean`

Quando `path` já está ocupado, salva o arquivo como `name-1.ext`, `name-2.ext` e assim por diante (o primeiro nome livre), em vez de retornar `BLOB_OBJECT_ALREADY_EXISTS`. O upload carrega o `path` final. Padrão `false`. Não pode ser combinado com `overwrite` e não tem efeito com um token de upload que fixa o `path`.

**random\_suffix** `boolean`

Insere um sufixo aleatório antes da extensão. Padrão `false`; é forçado para `true` em um token de upload sem `path` fixo.

**cache\_control** `string`

`immutable`, `max-age=<segundos>` ou `no-cache` (Enterprise-26 ou superior).

**content\_disposition** `string`

`inline` ou `attachment`. HTML, SVG, XML, XHTML e HTM são sempre `attachment`.

**filename** `string`

Nome sugerido no download.

**expires\_at** `string`

Timestamp ISO 8601 para a exclusão, no mínimo o prazo mínimo do plano a partir de agora.

**checksum\_sha256** `string`

SHA-256 em hexadecimal do arquivo inteiro. Verificado quando o upload é concluído. Só vale para um upload direto enviado em uma única parte; um upload multipart recusa com `VALIDATION_ERROR`.

**metadata** `object`

Até 5 chaves, cada uma `[a-z0-9-]{1,64}`, 512 bytes no total. Enterprise-12 ou superior.

**workspace\_id** `string`

O ID do workspace, quando o blob pertence a um workspace. A chamada atua sobre o blob do dono do workspace e precisa da permissão de workspace `blob:read` (`blob:manage` nas rotas que alteram dados). Omita para atuar sobre o seu próprio blob.

### Exemplo de requisição

```bash theme={null}
curl -X POST "https://blob.vertracloud.app/v1/uploads" \
  -H "Authorization: Bearer $VERTRA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"path":"videos/demo.mp4","size":2147483648,"visibility":"private"}'
```

### Resposta

**response** `object`

O upload, com as URLs para enviar os bytes.

**propriedades**

**id** `string`

ID do upload. Use-o para status, partes, conclusão e aborto.

**path** `string`

Caminho final, incluindo o sufixo aleatório quando ele foi pedido.

**mode** `string`

`single` (um `PUT` do arquivo inteiro para `url`) ou `multipart` (várias partes, cada uma com sua própria URL).

**status** `string`

`pending`, `completed`, `aborted` ou `expired`.

**size** `number`

Tamanho declarado em bytes. Os bytes armazenados precisam bater com ele em `complete`.

**expires\_at** `string`

Quando as URLs e o armazenamento reservado expiram, como timestamp ISO 8601.

**url** `string`

Somente no modo `single`: a URL para fazer `PUT` do arquivo inteiro.

**headers** `object`

Headers que o `PUT` deve enviar exatamente como informados, porque fazem parte da assinatura.

**part\_size** `number`

Somente no modo `multipart`: o tamanho fixo de cada parte em bytes. A última parte pode ser menor.

**part\_count** `number`

Somente no modo `multipart`: quantas partes o arquivo tem.

**uploaded\_parts** `number[]`

Números das partes já armazenadas. Use-os para retomar um upload interrompido.

**created\_at** `string`

Data e hora de criação em ISO 8601.

```json Response theme={null}
{
  "response": {
    "id": "7c1d2e3f-4a5b-4c6d-8e7f-0a1b2c3d4e5f",
    "path": "videos/demo.mp4",
    "mode": "multipart",
    "status": "pending",
    "size": 2147483648,
    "expires_at": "2026-10-14T13:00:00.000Z",
    "headers": {
      "content-type": "video/mp4"
    },
    "part_size": 67108864,
    "part_count": 32,
    "uploaded_parts": [],
    "created_at": "2026-10-14T12:00:00.000Z"
  }
}
```

### Respostas de erro

**code** `string`

O código de erro que indica o motivo da falha. Valores possíveis:

* `AUTH_TOKEN_MISSING` (`401`): Nenhum header `Authorization` foi enviado.
* `API_KEY_INVALID` (`401`): A chave de API não existe, foi revogada ou o segredo não confere.
* `API_KEY_SCOPE_DENIED` (`403`): A chave não tem o escopo que a rota exige (`blob:read` ou `blob:write`); `details.required` informa qual.
* `WORKSPACE_PERMISSION_DENIED` (`403`): Somente com `workspace_id`: você não é membro, ou seu papel não tem a permissão de blob.
* `WORKSPACE_NOT_FOUND` (`404`): Somente com `workspace_id`: não existe workspace com esse ID, ou você não é membro.
* `BLOB_UPLOAD_TOKEN_INVALID` (`401`): O token de upload não existe, expirou ou foi revogado (somente com token de upload).
* `BLOB_NAMESPACE_SUSPENDED` (`403`): O armazenamento de blob da conta está suspenso, ou o plano expirou. Uploads e outras gravações são recusados desde o início do período de carência de 72 horas.
* `VALIDATION_ERROR` (`400`): Um parâmetro ou campo do body falhou na validação. `details.path` informa o campo.
* `BLOB_UPLOAD_TOKEN_CONSTRAINT` (`403`): Somente com token de upload: o caminho, a pasta ou outra opção que o token fixa não confere com a requisição.
* `PLAN_RESTRICTED_FEATURE` (`403`): `metadata` (abaixo do Enterprise-12) ou `cache_control: no-cache` (abaixo do Enterprise-26) não estão incluídos no plano.
* `BLOB_UPLOAD_LIMIT` (`409`): A conta já tem tantos uploads em andamento quanto o plano permite (`max_open_uploads`).
* `BLOB_OBJECT_ALREADY_EXISTS` (`409`): `path` já está ocupado e `overwrite` não é `true`.
* `BLOB_FILE_TOO_LARGE` (`413`): `size` está acima de 10 GB, acima do `max_size` da regra da pasta, ou acima do `max_size` do token.
* `STORAGE_QUOTA_EXCEEDED` (`403`): O tamanho reservado somado ao que já está em uso ultrapassaria a cota de blob do plano.
* `BLOCKED_FILE_TYPE` (`422`): A extensão está bloqueada ou não é permitida pela regra da pasta ou pelo token.
* `BLOB_UPLOAD_TOKEN_EXHAUSTED` (`401`): Somente com token de upload: ele já usou todos os seus usos.
* `RATE_LIMIT_EXCEEDED` (`429`): Abaixo do Enterprise-12, os uploads são limitados a 1 por segundo. `details.retry_after` informa a espera.

```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 (400) theme={null}
{
  "code": "VALIDATION_ERROR"
}
```

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

```json Error Response (413) theme={null}
{
  "code": "BLOB_FILE_TOO_LARGE"
}
```

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

```json Error Response (429) theme={null}
{
  "code": "RATE_LIMIT_EXCEEDED"
}
```


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