---
title: "Delete branch"
method: DELETE
path: "/projects/{project_id}/branches/{branch_id}"
tags: ["Branch"]
---

# Delete branch

`DELETE /projects/{project_id}/branches/{branch_id}`

Deletes the specified branch from a project and places all compute endpoints into an idle state, breaking existing client connections.

The deletion completes after all operations finish.
You cannot delete a project's root or default branch, or a branch that has a child branch.
A project must have at least one branch.

By default, deleted branches can be recovered within a 7-day grace period.
Use the `hard_delete` parameter to permanently delete the branch immediately.
For related information, see [Manage branches](https://neon.com/docs/manage/branches/).

## Query parameters

- `hard_delete` boolean

## Response `200`

Deleted the specified branch

- BranchOperations
  - `branch` Branch, required
    - `id` string, required — The branch ID. This value is generated when a branch is created. A `branch_id` value has a `br` prefix. For example: `br-small-term-683261`.
    - `project_id` string, required — The ID of the project to which the branch belongs
    - `parent_id` string — The `branch_id` of the parent branch
    - `parent_lsn` string — The Log Sequence Number (LSN) on the parent branch from which this branch was created. When restoring a branch using the `POST /projects/{project_id}/branches/{branch_id}/restore` endpoint, this value isn’t finalized until all operations related to the restore have completed successfully.
    - `parent_timestamp` string, date-time — The point in time on the parent branch from which this branch was created. When restoring a branch using the `POST /projects/{project_id}/branches/{branch_id}/restore` endpoint, this value isn’t finalized until all operations related to the restore have completed successfully. After all the operations completed, this value might stay empty.
    - `name` string, required — The branch name
    - `current_state` string, required — The branch’s state, indicating if it is initializing, ready for use, or archived. * 'init' - the branch is being created but is not available for querying. * 'resetting' - the branch is being reset to a specific point in time or LSN and is not yet available for querying. * 'ready' - the branch is fully operational and ready for querying. Expect normal query response times. * 'archived' - the branch is stored in cost-effective archival storage. Expect slow query response times.
    - `pending_state` string — The branch’s state, indicating if it is initializing, ready for use, or archived. * 'init' - the branch is being created but is not available for querying. * 'resetting' - the branch is being reset to a specific point in time or LSN and is not yet available for querying. * 'ready' - the branch is fully operational and ready for querying. Expect normal query response times. * 'archived' - the branch is stored in cost-effective archival storage. Expect slow query response times.
    - `state_changed_at` string, date-time, required — A UTC timestamp indicating when the `current_state` began
    - `logical_size` integer — The logical size of the branch, in bytes
    - `creation_source` string, required — The branch creation source
    - `primary` boolean — DEPRECATED. Use `default` field. Whether the branch is the project's primary branch
    - `default` boolean, required — Whether the branch is the project's default branch
    - `protected` boolean, required — Whether the branch is protected
    - `cpu_used_sec` integer, required — CPU seconds used by all of the branch's compute endpoints, including deleted ones. This value is reset at the beginning of each billing period. Examples: 1. A branch that uses 1 CPU for 1 second is equal to `cpu_used_sec=1`. 2. A branch that uses 2 CPUs simultaneously for 1 second is equal to `cpu_used_sec=2`.
    - `compute_time_seconds` integer, required
    - `active_time_seconds` integer, required
    - `written_data_bytes` integer, required
    - `data_transfer_bytes` integer, required
    - `created_at` string, date-time, required — A timestamp indicating when the branch was created
    - `updated_at` string, date-time, required — A timestamp indicating when the branch was last updated
    - `ttl_interval_seconds` integer — The time-to-live (TTL) duration originally configured for the branch, in seconds. This read-only value represents the interval between the time `expires_at` was set and the expiration timestamp itself. It is preserved to ensure the same TTL duration is reapplied when resetting the branch from its parent, and only updates when a new `expires_at` value is set. Access to this feature is currently limited to participants in the Early Access Program.
    - `expires_at` string, date-time — The timestamp when the branch is scheduled to expire and be automatically deleted. Must be set by the client following the [RFC 3339, section 5.6](https://tools.ietf.org/html/rfc3339#section-5.6) format with precision up to seconds (such as 2025-06-09T18:02:16Z). Deletion is performed by a background job and may not occur exactly at the specified time. Access to this feature is currently limited to participants in the Early Access Program.
    - `last_reset_at` string, date-time — A timestamp indicating when the branch was last reset
    - `created_by` object — The resolved user model that contains details of the user/org/integration/api_key used for branch creation. This field is filled only in listing/get/create/get/update/delete methods, if it is empty when calling other handlers, it does not mean that it is empty in the system.
      - `name` string — The name of the user.
      - `image` string — The URL to the user's avatar image.
    - `init_source` string — The source of initialization for the branch. Valid values are `schema-only` and `parent-data` (default). * `schema-only` - creates a new root branch containing only the schema. Use `parent_id` to specify the source branch. Optionally, you can provide `parent_lsn` or `parent_timestamp` to branch from a specific point in time or LSN. These fields define which branch to copy the schema from and at what point—they do not establish a parent-child relationship between the `parent_id` branch and the new schema-only branch. * `parent-data` - creates the branch with both schema and data from the parent.
    - `restore_status` string — Could be `restored`, `finalized` or `detaching`. A `restored` branch becomes permanently `finalized` when you call `finalizeRestoreBranch` A `restored` or `finalized` branch may begin `detaching` as a one-time performance optimisation, after which it will continue in its original state
    - `restored_from` string — ID of the snapshot that was the restore source for this branch
    - `restored_as` string — ID of the target branch which was replaced when this branch was restored
    - `restricted_actions` BranchRestrictedAction[] — A list of actions that are currently restricted for this branch and the reason why.
      - `name` string, required — The name of a restricted action. Possible values include `restore`, `delete-rw-endpoint`.
      - `reason` string, required — A human-readable explanation of why the action is restricted.
    - `recovery` BranchRecoveryInfo — Recovery information for a deleted branch. Only present when listing deleted branches with `include_deleted=true`. This is part of the Branch Recovery feature, which is in preview and not available to all users.
      - `deleted_at` string, date-time, required — Timestamp when the branch was deleted
      - `recoverable_until` string, date-time, required — Timestamp when the recovery window expires and the branch will be permanently deleted
      - `deletion_method` 'user' | 'ttl', required — How the branch was deleted: 'user' for manual deletion, 'ttl' for TTL expiration
  - `operations` Operation[], required
    - `id` string, uuid, required — The operation ID
    - `project_id` string, required — The Neon project ID
    - `branch_id` string — The branch ID
    - `endpoint_id` string — The endpoint ID
    - `action` 'create_compute' | 'create_timeline' | 'start_compute' | 'suspend_compute' | 'apply_config' | 'check_availability' | 'delete_timeline' | 'create_branch' | 'import_data' | 'tenant_ignore' | 'tenant_attach' | 'tenant_detach' | 'tenant_detach_safekeepers' | 'tenant_attach_safekeepers' | 'tenant_reattach' | 'replace_safekeeper' | 'disable_maintenance' | 'apply_storage_config' | 'prepare_secondary_pageserver' | 'switch_pageserver' | 'detach_parent_branch' | 'timeline_archive' | 'timeline_unarchive' | 'start_reserved_compute' | 'sync_dbs_and_roles_from_compute' | 'apply_schema_from_branch' | 'timeline_mark_invisible' | 'timeline_update_protected_config' | 'prewarm_replica' | 'promote_replica' | 'set_storage_non_dirty' | 'swap_binding_id' | 'finalize_migration' | 'mark_migration_prepared' | 'update_catalog' | 'epc_sync', required — The action performed by the operation
    - `status` 'scheduling' | 'running' | 'finished' | 'failed' | 'error' | 'cancelling' | 'cancelled' | 'skipped', required — The status of the operation
    - `error` string — The error that occurred
    - `failures_count` integer, required — The number of times the operation failed
    - `retry_at` string, date-time — A timestamp indicating when the operation was last retried
    - `created_at` string, date-time, required — A timestamp indicating when the operation was created
    - `updated_at` string, date-time, required — A timestamp indicating when the operation status was last updated
    - `total_duration_ms` integer, required — The total duration of the operation in milliseconds

## Other responses

- `204` — Returned if the branch doesn't exist or has already been deleted
- `default` — General Error. The request may or may not be safe to retry, depending on the HTTP method, response status code, and whether a response was received. - If no response is returned from the API, a network error or timeout likely occurred. - In some cases, the request may have reached the server and been successfully processed, but the response failed to reach the client. As a result, retrying non-idempotent requests can lead to unintended results. The following HTTP methods are considered non-idempotent: `POST`, `PATCH`, `DELETE`, and `PUT`. Retrying these methods is generally **not safe**. The following methods are considered idempotent: `GET`, `HEAD`, and `OPTIONS`. Retrying these methods is **safe** in the event of a network error or timeout. Any request that returns a `503 Service Unavailable` response is always safe to retry. Any request that returns a `423 Locked` response is safe to retry. `423 Locked` indicates that the resource is temporarily locked, for example, due to another operation in progress.

---

[API](https://skmtc.net/neon/apis/neon-api.md) · [All operations](https://skmtc.net/neon/apis/neon-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/neon/neon-api/versions/cfde79a5c713/schema)
