databases

POST /v1/databases/{databaseId}/upgrade

Move the database to a newer PostgreSQL major.

All databases endpoints

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 POST https://api.zinndigital.com/v1/databases/{databaseId}/upgrade \
  -H "Authorization: Bearer zdk_live_…" \
  -H "Content-Type: application/json" \
  -d '{ "engine_version": <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

Gated on `databases.manage`. Returns `202` — the upgrade runs as a durable workflow because the operator rolls the primary over to an upgraded replica, which takes minutes and must survive a deploy or the customer closing the tab. ⛔ Refused with 422 when the target is not a major we run, when it is not newer than the current one (downgrading is not possible), and — importantly — when **the database has never been backed up**: if a switchover goes wrong the way back is a restore, and a restore with no backup is not a way back.

Parameters

NameTypeRequiredWhat it is
databaseId (path)stringYes

Request body

NameTypeRequiredWhat it is
engine_versionstringYesThe engine major to move to. Must be one this platform offers for the database's own engine, and newer than its current one. ⛔ Compared as version numbers, not as text: `"9.7" <…

Response

NameTypeRequiredWhat it is
idstringYes
labelstringYesThe customer's own name for it. Never sent to the infrastructure.
enginestring<postgres, mysql>YesWhich engine this database runs (`docs/497`). Modelled as a field from the start, which is why MySQL was additive rather than a migration of every row.
engine_versionstringYesThe engine's **major** — `"18"`, `"8.4"`. The patch level is ours to keep current and is deliberately not customer-selectable: choosing your own patch level means choosing to ru…
engine_labelstringNoThe engine and version as a customer sees them — "PostgreSQL 18", "MySQL 8.4". Assembled by the API so three frontends cannot disagree about a product name.
sizestringYesA code from `GET /v1/databases/catalogue`.
statusstring<provisioning, available, failed, suspended, deleting, deleted>Yes
status_detailstringNoWhy a `failed` instance failed. Empty otherwise.
hoststringNoEmpty until the instance is `available`.
portintegerYes
database_namestringYes
usernamestringYes
high_availabilitybooleanYesWhether a standby replica is held with automatic failover. **The property customers actually choose on** — stated rather than inferred from the size, because an inference goes w…
vcpuintegerNo
ram_gbintegerNo
storage_gbintegerNo
tls_requiredbooleanYesAlways true. TLS is a precondition of selling a publicly reachable database, not a feature that can be turned off.
created_atstringYes
last_backup_atstringNoWhen a backup last **completed**. `null` means none has ever run.
order_line_idobjectNoThe paid basket line this database fulfils, or `null` for one that predates the purchase path or that staff tooling created. The subscription that bills it carries the same id.
billingManagedDatabaseBillingNoThe subscription paying for this database — what it costs, and when it next renews. ⛔ `null` means **no subscription pays for it**, which is a real state (a row created before d…
restore_verified_atstringNoWhen a backup of this database was last proved restorable **by restoring it and reading a row back over a client connection**. ⛔ Deliberately separate from `last_backup_at`: a b…

Errors this endpoint can return

401 · 403 · 404 · 422