hosting

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

Tell us where this site's posts should go.

All hosting endpoints

Authentication

Send an API key as a bearer token. This endpoint does not state a specific permission in the specification, so give your key the least it needs and check the response rather than assuming.

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, becau…
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