catalog
GET /v1/catalog/app/site-hosting-lines
List the product lines a SITE can be created on.
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/catalog/app/site-hosting-lines \
-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 subset of listInAppProductLines a website can actually live on, and the catalogue half of what a deploy or migrate picker needs. ⚖️ Owner, 2026-09-09, on the migration flow: "When it allows them to select a hosting type to migrate to, does it only show them the hosting types they actually own and say for other hosting plans they need to buy it first type of thing?". Measured live the same day, the migration screen offered eighteen lines — of which four sell something that is not a website: Zinn® Boards, Zinn® Managed Databases, Zinn® Vector Databases and email for an external domain. A managed database has no document root; Boards is a project board. ⛔ The predicate is derived, never enumerated. A line appears here iff some purchasable plan on it grants a positive or unlimited max_sites — which is exactly the entitlement a site create spends, so this cannot drift from what POST /v1/sites accepts. A hand-written deny list would be right on the day it was typed and would silently offer the fifth non-hosting line an operator seeds tomorrow. ⛔ It says nothing about whether the caller can afford one. "Do I already have room" is getDeployablePlans, and the two stay apart: a screen composes them — the owned half to offer, the difference to upsell. Reseller clients see only the lines their provider still sells, exactly as listInAppProductLines does, so nothing here can be bought and then refused by the cart. internal lines (the staff tariff) are excluded: they grant unlimited sites and are assigned by staff, so offering one advertises a plan the customer cannot buy. Requires authentication and nothing else. Cache-Control: private, no-store — the list carries in-app-only lines, so a shared cache would hand them to the next anonymous visitor.
Response
| Name | Type | Required | What it is |
|---|---|---|---|
data | SiteHostingLine[] | Yes | — |
Errors this endpoint can return
401 · 429