Storage

Preview — pending review

This reference is generated from the platform API contract and is still under review. Operations, fields, and descriptions can change before publication.

Download an object from the bucket

POST
/scopes/{scopeId}/storage/buckets/{bucketId}/exports

Generates a short-lived download for a single object in the bucket, backing the per-row "Download" action in the object browser. The caller names the object key; the backend resolves the object's latest version and returns a time-limited download URL together with the object's size and content type. The bucket and the object are not mutated. Validation: bucketId must reference an existing, non-deleted bucket in the scope (unknown → 404 NOT_FOUND); key is required, must be a non-empty object key that exists in the bucket and must reference a file, not a folder prefix (missing/empty → 422 VALIDATION_FAILED, unknown key → 404 NOT_FOUND). An object uploaded since the last refresh is looked up in the container, so it is exportable at once; caller must hold reader-or-higher RBAC on the scope, otherwise 403 FORBIDDEN. Async & state: Synchronous — returns 200 with the BucketExportResult containing the time-limited downloadUrl. No bucket state changes and no SSE frames are emitted; the download itself is performed by the browser against the returned URL until expiresAt. Errors: 401 unauthenticated; 403 caller lacks read access to the scope or the object; 404 unknown scopeId, bucketId or object key; 409 CONFLICT details.reason=project_suspended the project's Temp-URL keys are withdrawn while it is suspended; 422 missing or malformed key (details.reason=object_key_invalid, details.rule one of empty|too_long|control_char|folder|edge_unreachable -- the key is the exact object name, never trimmed); 429 download-link issuance rate limit exceeded; 500 unexpected backend failure. Signing key: the URL is signed with the account's Temp-URL-Key (slot 1). An existing slot-1 key -- including one the customer set -- is reused unchanged; only an account without one gets a key written, once. Slot 2 and container keys are never written. Idempotency/Concurrency: This operation does not use Idempotency-Key; it may be omitted and a sent one is ignored. Every call signs a new download URL with a fresh expiresAt; an earlier URL keeps working until its own expiry. The returned URL is the only place the signed token appears — it is never readable from any subsequent GET.

Authorization

bearerToken
headerAuthorizationBearer <token>

An API token (pc_live_…) or a service-account key (sak_live_…), created in Identity & Access Management and sent as Authorization: Bearer <token>. Requests are rate limited per credential and per tenant: every response carries X-RateLimit-Limit, X-RateLimit-Remaining and X-RateLimit-Reset, and a refused request gets 429 RATE_LIMITED with Retry-After.

Path Parameters

scopeId*string

Opaque ownership+authorization scope resolving to tenant + subscription + project.

bucketId*string

Identifier of the bucket.

Request Body

application/json
  1. body

Download request for a single object ("Download" row action).

key*string

Object key to download (must reference a file, not a folder prefix).

Response Body

Time-limited download descriptor for the requested object.

application/json
  1. response

Time-limited download descriptor for a bucket object.

bucketId*string
key*string
downloadUrl*string

Signed, time-limited download URL (revealed only in this response).

sizeBytes*integer
contentType*string
expiresAt*string
Formatdate-time
curl -X POST "https://example.com/scopes/string/storage/buckets/string/exports" \  -H "Content-Type: application/json" \  -d '{    "key": "string"  }'
{  "bucketId": "string",  "key": "string",  "downloadUrl": "string",  "sizeBytes": 0,  "contentType": "string",  "expiresAt": "2019-08-24T14:15:22Z"}