hosting
GET /v1/wordpress/sites
List every WordPress site the caller owns, across all product lines.
Authentication
Send an API key as a bearer token. The key must carry the sites.view permission; a key without it is refused with 403, not 404.
Where your organisation id goes
This endpoint takes org_id as a query parameter. Leave it out and the call covers your whole tenancy subtree; send it to narrow the call to one organisation.
Your organisation id is on the API keys screen in your dashboard, beside the key itself. It is the same id in every call you make.
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/wordpress/sites \
-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
The fleet manager's list: every `wordpress` or `woocommerce` site in the caller's tenancy subtree, on every product line and every deploy target (own fleet, managed shared, managed cloud, CloudLinux), with each one's stored WordPress posture. ⛔ **This endpoint never calls a vendor**, however stale a row is. Collecting is `refreshWordPressSite`, an explicit act; a row that has never been collected reports `update_state: unknown` with a null `snapshot`, and the client renders that as *"not checked yet"* — **never** as "up to date". Those are different sentences and a customer acts differently on each. `update_state` and `needs_attention` are applied **after** pagination, because the state is derived from four snapshot columns with an explicit precedence and re-expressing that precedence in SQL would give this list and `getWordPressFleetOverview` two implementations of one rule. A filtered page can therefore be short; the totals come from the overview, which counts everything. Requires `sites.view`.
Parameters
| Name | Type | Required | What it is |
|---|---|---|---|
cursor (query) | string | No | Opaque cursor from a previous page's `page.next_cursor`. |
limit (query) | integer | No | Maximum items to return (page size). |
org_id (query) | string | No | Narrow to one organisation in the caller's subtree. Equivalent to the `X-Zinn-Org` header, which is now read centrally for every org-scoped operation — this parameter wins where… |
q (query) | string | No | Substring match on the primary domain. |
product_line (query) | string | No | — |
deploy_target (query) | string | No | — |
update_state (query) | WordPressUpdateState | No | `422` on an unrecognised value rather than silently returning everything — a filter that quietly does nothing is how a customer concludes their estate is clean. |
needs_attention (query) | boolean | No | Only sites with a core or component update waiting, no WordPress installed, or a homepage that is not answering. |
health (query) | string<, healthy, unhealthy> | No | Filter by the stored health verdict. ⭐ Applied **in the database**, unlike `update_state` — `health_status` is one indexed column written by one function, so there is no precede… |
Response
| Name | Type | Required | What it is |
|---|---|---|---|
data | WordPressFleetSite[] | Yes | — |
page | PageMeta | Yes | — |
Errors this endpoint can return
401 · 403 · 422 · 429