Get Blob Upload Status for Resume
curl --request GET \
--url https://blob.vertracloud.app/v1/uploads/{upload_id}import requests
url = "https://blob.vertracloud.app/v1/uploads/{upload_id}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://blob.vertracloud.app/v1/uploads/{upload_id}', 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/uploads/{upload_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://blob.vertracloud.app/v1/uploads/{upload_id}"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://blob.vertracloud.app/v1/uploads/{upload_id}")
.asString();require 'uri'
require 'net/http'
url = URI("https://blob.vertracloud.app/v1/uploads/{upload_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"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"
}
}
Uploads
Get Blob Upload Status for Resume
Returns the status of one direct upload and the parts already stored, so an interrupted upload can resume. Accepts an upload token.
GET
/
v1
/
uploads
/
{upload_id}
Get Blob Upload Status for Resume
curl --request GET \
--url https://blob.vertracloud.app/v1/uploads/{upload_id}import requests
url = "https://blob.vertracloud.app/v1/uploads/{upload_id}"
response = requests.get(url)
print(response.text)const options = {method: 'GET'};
fetch('https://blob.vertracloud.app/v1/uploads/{upload_id}', 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/uploads/{upload_id}",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://blob.vertracloud.app/v1/uploads/{upload_id}"
req, _ := http.NewRequest("GET", url, nil)
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://blob.vertracloud.app/v1/uploads/{upload_id}")
.asString();require 'uri'
require 'net/http'
url = URI("https://blob.vertracloud.app/v1/uploads/{upload_id}")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
response = http.request(request)
puts response.read_body{
"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"
}
}
Returns one direct upload with
uploaded_parts, the part numbers already stored. Send only the missing parts after an interruption. Use it to resume an upload. An upload that has expired returns BLOB_UPLOAD_EXPIRED.
Scope: blob:write. Accepts an upload token.
Upload token: this route also accepts an upload token (Authorization: Bearer vcup_...) instead of an API key.
string
required
The upload ID returned when the upload was started.
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:manage workspace permission, because uploads in progress belong to whoever manages the files. Leave it out to act on your own blob.Example request
curl "https://blob.vertracloud.app/v1/uploads/7c1d2e3f-4a5b-4c6d-8e7f-0a1b2c3d4e5f" \
-H "Authorization: Bearer $VERTRA_API_KEY"
Response
object
The upload and the parts already stored.
Show properties
Show properties
string
Upload ID. Use it for status, parts, complete and abort.
string
Final path, including the random suffix when one was requested.
string
single (one PUT of the whole file to url) or multipart (several parts, each with its own URL).string
pending, completed, aborted or expired.number
Declared size in bytes. The stored bytes must match it at
complete.string
When the URLs and the reserved storage expire, as an ISO 8601 timestamp.
string
Only in
single mode: the URL to PUT the whole file to.object
Headers the
PUT must send exactly as given, because they are part of the signature.number
Only in
multipart mode: the fixed part size in bytes. The last part can be smaller.number
Only in
multipart mode: how many parts the file has.number[]
Part numbers already stored. Use them to resume an interrupted upload.
string
ISO 8601 creation time.
{
"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"
}
}
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_UPLOAD_TOKEN_INVALID(401): The upload token doesn’t exist, has expired or was revoked (only with an upload token).BLOB_UPLOAD_NOT_FOUND(404): No upload with that ID in this account, or it was already completed or aborted.BLOB_UPLOAD_EXPIRED(410): The upload’s time limit has passed.
{
"code": "AUTH_TOKEN_MISSING"
}
{
"code": "API_KEY_SCOPE_DENIED"
}
{
"code": "WORKSPACE_NOT_FOUND"
}
{
"code": "BLOB_UPLOAD_EXPIRED"
}