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

# Update Many Blob Objects at Once

> Applies the same change to up to 100 blob objects in one call and returns the result of each one.

Applies the same `changes` to up to 100 objects in one call. The response has one result per ID: `ok: true` with the updated object, or `ok: false` with the error `code` for that object. A failure on one object doesn't stop the others.

**Scope:** `blob:write`.

<ParamField body="ids" type="string[]" required>
  Object IDs, 1–100.
</ParamField>

<ParamField body="changes" type="object" required>
  The fields to change, with the same meaning as in [Update a blob object](/api-reference/endpoint/blob/objects/update): `visibility`, `cache_control`, `content_disposition`, `filename`, `expires_at`, `metadata`.
</ParamField>

<ParamField query="workspace_id" type="string">
  The workspace ID, when the blob belongs to a workspace. The call acts on the blob of the workspace owner and needs the `blob:read` workspace permission (`blob:manage` on routes that change data). Leave it out to act on your own blob.
</ParamField>

### Example request

```bash theme={null}
curl -X PATCH "https://blob.vertracloud.app/v1/objects" \
  -H "Authorization: Bearer $VERTRA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"ids":["0b6f7c1e-3d2a-4f5b-9a8c-1d2e3f4a5b6c","7c1d2e3f-4a5b-4c6d-8e7f-0a1b2c3d4e5f"],"changes":{"visibility":"private"}}'
```

### Response

<ResponseField name="response" type="object[]">
  One result per requested ID, in the same order.

  <Expandable title="properties">
    <ResponseField name="id" type="string">The object ID of this result.</ResponseField>
    <ResponseField name="ok" type="boolean">`true` when the change was applied.</ResponseField>
    <ResponseField name="code" type="string">Only when `ok` is `false`: the error code for this object, such as `BLOB_OBJECT_NOT_FOUND`.</ResponseField>
    <ResponseField name="object" type="object">Only when `ok` is `true`: the updated blob object, with the fields of [Get a blob object](/api-reference/endpoint/blob/objects/get).</ResponseField>
  </Expandable>
</ResponseField>

<ResponseExample>
  ```json Response theme={null}
  {
    "response": [
      {
        "id": "0b6f7c1e-3d2a-4f5b-9a8c-1d2e3f4a5b6c",
        "ok": true,
        "object": {
          "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"
        }
      },
      {
        "id": "7c1d2e3f-4a5b-4c6d-8e7f-0a1b2c3d4e5f",
        "ok": false,
        "code": "BLOB_OBJECT_NOT_FOUND"
      }
    ]
  }
  ```
</ResponseExample>

### Error Responses

<ResponseField name="code" type="string">
  The error code indicating the reason for failure. Possible values:

  * `AUTH_TOKEN_MISSING` (`401`): No `Authorization` header was sent.
  * `API_KEY_INVALID` (`401`): The API key doesn't exist, was revoked, or its secret doesn't match.
  * `API_KEY_SCOPE_DENIED` (`403`): The key lacks the scope this route needs (`blob:read` or `blob:write`); `details.required` names it.
  * `WORKSPACE_PERMISSION_DENIED` (`403`): Only with `workspace_id`: you're not a member, or your role lacks the blob permission.
  * `WORKSPACE_NOT_FOUND` (`404`): Only with `workspace_id`: no workspace with that ID, or you're not a member.
  * `BLOB_NAMESPACE_SUSPENDED` (`403`): The account's blob storage is suspended, or its plan expired. Uploads and other writes are refused from the start of the 72-hour grace period.
  * `VALIDATION_ERROR` (`400`): A parameter or body field failed validation. `details.path` names the field.
</ResponseField>

<ResponseExample>
  ```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"
  }
  ```
</ResponseExample>


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