Replace All Folder Rules
curl --request PUT \
--url https://blob.vertracloud.app/v1/rules \
--header 'Content-Type: application/json' \
--header 'If-Match: <if-match>' \
--data '
{
"rules": [
{}
]
}
'import requests
url = "https://blob.vertracloud.app/v1/rules"
payload = { "rules": [{}] }
headers = {
"If-Match": "<if-match>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'If-Match': '<if-match>', 'Content-Type': 'application/json'},
body: JSON.stringify({rules: [{}]})
};
fetch('https://blob.vertracloud.app/v1/rules', 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/rules",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'rules' => [
[
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"If-Match: <if-match>"
],
]);
$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/rules"
payload := strings.NewReader("{\n \"rules\": [\n {}\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("If-Match", "<if-match>")
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.put("https://blob.vertracloud.app/v1/rules")
.header("If-Match", "<if-match>")
.header("Content-Type", "application/json")
.body("{\n \"rules\": [\n {}\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://blob.vertracloud.app/v1/rules")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["If-Match"] = '<if-match>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"rules\": [\n {}\n ]\n}"
response = http.request(request)
puts response.read_body{
"response": {
"rules": [
{
"prefix": "tmp/",
"delete_after_days": 30,
"active_from": "2026-10-15T12:00:00.000Z",
"created_at": "2026-10-14T12:00:00.000Z"
}
],
"etag": "v3"
}
}
Folder rules
Replace All Folder Rules
Replaces the whole list of folder rules. Send the etag from the last read in If-Match, so a change made elsewhere isn’t overwritten.
PUT
/
v1
/
rules
Replace All Folder Rules
curl --request PUT \
--url https://blob.vertracloud.app/v1/rules \
--header 'Content-Type: application/json' \
--header 'If-Match: <if-match>' \
--data '
{
"rules": [
{}
]
}
'import requests
url = "https://blob.vertracloud.app/v1/rules"
payload = { "rules": [{}] }
headers = {
"If-Match": "<if-match>",
"Content-Type": "application/json"
}
response = requests.put(url, json=payload, headers=headers)
print(response.text)const options = {
method: 'PUT',
headers: {'If-Match': '<if-match>', 'Content-Type': 'application/json'},
body: JSON.stringify({rules: [{}]})
};
fetch('https://blob.vertracloud.app/v1/rules', 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/rules",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "PUT",
CURLOPT_POSTFIELDS => json_encode([
'rules' => [
[
]
]
]),
CURLOPT_HTTPHEADER => [
"Content-Type: application/json",
"If-Match: <if-match>"
],
]);
$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/rules"
payload := strings.NewReader("{\n \"rules\": [\n {}\n ]\n}")
req, _ := http.NewRequest("PUT", url, payload)
req.Header.Add("If-Match", "<if-match>")
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.put("https://blob.vertracloud.app/v1/rules")
.header("If-Match", "<if-match>")
.header("Content-Type", "application/json")
.body("{\n \"rules\": [\n {}\n ]\n}")
.asString();require 'uri'
require 'net/http'
url = URI("https://blob.vertracloud.app/v1/rules")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Put.new(url)
request["If-Match"] = '<if-match>'
request["Content-Type"] = 'application/json'
request.body = "{\n \"rules\": [\n {}\n ]\n}"
response = http.request(request)
puts response.read_body{
"response": {
"rules": [
{
"prefix": "tmp/",
"delete_after_days": 30,
"active_from": "2026-10-15T12:00:00.000Z",
"created_at": "2026-10-14T12:00:00.000Z"
}
],
"etag": "v3"
}
}
Replaces the whole list of folder rules with the list you send. The
If-Match header must hold the etag from your last read; if the list changed since, the call fails with BLOB_RULES_CONFLICT and nothing is saved. To change a single rule, use Create or update one rule.
Scope: blob:write.
string
required
The
etag from the last read of the rule list.object[]
required
The complete list of rules. Each item takes
prefix (required) plus the fields of Create or update one rule. Up to 100 rules, and every rule needs at least one field besides the prefix. expire_seconds can’t be below the plan’s minimum expiration.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 PUT "https://blob.vertracloud.app/v1/rules" \
-H "Authorization: Bearer $VERTRA_API_KEY" \
-H "If-Match: v3" \
-H "Content-Type: application/json" \
-d '{"rules":[{"prefix":"tmp/","delete_after_days":30}]}'
Response
object
The saved list and its new etag.
Show properties
Show properties
object[]
Folder rules. The longest matching prefix applies.
string
Folder prefix, always stored with a trailing
/.string
Default visibility of new objects in the folder.
number
Default expiration of each new object, in seconds.
number
Largest accepted file in bytes, 512 B to 10 GB.
string[]
Accepted extensions, 1–50, lowercase, without the dot.
string
Default
cache_control of new objects.number
Objects are deleted this many days after they’re uploaded, 1–3650.
string
When
delete_after_days starts to apply, set by the platform (24 hours after the rule is saved).string
ISO 8601 time the rule was created.
string
Version of the whole rule list. Send it back in
If-Match when you replace the list.{
"response": {
"rules": [
{
"prefix": "tmp/",
"delete_after_days": 30,
"active_from": "2026-10-15T12:00:00.000Z",
"created_at": "2026-10-14T12:00:00.000Z"
}
],
"etag": "v3"
}
}
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.VALIDATION_ERROR(400): A parameter or body field failed validation.details.pathnames the field; a missingIf-Matchheader returns it withdetails.pathset toif-match.BLOB_NAMESPACE_SUSPENDED(403): The account’s blob storage is suspended, or its plan expired.PLAN_RESTRICTED_FEATURE(403): A rule setscache_controltono-cacheon a plan below Enterprise-26.BLOB_RULES_CONFLICT(409): TheIf-Matchetag is out of date. Read the list again and retry.BLOB_RULE_LIMIT(409): The list has more rules than the plan allows: 5, 10 or 20.
{
"code": "AUTH_TOKEN_MISSING"
}
{
"code": "API_KEY_SCOPE_DENIED"
}
{
"code": "WORKSPACE_NOT_FOUND"
}
{
"code": "VALIDATION_ERROR"
}
{
"code": "BLOB_RULES_CONFLICT"
}