Update Many Blob Objects at Once
curl --request PATCH \
--url https://blob.vertracloud.app/v1/objects \
--header 'Content-Type: application/json' \
--data '
{
"ids": [
"<string>"
],
"changes": {}
}
'import requests
url = "https://blob.vertracloud.app/v1/objects"
payload = {
"ids": ["<string>"],
"changes": {}
}
headers = {"Content-Type": "application/json"}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({ids: ['<string>'], changes: {}})
};
fetch('https://blob.vertracloud.app/v1/objects', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://blob.vertracloud.app/v1/objects",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'ids' => [
'<string>'
],
'changes' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://blob.vertracloud.app/v1/objects"
payload := strings.NewReader("{\n \"ids\": [\n \"<string>\"\n ],\n \"changes\": {}\n}")
req, _ := http.NewRequest("PATCH", url, payload)
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))
}HttpResponse<String> response = Unirest.patch("https://blob.vertracloud.app/v1/objects")
.header("Content-Type", "application/json")
.body("{\n \"ids\": [\n \"<string>\"\n ],\n \"changes\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://blob.vertracloud.app/v1/objects")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"ids\": [\n \"<string>\"\n ],\n \"changes\": {}\n}"
response = http.request(request)
puts response.read_body{
"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"
}
]
}
Objects
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.
PATCH
/
v1
/
objects
Update Many Blob Objects at Once
curl --request PATCH \
--url https://blob.vertracloud.app/v1/objects \
--header 'Content-Type: application/json' \
--data '
{
"ids": [
"<string>"
],
"changes": {}
}
'import requests
url = "https://blob.vertracloud.app/v1/objects"
payload = {
"ids": ["<string>"],
"changes": {}
}
headers = {"Content-Type": "application/json"}
response = requests.patch(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PATCH',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({ids: ['<string>'], changes: {}})
};
fetch('https://blob.vertracloud.app/v1/objects', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://blob.vertracloud.app/v1/objects",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PATCH",
CURLOPT_POSTFIELDS => json_encode([
'ids' => [
'<string>'
],
'changes' => [
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"strings"
"net/http"
"io"
)
func main() {
url := "https://blob.vertracloud.app/v1/objects"
payload := strings.NewReader("{\n \"ids\": [\n \"<string>\"\n ],\n \"changes\": {}\n}")
req, _ := http.NewRequest("PATCH", url, payload)
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))
}HttpResponse<String> response = Unirest.patch("https://blob.vertracloud.app/v1/objects")
.header("Content-Type", "application/json")
.body("{\n \"ids\": [\n \"<string>\"\n ],\n \"changes\": {}\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://blob.vertracloud.app/v1/objects")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Patch.new(url)
request["Content-Type"] = 'application/json'
request.body = "{\n \"ids\": [\n \"<string>\"\n ],\n \"changes\": {}\n}"
response = http.request(request)
puts response.read_body{
"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"
}
]
}
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.
string[]
required
Object IDs, 1–100.
object
required
The fields to change, with the same meaning as in Update a blob object:
visibility, cache_control, content_disposition, filename, expires_at, metadata.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.Example request
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
object[]
One result per requested ID, in the same order.
Show properties
Show properties
string
The object ID of this result.
boolean
true when the change was applied.string
Only when
ok is false: the error code for this object, such as BLOB_OBJECT_NOT_FOUND.object
{
"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"
}
]
}
Error Responses
string
The error code indicating the reason for failure. Possible values:
AUTH_TOKEN_MISSING(401): NoAuthorizationheader 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:readorblob:write);details.requirednames it.WORKSPACE_PERMISSION_DENIED(403): Only withworkspace_id: you’re not a member, or your role lacks the blob permission.WORKSPACE_NOT_FOUND(404): Only withworkspace_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.pathnames the field.
{
"code": "AUTH_TOKEN_MISSING"
}
{
"code": "API_KEY_SCOPE_DENIED"
}
{
"code": "WORKSPACE_NOT_FOUND"
}
{
"code": "VALIDATION_ERROR"
}