# Restart database

`POST https://api.instacloud.com/projects/{projectId}/database/restart`

**Token scope:** `account` · `org` · `project` — read-only tokens refused (not a GET).

Restart the postgres server (insta-db only) so settings written with ALTER SYSTEM that need a restart (wal_level, max_wal_senders, max_replication_slots, …) take effect. Connections drop while it restarts. Waits for the restart to finish. `pending: true` means it was still in progress when the wait ran out — GET .../database/instance reads `running` throughout, so confirm with `SHOW <setting>` instead. A suspended database stays suspended — its next connection starts it with the new settings. Gated — deploy.

## Parameters

| Name | In | Type | Required | Description |
| --- | --- | --- | --- | --- |
| `branch` | query | `string` | no | branch name (default branch if omitted) |
| `group` | query | `string` | no | postgres service name (default: the sole postgres service) |
| `projectId` | path | `string` | yes |  |

## Response 200

Default Response

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `id` | `string` | no |  |
| `name` | `string` | no |  |
| `state` | `string` | no |  |
| `routeKey` | `string` | no |  |
| `host` | `string` | no |  |
| `port` | `integer` | no |  |
| `connectionPooling` | `boolean` | no |  |
| `deletionProtection` | `boolean` | no |  |
| `scaleToZero` | `boolean` | no |  |
| `idleTimeoutSecs` | `integer` | no |  |
| `volumeSize` | `string` | no | the service's volume (block disk) size |
| `volumeGib` | `number` | no |  |
| `storageSize` | `string` | no | DEPRECATED alias of volumeSize — dropped next release |
| `storageGiB` | `number` | no | DEPRECATED alias of volumeGib — dropped next release |
| `enabledExtensions` | `string[]` | no |  |
| `cpuMilli` | `integer` | no | current cpu ceiling in millicores (2000 = 2 vCPU) |
| `memoryMib` | `integer` | no | current memory ceiling in MiB |
| `cap` | `object` | no | this plan's maximum for the ceilings — render sliders with their plan-limit markers. These are the caller's own tier caps and they move with the plan (and with env overrides per deployment), so read them from THIS field rather than assuming a tier's numbers; the parenthetical example that used to live here said 'pro 4 vCPU/4Gi/10Gi' and was stale on all three by the time anyone noticed. |
| `cap.cpuMilli` | `integer` | yes |  |
| `cap.memoryMib` | `integer` | yes |  |
| `cap.volumeGib` | `integer` | yes |  |
| `pending` | `boolean` | no | true when the provider accepted the change asynchronously and it has not been applied yet — the ceiling/volume fields are then the PRE-change values. Re-read (GET) to see the applied state. Absent when the change was applied synchronously. |
| `publicAccess` | `boolean` | no | postgres (insta-db) — false: the public endpoint refuses every connection (SQLSTATE 28000) and the database is not reachable from the internet; only the private network lane connects. Change it with PUT .../services/{serviceId}/access. Absent when the provider does not report it. |
| `privateAccess` | `boolean` | no | postgres (insta-db) — true: the database has a private network connection string (privateConnString, and DATABASE_PRIVATE_URL in the service credentials) for compute services on the insta-compute provider. Change it with PATCH .../database/settings {privateAccess}. Absent when the provider does not report it. |
| `privateConnString` | `string` | no | the connection string over the private network lane, WITHOUT the password (the full URL is DATABASE_PRIVATE_URL in the service credentials). Present only while privateAccess is on. |
| `privateLane` | `object` | no | GET .../database/instance only — this deployment's private-lane switches, so a UI can render the toggles without a probing write |
| `privateLane.enabled` | `boolean` | yes | the private network access toggle and closing public access are available on this deployment; false: both answer 409 {code: private_lane_disabled} |
| `privateLane.console` | `boolean` | yes | the platform console reaches databases over the private network lane; false: it uses the public endpoint, so it cannot browse a database whose public access is closed |
| `warnings` | `string[]` | no | what this change will break and how to fix it (e.g. compute services bound to DATABASE_PRIVATE_URL when private access is turned off). Advisory: the change was applied. |

## Response 202

Default Response

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `status` | `"approval_required"` | no |  |
| `approvalId` | `string` | no |  |
| `action` | `string` | no | the gated action, or a comma-joined compound set — prefer `actions` |
| `actions` | `string[]` | no | every capability this approval covers |
| `message` | `string` | no |  |
| `url` | `string` | no | the console page where a project admin reviews this request |
| `nextActions` | `object[]` | no |  |
| `nextActions.op` | `string` | yes | Neutral logical action id, e.g. "service.add" — NOT an operationId or a CLI/MCP tool name; each client maps it to its own surface. |
| `nextActions.reason` | `string` | yes | Natural-language, human/LLM-facing "why do this now". |
| `nextActions.args` | `object` | no | Suggested, flat named arguments; "<placeholder>"s where a value is unknown. |
| `nextActions.gated` | `boolean` | no | True if the action passes a governance gate. |

## Response 400

Default Response

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `error` | `string` | yes |  |

## Response 403

Default Response

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `error` | `string` | yes |  |

## Response 404

Default Response

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `error` | `string` | yes |  |

## Response 409

Default Response

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `error` | `string` | yes |  |

## Response 502

Default Response

| Field | Type | Required | Description |
| --- | --- | --- | --- |
| `error` | `string` | yes |  |
