hosting

PUT /v1/sites/{siteId}/cms-target

Tell us where this site's posts should go.

All hosting endpoints

All developer docs →

Authentication

Send an API key as a bearer token. The key must carry the links.edit 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}/cms-target \
  -H "Authorization: Bearer zdk_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "kind": <string<wordpress, headless_rest, git_static>> }'

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 or replaces the site's content target. Gated on links.edit. ⛔ secret is write-only, and omitting it keeps the credential you already have rather than clearing it — a customer editing a collection name must not silently delete their key. The secret is written to Vault before the row is saved, and the row is only written if that succeeded: the other order leaves a row that reads as configured on every screen and fails at the first publish.

Parameters

NameTypeRequiredWhat it is
siteId (path)stringYes—

Request body

NameTypeRequiredWhat it is
kindstring<wordpress, headless_rest, git_static>Yes—
presetstring<, payload, strapi, directus, ghost, shopify, webflow, custom>No—
base_urlstringNo—
collectionstringNo—
auth_schemestring<, bearer, payload_api_key, ghost_admin_jwt, shopify_token, header>No—
auth_headerstringNo—
field_mapobjectNo—
enabledbooleanNo—
secretstringNoThe API key. ⛔ Write-only, and omitting it keeps the credential you already have rather than clearing it. It is written to Vault before the row is saved, and the row is only…

Response

NameTypeRequiredWhat it is
site_idstringYes—
kindstring<, wordpress, headless_rest, git_static>YesEmpty when nothing claims this site. For a site with no configured row this is the derived target — most WordPress sites on our own fleet need no configuration at all, because…
presetstring<, payload, strapi, directus, ghost, shopify, webflow, custom>Yes—
base_urlstringYesThe CMS's API root. Empty for a target whose address is derived from the site (fleet WordPress, a connected Git repository).
collectionstringYesThe collection posts are created in — posts on Payload, a blog id on Shopify, a collection id on Webflow, the content directory on a Git target.
auth_schemestring<, bearer, payload_api_key, ghost_admin_jwt, shopify_token, header>Yes—
auth_headerstringYesFor the header auth scheme — which header the key is sent in.
field_mapobjectYesRenames, for a destination that spells our fields differently. ⛔ It renames; it never adds a capability. A field map cannot make a target able to carry a tag it has no field…
enabledbooleanYesA disabled target is skipped and reads as needs_setup — kept rather than deleted so pausing publishing to a site does not lose its set-up.
has_credentialbooleanYes—
capabilitiesstring[]Yes—
detected_identitystringYesWhat the destination said it was, last time it answered.
last_probe_atstringYes—
last_probe_reachablebooleanYes⛔ null means never probed; false means probed and could not be reached. Those are different facts and a client must not render them the same.
last_probe_codestringYes—
last_probe_detailstringYes—

Errors this endpoint can return

401 · 403 · 404 · 422