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 GET https://api.zinndigital.com/v1/sites/{siteId} \
-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
Returns a single site the principal can view. RLS-scoped.
Parameters
| Name | Type | Required | What it is |
|---|---|---|---|
siteId (path) | Uuid | Yes | Site ID (UUIDv7). |
Response
| Name | Type | Required | What it is |
|---|---|---|---|
id | Uuid | Yes | UUIDv7 identifier — sortable by creation time (docs/02 §8). |
org_id | Uuid | Yes | UUIDv7 identifier — sortable by creation time (docs/02 §8). |
product_line | string | Yes | Product line code this site belongs to (CLAUDE.md §2.14). |
source | SiteSource | Yes | Where a site's initial content came from (docs/04 §2). `blueprint` is a fresh site off one of our published stack recipes. `site_blueprint` is a copy of one of the **customer's… |
blueprint_id | Uuid | null | No | The exact blueprint version the site was built from; null for imports. |
subscription_id | Uuid | null | No | The subscription entitling this site; null while unassigned. |
plan_code | string | null | No | Stable code of the plan behind this site's subscription (e.g. `pbn_25`); null when the site has no subscription. Use this, not `plan_name`, for filters, saved views and support… |
plan_name | string | null | No | Display name of the plan behind this site's subscription; null when the site has no subscription (a real state — a trial, an internal site, or a site provisioned before its orde… |
seo | SiteSeoSummary | null | No | **This site's search-index status and authority metrics, on the list row.** The same readings `GET /v1/sites/{siteId}/index-check` and `/seo-metrics` return for one site, comput… |
primary_domain | Hostname | Yes | A fully-qualified DNS hostname, lowercase, no trailing dot. |
name | string | No | Human label for the site; defaults to the primary domain. |
stack_type | StackType | Yes | The application stack a site runs (docs/04 §1). `nextcloud`, `owncloud` and `headless_cms` are **own-fleet only** (docs/139): we install them ourselves from each project's own d… |
runtime | Runtime | Yes | The runtime the web server serves the site with. |
php_version | string | No | The PHP version this site is pinned to, or `""` when it follows the product line's current default. Echoed so a caller can confirm the choice it just made on create — without it… |
status | SiteStatus | Yes | A site's lifecycle state (docs/04 §3). A newly created site is `pending` until the provisioning workflow picks it up; `deleted` is terminal. `restricted` and `quarantined` are t… |
status_reason | SiteStatusReason | null | No | Why the site is in that status. **Null on any healthy site**, and cleared the moment the site leaves `failed` — a reason that outlives its failure reads to the customer as current. |
failed_step | string | No | WHERE provisioning failed — the saga step that was running when it did, as a `SiteFailedStep` code the client localises, or `""` when the site is not `failed` (cleared in the sa… |
failed_activity | string | No | The activity that refused, by the name the worker registered it under (`create_dns_zone`, `verify_site_serving`). An identifier of ours, never the vendor's message, so it is saf… |
region | string | No | Where the site is running. On our own fleet this is the region of the box the site is **placed on**, not the region asked for at create time — the two can disagree when placemen… |
cdn_vendor | string | No | The CDN vendor this site was pinned to, or `""` when the footprint balancer chooses (the default, and the only value on a managed line). This is the customer's own choice echoed… |
dns_vendor | string | No | The DNS vendor this site's zone was pinned to, or `""` when the footprint balancer chooses. |
deploy_target | string | No | Where the site actually runs (docs/62 §1) — `fleet`, `cf_pages`, `twentyi_shared`, and so on. Empty when it has not been decided. A machine identifier the client localises, neve… |
deletion_state | string<none, scheduled, running, stalled, deleted> | No | Whether this site is on its way out. The same five values as `SiteDeletion.state`, reused verbatim so a list chip and the danger zone cannot disagree inside one screen. ⛔ **An a… |
deletion_scheduled_for | string | No | When the teardown fires. Null unless a deletion is armed or running. Stored when the request is made rather than recomputed from the grace period, so a countdown already shown t… |
created_at | string | Yes | — |
updated_at | string | No | — |
Errors this endpoint can return
401 · 403 · 404 · 429