hosting

PUT /v1/sites/{siteId}/media-offload

Turn media offload on for a site, or change how it behaves.

All hosting endpoints

Authentication

Send an API key as a bearer token. The key must carry the storage.manage 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 PUT https://api.zinndigital.com/v1/sites/{siteId}/media-offload \
  -H "Authorization: Bearer zdk_live_…" \
  -H "Content-Type: application/json" \
  -d '{  }'

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

Creates the offload configuration if it does not exist, provisioning storage for the organisation on first use — "turn on media offload" is what the customer wants, and a bucket is our word for part of how we do it. Moving an offload that is already live to a **different** bucket answers `422`. The objects already written stay where they are, so the switch would leave the site serving half its media from a bucket the configuration no longer names, and nothing would report it because new uploads would keep succeeding. Requires `storage.manage`.

Parameters

NameTypeRequiredWhat it is
siteId (path)UuidYesSite ID (UUIDv7).

Request body

NameTypeRequiredWhat it is
bucket_idstringNoWhich bucket to use. Omit to use the organisation's own, provisioning one on first use. Changing this on a live offload is refused.
enabledbooleanNoPause or resume a paired site. Ignored before the plugin has paired.
rewrite_urlsbooleanNo
delete_localbooleanNo
prefixstringNo
custom_domainstringNoA media domain of the site's own, replacing the shared Zinn® hostname. Must be `https://` and a bare domain with no path. Send `""` to clear it. Required to turn on URL rewritin…

Response

NameTypeRequiredWhat it is
configuredbooleanYes`false` when this site has no offload set up. The rest of the fields are then absent. A site with no offload is a `200`, never a `404`.
idstringNo
site_idstringNo
bucket_idstringNo
statusstring<awaiting_pairing, active, paused, revoked>No
prefixstringNoThe key prefix this site's objects live under.
rewrite_urlsbooleanNoWhether 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_localbooleanNoWhether 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_domainstringNoThe 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 — t…
public_base_urlstringNoWhere 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 rewrit…
needs_custom_domainbooleanNo`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 empty-`public_base_…
accepts_uploadsbooleanNoWhether the plugin may currently upload. Requires both an active offload and a usable bucket.
pairedbooleanNoWhether a plugin token has been issued. The token and its hash are never returned.
plugin_versionstringNo
last_seen_atstringNoWhen the plugin last called. `null` means it never has.
objects_offloadedintegerNoWhat the plugin reports it has moved. A diagnostic for the screen, never an input to billing — storage is metered by measuring the bucket.
bytes_offloadedintegerNo
created_atstringNo

Errors this endpoint can return

401 · 403 · 404 · 422 · 429