---
title: "Create branch"
method: POST
path: "/projects/{project_id}/branches"
tags: ["Branch"]
---

# Create branch

`POST /projects/{project_id}/branches`

Creates a branch in the specified project.
No request body is required, but you can specify one to create a compute endpoint or select a non-default parent branch.
By default, the branch is created from the project's default branch with no compute endpoint, and the branch name is auto-generated.
To access the branch, add a `read_write` endpoint.
Each branch supports one read-write endpoint and multiple read-only endpoints.
For related information, see [Manage branches](https://neon.com/docs/manage/branches/).

## Request body

- object
  - `endpoints` BranchCreateRequestEndpointOptions[]
    - `type` 'read_only' | 'read_write', required — The compute endpoint type. Either `read_write` or `read_only`.
    - `settings` EndpointSettingsData — A collection of settings for a compute endpoint
      - `pg_settings` PgSettingsData — A raw representation of Postgres settings
      - `pgbouncer_settings` PgbouncerSettingsData — DEPRECATED. A raw representation of PgBouncer settings. This schema is deprecated and will be removed after 2026-06-20.
      - `preload_libraries` PreloadLibraries — The shared libraries to preload into the project's compute instances.
        - `use_defaults` boolean
        - `enabled_libraries` string[]
    - `autoscaling_limit_min_cu` number
    - `autoscaling_limit_max_cu` number
    - `provisioner` string — The Neon compute provisioner. Specify the `k8s-neonvm` provisioner to create a compute endpoint that supports Autoscaling. Provisioner can be one of the following values: * k8s-pod * k8s-neonvm * serverless-platform Clients must expect, that any string value that is not documented in the description above should be treated as a error. UNKNOWN value if safe to treat as an error too.
    - `suspend_timeout_seconds` integer — Duration of inactivity in seconds after which the compute endpoint is automatically suspended. The value `0` means use the default value. The value `-1` means never suspend. The default value is `300` seconds (5 minutes). The minimum value is `60` seconds (1 minute). The maximum value is `604800` seconds (1 week). For more information, see [Scale to zero configuration](https://neon.com/docs/manage/endpoints#scale-to-zero-configuration).
  - `branch` object
    - `parent_id` string — The `branch_id` of the parent branch. If omitted or empty, the branch will be created from the project's default branch.
    - `name` string — The branch name
    - `parent_lsn` string — A Log Sequence Number (LSN) on the parent branch. The branch will be created with data from this LSN.
    - `parent_timestamp` string, date-time — A timestamp identifying a point in time on the parent branch. The branch will be created with data starting from this point in time. The timestamp must be provided in ISO 8601 format; for example: `2024-02-26T12:00:00Z`.
    - `protected` boolean — Whether the branch is protected
    - `archived` boolean — Whether to create the branch as archived
    - `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.
    - `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.
  - `annotation_value` AnnotationValueData — Annotation properties.

## Response `201`

Created a branch. An endpoint is only created if it was specified in the request.

- object
  - `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
  - `endpoints` Endpoint[], required
    - `host` string, required — The hostname of the compute endpoint. This is the hostname specified when connecting to a Neon database.
    - `id` string, required — The compute endpoint ID. Compute endpoint IDs have an `ep-` prefix. For example: `ep-little-smoke-851426`
    - `name` string — Optional name of the compute endpoint
    - `project_id` string, required — The ID of the project to which the compute endpoint belongs
    - `branch_id` string, required — The ID of the branch that the compute endpoint is associated with
    - `autoscaling_limit_min_cu` number, required
    - `autoscaling_limit_max_cu` number, required
    - `region_id` string, required — The region identifier
    - `type` 'read_only' | 'read_write', required — The compute endpoint type. Either `read_write` or `read_only`.
    - `current_state` 'init' | 'active' | 'idle', required — The state of the compute endpoint
    - `pending_state` 'init' | 'active' | 'idle' — The state of the compute endpoint
    - `settings` EndpointSettingsData, required — A collection of settings for a compute endpoint
      - `pg_settings` PgSettingsData — A raw representation of Postgres settings
      - `pgbouncer_settings` PgbouncerSettingsData — DEPRECATED. A raw representation of PgBouncer settings. This schema is deprecated and will be removed after 2026-06-20.
      - `preload_libraries` PreloadLibraries — The shared libraries to preload into the project's compute instances.
        - `use_defaults` boolean
        - `enabled_libraries` string[]
    - `pooler_enabled` boolean, required — DEPRECATED. Whether to enable connection pooling for the compute endpoint. The recommended way to enable connection pooling is to append `-pooler` to the endpoint ID in the connection string. See [How to use connection pooling](https://neon.com/docs/connect/connection-pooling#how-to-use-connection-pooling)
    - `pooler_mode` 'transaction', required — DEPRECATED. The connection pooler mode. Neon supports PgBouncer in `transaction` mode only. This schema is deprecated and will be removed after 2026-06-20.
    - `disabled` boolean, required — Whether to restrict connections to the compute endpoint. Enabling this option schedules a suspend compute operation. A disabled compute endpoint cannot be enabled by a connection or console action.
    - `passwordless_access` boolean, required — Whether to permit passwordless access to the compute endpoint
    - `last_active` string, date-time — A timestamp indicating when the compute endpoint was last active
    - `creation_source` string, required — The compute endpoint creation source
    - `created_at` string, date-time, required — A timestamp indicating when the compute endpoint was created
    - `updated_at` string, date-time, required — A timestamp indicating when the compute endpoint was last updated
    - `started_at` string, date-time — A timestamp indicating when the compute endpoint was last started
    - `suspended_at` string, date-time — A timestamp indicating when the compute endpoint was last suspended
    - `proxy_host` string, required — DEPRECATED. Use the "host" property instead.
    - `suspend_timeout_seconds` integer, required — Duration of inactivity in seconds after which the compute endpoint is automatically suspended. The value `0` means use the default value. The value `-1` means never suspend. The default value is `300` seconds (5 minutes). The minimum value is `60` seconds (1 minute). The maximum value is `604800` seconds (1 week). For more information, see [Scale to zero configuration](https://neon.com/docs/manage/endpoints#scale-to-zero-configuration).
    - `provisioner` string, required — The Neon compute provisioner. Specify the `k8s-neonvm` provisioner to create a compute endpoint that supports Autoscaling. Provisioner can be one of the following values: * k8s-pod * k8s-neonvm * serverless-platform Clients must expect, that any string value that is not documented in the description above should be treated as a error. UNKNOWN value if safe to treat as an error too.
    - `compute_release_version` string — Attached compute's release version number.
  - `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
  - `roles` Role[], required
    - `branch_id` string, required — The ID of the branch to which the role belongs
    - `name` string, required — The role name
    - `password` string — The role password
    - `protected` boolean — Whether or not the role is system-protected
    - `authentication_method` string — Authentication method configured for this role. Valid options: `password`, `oauth`, `no_login`
    - `created_at` string, date-time, required — A timestamp indicating when the role was created
    - `updated_at` string, date-time, required — A timestamp indicating when the role was last updated
  - `databases` Database[], required
    - `id` integer, required — The database ID
    - `branch_id` string, required — The ID of the branch to which the database belongs
    - `name` string, required — The database name
    - `owner_name` string, required — The name of role that owns the database
    - `created_at` string, date-time, required — A timestamp indicating when the database was created
    - `updated_at` string, date-time, required — A timestamp indicating when the database was last updated
  - `connection_uris` ConnectionDetails[]
    - `connection_uri` string, required — The connection URI is defined as specified here: [Connection URIs](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING-URIS) The connection URI can be used to connect to a Postgres database with psql or defined in a DATABASE_URL environment variable. When creating a branch from a parent with more than one role or database, the response body does not include a connection URI.
    - `connection_parameters` ConnectionParameters, required
      - `database` string, required — Database name
      - `password` string, required — Password for the role
      - `role` string, required — Role name
      - `host` string, required — Hostname
      - `pooler_host` string, required — Pooler hostname

## Other responses

- `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)
