--- stage: Tenant Scale group: Organizations info: To determine the technical writer assigned to the Stage/Group associated with this page, see https://handbook.gitlab.com/handbook/product/ux/technical-writing/#assignments title: Projects API --- {{< details >}} - Tier: Free, Premium, Ultimate - Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated {{< /details >}} Use this API to manage GitLab projects and their associated settings. A project is a central hub for collaboration where you store code, track issues, and organize team activities. For more information, see [create a project](../user/project/_index.md). The Projects API contains endpoints that: - Retrieve project information and metadata - Create, edit, and remove projects - Control project visibility, access permissions, and security settings - Manage project features like issue tracking, merge requests, and CI/CD - Archive and unarchive projects - Transfer projects between namespaces - Manage deployment and container registry settings ## Permissions Users with: - Any [default role](../user/permissions.md#roles) on a project can read the project's properties. - The Owner or Maintainer role on a project can also edit the project's properties. ## Project visibility level A project in GitLab can have a visibility level of either: - Private - Internal - Public The visibility level is determined by the `visibility` field in the project. For more information, see [Project visibility](../user/public_access.md). The fields returned in responses vary based on the [permissions](../user/permissions.md) of the authenticated user. ## Deprecated attributes These attributes are deprecated and could be removed in a future version of the REST API. Use the alternative attributes instead. | Deprecated attribute | Alternative | |:-------------------------|:------------| | `tag_list` | `topics` attribute | | `marked_for_deletion_at` | `marked_for_deletion_on`. Premium and Ultimate tier only. | | `approvals_before_merge` | [Merge request approvals API](merge_request_approvals.md). Premium and Ultimate tier only. | ## Get a single project Get a specific project. This endpoint can be accessed without authentication if the project is publicly accessible. ```plaintext GET /projects/:id ``` Supported attributes: | Attribute | Type | Required | Description | |:-------------------------|:------------------|:---------|:------------| | `id` | integer or string | Yes | The ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths). | | `license` | boolean | No | Include project license data. | | `statistics` | boolean | No | Include project statistics. Available only to users with at least the Reporter role. | | `with_custom_attributes` | boolean | No | Include [custom attributes](custom_attributes.md) in response. _(administrators only)_ | The responses include attributes related to container registry storage size: - `container_registry_size`: Total storage size in bytes used by all container repositories in the project. Updated whenever container images are pushed or deleted. For GitLab Self-Managed instances, requires the [container registry metadata database](../administration/packages/container_registry_metadata_database.md) to be enabled. Example response: ```json { "id": 3, "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", "description_html": "
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
", "default_branch": "main", "visibility": "private", "ssh_url_to_repo": "git@example.com:diaspora/diaspora-project-site.git", "http_url_to_repo": "http://example.com/diaspora/diaspora-project-site.git", "web_url": "http://example.com/diaspora/diaspora-project-site", "readme_url": "http://example.com/diaspora/diaspora-project-site/blob/main/README.md", "tag_list": [ //deprecated, use `topics` instead "example", "disapora project" ], "topics": [ "example", "disapora project" ], "owner": { "id": 3, "name": "Diaspora", "created_at": "2013-09-30T13:46:02Z" }, "name": "Diaspora Project Site", "name_with_namespace": "Diaspora / Diaspora Project Site", "path": "diaspora-project-site", "path_with_namespace": "diaspora/diaspora-project-site", "issues_enabled": true, "open_issues_count": 1, "merge_requests_enabled": true, "jobs_enabled": true, "wiki_enabled": true, "snippets_enabled": false, "can_create_merge_request_in": true, "resolve_outdated_diff_discussions": false, "container_registry_enabled": false, // deprecated, use container_registry_access_level instead "container_registry_access_level": "disabled", "security_and_compliance_access_level": "disabled", "container_expiration_policy": { "cadence": "7d", "enabled": false, "keep_n": null, "older_than": null, "name_regex": null, // to be deprecated in GitLab 13.0 in favor of `name_regex_delete` "name_regex_delete": null, "name_regex_keep": null, "next_run_at": "2020-01-07T21:42:58.658Z" }, "created_at": "2013-09-30T13:46:02Z", "updated_at": "2013-09-30T13:46:02Z", "last_activity_at": "2013-09-30T13:46:02Z", "creator_id": 3, "namespace": { "id": 3, "name": "Diaspora", "path": "diaspora", "kind": "group", "full_path": "diaspora", "avatar_url": "http://localhost:3000/uploads/group/avatar/3/foo.jpg", "web_url": "http://localhost:3000/groups/diaspora" }, "import_url": null, "import_type": null, "import_status": "none", "import_error": null, "permissions": { "project_access": { "access_level": 10, "notification_level": 3 }, "group_access": { "access_level": 50, "notification_level": 3 } }, "archived": false, "avatar_url": "http://example.com/uploads/project/avatar/3/uploads/avatar.png", "license_url": "http://example.com/diaspora/diaspora-client/blob/main/LICENSE", "license": { "key": "lgpl-3.0", "name": "GNU Lesser General Public License v3.0", "nickname": "GNU LGPLv3", "html_url": "http://choosealicense.com/licenses/lgpl-3.0/", "source_url": "http://www.gnu.org/licenses/lgpl-3.0.txt" }, "shared_runners_enabled": true, "group_runners_enabled": true, "forks_count": 0, "star_count": 0, "runners_token": "b8bc4a7a29eb76ea83cf79e4908c2b", "ci_default_git_depth": 50, "ci_forward_deployment_enabled": true, "ci_forward_deployment_rollback_allowed": true, "ci_allow_fork_pipelines_to_run_in_parent_project": true, "ci_id_token_sub_claim_components": ["project_path", "ref_type", "ref"], "ci_separated_caches": true, "ci_restrict_pipeline_cancellation_role": "developer", "ci_pipeline_variables_minimum_override_role": "maintainer", "ci_push_repository_for_job_token_allowed": false, "public_jobs": true, "shared_with_groups": [ { "group_id": 4, "group_name": "Twitter", "group_full_path": "twitter", "group_access_level": 30 }, { "group_id": 3, "group_name": "Gitlab Org", "group_full_path": "gitlab-org", "group_access_level": 10 } ], "repository_storage": "default", "only_allow_merge_if_pipeline_succeeds": false, "allow_merge_on_skipped_pipeline": false, "allow_pipeline_trigger_approve_deployment": false, "restrict_user_defined_variables": false, "only_allow_merge_if_all_discussions_are_resolved": false, "remove_source_branch_after_merge": false, "printing_merge_requests_link_enabled": true, "request_access_enabled": false, "merge_method": "merge", "squash_option": "default_on", "auto_devops_enabled": true, "auto_devops_deploy_strategy": "continuous", "approvals_before_merge": 0, // Deprecated. Use merge request approvals API instead. "mirror": false, "mirror_user_id": 45, "mirror_trigger_builds": false, "only_mirror_protected_branches": false, "mirror_overwrites_diverged_branches": false, "external_authorization_classification_label": null, "packages_enabled": true, "service_desk_enabled": false, "service_desk_address": null, "autoclose_referenced_issues": true, "suggestion_commit_message": null, "enforce_auth_checks_on_uploads": true, "merge_commit_template": null, "squash_commit_template": null, "issue_branch_template": "gitlab/%{id}-%{title}", "marked_for_deletion_at": "2020-04-03", // Deprecated in favor of marked_for_deletion_on. Planned for removal in a future version of the REST API. "marked_for_deletion_on": "2020-04-03", "compliance_frameworks": [ "sox" ], "warn_about_potentially_unwanted_characters": true, "secret_push_protection_enabled": false, "statistics": { "commit_count": 37, "storage_size": 1038090, "repository_size": 1038090, "wiki_size" : 0, "lfs_objects_size": 0, "job_artifacts_size": 0, "pipeline_artifacts_size": 0, "packages_size": 0, "snippets_size": 0, "uploads_size": 0, "container_registry_size": 0 }, "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-client", "_links": { "self": "http://example.com/api/v4/projects", "issues": "http://example.com/api/v4/projects/1/issues", "merge_requests": "http://example.com/api/v4/projects/1/merge_requests", "repo_branches": "http://example.com/api/v4/projects/1/repository_branches", "labels": "http://example.com/api/v4/projects/1/labels", "events": "http://example.com/api/v4/projects/1/events", "members": "http://example.com/api/v4/projects/1/members", "cluster_agents": "http://example.com/api/v4/projects/1/cluster_agents" }, "spp_repository_pipeline_access": false // Only visible if the security_orchestration_policies feature is available } ``` Users of [GitLab Ultimate](https://about.gitlab.com/pricing/) can also see the `only_allow_merge_if_all_status_checks_passed` parameters using GitLab 15.5 and later: ```json { "id": 1, "project_id": 3, "only_allow_merge_if_all_status_checks_passed": false, ... } ``` If the project is a fork, the `forked_from_project` field appears in the response. For this field, if the upstream project is private, a valid token for authentication must be provided. The field `mr_default_target_self` appears as well. If this value is `false`, then all merge requests target the upstream project by default. ```json { "id":3, ... "mr_default_target_self": false, "forked_from_project":{ "id":13083, "description":"GitLab Community Edition", "name":"GitLab Community Edition", "name_with_namespace":"GitLab.org / GitLab Community Edition", "path":"gitlab-foss", "path_with_namespace":"gitlab-org/gitlab-foss", "created_at":"2013-09-26T06:02:36.000Z", "default_branch":"main", "tag_list":[], //deprecated, use `topics` instead "topics":[], "ssh_url_to_repo":"git@gitlab.com:gitlab-org/gitlab-foss.git", "http_url_to_repo":"https://gitlab.com/gitlab-org/gitlab-foss.git", "web_url":"https://gitlab.com/gitlab-org/gitlab-foss", "avatar_url":"https://gitlab.com/uploads/-/system/project/avatar/13083/logo-extra-whitespace.png", "license_url": "https://gitlab.com/gitlab-org/gitlab/-/blob/main/LICENSE", "license": { "key": "mit", "name": "MIT License", "nickname": null, "html_url": "http://choosealicense.com/licenses/mit/", "source_url": "https://opensource.org/licenses/MIT" }, "star_count":3812, "forks_count":3561, "last_activity_at":"2018-01-02T11:40:26.570Z", "namespace": { "id": 72, "name": "GitLab.org", "path": "gitlab-org", "kind": "group", "full_path": "gitlab-org", "parent_id": null }, "repository_storage": "default" } ... } ``` ### Templates for issues and merge requests {{< details >}} - Tier: Premium, Ultimate - Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated {{< /details >}} Users of [GitLab Premium or Ultimate](https://about.gitlab.com/pricing/) can also see the `issues_template` and `merge_requests_template` parameters for managing [issue and merge request description templates](../user/project/description_templates.md). ```json { "id": 3, "issues_template": null, "merge_requests_template": null, ... } ``` ## List projects List projects. ### List all projects {{< history >}} - The `_links.cluster_agents` attribute in the response was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/347047) in GitLab 15.0. - `web_based_commit_signing_enabled` [introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/194650) in GitLab 18.2 [with a flag](../administration/feature_flags/_index.md) named `use_web_based_commit_signing_enabled`. Disabled by default. {{< /history >}} {{< alert type="flag" >}} The availability of the `web_based_commit_signing_enabled` attribute is controlled by a feature flag. For more information, see the history. This feature is available for testing, but not ready for production use. {{< /alert >}} Get a list of all visible projects across GitLab for the authenticated user. When accessed without authentication, only public projects with simple fields are returned. ```plaintext GET /projects ``` Supported attributes: | Attribute | Type | Required | Description | |:------------------------------|:---------|:---------|:---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `archived` | boolean | No | Limit by archived status. | | `id_after` | integer | No | Limit results to projects with IDs greater than the specified ID. | | `id_before` | integer | No | Limit results to projects with IDs less than the specified ID. | | `imported` | boolean | No | Limit results to projects which were imported from external systems by current user. | | `include_hidden` | boolean | No | Include hidden projects. _(administrators only)_ Premium and Ultimate only. | | `include_pending_delete` | boolean | No | Include projects pending deletion. _(administrators only)_ | | `last_activity_after` | datetime | No | Limit results to projects with last activity after specified time. Format: ISO 8601 (`YYYY-MM-DDTHH:MM:SSZ`) | | `last_activity_before` | datetime | No | Limit results to projects with last activity before specified time. Format: ISO 8601 (`YYYY-MM-DDTHH:MM:SSZ`) | | `membership` | boolean | No | Limit by projects that the current user is a member of. | | `min_access_level` | integer | No | Limit by current user minimal [role (`access_level`)](members.md#roles). | | `order_by` | string | No | Return projects ordered by `id`, `name`, `path`, `created_at`, `updated_at`, `star_count`, `last_activity_at`, or `similarity` fields. `repository_size`, `storage_size`, `packages_size` or `wiki_size` fields are only allowed for administrators. `similarity` is only available when searching and is limited to projects that the current user is a member of. Default is `created_at`. | | `owned` | boolean | No | Limit by projects explicitly owned by the current user. | | `repository_checksum_failed` | boolean | No | Limit projects where the repository checksum calculation has failed. Premium and Ultimate only. | | `repository_storage` | string | No | Limit results to projects stored on `repository_storage`. _(administrators only)_ | | `search_namespaces` | boolean | No | Include ancestor namespaces when matching search criteria. Default is `false`. | | `search` | string | No | Return list of projects with a `path`, `name`, or `description` matching the search criteria (case-insensitive, substring match). Multiple terms can be provided, separated by an escaped space, either `+` or `%20`, and will be ANDed together. Example: `one+two` will match substrings `one` and `two` (in any order). | | `simple` | boolean | No | Return only limited fields for each project. This operation is a no-op without authentication where only simple fields are returned. | | `sort` | string | No | Return projects sorted in `asc` or `desc` order. Default is `desc`. | | `starred` | boolean | No | Limit by projects starred by the current user. | | `statistics` | boolean | No | Include project statistics. Available only to users with at least the Reporter role. | | `topic_id` | integer | No | Limit results to projects with the assigned topic given by the topic ID. | | `topic` | string | No | Comma-separated topic names. Limit results to projects that match all of given topics. See `topics` attribute. | | `updated_after` | datetime | No | Limit results to projects last updated after the specified time. Format: ISO 8601 (`YYYY-MM-DDTHH:MM:SSZ`). [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/393979) in GitLab 15.10. For this filter to work, you must also provide `updated_at` as the `order_by` attribute. | | `updated_before` | datetime | No | Limit results to projects last updated before the specified time. Format: ISO 8601 (`YYYY-MM-DDTHH:MM:SSZ`). [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/393979) in GitLab 15.10. For this filter to work, you must also provide `updated_at` as the `order_by` attribute. | | `visibility` | string | No | Limit by visibility `public`, `internal`, or `private`. | | `wiki_checksum_failed` | boolean | No | Limit projects where the wiki checksum calculation has failed. Premium and Ultimate only. | | `with_custom_attributes` | boolean | No | Include [custom attributes](custom_attributes.md) in response. _(administrator only)_ | | `with_issues_enabled` | boolean | No | Limit by enabled issues feature. | | `with_merge_requests_enabled` | boolean | No | Limit by enabled merge requests feature. | | `with_programming_language` | string | No | Limit by projects which use the given programming language. | | `marked_for_deletion_on` | date | No | Filter by date when project was marked for deletion. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/463939) in GitLab 17.1. Premium and Ultimate only. | | `active` | boolean | No | Limit by projects that are not archived and not marked for deletion. | This endpoint supports [keyset pagination](rest/_index.md#keyset-based-pagination) for selected `order_by` options. When `simple=true` or the user is unauthenticated this returns something like: Example request: ```shell curl --request GET "https://gitlab.example.com/api/v4/projects?simple=true" ``` Example response: ```json [ { "id": 4, "description": null, "name": "Diaspora Client", "name_with_namespace": "Diaspora / Diaspora Client", "path": "diaspora-client", "path_with_namespace": "diaspora/diaspora-client", "created_at": "2013-09-30T13:46:02Z", "default_branch": "main", "tag_list": [ "example", "disapora client" ], "topics": [ "example", "disapora client" ], "ssh_url_to_repo": "git@gitlab.example.com:diaspora/diaspora-client.git", "http_url_to_repo": "https://gitlab.example.com/diaspora/diaspora-client.git", "web_url": "https://gitlab.example.com/diaspora/diaspora-client", "avatar_url": "https://gitlab.example.com/uploads/project/avatar/4/uploads/avatar.png", "star_count": 0, "last_activity_at": "2013-09-30T13:46:02Z", "visibility": "public", "namespace": { "id": 2, "name": "Diaspora", "path": "diaspora", "kind": "group", "full_path": "diaspora", "parent_id": null, "avatar_url": null, "web_url": "https://gitlab.example.com/diaspora" } }, { ... } ``` When the user is authenticated and `simple` is not set, this endpoint returns something like: ```json [ { "id": 4, "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", "description_html": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.
", "name": "Diaspora Client", "name_with_namespace": "Diaspora / Diaspora Client", "path": "diaspora-client", "path_with_namespace": "diaspora/diaspora-client", "created_at": "2013-09-30T13:46:02Z", "updated_at": "2013-09-30T13:46:02Z", "default_branch": "main", "tag_list": [ //deprecated, use `topics` instead "example", "disapora client" ], "topics": [ "example", "disapora client" ], "ssh_url_to_repo": "git@gitlab.example.com:diaspora/diaspora-client.git", "http_url_to_repo": "https://gitlab.example.com/diaspora/diaspora-client.git", "web_url": "https://gitlab.example.com/diaspora/diaspora-client", "readme_url": "https://gitlab.example.com/diaspora/diaspora-client/blob/main/README.md", "avatar_url": "https://gitlab.example.com/uploads/project/avatar/4/uploads/avatar.png", "forks_count": 0, "star_count": 0, "last_activity_at": "2022-06-24T17:11:26.841Z", "namespace": { "id": 3, "name": "Diaspora", "path": "diaspora", "kind": "group", "full_path": "diaspora", "parent_id": null, "avatar_url": "https://gitlab.example.com/uploads/project/avatar/6/uploads/avatar.png", "web_url": "https://gitlab.example.com/diaspora" }, "container_registry_image_prefix": "registry.gitlab.example.com/diaspora/diaspora-client", "_links": { "self": "https://gitlab.example.com/api/v4/projects/4", "issues": "https://gitlab.example.com/api/v4/projects/4/issues", "merge_requests": "https://gitlab.example.com/api/v4/projects/4/merge_requests", "repo_branches": "https://gitlab.example.com/api/v4/projects/4/repository/branches", "labels": "https://gitlab.example.com/api/v4/projects/4/labels", "events": "https://gitlab.example.com/api/v4/projects/4/events", "members": "https://gitlab.example.com/api/v4/projects/4/members", "cluster_agents": "https://gitlab.example.com/api/v4/projects/4/cluster_agents" }, "packages_enabled": true, "empty_repo": false, "archived": false, "visibility": "public", "resolve_outdated_diff_discussions": false, "container_expiration_policy": { "cadence": "1month", "enabled": true, "keep_n": 1, "older_than": "14d", "name_regex": "", "name_regex_keep": ".*-main", "next_run_at": "2022-06-25T17:11:26.865Z" }, "issues_enabled": true, "merge_requests_enabled": true, "wiki_enabled": true, "jobs_enabled": true, "snippets_enabled": true, "container_registry_enabled": true, "service_desk_enabled": true, "can_create_merge_request_in": true, "issues_access_level": "enabled", "repository_access_level": "enabled", "merge_requests_access_level": "enabled", "forking_access_level": "enabled", "wiki_access_level": "enabled", "builds_access_level": "enabled", "snippets_access_level": "enabled", "pages_access_level": "enabled", "analytics_access_level": "enabled", "container_registry_access_level": "enabled", "security_and_compliance_access_level": "private", "emails_disabled": null, "emails_enabled": null, "shared_runners_enabled": true, "group_runners_enabled": true, "lfs_enabled": true, "creator_id": 1, "import_url": null, "import_type": null, "import_status": "none", "import_error": null, "open_issues_count": 0, "ci_default_git_depth": 20, "ci_forward_deployment_enabled": true, "ci_forward_deployment_rollback_allowed": true, "ci_allow_fork_pipelines_to_run_in_parent_project": true, "ci_id_token_sub_claim_components": ["project_path", "ref_type", "ref"], "ci_job_token_scope_enabled": false, "ci_separated_caches": true, "ci_restrict_pipeline_cancellation_role": "developer", "ci_pipeline_variables_minimum_override_role": "maintainer", "ci_push_repository_for_job_token_allowed": false, "public_jobs": true, "build_timeout": 3600, "auto_cancel_pending_pipelines": "enabled", "ci_config_path": "", "shared_with_groups": [], "only_allow_merge_if_pipeline_succeeds": false, "allow_merge_on_skipped_pipeline": null, "allow_pipeline_trigger_approve_deployment": false, "restrict_user_defined_variables": false, "request_access_enabled": true, "only_allow_merge_if_all_discussions_are_resolved": false, "remove_source_branch_after_merge": true, "printing_merge_request_link_enabled": true, "merge_method": "merge", "squash_option": "default_off", "enforce_auth_checks_on_uploads": true, "suggestion_commit_message": null, "merge_commit_template": null, "squash_commit_template": null, "issue_branch_template": "gitlab/%{id}-%{title}", "auto_devops_enabled": false, "auto_devops_deploy_strategy": "continuous", "autoclose_referenced_issues": true, "keep_latest_artifact": true, "runner_token_expiration_interval": null, "external_authorization_classification_label": "", "requirements_enabled": false, "requirements_access_level": "enabled", "security_and_compliance_enabled": false, "secret_push_protection_enabled": false, "compliance_frameworks": [], "warn_about_potentially_unwanted_characters": true, "permissions": { "project_access": null, "group_access": null } }, { ... } ] ``` {{< alert type="note" >}} `last_activity_at` is updated based on [project activity](../user/project/working_with_projects.md#view-project-activity) and [project events](events.md). `updated_at` is updated whenever the project record is changed in the database. {{< /alert >}} You can filter by [custom attributes](custom_attributes.md) with: ```plaintext GET /projects?custom_attributes[key]=value&custom_attributes[other_key]=other_value ``` Example request: ```shell curl --globoff --request GET "https://gitlab.example.com/api/v4/projects?custom_attributes[location]=Antarctica&custom_attributes[role]=Developer" ``` #### Pagination limits You can use [offset-based pagination](rest/_index.md#offset-based-pagination) to access [up to 50,000 projects](https://gitlab.com/gitlab-org/gitlab/-/issues/34565). Use [keyset pagination](rest/_index.md#keyset-based-pagination) to retrieve projects beyond this limit. Keyset pagination supports only `order_by=id`. Other sorting options aren't available. ### List a user's projects Get a list of visible projects owned by the given user. When accessed without authentication, only public projects are returned. Prerequisites: - To view [certain attributes](https://gitlab.com/gitlab-org/gitlab/-/blob/520776fa8e5a11b8275b7c597d75246fcfc74c89/lib/api/entities/project.rb#L109-130), you must be an administrator or have the Owner role for the project. {{< alert type="note" >}} Only the projects in the user's (specified in `user_id`) namespace are returned. Projects owned by the user in any group or subgroups are not returned. An empty list is returned if a profile is set to private. {{< /alert >}} This endpoint supports [keyset pagination](rest/_index.md#keyset-based-pagination) for selected `order_by` options. ```plaintext GET /users/:user_id/projects ``` Supported attributes: | Attribute | Type | Required | Description | |:------------------------------|:---------|:---------|:------------| | `user_id` | string | Yes | The ID or username of the user. | | `archived` | boolean | No | Limit by archived status. | | `id_after` | integer | No | Limit results to projects with IDs greater than the specified ID. | | `id_before` | integer | No | Limit results to projects with IDs less than the specified ID. | | `membership` | boolean | No | Limit by projects that the current user is a member of. | | `min_access_level` | integer | No | Limit by current user minimal [role (`access_level`)](members.md#roles). | | `order_by` | string | No | Return projects ordered by `id`, `name`, `path`, `created_at`, `updated_at`, `star_count`, or `last_activity_at` fields. Default is `created_at`. | | `owned` | boolean | No | Limit by projects explicitly owned by the current user. | | `search` | string | No | Return list of projects matching the search criteria. | | `simple` | boolean | No | Return only limited fields for each project. Without authentication, this operation is a no-op; only simple fields are returned. | | `sort` | string | No | Return projects sorted in `asc` or `desc` order. Default is `desc`. | | `starred` | boolean | No | Limit by projects starred by the current user. | | `statistics` | boolean | No | Include project statistics. Available only to users with at least the Reporter role. | | `updated_after` | datetime | No | Limit results to projects last updated after the specified time. Format: ISO 8601 (`YYYY-MM-DDTHH:MM:SSZ`). [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/393979) in GitLab 15.10. | | `updated_before` | datetime | No | Limit results to projects last updated before the specified time. Format: ISO 8601 (`YYYY-MM-DDTHH:MM:SSZ`). [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/393979) in GitLab 15.10. | | `visibility` | string | No | Limit by visibility `public`, `internal`, or `private`. | | `with_custom_attributes` | boolean | No | Include [custom attributes](custom_attributes.md) in response. _(administrator only)_ | | `with_issues_enabled` | boolean | No | Limit by enabled issues feature. | | `with_merge_requests_enabled` | boolean | No | Limit by enabled merge requests feature. | | `with_programming_language` | string | No | Limit by projects which use the given programming language. | Example response: ```json [ { "id": 4, "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", "description_html": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.
", "default_branch": "main", "visibility": "private", "ssh_url_to_repo": "git@example.com:diaspora/diaspora-client.git", "http_url_to_repo": "http://example.com/diaspora/diaspora-client.git", "web_url": "http://example.com/diaspora/diaspora-client", "readme_url": "http://example.com/diaspora/diaspora-client/blob/main/README.md", "tag_list": [ //deprecated, use `topics` instead "example", "disapora client" ], "topics": [ "example", "disapora client" ], "owner": { "id": 3, "name": "Diaspora", "created_at": "2013-09-30T13:46:02Z" }, "name": "Diaspora Client", "name_with_namespace": "Diaspora / Diaspora Client", "path": "diaspora-client", "path_with_namespace": "diaspora/diaspora-client", "issues_enabled": true, "open_issues_count": 1, "merge_requests_enabled": true, "jobs_enabled": true, "wiki_enabled": true, "snippets_enabled": false, "can_create_merge_request_in": true, "resolve_outdated_diff_discussions": false, "container_registry_enabled": false, // deprecated, use container_registry_access_level instead "container_registry_access_level": "disabled", "security_and_compliance_access_level": "disabled", "created_at": "2013-09-30T13:46:02Z", "updated_at": "2013-09-30T13:46:02Z", "last_activity_at": "2013-09-30T13:46:02Z", "creator_id": 3, "import_url": null, "import_type": null, "import_status": "none", "import_error": null, "namespace": { "id": 3, "name": "Diaspora", "path": "diaspora", "kind": "group", "full_path": "diaspora" }, "import_status": "none", "archived": false, "avatar_url": "http://example.com/uploads/project/avatar/4/uploads/avatar.png", "shared_runners_enabled": true, "group_runners_enabled": true, "forks_count": 0, "star_count": 0, "runners_token": "b8547b1dc37721d05889db52fa2f02", "ci_default_git_depth": 50, "ci_forward_deployment_enabled": true, "ci_forward_deployment_rollback_allowed": true, "ci_allow_fork_pipelines_to_run_in_parent_project": true, "ci_id_token_sub_claim_components": ["project_path", "ref_type", "ref"], "ci_separated_caches": true, "ci_restrict_pipeline_cancellation_role": "developer", "ci_pipeline_variables_minimum_override_role": "maintainer", "ci_push_repository_for_job_token_allowed": false, "public_jobs": true, "shared_with_groups": [], "only_allow_merge_if_pipeline_succeeds": false, "allow_merge_on_skipped_pipeline": false, "allow_pipeline_trigger_approve_deployment": false, "restrict_user_defined_variables": false, "only_allow_merge_if_all_discussions_are_resolved": false, "remove_source_branch_after_merge": false, "request_access_enabled": false, "merge_method": "merge", "squash_option": "default_on", "autoclose_referenced_issues": true, "enforce_auth_checks_on_uploads": true, "suggestion_commit_message": null, "merge_commit_template": null, "squash_commit_template": null, "secret_push_protection_enabled": false, "issue_branch_template": "gitlab/%{id}-%{title}", "marked_for_deletion_at": "2020-04-03", // Deprecated in favor of marked_for_deletion_on. Planned for removal in a future version of the REST API. "marked_for_deletion_on": "2020-04-03", "statistics": { "commit_count": 37, "storage_size": 1038090, "repository_size": 1038090, "wiki_size" : 0, "lfs_objects_size": 0, "job_artifacts_size": 0, "pipeline_artifacts_size": 0, "packages_size": 0, "snippets_size": 0, "uploads_size": 0, "container_registry_size": 0 }, "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-client", "_links": { "self": "http://example.com/api/v4/projects", "issues": "http://example.com/api/v4/projects/1/issues", "merge_requests": "http://example.com/api/v4/projects/1/merge_requests", "repo_branches": "http://example.com/api/v4/projects/1/repository_branches", "labels": "http://example.com/api/v4/projects/1/labels", "events": "http://example.com/api/v4/projects/1/events", "members": "http://example.com/api/v4/projects/1/members", "cluster_agents": "http://example.com/api/v4/projects/1/cluster_agents" } }, { "id": 6, "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", "description_html": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.
", "default_branch": "main", "visibility": "private", "ssh_url_to_repo": "git@example.com:brightbox/puppet.git", "http_url_to_repo": "http://example.com/brightbox/puppet.git", "web_url": "http://example.com/brightbox/puppet", "readme_url": "http://example.com/brightbox/puppet/blob/main/README.md", "tag_list": [ //deprecated, use `topics` instead "example", "puppet" ], "topics": [ "example", "puppet" ], "owner": { "id": 4, "name": "Brightbox", "created_at": "2013-09-30T13:46:02Z" }, "name": "Puppet", "name_with_namespace": "Brightbox / Puppet", "path": "puppet", "path_with_namespace": "brightbox/puppet", "issues_enabled": true, "open_issues_count": 1, "merge_requests_enabled": true, "jobs_enabled": true, "wiki_enabled": true, "snippets_enabled": false, "can_create_merge_request_in": true, "resolve_outdated_diff_discussions": false, "container_registry_enabled": false, // deprecated, use container_registry_access_level instead "container_registry_access_level": "disabled", "security_and_compliance_access_level": "disabled", "created_at": "2013-09-30T13:46:02Z", "updated_at": "2013-09-30T13:46:02Z", "last_activity_at": "2013-09-30T13:46:02Z", "creator_id": 3, "import_url": null, "import_type": null, "import_status": "none", "import_error": null, "namespace": { "id": 4, "name": "Brightbox", "path": "brightbox", "kind": "group", "full_path": "brightbox" }, "import_status": "none", "import_error": null, "permissions": { "project_access": { "access_level": 10, "notification_level": 3 }, "group_access": { "access_level": 50, "notification_level": 3 } }, "archived": false, "avatar_url": null, "shared_runners_enabled": true, "group_runners_enabled": true, "forks_count": 0, "star_count": 0, "runners_token": "b8547b1dc37721d05889db52fa2f02", "ci_default_git_depth": 0, "ci_forward_deployment_enabled": true, "ci_forward_deployment_rollback_allowed": true, "ci_allow_fork_pipelines_to_run_in_parent_project": true, "ci_id_token_sub_claim_components": ["project_path", "ref_type", "ref"], "ci_separated_caches": true, "ci_restrict_pipeline_cancellation_role": "developer", "ci_pipeline_variables_minimum_override_role": "maintainer", "ci_push_repository_for_job_token_allowed": false, "public_jobs": true, "shared_with_groups": [], "only_allow_merge_if_pipeline_succeeds": false, "allow_merge_on_skipped_pipeline": false, "allow_pipeline_trigger_approve_deployment": false, "restrict_user_defined_variables": false, "only_allow_merge_if_all_discussions_are_resolved": false, "remove_source_branch_after_merge": false, "request_access_enabled": false, "merge_method": "merge", "squash_option": "default_on", "auto_devops_enabled": true, "auto_devops_deploy_strategy": "continuous", "repository_storage": "default", "approvals_before_merge": 0, // Deprecated. Use merge request approvals API instead. "mirror": false, "mirror_user_id": 45, "mirror_trigger_builds": false, "only_mirror_protected_branches": false, "mirror_overwrites_diverged_branches": false, "external_authorization_classification_label": null, "packages_enabled": true, "service_desk_enabled": false, "service_desk_address": null, "autoclose_referenced_issues": true, "enforce_auth_checks_on_uploads": true, "suggestion_commit_message": null, "merge_commit_template": null, "squash_commit_template": null, "secret_push_protection_enabled": false, "issue_branch_template": "gitlab/%{id}-%{title}", "statistics": { "commit_count": 12, "storage_size": 2066080, "repository_size": 2066080, "wiki_size" : 0, "lfs_objects_size": 0, "job_artifacts_size": 0, "pipeline_artifacts_size": 0, "packages_size": 0, "snippets_size": 0, "uploads_size": 0, "container_registry_size": 0 }, "container_registry_image_prefix": "registry.example.com/brightbox/puppet", "_links": { "self": "http://example.com/api/v4/projects", "issues": "http://example.com/api/v4/projects/1/issues", "merge_requests": "http://example.com/api/v4/projects/1/merge_requests", "repo_branches": "http://example.com/api/v4/projects/1/repository_branches", "labels": "http://example.com/api/v4/projects/1/labels", "events": "http://example.com/api/v4/projects/1/events", "members": "http://example.com/api/v4/projects/1/members", "cluster_agents": "http://example.com/api/v4/projects/1/cluster_agents" } } ] ``` ### List projects a user has contributed to Returns a list of visible projects a given user has contributed to within the past year. For more information about what counts as a contribution, [view projects you have contributed to](../user/project/working_with_projects.md#view-projects-you-work-with). ```plaintext GET /users/:user_id/contributed_projects ``` Supported attributes: | Attribute | Type | Required | Description | |:-----------|:--------|:---------|:------------| | `user_id` | string | Yes | The ID or username of the user. | | `order_by` | string | No | Return projects ordered by `id`, `name`, `path`, `created_at`, `updated_at`, `star_count`, or `last_activity_at` fields. Default is `created_at`. | | `simple` | boolean | No | Return only limited fields for each project. Without authentication, this operation is a no-op; only simple fields are returned. | | `sort` | string | No | Return projects sorted in `asc` or `desc` order. Default is `desc`. | Example request: ```shell curl --header "PRIVATE-TOKEN:Lorem ipsum dolor sit amet, consectetur adipiscing elit.
", "default_branch": "main", "visibility": "private", "ssh_url_to_repo": "git@example.com:diaspora/diaspora-client.git", "http_url_to_repo": "http://example.com/diaspora/diaspora-client.git", "web_url": "http://example.com/diaspora/diaspora-client", "readme_url": "http://example.com/diaspora/diaspora-client/blob/main/README.md", "tag_list": [ //deprecated, use `topics` instead "example", "disapora client" ], "topics": [ "example", "disapora client" ], "owner": { "id": 3, "name": "Diaspora", "created_at": "2013-09-30T13:46:02Z" }, "name": "Diaspora Client", "name_with_namespace": "Diaspora / Diaspora Client", "path": "diaspora-client", "path_with_namespace": "diaspora/diaspora-client", "issues_enabled": true, "open_issues_count": 1, "merge_requests_enabled": true, "jobs_enabled": true, "wiki_enabled": true, "snippets_enabled": false, "can_create_merge_request_in": true, "resolve_outdated_diff_discussions": false, "container_registry_enabled": false, // deprecated, use container_registry_access_level instead "container_registry_access_level": "disabled", "security_and_compliance_access_level": "disabled", "created_at": "2013-09-30T13:46:02Z", "updated_at": "2013-09-30T13:46:02Z", "last_activity_at": "2013-09-30T13:46:02Z", "creator_id": 3, "namespace": { "id": 3, "name": "Diaspora", "path": "diaspora", "kind": "group", "full_path": "diaspora" }, "import_status": "none", "archived": false, "avatar_url": "http://example.com/uploads/project/avatar/4/uploads/avatar.png", "shared_runners_enabled": true, "group_runners_enabled": true, "forks_count": 0, "star_count": 0, "runners_token": "b8547b1dc37721d05889db52fa2f02", "public_jobs": true, "shared_with_groups": [], "only_allow_merge_if_pipeline_succeeds": false, "allow_merge_on_skipped_pipeline": false, "allow_pipeline_trigger_approve_deployment": false, "restrict_user_defined_variables": false, "only_allow_merge_if_all_discussions_are_resolved": false, "remove_source_branch_after_merge": false, "request_access_enabled": false, "merge_method": "merge", "squash_option": "default_on", "autoclose_referenced_issues": true, "enforce_auth_checks_on_uploads": true, "suggestion_commit_message": null, "merge_commit_template": null, "squash_commit_template": null, "secret_push_protection_enabled": false, "issue_branch_template": "gitlab/%{id}-%{title}", "statistics": { "commit_count": 37, "storage_size": 1038090, "repository_size": 1038090, "lfs_objects_size": 0, "job_artifacts_size": 0, "pipeline_artifacts_size": 0, "packages_size": 0, "snippets_size": 0, "uploads_size": 0, "container_registry_size": 0 }, "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-client", "_links": { "self": "http://example.com/api/v4/projects", "issues": "http://example.com/api/v4/projects/1/issues", "merge_requests": "http://example.com/api/v4/projects/1/merge_requests", "repo_branches": "http://example.com/api/v4/projects/1/repository_branches", "labels": "http://example.com/api/v4/projects/1/labels", "events": "http://example.com/api/v4/projects/1/events", "members": "http://example.com/api/v4/projects/1/members", "cluster_agents": "http://example.com/api/v4/projects/1/cluster_agents" } }, { "id": 6, "description": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.", "description_html": "Lorem ipsum dolor sit amet, consectetur adipiscing elit.
", "default_branch": "main", "visibility": "private", "ssh_url_to_repo": "git@example.com:brightbox/puppet.git", "http_url_to_repo": "http://example.com/brightbox/puppet.git", "web_url": "http://example.com/brightbox/puppet", "readme_url": "http://example.com/brightbox/puppet/blob/main/README.md", "tag_list": [ //deprecated, use `topics` instead "example", "puppet" ], "topics": [ "example", "puppet" ], "owner": { "id": 4, "name": "Brightbox", "created_at": "2013-09-30T13:46:02Z" }, "name": "Puppet", "name_with_namespace": "Brightbox / Puppet", "path": "puppet", "path_with_namespace": "brightbox/puppet", "issues_enabled": true, "open_issues_count": 1, "merge_requests_enabled": true, "jobs_enabled": true, "wiki_enabled": true, "snippets_enabled": false, "can_create_merge_request_in": true, "resolve_outdated_diff_discussions": false, "container_registry_enabled": false, // deprecated, use container_registry_access_level instead "container_registry_access_level": "disabled", "security_and_compliance_access_level": "disabled", "created_at": "2013-09-30T13:46:02Z", "updated_at": "2013-09-30T13:46:02Z", "last_activity_at": "2013-09-30T13:46:02Z", "creator_id": 3, "namespace": { "id": 4, "name": "Brightbox", "path": "brightbox", "kind": "group", "full_path": "brightbox" }, "import_status": "none", "import_error": null, "permissions": { "project_access": { "access_level": 10, "notification_level": 3 }, "group_access": { "access_level": 50, "notification_level": 3 } }, "archived": false, "avatar_url": null, "shared_runners_enabled": true, "group_runners_enabled": true, "forks_count": 0, "star_count": 0, "runners_token": "b8547b1dc37721d05889db52fa2f02", "public_jobs": true, "shared_with_groups": [], "only_allow_merge_if_pipeline_succeeds": false, "allow_merge_on_skipped_pipeline": false, "allow_pipeline_trigger_approve_deployment": false, "restrict_user_defined_variables": false, "only_allow_merge_if_all_discussions_are_resolved": false, "remove_source_branch_after_merge": false, "request_access_enabled": false, "merge_method": "merge", "squash_option": "default_on", "auto_devops_enabled": true, "auto_devops_deploy_strategy": "continuous", "repository_storage": "default", "approvals_before_merge": 0, // Deprecated. Use merge request approvals API instead. "mirror": false, "mirror_user_id": 45, "mirror_trigger_builds": false, "only_mirror_protected_branches": false, "mirror_overwrites_diverged_branches": false, "external_authorization_classification_label": null, "packages_enabled": true, "service_desk_enabled": false, "service_desk_address": null, "autoclose_referenced_issues": true, "enforce_auth_checks_on_uploads": true, "suggestion_commit_message": null, "merge_commit_template": null, "squash_commit_template": null, "secret_push_protection_enabled": false, "issue_branch_template": "gitlab/%{id}-%{title}", "statistics": { "commit_count": 12, "storage_size": 2066080, "repository_size": 2066080, "lfs_objects_size": 0, "job_artifacts_size": 0, "pipeline_artifacts_size": 0, "packages_size": 0, "snippets_size": 0, "uploads_size": 0, "container_registry_size": 0 }, "container_registry_image_prefix": "registry.example.com/brightbox/puppet", "_links": { "self": "http://example.com/api/v4/projects", "issues": "http://example.com/api/v4/projects/1/issues", "merge_requests": "http://example.com/api/v4/projects/1/merge_requests", "repo_branches": "http://example.com/api/v4/projects/1/repository_branches", "labels": "http://example.com/api/v4/projects/1/labels", "events": "http://example.com/api/v4/projects/1/events", "members": "http://example.com/api/v4/projects/1/members", "cluster_agents": "http://example.com/api/v4/projects/1/cluster_agents" } } ] ``` ### Search for projects by name Search for projects by name that are accessible to the authenticated user. If this endpoint is accessed without authentication, it lists projects that are publicly accessible. ```plaintext GET /projects ``` Example attributes: | Attribute | Type | Required | Description | |:-----------|:-------|:---------|:------------| | `search` | string | Yes | A string contained in the project name. | | `order_by` | string | No | Return requests ordered by `id`, `name`, `created_at`, `star_count`, or `last_activity_at` fields. | | `sort` | string | No | Return requests sorted in `asc` or `desc` order. | Example request: ```shell curl --header "PRIVATE-TOKEN:Lorem ipsum dolor sit amet, consectetur adipiscing elit.
", "default_branch": "main", "visibility": "private", "ssh_url_to_repo": "git@example.com:diaspora/diaspora-project-site.git", "http_url_to_repo": "http://example.com/diaspora/diaspora-project-site.git", "web_url": "http://example.com/diaspora/diaspora-project-site", "readme_url": "http://example.com/diaspora/diaspora-project-site/blob/main/README.md", "tag_list": [ //deprecated, use `topics` instead "example", "disapora project" ], "topics": [ "example", "disapora project" ], "owner": { "id": 3, "name": "Diaspora", "created_at": "2013-09-30T13:46:02Z" }, "name": "Diaspora Project Site", "name_with_namespace": "Diaspora / Diaspora Project Site", "path": "diaspora-project-site", "path_with_namespace": "diaspora/diaspora-project-site", "repository_object_format": "sha1", "issues_enabled": true, "open_issues_count": 1, "merge_requests_enabled": true, "jobs_enabled": true, "wiki_enabled": true, "snippets_enabled": false, "can_create_merge_request_in": true, "resolve_outdated_diff_discussions": false, "container_registry_enabled": false, // deprecated, use container_registry_access_level instead "container_registry_access_level": "disabled", "security_and_compliance_access_level": "disabled", "created_at": "2013-09-30T13:46:02Z", "updated_at": "2013-09-30T13:46:02Z", "last_activity_at": "2013-09-30T13:46:02Z", "creator_id": 3, "namespace": { "id": 3, "name": "Diaspora", "path": "diaspora", "kind": "group", "full_path": "diaspora" }, "import_status": "none", "import_error": null, "permissions": { "project_access": { "access_level": 10, "notification_level": 3 }, "group_access": { "access_level": 50, "notification_level": 3 } }, "archived": true, "avatar_url": "http://example.com/uploads/project/avatar/3/uploads/avatar.png", "license_url": "http://example.com/diaspora/diaspora-client/blob/main/LICENSE", "license": { "key": "lgpl-3.0", "name": "GNU Lesser General Public License v3.0", "nickname": "GNU LGPLv3", "html_url": "http://choosealicense.com/licenses/lgpl-3.0/", "source_url": "http://www.gnu.org/licenses/lgpl-3.0.txt" }, "shared_runners_enabled": true, "group_runners_enabled": true, "forks_count": 0, "star_count": 0, "runners_token": "b8bc4a7a29eb76ea83cf79e4908c2b", "ci_default_git_depth": 50, "ci_forward_deployment_enabled": true, "ci_forward_deployment_rollback_allowed": true, "ci_allow_fork_pipelines_to_run_in_parent_project": true, "ci_id_token_sub_claim_components": ["project_path", "ref_type", "ref"], "ci_separated_caches": true, "ci_restrict_pipeline_cancellation_role": "developer", "ci_pipeline_variables_minimum_override_role": "maintainer", "ci_push_repository_for_job_token_allowed": false, "public_jobs": true, "shared_with_groups": [], "only_allow_merge_if_pipeline_succeeds": false, "allow_merge_on_skipped_pipeline": false, "allow_pipeline_trigger_approve_deployment": false, "restrict_user_defined_variables": false, "only_allow_merge_if_all_discussions_are_resolved": false, "remove_source_branch_after_merge": false, "request_access_enabled": false, "merge_method": "merge", "squash_option": "default_on", "autoclose_referenced_issues": true, "enforce_auth_checks_on_uploads": true, "suggestion_commit_message": null, "merge_commit_template": null, "secret_push_protection_enabled": false, "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-project-site", "_links": { "self": "http://example.com/api/v4/projects", "issues": "http://example.com/api/v4/projects/1/issues", "merge_requests": "http://example.com/api/v4/projects/1/merge_requests", "repo_branches": "http://example.com/api/v4/projects/1/repository_branches", "labels": "http://example.com/api/v4/projects/1/labels", "events": "http://example.com/api/v4/projects/1/events", "members": "http://example.com/api/v4/projects/1/members", "cluster_agents": "http://example.com/api/v4/projects/1/cluster_agents" } } ``` ### Unarchive a project Unarchive a project. Prerequisites: - You must be an administrator or be assigned the Owner role on the project. This endpoint is idempotent. Unarchiving a project that isn't archived doesn't change the project. ```plaintext POST /projects/:id/unarchive ``` Supported attributes: | Attribute | Type | Required | Description | |:----------|:------------------|:---------|:------------| | `id` | integer or string | Yes | The ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths). | Example request: ```shell curl --request POST --header "PRIVATE-TOKEN:Lorem ipsum dolor sit amet, consectetur adipiscing elit.
", "default_branch": "main", "visibility": "private", "ssh_url_to_repo": "git@example.com:diaspora/diaspora-project-site.git", "http_url_to_repo": "http://example.com/diaspora/diaspora-project-site.git", "web_url": "http://example.com/diaspora/diaspora-project-site", "readme_url": "http://example.com/diaspora/diaspora-project-site/blob/main/README.md", "tag_list": [ //deprecated, use `topics` instead "example", "disapora project" ], "topics": [ "example", "disapora project" ], "owner": { "id": 3, "name": "Diaspora", "created_at": "2013-09-30T13:46:02Z" }, "name": "Diaspora Project Site", "name_with_namespace": "Diaspora / Diaspora Project Site", "path": "diaspora-project-site", "path_with_namespace": "diaspora/diaspora-project-site", "repository_object_format": "sha1", "issues_enabled": true, "open_issues_count": 1, "merge_requests_enabled": true, "jobs_enabled": true, "wiki_enabled": true, "snippets_enabled": false, "can_create_merge_request_in": true, "resolve_outdated_diff_discussions": false, "container_registry_enabled": false, // deprecated, use container_registry_access_level instead "container_registry_access_level": "disabled", "security_and_compliance_access_level": "disabled", "created_at": "2013-09-30T13:46:02Z", "updated_at": "2013-09-30T13:46:02Z", "last_activity_at": "2013-09-30T13:46:02Z", "creator_id": 3, "namespace": { "id": 3, "name": "Diaspora", "path": "diaspora", "kind": "group", "full_path": "diaspora" }, "import_status": "none", "import_error": null, "permissions": { "project_access": { "access_level": 10, "notification_level": 3 }, "group_access": { "access_level": 50, "notification_level": 3 } }, "archived": false, "avatar_url": "http://example.com/uploads/project/avatar/3/uploads/avatar.png", "license_url": "http://example.com/diaspora/diaspora-client/blob/main/LICENSE", "license": { "key": "lgpl-3.0", "name": "GNU Lesser General Public License v3.0", "nickname": "GNU LGPLv3", "html_url": "http://choosealicense.com/licenses/lgpl-3.0/", "source_url": "http://www.gnu.org/licenses/lgpl-3.0.txt" }, "shared_runners_enabled": true, "group_runners_enabled": true, "forks_count": 0, "star_count": 0, "runners_token": "b8bc4a7a29eb76ea83cf79e4908c2b", "ci_default_git_depth": 50, "ci_forward_deployment_enabled": true, "ci_forward_deployment_rollback_allowed": true, "ci_allow_fork_pipelines_to_run_in_parent_project": true, "ci_id_token_sub_claim_components": ["project_path", "ref_type", "ref"], "ci_separated_caches": true, "ci_restrict_pipeline_cancellation_role": "developer", "ci_pipeline_variables_minimum_override_role": "maintainer", "ci_push_repository_for_job_token_allowed": false, "public_jobs": true, "shared_with_groups": [], "only_allow_merge_if_pipeline_succeeds": false, "allow_merge_on_skipped_pipeline": false, "allow_pipeline_trigger_approve_deployment": false, "restrict_user_defined_variables": false, "only_allow_merge_if_all_discussions_are_resolved": false, "remove_source_branch_after_merge": false, "request_access_enabled": false, "merge_method": "merge", "squash_option": "default_on", "autoclose_referenced_issues": true, "enforce_auth_checks_on_uploads": true, "suggestion_commit_message": null, "merge_commit_template": null, "container_registry_image_prefix": "registry.example.com/diaspora/diaspora-project-site", "secret_push_protection_enabled": false, "_links": { "self": "http://example.com/api/v4/projects", "issues": "http://example.com/api/v4/projects/1/issues", "merge_requests": "http://example.com/api/v4/projects/1/merge_requests", "repo_branches": "http://example.com/api/v4/projects/1/repository_branches", "labels": "http://example.com/api/v4/projects/1/labels", "events": "http://example.com/api/v4/projects/1/events", "members": "http://example.com/api/v4/projects/1/members", "cluster_agents": "http://example.com/api/v4/projects/1/cluster_agents" } } ``` ### Delete a project {{< history >}} - Immediately deleting projects was [enabled on GitLab.com and GitLab Self-Managed](https://gitlab.com/gitlab-org/gitlab/-/issues/396500) in GitLab 15.11. - [Marking project for deletion was moved](https://gitlab.com/groups/gitlab-org/-/epics/17208) from GitLab Premium to GitLab Free in 18.0. {{< /history >}} Delete a project. This endpoint: - Deletes a project including all associated resources, including issues and merge requests. - Marks the project for deletion. The deletion happens 7 days later by default, but you can change the retention period in the [instance settings](../administration/settings/visibility_and_access_controls.md#deletion-protection). - Deletes project immediately if the project is marked for deletion (GitLab 15.11 and later). {{< alert type="warning" >}} The option to delete projects immediately from deletion protection settings in the **Admin** area was [deprecated](https://gitlab.com/gitlab-org/gitlab/-/issues/389557) in GitLab 15.9 and removed in GitLab 16.0. {{< /alert >}} ```plaintext DELETE /projects/:id ``` Supported attributes: | Attribute | Type | Required | Description | |:---------------------|:------------------|:---------|:------------| | `id` | integer or string | Yes | The ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths). | | `full_path` | string | no | Full path of project to use with `permanently_remove`. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/396500) in GitLab 15.11 for Premium and Ultimate only and moved to GitLab Free in 18.0. To find the project path, use `path_with_namespace` from [get single project](projects.md#get-a-single-project). Premium and Ultimate only. | | `permanently_remove` | boolean/string | no | Immediately deletes a project if it is marked for deletion. [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/396500) in GitLab 15.11 for Premium and Ultimate only and moved to GitLab Free in 18.0. | ### Restore a project marked for deletion Restore a project that is marked for deletion. ```plaintext POST /projects/:id/restore ``` Supported attributes: | Attribute | Type | Required | Description | |:----------|:------------------|:---------|:------------| | `id` | integer or string | Yes | The ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths). | ### Transfer a project to a new namespace Transfer a project to a new namespace. For information on prerequisites for transferring a project, see [Transfer a project to another namespace](../user/project/working_with_projects.md#transfer-a-project). ```plaintext PUT /projects/:id/transfer ``` Supported attributes: | Attribute | Type | Required | Description | |:------------|:------------------|:---------|:------------| | `id` | integer or string | Yes | The ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths). | | `namespace` | integer or string | Yes | The ID or path of the namespace to transfer to project to. | Example request: ```shell curl --request PUT --header "PRIVATE-TOKEN:Lorem ipsum dolor sit amet, consectetur adipiscing elit.
", "name": "hello-world", "name_with_namespace": "cute-cats / hello-world", "path": "hello-world", "path_with_namespace": "cute-cats/hello-world", "created_at": "2020-10-15T16:25:22.415Z", "updated_at": "2020-10-15T16:25:22.415Z", "default_branch": "main", "tag_list": [], //deprecated, use `topics` instead "topics": [], "ssh_url_to_repo": "git@gitlab.example.com:cute-cats/hello-world.git", "http_url_to_repo": "https://gitlab.example.com/cute-cats/hello-world.git", "web_url": "https://gitlab.example.com/cute-cats/hello-world", "readme_url": "https://gitlab.example.com/cute-cats/hello-world/-/blob/main/README.md", "avatar_url": null, "forks_count": 0, "star_count": 0, "last_activity_at": "2020-10-15T16:25:22.415Z", "namespace": { "id": 18, "name": "cute-cats", "path": "cute-cats", "kind": "group", "full_path": "cute-cats", "parent_id": null, "avatar_url": null, "web_url": "https://gitlab.example.com/groups/cute-cats" }, "container_registry_image_prefix": "registry.example.com/cute-cats/hello-world", "_links": { "self": "https://gitlab.example.com/api/v4/projects/7", "issues": "https://gitlab.example.com/api/v4/projects/7/issues", "merge_requests": "https://gitlab.example.com/api/v4/projects/7/merge_requests", "repo_branches": "https://gitlab.example.com/api/v4/projects/7/repository/branches", "labels": "https://gitlab.example.com/api/v4/projects/7/labels", "events": "https://gitlab.example.com/api/v4/projects/7/events", "members": "https://gitlab.example.com/api/v4/projects/7/members" }, "packages_enabled": true, "empty_repo": false, "archived": false, "visibility": "private", "resolve_outdated_diff_discussions": false, "container_registry_enabled": true, // deprecated, use container_registry_access_level instead "container_registry_access_level": "enabled", "container_expiration_policy": { "cadence": "7d", "enabled": false, "keep_n": null, "older_than": null, "name_regex": null, "name_regex_keep": null, "next_run_at": "2020-10-22T16:25:22.746Z" }, "issues_enabled": true, "merge_requests_enabled": true, "wiki_enabled": true, "jobs_enabled": true, "snippets_enabled": true, "service_desk_enabled": false, "service_desk_address": null, "can_create_merge_request_in": true, "issues_access_level": "enabled", "repository_access_level": "enabled", "merge_requests_access_level": "enabled", "forking_access_level": "enabled", "analytics_access_level": "enabled", "wiki_access_level": "enabled", "builds_access_level": "enabled", "snippets_access_level": "enabled", "pages_access_level": "enabled", "security_and_compliance_access_level": "enabled", "emails_disabled": null, "emails_enabled": null, "shared_runners_enabled": true, "group_runners_enabled": true, "lfs_enabled": true, "creator_id": 2, "import_status": "none", "open_issues_count": 0, "ci_default_git_depth": 50, "public_jobs": true, "build_timeout": 3600, "auto_cancel_pending_pipelines": "enabled", "ci_config_path": null, "shared_with_groups": [], "only_allow_merge_if_pipeline_succeeds": false, "allow_merge_on_skipped_pipeline": null, "allow_pipeline_trigger_approve_deployment": false, "restrict_user_defined_variables": false, "request_access_enabled": true, "only_allow_merge_if_all_discussions_are_resolved": false, "remove_source_branch_after_merge": true, "printing_merge_request_link_enabled": true, "merge_method": "merge", "squash_option": "default_on", "suggestion_commit_message": null, "merge_commit_template": null, "auto_devops_enabled": true, "auto_devops_deploy_strategy": "continuous", "autoclose_referenced_issues": true, "approvals_before_merge": 0, // Deprecated. Use merge request approvals API instead. "mirror": false, "compliance_frameworks": [], "warn_about_potentially_unwanted_characters": true, "secret_push_protection_enabled": false } ``` #### List groups available for project transfer {{< history >}} - [Introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/371006) in GitLab 15.4 {{< /history >}} Retrieve a list of groups to which the user can transfer a project. ```plaintext GET /projects/:id/transfer_locations ``` Supported attributes: | Attribute | Type | Required | Description | |:----------|:------------------|:---------|:------------| | `id` | integer or string | Yes | The ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths). | | `search` | string | No | The group names to search for. | Example request: ```shell curl --request GET "https://gitlab.example.com/api/v4/projects/1/transfer_locations" ``` Example response: ```json [ { "id": 27, "web_url": "https://gitlab.example.com/groups/gitlab", "name": "GitLab", "avatar_url": null, "full_name": "GitLab", "full_path": "GitLab" }, { "id": 31, "web_url": "https://gitlab.example.com/groups/foobar", "name": "FooBar", "avatar_url": null, "full_name": "FooBar", "full_path": "FooBar" } ] ``` ### Upload a project avatar Upload an avatar to the specified project. ```plaintext PUT /projects/:id ``` Supported attributes: | Attribute | Type | Required | Description | |:----------|:------------------|:---------|:------------| | `avatar` | string | Yes | The file to be uploaded. | | `id` | integer or string | Yes | The ID or [URL-encoded path of the project](rest/_index.md#namespaced-paths). | To upload an avatar from your file system, use the `--form` argument. This causes cURL to post data using the header `Content-Type: multipart/form-data`. The `file=` parameter must point to an image file on your file system and be preceded by `@`. For example: Example request: ```shell curl --request PUT --header "PRIVATE-TOKEN: