hosting

GET /v1/sites/{siteId}/certificate

The TLS certificate serving this site.

All hosting endpoints

All developer docs

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}/certificate \
  -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

Whether this site is served over HTTPS on its own name, and if not, why not. Sites on our own fleet are served a per-vhost certificate the platform obtains itself by ACME (owner ruling 2026-09-07, docs/537), because not every site sits behind a CDN and a site with DNS pointed straight at our fleet needs a publicly-trusted certificate of its own. ⛔ state is never simply "no". issued / pending / failed with a reason are three different facts, and the failure directions are asymmetric: behind Cloudflare Full (strict) an uncovered host answers HTTP 526 — a hard outage — while behind plain Full it is a silent downgrade. A payload that could only say "no" would leave a customer looking at a broken site with no explanation. ⛔ covered and serving are DIFFERENT and both are returned. covered means a CA signed it; serving means the box actually presents it. A certificate that exists and is not installed serves nobody, and a screen built from covered alone would report a healthy site to a customer whose visitors see a name-mismatch warning. scope is shared when the site is covered by one platform certificate for a registrable domain we own — the ordinary case for a preview hostname, where a single wildcard covers every site on that domain rather than one certificate each.

Parameters

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

Response

NameTypeRequiredWhat it is
site_idstringYes
statestring<none, pending, issued, failed, retired>Yesnone means nothing has been attempted, which is a DIFFERENT fact from failed. Collapsing them would leave a screen unable to tell a new site from a broken one.
scopestring<site, shared>Yesshared when one platform certificate for a registrable domain we own covers this site — the ordinary case for a preview hostname.
shared_suffixstringNoThe registrable domain a shared certificate covers. Empty when scope is site.
hostnamesstring[]YesRead back off the ISSUED artefact, never from what was requested — a CA that trimmed a name must not be reported as covering it.
coveredbooleanYesA certificate authority has signed a certificate for this site.
servingbooleanYes⛔ The box actually presents it. DIFFERENT from covered: a certificate that exists in Vault and is not installed serves nobody.
failure_reasonstringNo
failure_detailstringNo
not_afterstringNo
installed_atstringNo
environmentstringNo⛔ Travels because a staging certificate is trusted by NO browser. A screen showing one as simply "issued" would report green for a site every visitor sees a warning on.
wildcard_coveredbooleanNoWhether subdomains are covered. A wildcard needs DNS-01, which needs a TXT record in the zone, so a domain whose DNS we do not manage cannot have one.

Errors this endpoint can return

401 · 403 · 404