hosting
GET /v1/sites/{siteId}/media-offload
Whether this site's media is offloaded to object storage, and how.
Authentication
Send an API key as a bearer token. The key must carry the storage.view permission; a key without it is refused with 403, not 404.
This endpoint takes no organisation id. Your key already identifies the organisation it belongs to, and the response is scoped to it.
Try it
Replace anything in angle brackets with your own values, and the key placeholder with a key from your dashboard.
curl -X GET https://api.zinndigital.com/v1/sites/{siteId}/media-offload \
-H "Authorization: Bearer zdk_live_…"Signed in? The API console in your dashboard fills in your real organisation id and your own key, and runs the request against the live API so you can see the actual response. Open this endpoint in the API console
Details
A site with no offload configured answers 200 with configured: false, not 404. "This site does not offload its media" is an answer; a 404 would be indistinguishable from "no such site", which is what the screen would then have to show the customer. plan is returned in both states and carries the organisation's included storage, what it is using and what more costs. Media offload is an allowance in the plan plus metered overage, not a separate add-on, and the off state is where a customer needs that said. Requires storage.view.
Parameters
| Name | Type | Required | What it is |
|---|---|---|---|
siteId (path) | Uuid | Yes | Site ID (UUIDv7). |
Response
| Name | Type | Required | What it is |
|---|---|---|---|
configured | boolean | Yes | false when this site has no offload set up. The rest of the fields are then absent — except plan, which is present in both states on purpose. |
plan | MediaStorageTerms | No | What this site's organisation gets included for media storage, what it is using, and what more would cost. Present on every media-offload response, including… |
id | string | No | — |
site_id | string | No | — |
bucket_id | string | No | — |
status | string<awaiting_pairing, active, paused, revoked> | No | — |
prefix | string | No | The key prefix this site's objects live under. |
rewrite_urls | boolean | No | Whether the plugin points media URLs at the bucket. Off means "upload a copy but keep serving locally", which is how a cautious customer migrates. |
delete_local | boolean | No | Whether the plugin removes the local file after a confirmed upload. Defaults to off, and even when on the plugin refuses to delete after a partial upload. |
custom_domain | string | No | The site's OWN media domain, as the customer typed it, or "". This is what belongs in the settings input box. See public_base_url for where media is actually served from — the… |
public_base_url | string | No | Where this site's media is actually served from, after the site's own domain, the footprint rule and the bucket's shared hostname have been resolved. "" means no URL is… |
needs_custom_domain | boolean | No | true when this site is serving media locally only because it has no media domain of its own — a footprint-free site awaiting a CNAME. Distinguishes the one… |
accepts_uploads | boolean | No | Whether the plugin may currently upload. Requires both an active offload and a usable bucket. |
paired | boolean | No | Whether a plugin token has been issued. The token and its hash are never returned. |
plugin_version | string | No | — |
last_seen_at | string | No | When the plugin last called. null means it never has. |
objects_offloaded | integer | No | What the plugin reports it has moved. A diagnostic for the screen, never an input to billing — storage is metered by measuring the bucket. |
bytes_offloaded | integer | No | — |
created_at | string | No | — |
Errors this endpoint can return
401 · 403 · 404 · 429