databases
POST /v1/databases
Validate a managed database, and say where to buy it.
Authentication
Send an API key as a bearer token. The key must carry the databases.manage permission; 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 POST https://api.zinndigital.com/v1/databases \
-H "Authorization: Bearer zdk_live_…" \
-H "Content-Type: application/json" \
-d '{ "label": <string>, "size": <string> }'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
⛔ This endpoint no longer creates a database — it always answers 422 (docs/497 §8). Until 2026-09-05 it created a real cluster for nothing: no order, no invoice, no subscription and no charge, so a customer could run a highly-available database that never appeared on any bill. A managed database is bought: POST /v1/carts/{cartId}/lines with kind=managed_database and a database block, then checkout. Fulfilment creates the instance in provisioning and starts the Temporal workflow that builds it. The request is still validated first, so a caller learns why it would be refused before it goes to the basket and pays: the account is not in good standing, the label is blank or already used in this organisation, the size is not on sale, the engine or version is not one we run, the size belongs to a different engine, or the organisation already holds the self-service maximum. Only when all of that passes does it answer with the PURCHASE_REQUIRED code that names the basket. Gated on databases.manage in addition to databases.view.
Request body
| Name | Type | Required | What it is |
|---|---|---|---|
label | string | Yes | — |
size | string | Yes | A size code from GET /v1/databases/catalogue. |
engine | string<postgres, mysql> | No | Optional. Omitted uses PostgreSQL. ⛔ Must match the engine the size code belongs to — a MySQL request carrying a db_pg_* size is refused, because it would run one engine and… |
engine_version | string | No | Optional engine version — "18", "8.4". Omitted uses the newest we offer for the chosen engine. ⛔ A version too close to end of life is refused by name rather than silently… |
Errors this endpoint can return
401 · 403 · 422