---
title: "Update a project"
method: PUT
path: "/api/v4/projects/{id}"
tags: ["projects"]
---

# Update a project

`PUT /api/v4/projects/{id}`

## Request

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

Updates an existing project. If your HTTP repository is not publicly accessible, add authentication information to the URL `https://username:password@gitlab.company.com/group/project.git`, where `password` is a public access key with the `api` scope.

## Path parameters

- `id` string, required

## Request body

- PutApiV4ProjectsId: Update a project
  - `name` string: The name of the project
  - `default_branch` string: The default branch of the project
  - `path` string: The path of the repository
  - `description` string: The description of the project
  - `build_git_strategy` 'fetch' | 'clone': The Git strategy. Defaults to `fetch`
  - `build_timeout` integer: Build timeout
  - `auto_cancel_pending_pipelines` 'disabled' | 'enabled': Auto-cancel pending pipelines
  - `ci_config_path` string: The path to CI config file. Defaults to `.gitlab-ci.yml`
  - `service_desk_enabled` boolean: Disable or enable the service desk
  - `issues_enabled` boolean: Flag indication if the issue tracker is enabled
  - `merge_requests_enabled` boolean: Flag indication if merge requests are enabled
  - `wiki_enabled` boolean: Flag indication if the wiki is enabled
  - `jobs_enabled` boolean: Flag indication if jobs are enabled
  - `snippets_enabled` boolean: Flag indication if snippets are enabled
  - `issues_access_level` 'disabled' | 'private' | 'enabled': Issues access level. One of `disabled`, `private` or `enabled`
  - `repository_access_level` 'disabled' | 'private' | 'enabled': Repository access level. One of `disabled`, `private` or `enabled`
  - `merge_requests_access_level` 'disabled' | 'private' | 'enabled': Merge requests access level. One of `disabled`, `private` or `enabled`
  - `forking_access_level` 'disabled' | 'private' | 'enabled': Forks access level. One of `disabled`, `private` or `enabled`
  - `wiki_access_level` 'disabled' | 'private' | 'enabled': Wiki access level. One of `disabled`, `private` or `enabled`
  - `builds_access_level` 'disabled' | 'private' | 'enabled': Builds access level. One of `disabled`, `private` or `enabled`
  - `snippets_access_level` 'disabled' | 'private' | 'enabled': Snippets access level. One of `disabled`, `private` or `enabled`
  - `package_registry_access_level` 'disabled' | 'private' | 'enabled' | 'public': Controls visibility of the package registry. One of `disabled`, `private`, `enabled` or `public`. `private` will make the package registry accessible only to project members (reporter role and above). `enabled` will make the package registry accessible to everyone who has access to the project. `public` will make the package registry accessible to everyone. `disabled` will disable the package registry
  - `pages_access_level` 'disabled' | 'private' | 'enabled' | 'public': Pages access level. One of `disabled`, `private`, `enabled` or `public`
  - `analytics_access_level` 'disabled' | 'private' | 'enabled': Analytics access level. One of `disabled`, `private` or `enabled`
  - `container_registry_access_level` 'disabled' | 'private' | 'enabled': Controls visibility of the container registry. One of `disabled`, `private` or `enabled`. `private` will make the container registry accessible only to project members (reporter role and above). `enabled` will make the container registry accessible to everyone who has access to the project. `disabled` will disable the container registry
  - `security_and_compliance_access_level` 'disabled' | 'private' | 'enabled': Security and compliance access level. One of `disabled`, `private` or `enabled`
  - `releases_access_level` 'disabled' | 'private' | 'enabled': Releases access level. One of `disabled`, `private` or `enabled`
  - `environments_access_level` 'disabled' | 'private' | 'enabled': Environments access level. One of `disabled`, `private` or `enabled`
  - `feature_flags_access_level` 'disabled' | 'private' | 'enabled': Feature flags access level. One of `disabled`, `private` or `enabled`
  - `infrastructure_access_level` 'disabled' | 'private' | 'enabled': Infrastructure access level. One of `disabled`, `private` or `enabled`
  - `monitor_access_level` 'disabled' | 'private' | 'enabled': Monitor access level. One of `disabled`, `private` or `enabled`
  - `model_experiments_access_level` 'disabled' | 'private' | 'enabled': Model experiments access level. One of `disabled`, `private` or `enabled`
  - `model_registry_access_level` 'disabled' | 'private' | 'enabled': Model registry access level. One of `disabled`, `private` or `enabled`
  - `emails_disabled` boolean: Deprecated: Use emails_enabled instead.
  - `emails_enabled` boolean: Enable email notifications
  - `show_default_award_emojis` boolean: Show default award emojis
  - `show_diff_preview_in_email` boolean: Include the code diff preview in merge request notification emails
  - `warn_about_potentially_unwanted_characters` boolean: Warn about potentially unwanted characters
  - `enforce_auth_checks_on_uploads` boolean: Enforce auth check on uploads
  - `shared_runners_enabled` boolean: Flag indication if shared runners are enabled for that project
  - `group_runners_enabled` boolean: Flag indication if group runners are enabled for that project
  - `resource_group_default_process_mode` 'unordered' | 'oldest_first' | 'newest_first' | 'newest_ready_first': The process mode of the resource group
  - `resolve_outdated_diff_discussions` boolean: Automatically resolve merge request diff threads on lines changed with a push
  - `remove_source_branch_after_merge` boolean: Remove the source branch by default after merge
  - `packages_enabled` boolean: Deprecated: Use :package_registry_access_level instead. Enable project packages feature
  - `container_registry_enabled` boolean: Deprecated: Use :container_registry_access_level instead. Flag indication if the container registry is enabled for that project
  - `container_expiration_policy_attributes` object: Object that contains information on the container expiration policy
    - `cadence` string: Container expiration policy cadence for recurring job
    - `keep_n` integer: Container expiration policy number of images to keep
    - `older_than` string: Container expiration policy remove images older than value
    - `name_regex` string: Container expiration policy regex for image removal
    - `name_regex_keep` string: Container expiration policy regex for image retention
    - `enabled` boolean: Flag indication if container expiration policy is enabled
  - `lfs_enabled` boolean: Flag indication if Git LFS is enabled for that project
  - `visibility` 'private' | 'internal' | 'public': The visibility of the project.
  - `public_builds` boolean: Deprecated: Use public_jobs instead.
  - `public_jobs` boolean: Perform public builds
  - `request_access_enabled` boolean: Allow users to request member access
  - `only_allow_merge_if_pipeline_succeeds` boolean: Only allow to merge if builds succeed
  - `allow_merge_on_skipped_pipeline` boolean: Allow to merge if pipeline is skipped
  - `only_allow_merge_if_all_discussions_are_resolved` boolean: Only allow to merge if all threads are resolved
  - `tag_list` string[]: Deprecated: Use :topics instead
  - `topics` string[]: The list of topics for a project
  - `avatar` string, binary: Avatar image for project
  - `printing_merge_request_link_enabled` boolean: Show link to create/view merge request when pushing from the command line
  - `merge_method` 'ff' | 'rebase_merge' | 'merge': The merge method used when merging merge requests
  - `suggestion_commit_message` string: The commit message used to apply merge request suggestions
  - `merge_commit_template` string: Template used to create merge commit message
  - `squash_commit_template` string: Template used to create squash commit message
  - `issue_branch_template` string: Template used to create a branch from an issue
  - `auto_devops_enabled` boolean: Flag indication if Auto DevOps is enabled
  - `auto_devops_deploy_strategy` 'continuous' | 'manual' | 'timed_incremental': Auto Deploy strategy
  - `autoclose_referenced_issues` boolean: Flag indication if referenced issues auto-closing is enabled
  - `repository_storage` string: Which storage shard the repository is on. Available only to admins
  - `squash_option` 'never' | 'always' | 'default_on' | 'default_off': Squash default for project. One of `never`, `always`, `default_on`, or `default_off`.
  - `mr_default_target_self` boolean: Merge requests of this forked project targets itself by default
  - `mr_default_title_template` string: Template used to generate the default merge request title. Maximum 100 characters.
  - `cicd_catalog_enabled` boolean: Set whether the project is a CI/CD catalog project
  - `only_allow_merge_if_all_status_checks_passed` boolean: Blocks merge requests from merging unless all status checks have passed
  - `approvals_before_merge` integer: How many approvers should approve merge request by default
  - `mirror` boolean: [Deprecated] Enables pull mirroring in a project
  - `mirror_trigger_builds` boolean: [Deprecated] Pull mirroring triggers builds
  - `external_authorization_classification_label` string: The classification label for the project
  - `requirements_access_level` 'disabled' | 'private' | 'enabled': Requirements feature access level. One of `disabled`, `private` or `enabled`
  - `prevent_merge_without_jira_issue` boolean: Require an associated issue from Jira
  - `auto_duo_code_review_enabled` boolean: Enable automatic reviews by GitLab Duo on merge requests
  - `duo_remote_flows_enabled` boolean: Enable GitLab Duo remote flows for this project
  - `duo_sast_fp_detection_enabled` boolean: Enable GitLab Duo SAST false positive detection for this project
  - `duo_secret_detection_fp_enabled` boolean: Enable GitLab Duo Secret Detection false positive detection for this project
  - `duo_dependency_bump_breaking_changes_enabled` boolean: Enable Agentic Breaking Change Resolution for this project
  - `duo_sast_vr_workflow_enabled` boolean: Enable GitLab Duo SAST vulnerability resolution workflow for this project
  - `spp_repository_pipeline_access` boolean: Grant read-only access to security policy configurations for enforcement in linked CI/CD projects
  - `merge_request_title_regex` string: The regex the Merge Request must adhere to
  - `merge_request_title_regex_description` string: The description for the regex the Merge Request must adhere to
  - `ci_default_git_depth` integer: Default Git depth for shallow cloning
  - `keep_latest_artifact` boolean: Indicates if the latest artifact should be kept for this project.
  - `ci_forward_deployment_enabled` boolean: Prevent older deployment jobs that are still pending
  - `ci_forward_deployment_rollback_allowed` boolean: Allow job retries for rollback deployments
  - `ci_allow_fork_pipelines_to_run_in_parent_project` boolean: Allow fork merge request pipelines to run in parent project
  - `ci_separated_caches` boolean: Enable or disable separated caches based on branch protection.
  - `restrict_user_defined_variables` boolean: Restrict use of user-defined variables when triggering a pipeline
  - `ci_pipeline_variables_minimum_override_role` 'no_one_allowed' | 'developer' | 'maintainer' | 'owner': Limit ability to override CI/CD variables when triggering a pipeline to only users with at least the set minimum role
  - `ci_push_repository_for_job_token_allowed` boolean: Allow pushing to this project's repository by authenticating with a CI/CD job token generated in this project.
  - `ci_id_token_sub_claim_components` string[]: Claims that will be used to build the sub claim in id tokens
  - `ci_delete_pipelines_in_seconds` integer: Pipelines older than the configured time are deleted
  - `max_artifacts_size` integer: Set the maximum file size for each job's artifacts
  - `protect_merge_request_pipelines` boolean: Make protected CI/CD variables and runners available in merge request pipelines
  - `ci_display_pipeline_variables` boolean: Display all manually-defined variables in the pipeline details page after running a pipeline manually
  - `allow_pipeline_trigger_approve_deployment` boolean: Allow pipeline triggerer to approve deployments
  - `mirror_user_id` integer: [Deprecated] User responsible for all the activity surrounding a pull mirror event. Can only be set by admins
  - `only_mirror_protected_branches` boolean: [Deprecated] Only mirror protected branches
  - `mirror_branch_regex` string: [Deprecated] Only mirror branches match regex
  - `mirror_overwrites_diverged_branches` boolean: [Deprecated] Pull mirror overwrites diverged branches
  - `import_url` string: URL from which the project is imported
  - `fallback_approvals_required` integer: Overall approvals required when no rule is present
  - `issues_template` string: Default description for Issues. Description is parsed with GitLab Flavored Markdown.
  - `merge_requests_template` string: Default description for merge requests. Description is parsed with GitLab Flavored Markdown.
  - `merge_pipelines_enabled` boolean: Enable merged results pipelines.
  - `merge_trains_enabled` boolean: Enable merge trains.
  - `merge_trains_skip_train_allowed` boolean: Allow merge train merge requests to be merged without waiting for pipelines to finish.
  - `merge_train_enforcement` 'allow_bypass' | 'enforce_for_all_users' | 'enforce_with_owner_override': Merge train enforcement level. One of `allow_bypass`, `enforce_for_all_users`, or `enforce_with_owner_override`.
  - `max_pipelines_per_merge_train` integer: Maximum number of parallel pipelines per merge train for this project.
  - `ci_restrict_pipeline_cancellation_role` string: Roles allowed to cancel pipelines and jobs.
  - `web_based_commit_signing_enabled` boolean: Enable web based commit signing for this project
  - `security_policy_pipeline_must_succeed` boolean: Require all security policy pipelines to succeed before merge requests can be merged
  - `reviewer_assignment_strategy` 'disabled' | 'code_owners' | 'dap_powered': Strategy used to automatically assign reviewers to merge requests. One of `disabled`, `code_owners`, or `dap_powered`.

## Response `200`

Update a project

- APIEntitiesProjectsWithCatalogSetting: API_Entities_Projects_WithCatalogSetting model
  - `id` integer, required
  - `description` string, required
  - `name` string, required
  - `name_with_namespace` string, required
  - `path` string, required
  - `path_with_namespace` string, required
  - `created_at` string, date-time, required
  - `default_branch` string
  - `tag_list` string[], required
  - `topics` string[], required
  - `ssh_url_to_repo` string, required
  - `http_url_to_repo` string, required
  - `web_url` string, required
  - `readme_url` string
  - `forks_count` integer
  - `license_url` string
  - `license` APIEntitiesLicenseBasic
    - `key` string, required
    - `name` string, required
    - `nickname` string, required
    - `html_url` string, required
    - `source_url` string, required
  - `avatar_url` string, required
  - `star_count` integer, required
  - `last_activity_at` string, date-time, required
  - `visibility` string, required
  - `namespace` APIEntitiesNamespaceBasic, required
    - `id` integer, required
    - `name` string, required
    - `path` string, required
    - `kind` string, required
    - `full_path` string, required
    - `parent_id` integer, required
    - `avatar_url` string, required
    - `web_url` string, required
  - `custom_attributes` APIEntitiesCustomAttribute: API_Entities_CustomAttribute model
    - `key` string, required
    - `value` string, required
  - `repository_storage` string
  - `forked_from_project` APIEntitiesBasicProjectDetails: API_Entities_BasicProjectDetails model
    - `id` integer, required
    - `description` string, required
    - `name` string, required
    - `name_with_namespace` string, required
    - `path` string, required
    - `path_with_namespace` string, required
    - `created_at` string, date-time, required
    - `default_branch` string
    - `tag_list` string[], required
    - `topics` string[], required
    - `ssh_url_to_repo` string, required
    - `http_url_to_repo` string, required
    - `web_url` string, required
    - `readme_url` string
    - `forks_count` integer
    - `license_url` string
    - `license` APIEntitiesLicenseBasic
      - `key` string, required
      - `name` string, required
      - `nickname` string, required
      - `html_url` string, required
      - `source_url` string, required
    - `avatar_url` string, required
    - `star_count` integer, required
    - `last_activity_at` string, date-time, required
    - `visibility` string, required
    - `namespace` APIEntitiesNamespaceBasic, required
      - `id` integer, required
      - `name` string, required
      - `path` string, required
      - `kind` string, required
      - `full_path` string, required
      - `parent_id` integer, required
      - `avatar_url` string, required
      - `web_url` string, required
    - `custom_attributes` APIEntitiesCustomAttribute: API_Entities_CustomAttribute model
      - `key` string, required
      - `value` string, required
    - `repository_storage` string
  - `container_registry_image_prefix` string
  - `_links` object, required
    - `self` string, required
    - `issues` string
    - `merge_requests` string
    - `repo_branches` string, required
    - `labels` string, required
    - `events` string, required
    - `members` string, required
    - `cluster_agents` string, required
  - `marked_for_deletion_at` string, date-time, required
  - `marked_for_deletion_on` string, date-time, required
  - `packages_enabled` boolean, required
  - `empty_repo` boolean, required
  - `archived` boolean, required
  - `owner` APIEntitiesUserBasic: API_Entities_UserBasic model
    - `id` integer, required
    - `username` string, required
    - `public_email` string, required
    - `name` string, required
    - `state` string, required
    - `locked` boolean, required
    - `avatar_url` string, required
    - `avatar_path` string
    - `custom_attributes` APIEntitiesCustomAttribute[]
      - `key` string, required
      - `value` string, required
    - `web_url` string, required
  - `resolve_outdated_diff_discussions` boolean, required
  - `container_expiration_policy` APIEntitiesContainerExpirationPolicy
    - `cadence` string, required
    - `enabled` string, required
    - `keep_n` string, required
    - `older_than` string, required
    - `name_regex` string, required
    - `name_regex_keep` string, required
    - `next_run_at` string, required
  - `repository_object_format` string, required
  - `issues_enabled` boolean, required
  - `merge_requests_enabled` boolean, required
  - `wiki_enabled` boolean, required
  - `jobs_enabled` boolean, required
  - `snippets_enabled` boolean, required
  - `container_registry_enabled` boolean, required
  - `service_desk_enabled` boolean, required
  - `service_desk_address` string
  - `can_create_merge_request_in` boolean, required
  - `issues_access_level` string, required
  - `repository_access_level` string, required
  - `merge_requests_access_level` string, required
  - `forking_access_level` string, required
  - `wiki_access_level` string, required
  - `builds_access_level` string, required
  - `snippets_access_level` string, required
  - `pages_access_level` string, required
  - `analytics_access_level` string, required
  - `container_registry_access_level` string, required
  - `security_and_compliance_access_level` string, required
  - `releases_access_level` string, required
  - `environments_access_level` string, required
  - `feature_flags_access_level` string, required
  - `infrastructure_access_level` string, required
  - `monitor_access_level` string, required
  - `model_experiments_access_level` string, required
  - `model_registry_access_level` string, required
  - `package_registry_access_level` string, required
  - `emails_disabled` boolean, required
  - `emails_enabled` boolean, required
  - `show_diff_preview_in_email` boolean, required
  - `shared_runners_enabled` boolean, required
  - `lfs_enabled` boolean, required
  - `creator_id` integer, required
  - `mr_default_target_self` boolean
  - `import_url` string
  - `import_type` string
  - `import_status` string, required
  - `import_error` string
  - `open_issues_count` integer
  - `description_html` string, required
  - `updated_at` string, date-time, required
  - `ci_default_git_depth` integer
  - `ci_delete_pipelines_in_seconds` integer
  - `ci_forward_deployment_enabled` boolean
  - `ci_forward_deployment_rollback_allowed` boolean
  - `ci_job_token_scope_enabled` boolean
  - `ci_separated_caches` boolean
  - `ci_allow_fork_pipelines_to_run_in_parent_project` boolean
  - `ci_id_token_sub_claim_components` string[]
  - `build_git_strategy` string
  - `keep_latest_artifact` boolean
  - `restrict_user_defined_variables` boolean
  - `ci_pipeline_variables_minimum_override_role` string
  - `runner_token_expiration_interval` integer
  - `group_runners_enabled` boolean
  - `resource_group_default_process_mode` string
  - `auto_cancel_pending_pipelines` string
  - `build_timeout` integer
  - `auto_devops_enabled` boolean
  - `auto_devops_deploy_strategy` string
  - `ci_push_repository_for_job_token_allowed` boolean
  - `protect_merge_request_pipelines` boolean
  - `ci_display_pipeline_variables` boolean
  - `runners_token` string
  - `ci_config_path` string
  - `public_jobs` boolean, required
  - `shared_with_groups` object[], required
  - `only_allow_merge_if_pipeline_succeeds` boolean, required
  - `allow_merge_on_skipped_pipeline` boolean, required
  - `request_access_enabled` boolean, required
  - `only_allow_merge_if_all_discussions_are_resolved` boolean, required
  - `remove_source_branch_after_merge` boolean, required
  - `printing_merge_request_link_enabled` boolean, required
  - `merge_method` string, required
  - `squash_option` string, required
  - `enforce_auth_checks_on_uploads` boolean, required
  - `suggestion_commit_message` string, required
  - `merge_commit_template` string, required
  - `squash_commit_template` string, required
  - `mr_default_title_template` string, required
  - `issue_branch_template` string, required
  - `statistics` APIEntitiesProjectStatistics
    - `commit_count` integer, required
    - `storage_size` integer, required
    - `repository_size` integer, required
    - `wiki_size` integer, required
    - `lfs_objects_size` integer, required
    - `job_artifacts_size` integer, required
    - `pipeline_artifacts_size` integer, required
    - `packages_size` integer, required
    - `snippets_size` integer, required
    - `uploads_size` integer, required
    - `container_registry_size` integer, required
  - `warn_about_potentially_unwanted_characters` boolean, required
  - `autoclose_referenced_issues` boolean, required
  - `max_artifacts_size` integer, required
  - `approvals_before_merge` string
  - `mirror` string
  - `mirror_user_id` string
  - `mirror_trigger_builds` string
  - `only_mirror_protected_branches` string
  - `mirror_overwrites_diverged_branches` string
  - `external_authorization_classification_label` string
  - `requirements_enabled` string, required
  - `requirements_access_level` string, required
  - `security_and_compliance_enabled` string, required
  - `secret_push_protection_enabled` boolean
  - `pre_receive_secret_detection_enabled` boolean
  - `compliance_frameworks` string, required
  - `issues_template` string
  - `merge_requests_template` string
  - `ci_restrict_pipeline_cancellation_role` string
  - `merge_pipelines_enabled` string
  - `merge_trains_enabled` string
  - `merge_trains_skip_train_allowed` string
  - `merge_train_enforcement` string
  - `max_pipelines_per_merge_train` string
  - `only_allow_merge_if_all_status_checks_passed` string
  - `allow_pipeline_trigger_approve_deployment` boolean
  - `prevent_merge_without_jira_issue` string
  - `auto_duo_code_review_enabled` string
  - `reviewer_assignment_strategy` string
  - `duo_remote_flows_enabled` string
  - `duo_foundational_flows_enabled` string
  - `duo_sast_fp_detection_enabled` string
  - `duo_secret_detection_fp_enabled` string
  - `duo_dependency_bump_breaking_changes_enabled` string
  - `duo_sast_vr_workflow_enabled` string
  - `web_based_commit_signing_enabled` string
  - `spp_repository_pipeline_access` boolean: The spp_repository_pipeline_access setting is only visible if the security_orchestration_policies feature is available.
  - `security_policy_pipeline_must_succeed` boolean: Require all security policy pipelines to succeed before merge requests can be merged.
  - `merge_request_title_regex` string
  - `merge_request_title_regex_description` string
  - `cicd_catalog_enabled` boolean, required

## Other responses

- `400`: Bad request
- `403`: Unauthenticated

---

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