hosting

GET /v1/sites/{siteId}

Get a site.

All hosting endpoints

All developer docs →

Authentication

Send an API key as a bearer token. The endpoint checks sites.view; 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 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

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

Response

NameTypeRequiredWhat it is
idUuidYesUUIDv7 identifier — sortable by creation time (docs/02 §8).
org_idUuidYesUUIDv7 identifier — sortable by creation time (docs/02 §8).
product_linestringYesProduct line code this site belongs to (CLAUDE.md §2.14).
sourceSiteSourceYesWhere 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…
blueprint_idUuid | nullNoThe exact blueprint version the site was built from; null for imports.
subscription_idUuid | nullNoThe subscription entitling this site; null while unassigned.
plan_codestring | nullNoStable 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_namestring | nullNoDisplay 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 order…
domain_pointingobjectNoWhether this site's domain actually reaches us (docs/823) — the compact form, for the row. null means we have never measured it, which a client renders as no badge rather…
seoSiteSeoSummary | nullNoThis 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, computed…
primary_domainHostnameYesA fully-qualified DNS hostname, lowercase, no trailing dot.
namestringNoHuman label for the site; defaults to the primary domain.
stack_typeStackTypeYesThe application stack a site runs (docs/04 §1). nextcloud, owncloud, headless_cms and php_app are own-fleet only (docs/139, docs/564): we install them ourselves from…
runtimeRuntimeYesThe runtime the web server serves the site with. node, python and ruby are long-lived application processes the web server itself runs (docs/715); dotnet is one the…
php_versionstringNoThe 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,…
statusSiteStatusYesA 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 the…
status_reasonSiteStatusReason | nullNoWhy 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_stepstringNoWHERE 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 same…
failed_activitystringNoThe 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 safe…
provider_refusalSiteProviderRefusalNoR42 (owner 2026-10-18): a DNS or CDN provider REFUSED this domain - normal, and the customer's to route around. null unless the site is failed on a refusal. The site shows…
provisioning_started_atstringNoWhen the site last ENTERED provisioning - the start of the current build attempt, so a retried site's elapsed time and "taking longer than expected" count from the retry, not…
enforcement_errorstring<, config_rejected, stop_unconfirmed, start_unconfirmed, unverified>NoWhy the enforcement rung this site is on (suspended, restricted, quarantined, or a resume from one) was not confirmed by its box. "" when the last rung change was confirmed.…
serverSiteServerYesWhich server the site runs on (D43). kind decides how to label it: fleet — our shared server, labelled from region + number ("Helsinki server 1"); own — the customer's…
diskSiteDiskYesThe newest stored disk reading against the site's effective allowance (base plus live grants). used_mb is null when the site has never been measured — never 0. limit_mb is…
regionstringNoWhere 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 placement…
cdn_vendorstringNoThe 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_vendorstringNoThe DNS vendor this site's zone was pinned to, or "" when the footprint balancer chooses.
deploy_targetstringNoWhere 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, never…
panel_connection_idUuid | nullNoWhich control panel this site's subscription lives on — the PanelConnection from GET /v1/panels/connections. Set only when deploy_target is plesk;…
deletion_statestring<none, scheduled, running, stalled, deleted>NoWhether 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. ⛔…
deletion_scheduled_forstringNoWhen 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 to…
created_atstringYes—
updated_atstringNo—

Errors this endpoint can return

401 · 403 · 404 · 429