hosting
PUT /v1/sites/{siteId}/cms-target
Tell us where this site's posts should go.
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
| Name | Type | Required | What it is |
|---|---|---|---|
siteId (path) | string | Yes | — |
Request body
| Name | Type | Required | What it is |
|---|---|---|---|
kind | string<wordpress, headless_rest, git_static> | Yes | — |
preset | string<, payload, strapi, directus, ghost, shopify, webflow, custom> | No | — |
base_url | string | No | — |
collection | string | No | — |
auth_scheme | string<, bearer, payload_api_key, ghost_admin_jwt, shopify_token, header> | No | — |
auth_header | string | No | — |
field_map | object | No | — |
enabled | boolean | No | — |
secret | string | No | The 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
| Name | Type | Required | What it is |
|---|---|---|---|
site_id | string | Yes | — |
kind | string<, wordpress, headless_rest, git_static> | Yes | Empty 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… |
preset | string<, payload, strapi, directus, ghost, shopify, webflow, custom> | Yes | — |
base_url | string | Yes | The CMS's API root. Empty for a target whose address is derived from the site (fleet WordPress, a connected Git repository). |
collection | string | Yes | The 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_scheme | string<, bearer, payload_api_key, ghost_admin_jwt, shopify_token, header> | Yes | — |
auth_header | string | Yes | For the `header` auth scheme — which header the key is sent in. |
field_map | object | Yes | Renames, 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… |
enabled | boolean | Yes | A 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_credential | boolean | Yes | — |
capabilities | string[] | Yes | — |
detected_identity | string | Yes | What the destination said it was, last time it answered. |
last_probe_at | string | Yes | — |
last_probe_reachable | boolean | Yes | ⛔ `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_code | string | Yes | — |
last_probe_detail | string | Yes | — |
Errors this endpoint can return
401 · 403 · 404 · 422