databases
DELETE /v1/databases/{databaseId}
Delete a managed database and its backups.
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 DELETE https://api.zinndigital.com/v1/databases/{databaseId} \
-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
Gated on `databases.manage`. Returns `202` — the instance moves to `deleting` and **stops accruing charges at that moment**, not when the last volume detaches; teardown latency is ours, not the customer's. ⛔ Irreversible: the cluster, its volumes and its backup chain all go.
Parameters
| Name | Type | Required | What it is |
|---|---|---|---|
databaseId (path) | string | Yes | — |
Response
| Name | Type | Required | What it is |
|---|---|---|---|
id | string | Yes | — |
label | string | Yes | The customer's own name for it. Never sent to the infrastructure. |
engine | string<postgres, mysql> | Yes | Which 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_version | string | Yes | The 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_label | string | No | The 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. |
size | string | Yes | A code from `GET /v1/databases/catalogue`. |
status | string<provisioning, available, failed, suspended, deleting, deleted> | Yes | — |
status_detail | string | No | Why a `failed` instance failed. Empty otherwise. |
host | string | No | Empty until the instance is `available`. |
port | integer | Yes | — |
database_name | string | Yes | — |
username | string | Yes | — |
high_availability | boolean | Yes | Whether 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… |
vcpu | integer | No | — |
ram_gb | integer | No | — |
storage_gb | integer | No | — |
tls_required | boolean | Yes | Always true. TLS is a precondition of selling a publicly reachable database, not a feature that can be turned off. |
created_at | string | Yes | — |
last_backup_at | string | No | When a backup last **completed**. `null` means none has ever run. |
order_line_id | object | No | The 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. |
billing | ManagedDatabaseBilling | No | The 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_at | string | No | When 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