---
title: "Protect repository branches"
method: POST
path: "/api/v4/projects/{id}/protected_branches"
tags: ["protected_branches"]
---

# Protect repository branches

`POST /api/v4/projects/{id}/protected_branches`

## Request

- Base URL: `https://gitlab.com`
- URL: `https://gitlab.com/api/v4/projects/{id}/protected_branches`
- Auth: none declared

Protects a specified repository branch or several project repository branches using a wildcard protected branch.

## Path parameters

- `id` string, required

## Request body

- PostApiV4ProjectsIdProtectedBranches: Protect repository branches
  - `name` string, required: The name of the protected branch
  - `push_access_level` 30 | 40 | 60 | 0: Access levels allowed to push (defaults: `40`, maintainer access level)
  - `merge_access_level` 30 | 40 | 60 | 0: Access levels allowed to merge (defaults: `40`, maintainer access level)
  - `allow_force_push` boolean: Allow force push for all users with push access.
  - `allowed_to_push` object[]: Array of users, groups, deploy keys, or access levels allowed to push to protected branches
    - `deploy_key_id` integer: Deploy key allowed to push
    - `access_level` 30 | 40 | 60 | 0: Access level allowed to push
    - `user_id` integer: ID of a user
    - `group_id` integer: ID of a group
    - `member_role_id` integer: ID of a custom member role
    - `id` integer: ID of a project
    - `_destroy` boolean: Delete the object when true
  - `unprotect_access_level` 30 | 40 | 60: Access levels allowed to unprotect (defaults: `40`, maintainer access level)
  - `allowed_to_merge` object[]: Array of users, groups, or access levels allowed to merge protected branches
    - `access_level` 30 | 40 | 60 | 0: Access level allowed to merge
    - `user_id` integer: ID of a user
    - `group_id` integer: ID of a group
    - `member_role_id` integer: ID of a custom member role
    - `id` integer: ID of a project
    - `_destroy` boolean: Delete the object when true
  - `allowed_to_unprotect` object[]: Array of users, groups, or access levels allowed to unprotect protected branches
    - `access_level` 30 | 40 | 60: Access level allowed to unprotect
    - `user_id` integer: ID of a user
    - `group_id` integer: ID of a group
    - `member_role_id` integer: ID of a custom member role
    - `id` integer: ID of a project
    - `_destroy` boolean: Delete the object when true
  - `code_owner_approval_required` boolean: Prevent pushes to this branch if it matches an item in CODEOWNERS

## Response `201`

Protect repository branches

- APIEntitiesProtectedBranch: API_Entities_ProtectedBranch model
  - `id` integer, required
  - `name` string, required
  - `push_access_levels` APIEntitiesProtectedRefAccess[], required
    - `id` integer, required
    - `access_level` integer, required
    - `access_level_description` string, required
    - `deploy_key_id` integer
    - `user_id` integer, required
    - `group_id` integer, required
    - `member_role_id` integer
    - `member_role_name` string
  - `merge_access_levels` APIEntitiesProtectedRefAccess[], required
    - `id` integer, required
    - `access_level` integer, required
    - `access_level_description` string, required
    - `deploy_key_id` integer
    - `user_id` integer, required
    - `group_id` integer, required
    - `member_role_id` integer
    - `member_role_name` string
  - `allow_force_push` boolean, required
  - `unprotect_access_levels` APIEntitiesProtectedRefAccess[], required
    - `id` integer, required
    - `access_level` integer, required
    - `access_level_description` string, required
    - `deploy_key_id` integer
    - `user_id` integer, required
    - `group_id` integer, required
    - `member_role_id` integer
    - `member_role_name` string
  - `code_owner_approval_required` boolean, required
  - `inherited` boolean, required

## Other responses

- `401`: 401 Unauthorized
- `404`: 404 Project Not Found
- `409`: Protected branch 'main' already exists
- `422`: name is missing

---

[API](https://skmtc.dev/gitlab/apis/gitlab-api.md) - [All operations](https://skmtc.dev/gitlab/apis/gitlab-api/llms.txt) - [OpenAPI document](https://skmtc.dev/gitlab/apis/gitlab-api/revisions/b234947ef3f2?raw)
