Projects API

Project visibility level

Project in GitLab can be either private, internal or public. This is determined by the visibility field in the project.

Values for the project visibility level are:

  • private: Project access must be granted explicitly for each user.

  • internal: The project can be cloned by any logged in user.

  • public: The project can be accessed without any authentication.

Project merge method

There are currently three options for merge_method to choose from:

  • merge: A merge commit is created for every merge, and merging is allowed as long as there are no conflicts.

  • rebase_merge: A merge commit is created for every merge, but merging is only allowed if fast-forward merge is possible. This way you could make sure that if this merge request would build, after merging to target branch it would also build.

  • ff: No merge commits are created and all merges are fast-forwarded, which means that merging is only allowed if the branch could be fast-forwarded.

List all projects

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.

GET /projects
AttributeTypeRequiredDescription
archivedbooleannoLimit by archived status
visibilitystringnoLimit by visibility public, internal, or private
order_bystringnoReturn projects ordered by id, name, path, created_at, updated_at, or last_activity_at fields. Default is created_at
sortstringnoReturn projects sorted in asc or desc order. Default is desc
searchstringnoReturn list of projects matching the search criteria
simplebooleannoReturn only limited fields for each project. This is a no-op without authentication as then only simple fields are returned.
ownedbooleannoLimit by projects explicitly owned by the current user
membershipbooleannoLimit by projects that the current user is a member of
starredbooleannoLimit by projects starred by the current user
statisticsbooleannoInclude project statistics
with_custom_attributesbooleannoInclude custom attributes in response (admins only)
with_issues_enabledbooleannoLimit by enabled issues feature
with_merge_requests_enabledbooleannoLimit by enabled merge requests feature
with_programming_languagestringnoLimit by projects which use the given programming language
wiki_checksum_failedbooleannoLimit projects where the wiki checksum calculation has failed (Introduced in GitLab Premium 11.2)
repository_checksum_failedbooleannoLimit projects where the repository checksum calculation has failed (Introduced in GitLab Premium 11.2)
min_access_levelintegernoLimit by current user minimal access level
id_afterintegernoLimit results to projects with IDs greater than the specified ID
id_beforeintegernoLimit results to projects with IDs less than the specified ID
Note: This endpoint supports keyset pagination for selected order_by options.

When simple=true or the user is unauthenticated this returns something like:

[
  {
    "id": 4,
    "description": null,
    "default_branch": "master",
    "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/master/README.md",
    "tag_list": [
      "example",
      "disapora client"
    ],
    "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",
    "last_activity_at": "2013-09-30T13:46:02Z",
    "forks_count": 0,
    "avatar_url": "http://example.com/uploads/project/avatar/4/uploads/avatar.png",
    "star_count": 0,
  },
  {
    "id": 6,
    "description": null,
    "default_branch": "master",
...

When the user is authenticated and simple is not set this returns something like:

[
  {
    "id": 4,
    "description": null,
    "default_branch": "master",
    "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/master/README.md",
    "tag_list": [
      "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,
    "resolve_outdated_diff_discussions": false,
    "container_registry_enabled": false,
    "created_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,
    "forks_count": 0,
    "star_count": 0,
    "runners_token": "b8547b1dc37721d05889db52fa2f02",
    "ci_default_git_depth": 50,
    "public_jobs": true,
    "shared_with_groups": [],
    "only_allow_merge_if_pipeline_succeeds": false,
    "only_allow_merge_if_all_discussions_are_resolved": false,
    "remove_source_branch_after_merge": false,
    "request_access_enabled": false,
    "merge_method": "merge",
    "statistics": {
      "commit_count": 37,
      "storage_size": 1038090,
      "repository_size": 1038090,
      "wiki_size" : 0,
      "lfs_objects_size": 0,
      "job_artifacts_size": 0,
      "packages_size": 0
    },
    "_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"
    },
  },
  {
    "id": 6,
    "description": null,
    "default_branch": "master",
    "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/master/README.md",
    "tag_list": [
      "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,
    "resolve_outdated_diff_discussions": false,
    "container_registry_enabled": false,
    "created_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,
    "forks_count": 0,
    "star_count": 0,
    "runners_token": "b8547b1dc37721d05889db52fa2f02",
    "ci_default_git_depth": 0,
    "public_jobs": true,
    "shared_with_groups": [],
    "only_allow_merge_if_pipeline_succeeds": false,
    "only_allow_merge_if_all_discussions_are_resolved": false,
    "remove_source_branch_after_merge": false,
    "request_access_enabled": false,
    "merge_method": "merge",
    "statistics": {
      "commit_count": 12,
      "storage_size": 2066080,
      "repository_size": 2066080,
      "wiki_size" : 0,
      "lfs_objects_size": 0,
      "job_artifacts_size": 0,
      "packages_size": 0
    },
    "_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"
    }
  }
]

Users on GitLab Starter, Bronze, or higher will also see the approvals_before_merge parameter:

[
  {
    "id": 4,
    "description": null,
    "approvals_before_merge": 0,
    ...
  }
]

You can filter by custom attributes with:

GET /projects?custom_attributes[key]=value&custom_attributes[other_key]=other_value

List user projects

Get a list of visible projects owned by the given user. When accessed without authentication, only public projects are returned.

GET /users/:user_id/projects
AttributeTypeRequiredDescription
user_idstringyesThe ID or username of the user
archivedbooleannoLimit by archived status
visibilitystringnoLimit by visibility public, internal, or private
order_bystringnoReturn projects ordered by id, name, path, created_at, updated_at, or last_activity_at fields. Default is created_at
sortstringnoReturn projects sorted in asc or desc order. Default is desc
searchstringnoReturn list of projects matching the search criteria
simplebooleannoReturn only limited fields for each project. This is a no-op without authentication as then only simple fields are returned.
ownedbooleannoLimit by projects explicitly owned by the current user
membershipbooleannoLimit by projects that the current user is a member of
starredbooleannoLimit by projects starred by the current user
statisticsbooleannoInclude project statistics
with_custom_attributesbooleannoInclude custom attributes in response (admins only)
with_issues_enabledbooleannoLimit by enabled issues feature
with_merge_requests_enabledbooleannoLimit by enabled merge requests feature
with_programming_languagestringnoLimit by projects which use the given programming language
min_access_levelintegernoLimit by current user minimal access level
id_afterintegernoLimit results to projects with IDs greater than the specified ID
id_beforeintegernoLimit results to projects with IDs less than the specified ID
Note: This endpoint supports keyset pagination for selected order_by options.
[
  {
    "id": 4,
    "description": null,
    "default_branch": "master",
    "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/master/README.md",
    "tag_list": [
      "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,
    "resolve_outdated_diff_discussions": false,
    "container_registry_enabled": false,
    "created_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,
    "forks_count": 0,
    "star_count": 0,
    "runners_token": "b8547b1dc37721d05889db52fa2f02",
    "ci_default_git_depth": 50,
    "public_jobs": true,
    "shared_with_groups": [],
    "only_allow_merge_if_pipeline_succeeds": false,
    "only_allow_merge_if_all_discussions_are_resolved": false,
    "remove_source_branch_after_merge": false,
    "request_access_enabled": false,
    "merge_method": "merge",
    "statistics": {
      "commit_count": 37,
      "storage_size": 1038090,
      "repository_size": 1038090,
      "wiki_size" : 0,
      "lfs_objects_size": 0,
      "job_artifacts_size": 0,
      "packages_size": 0
    },
    "_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"
    }
  },
  {
    "id": 6,
    "description": null,
    "default_branch": "master",
    "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/master/README.md",
    "tag_list": [
      "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,
    "resolve_outdated_diff_discussions": false,
    "container_registry_enabled": false,
    "created_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,
    "forks_count": 0,
    "star_count": 0,
    "runners_token": "b8547b1dc37721d05889db52fa2f02",
    "ci_default_git_depth": 0,
    "public_jobs": true,
    "shared_with_groups": [],
    "only_allow_merge_if_pipeline_succeeds": false,
    "only_allow_merge_if_all_discussions_are_resolved": false,
    "remove_source_branch_after_merge": false,
    "request_access_enabled": false,
    "merge_method": "merge",
    "statistics": {
      "commit_count": 12,
      "storage_size": 2066080,
      "repository_size": 2066080,
      "wiki_size" : 0,
      "lfs_objects_size": 0,
      "job_artifacts_size": 0,
      "packages_size": 0
    },
    "_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"
    }
  }
]

List projects starred by a user

Get a list of visible projects owned by the given user. When accessed without authentication, only public projects are returned.

GET /users/:user_id/starred_projects
AttributeTypeRequiredDescription
user_idstringyesThe ID or username of the user.
archivedbooleannoLimit by archived status.
visibilitystringnoLimit by visibility public, internal, or private.
order_bystringnoReturn projects ordered by id, name, path, created_at, updated_at, or last_activity_at fields. Default is created_at.
sortstringnoReturn projects sorted in asc or desc order. Default is desc.
searchstringnoReturn list of projects matching the search criteria.
simplebooleannoReturn only limited fields for each project. This is a no-op without authentication as then only simple fields are returned..
ownedbooleannoLimit by projects explicitly owned by the current user.
membershipbooleannoLimit by projects that the current user is a member of.
starredbooleannoLimit by projects starred by the current user.
statisticsbooleannoInclude project statistics.
with_custom_attributesbooleannoInclude custom attributes in response (admins only).
with_issues_enabledbooleannoLimit by enabled issues feature.
with_merge_requests_enabledbooleannoLimit by enabled merge requests feature.
min_access_levelintegernoLimit by current user minimal access level.
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/users/5/starred_projects"

Example response:

[
  {
    "id": 4,
    "description": null,
    "default_branch": "master",
    "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/master/README.md",
    "tag_list": [
      "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,
    "resolve_outdated_diff_discussions": false,
    "container_registry_enabled": false,
    "created_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,
    "forks_count": 0,
    "star_count": 0,
    "runners_token": "b8547b1dc37721d05889db52fa2f02",
    "public_jobs": true,
    "shared_with_groups": [],
    "only_allow_merge_if_pipeline_succeeds": false,
    "only_allow_merge_if_all_discussions_are_resolved": false,
    "remove_source_branch_after_merge": false,
    "request_access_enabled": false,
    "merge_method": "merge",
    "statistics": {
      "commit_count": 37,
      "storage_size": 1038090,
      "repository_size": 1038090,
      "lfs_objects_size": 0,
      "job_artifacts_size": 0
    },
    "_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"
    }
  },
  {
    "id": 6,
    "description": null,
    "default_branch": "master",
    "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/master/README.md",
    "tag_list": [
      "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,
    "resolve_outdated_diff_discussions": false,
    "container_registry_enabled": false,
    "created_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,
    "forks_count": 0,
    "star_count": 0,
    "runners_token": "b8547b1dc37721d05889db52fa2f02",
    "public_jobs": true,
    "shared_with_groups": [],
    "only_allow_merge_if_pipeline_succeeds": false,
    "only_allow_merge_if_all_discussions_are_resolved": false,
    "remove_source_branch_after_merge": false,
    "request_access_enabled": false,
    "merge_method": "merge",
    "statistics": {
      "commit_count": 12,
      "storage_size": 2066080,
      "repository_size": 2066080,
      "lfs_objects_size": 0,
      "job_artifacts_size": 0
    },
    "_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"
    }
  }
]

Get single project

Get a specific project. This endpoint can be accessed without authentication if the project is publicly accessible.

GET /projects/:id
AttributeTypeRequiredDescription
idinteger/stringyesThe ID or URL-encoded path of the project
statisticsbooleannoInclude project statistics
licensebooleannoInclude project license data
with_custom_attributesbooleannoInclude custom attributes in response (admins only)
{
  "id": 3,
  "description": null,
  "default_branch": "master",
  "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/master/README.md",
  "tag_list": [
    "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,
  "resolve_outdated_diff_discussions": false,
  "container_registry_enabled": false,
  "created_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_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/master/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,
  "forks_count": 0,
  "star_count": 0,
  "runners_token": "b8bc4a7a29eb76ea83cf79e4908c2b",
  "ci_default_git_depth": 50,
  "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,
  "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",
  "statistics": {
    "commit_count": 37,
    "storage_size": 1038090,
    "repository_size": 1038090,
    "wiki_size" : 0,
    "lfs_objects_size": 0,
    "job_artifacts_size": 0,
    "packages_size": 0
  },
  "_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"
  }
}

Users on GitLab Starter, Bronze, or higher will also see the approvals_before_merge parameter:

{
  "id": 3,
  "description": null,
  "approvals_before_merge": 0,
  ...
}

Note: The web_url and avatar_url attributes on namespace were introduced in GitLab 11.11.

If the project is a fork, and you provide a valid token to authenticate, the forked_from_project field will appear in the response.

{
   "id":3,

   ...

   "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":"master",
      "tag_list":[],
      "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://assets.gitlab-static.net/uploads/-/system/project/avatar/13083/logo-extra-whitespace.png",
      "license_url": "https://gitlab.com/gitlab-org/gitlab/blob/master/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
      }
   }

   ...

}

Get project users

Get the users list of a project.

GET /projects/:id/users
AttributeTypeRequiredDescription
searchstringnoSearch for specific users
skip_usersinteger arraynoFilter out users with the specified IDs
[
  {
    "id": 1,
    "username": "john_smith",
    "name": "John Smith",
    "state": "active",
    "avatar_url": "http://localhost:3000/uploads/user/avatar/1/cd8.jpeg",
    "web_url": "http://localhost:3000/john_smith"
  },
  {
    "id": 2,
    "username": "jack_smith",
    "name": "Jack Smith",
    "state": "blocked",
    "avatar_url": "http://gravatar.com/../e32131cd8.jpeg",
    "web_url": "http://localhost:3000/jack_smith"
  }
]

Get project events

Please refer to the Events API documentation.

Create project

Creates a new project owned by the authenticated user.

POST /projects
AttributeTypeRequiredDescription
namestringyes if path is not providedThe name of the new project. Equals path if not provided.
pathstringyes if name is not providedRepository name for new project. Generated based on name if not provided (generated lowercased with dashes).
namespace_idintegernoNamespace for the new project (defaults to the current user’s namespace)
default_branchstringnomaster by default
descriptionstringnoShort project description
issues_enabledbooleanno(deprecated) Enable issues for this project. Use issues_access_level instead
merge_requests_enabledbooleanno(deprecated) Enable merge requests for this project. Use merge_requests_access_level instead
jobs_enabledbooleanno(deprecated) Enable jobs for this project. Use builds_access_level instead
wiki_enabledbooleanno(deprecated) Enable wiki for this project. Use wiki_access_level instead
snippets_enabledbooleanno(deprecated) Enable snippets for this project. Use snippets_access_level instead
issues_access_levelstringnoOne of disabled, private or enabled
repository_access_levelstringnoOne of disabled, private or enabled
merge_requests_access_levelstringnoOne of disabled, private or enabled
builds_access_levelstringnoOne of disabled, private or enabled
wiki_access_levelstringnoOne of disabled, private or enabled
snippets_access_levelstringnoOne of disabled, private or enabled
resolve_outdated_diff_discussionsbooleannoAutomatically resolve merge request diffs discussions on lines changed with a push
container_registry_enabledbooleannoEnable container registry for this project
shared_runners_enabledbooleannoEnable shared runners for this project
visibilitystringnoSee project visibility level
import_urlstringnoURL to import repository from
public_buildsbooleannoIf true, jobs can be viewed by non-project-members
only_allow_merge_if_pipeline_succeedsbooleannoSet whether merge requests can only be merged with successful jobs
only_allow_merge_if_all_discussions_are_resolvedbooleannoSet whether merge requests can only be merged when all the discussions are resolved
merge_methodstringnoSet the merge method used
remove_source_branch_after_mergebooleannoEnable Delete source branch option by default for all new merge requests
lfs_enabledbooleannoEnable LFS
request_access_enabledbooleannoAllow users to request member access
tag_listarraynoThe list of tags for a project; put array of tags, that should be finally assigned to a project
avatarmixednoImage file for avatar of the project
printing_merge_request_link_enabledbooleannoShow link to create/view merge request when pushing from the command line
build_git_strategystringnoThe Git strategy. Defaults to fetch
build_timeoutintegernoThe maximum amount of time in minutes that a job is able run (in seconds)
auto_cancel_pending_pipelinesstringnoAuto-cancel pending pipelines (Note: this is not a boolean, but enabled/disabled
build_coverage_regexstringnoTest coverage parsing
ci_config_pathstringnoThe path to CI config file
auto_devops_enabledbooleannoEnable Auto DevOps for this project
auto_devops_deploy_strategystringnoAuto Deploy strategy (continuous, manual or timed_incremental)
repository_storagestringnoWhich storage shard the repository is on. Available only to admins
approvals_before_mergeintegernoHow many approvers should approve merge requests by default
external_authorization_classification_labelstringnoThe classification label for the project
mirrorbooleannoEnables pull mirroring in a project
mirror_trigger_buildsbooleannoPull mirroring triggers builds
initialize_with_readmebooleannofalse by default
template_namestringnoWhen used without use_custom_template, name of a built-in project template. When used with use_custom_template, name of a custom project template
template_project_idintegernoWhen used with use_custom_template, project ID of a custom project template. This is preferable to using template_name since template_name may be ambiguous.
use_custom_templatebooleannoUse either custom instance or group (with group_with_project_templates_id) project template
group_with_project_templates_idintegernoFor group-level custom templates, specifies ID of group from which all the custom project templates are sourced. Leave empty for instance-level templates. Requires use_custom_template to be true
Note: 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 enabled.

Create project for user

Creates a new project owned by the specified user. Available only for admins.

POST /projects/user/:user_id
AttributeTypeRequiredDescription
user_idintegeryesThe user ID of the project owner
namestringyesThe name of the new project
pathstringnoCustom repository name for new project. By default generated based on name
namespace_idintegernoNamespace for the new project (defaults to the current user’s namespace)
descriptionstringnoShort project description
issues_enabledbooleanno(deprecated) Enable issues for this project. Use issues_access_level instead
merge_requests_enabledbooleanno(deprecated) Enable merge requests for this project. Use merge_requests_access_level instead
jobs_enabledbooleanno(deprecated) Enable jobs for this project. Use builds_access_level instead
wiki_enabledbooleanno(deprecated) Enable wiki for this project. Use wiki_access_level instead
snippets_enabledbooleanno(deprecated) Enable snippets for this project. Use snippets_access_level instead
issues_access_levelstringnoOne of disabled, private or enabled
repository_access_levelstringnoOne of disabled, private or enabled
merge_requests_access_levelstringnoOne of disabled, private or enabled
builds_access_levelstringnoOne of disabled, private or enabled
wiki_access_levelstringnoOne of disabled, private or enabled
snippets_access_levelstringnoOne of disabled, private or enabled
resolve_outdated_diff_discussionsbooleannoAutomatically resolve merge request diffs discussions on lines changed with a push
container_registry_enabledbooleannoEnable container registry for this project
shared_runners_enabledbooleannoEnable shared runners for this project
visibilitystringnoSee project visibility level
import_urlstringnoURL to import repository from
public_buildsbooleannoIf true, jobs can be viewed by non-project-members
only_allow_merge_if_pipeline_succeedsbooleannoSet whether merge requests can only be merged with successful jobs
only_allow_merge_if_all_discussions_are_resolvedbooleannoSet whether merge requests can only be merged when all the discussions are resolved
merge_methodstringnoSet the merge method used
remove_source_branch_after_mergebooleannoEnable Delete source branch option by default for all new merge requests
lfs_enabledbooleannoEnable LFS
request_access_enabledbooleannoAllow users to request member access
tag_listarraynoThe list of tags for a project; put array of tags, that should be finally assigned to a project
avatarmixednoImage file for avatar of the project
printing_merge_request_link_enabledbooleannoShow link to create/view merge request when pushing from the command line
build_git_strategystringnoThe Git strategy. Defaults to fetch
build_timeoutintegernoThe maximum amount of time in minutes that a job is able run (in seconds)
auto_cancel_pending_pipelinesstringnoAuto-cancel pending pipelines (Note: this is not a boolean, but enabled/disabled
build_coverage_regexstringnoTest coverage parsing
ci_config_pathstringnoThe path to CI config file
auto_devops_enabledbooleannoEnable Auto DevOps for this project
auto_devops_deploy_strategystringnoAuto Deploy strategy (continuous, manual or timed_incremental)
repository_storagestringnoWhich storage shard the repository is on. Available only to admins
approvals_before_mergeintegernoHow many approvers should approve merge requests by default
external_authorization_classification_labelstringnoThe classification label for the project
mirrorbooleannoEnables pull mirroring in a project
mirror_trigger_buildsbooleannoPull mirroring triggers builds
initialize_with_readmebooleannofalse by default
template_namestringnoWhen used without use_custom_template, name of a built-in project template. When used with use_custom_template, name of a custom project template
use_custom_templatebooleannoUse either custom instance or group (with group_with_project_templates_id) project template
group_with_project_templates_idintegernoFor group-level custom templates, specifies ID of group from which all the custom project templates are sourced. Leave empty for instance-level templates. Requires use_custom_template to be true
Note: 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 enabled.

Edit project

Updates an existing project.

PUT /projects/:id
AttributeTypeRequiredDescription
idinteger/stringyesThe ID or URL-encoded path of the project
namestringnoThe name of the project
pathstringnoCustom repository name for the project. By default generated based on name
default_branchstringnomaster by default
descriptionstringnoShort project description
issues_enabledbooleanno(deprecated) Enable issues for this project. Use issues_access_level instead
merge_requests_enabledbooleanno(deprecated) Enable merge requests for this project. Use merge_requests_access_level instead
jobs_enabledbooleanno(deprecated) Enable jobs for this project. Use builds_access_level instead
wiki_enabledbooleanno(deprecated) Enable wiki for this project. Use wiki_access_level instead
snippets_enabledbooleanno(deprecated) Enable snippets for this project. Use snippets_access_level instead
issues_access_levelstringnoOne of disabled, private or enabled
repository_access_levelstringnoOne of disabled, private or enabled
merge_requests_access_levelstringnoOne of disabled, private or enabled
builds_access_levelstringnoOne of disabled, private or enabled
wiki_access_levelstringnoOne of disabled, private or enabled
snippets_access_levelstringnoOne of disabled, private or enabled
resolve_outdated_diff_discussionsbooleannoAutomatically resolve merge request diffs discussions on lines changed with a push
container_registry_enabledbooleannoEnable container registry for this project
shared_runners_enabledbooleannoEnable shared runners for this project
visibilitystringnoSee project visibility level
import_urlstringnoURL to import repository from
public_buildsbooleannoIf true, jobs can be viewed by non-project-members
only_allow_merge_if_pipeline_succeedsbooleannoSet whether merge requests can only be merged with successful jobs
only_allow_merge_if_all_discussions_are_resolvedbooleannoSet whether merge requests can only be merged when all the discussions are resolved
merge_methodstringnoSet the merge method used
remove_source_branch_after_mergebooleannoEnable Delete source branch option by default for all new merge requests
lfs_enabledbooleannoEnable LFS
request_access_enabledbooleannoAllow users to request member access
tag_listarraynoThe list of tags for a project; put array of tags, that should be finally assigned to a project
avatarmixednoImage file for avatar of the project
build_git_strategystringnoThe Git strategy. Defaults to fetch
build_timeoutintegernoThe maximum amount of time in minutes that a job is able run (in seconds)
auto_cancel_pending_pipelinesstringnoAuto-cancel pending pipelines (Note: this is not a boolean, but enabled/disabled
build_coverage_regexstringnoTest coverage parsing
ci_config_pathstringnoThe path to CI config file
ci_default_git_depthintegernoDefault number of revisions for shallow cloning
auto_devops_enabledbooleannoEnable Auto DevOps for this project
auto_devops_deploy_strategystringnoAuto Deploy strategy (continuous, manual or timed_incremental)
repository_storagestringnoWhich storage shard the repository is on. Available only to admins
approvals_before_mergeintegernoHow many approvers should approve merge request by default
external_authorization_classification_labelstringnoThe classification label for the project
mirrorbooleannoEnables pull mirroring in a project
mirror_user_idintegernoUser responsible for all the activity surrounding a pull mirror event
mirror_trigger_buildsbooleannoPull mirroring triggers builds
only_mirror_protected_branchesbooleannoOnly mirror protected branches
mirror_overwrites_diverged_branchesbooleannoPull mirror overwrites diverged branches
packages_enabledbooleannoEnable or disable packages repository feature
Note: 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 enabled.

Fork project

Forks a project into the user namespace of the authenticated user or the one provided.

The forking operation for a project is asynchronous and is completed in a background job. The request will return immediately. To determine whether the fork of the project has completed, query the import_status for the new project.

POST /projects/:id/fork
AttributeTypeRequiredDescription
idinteger/stringyesThe ID or URL-encoded path of the project
namespaceinteger/stringyesThe ID or path of the namespace that the project will be forked to
pathstringnoThe path that will be assigned to the resultant project after forking
namestringnoThe name that will be assigned to the resultant project after forking

List Forks of a project

Note: This feature was introduced in GitLab 10.1

List the projects accessible to the calling user that have an established, forked relationship with the specified project

GET /projects/:id/forks
AttributeTypeRequiredDescription
idinteger/stringyesThe ID or URL-encoded path of the project
archivedbooleannoLimit by archived status
visibilitystringnoLimit by visibility public, internal, or private
order_bystringnoReturn projects ordered by id, name, path, created_at, updated_at, or last_activity_at fields. Default is created_at
sortstringnoReturn projects sorted in asc or desc order. Default is desc
searchstringnoReturn list of projects matching the search criteria
simplebooleannoReturn only limited fields for each project. This is a no-op without authentication as then only simple fields are returned.
ownedbooleannoLimit by projects explicitly owned by the current user
membershipbooleannoLimit by projects that the current user is a member of
starredbooleannoLimit by projects starred by the current user
statisticsbooleannoInclude project statistics
with_custom_attributesbooleannoInclude custom attributes in response (admins only)
with_issues_enabledbooleannoLimit by enabled issues feature
with_merge_requests_enabledbooleannoLimit by enabled merge requests feature
min_access_levelintegernoLimit by current user minimal access level
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/forks"

Example responses:

[
  {
    "id": 3,
    "description": null,
    "default_branch": "master",
    "visibility": "internal",
    "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/master/README.md",
    "tag_list": [
      "example",
      "disapora project"
    ],
    "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,
    "resolve_outdated_diff_discussions": false,
    "container_registry_enabled": false,
    "created_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": true,
    "avatar_url": "http://example.com/uploads/project/avatar/3/uploads/avatar.png",
    "shared_runners_enabled": true,
    "forks_count": 0,
    "star_count": 1,
    "public_jobs": true,
    "shared_with_groups": [],
    "only_allow_merge_if_pipeline_succeeds": false,
    "only_allow_merge_if_all_discussions_are_resolved": false,
    "remove_source_branch_after_merge": false,
    "request_access_enabled": false,
    "merge_method": "merge",
    "_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"
    }
  }
]

Star a project

Stars a given project. Returns status code 304 if the project is already starred.

POST /projects/:id/star
AttributeTypeRequiredDescription
idinteger/stringyesThe ID or URL-encoded path of the project
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/star"

Example response:

{
  "id": 3,
  "description": null,
  "default_branch": "master",
  "visibility": "internal",
  "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/master/README.md",
  "tag_list": [
    "example",
    "disapora project"
  ],
  "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,
  "resolve_outdated_diff_discussions": false,
  "container_registry_enabled": false,
  "created_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": true,
  "avatar_url": "http://example.com/uploads/project/avatar/3/uploads/avatar.png",
  "license_url": "http://example.com/diaspora/diaspora-client/blob/master/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,
  "forks_count": 0,
  "star_count": 1,
  "public_jobs": true,
  "shared_with_groups": [],
  "only_allow_merge_if_pipeline_succeeds": false,
  "only_allow_merge_if_all_discussions_are_resolved": false,
  "remove_source_branch_after_merge": false,
  "request_access_enabled": false,
  "merge_method": "merge",
  "_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"
  }
}

Unstar a project

Unstars a given project. Returns status code 304 if the project is not starred.

POST /projects/:id/unstar
AttributeTypeRequiredDescription
idinteger/stringyesThe ID or URL-encoded path of the project
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/unstar"

Example response:

{
  "id": 3,
  "description": null,
  "default_branch": "master",
  "visibility": "internal",
  "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/master/README.md",
  "tag_list": [
    "example",
    "disapora project"
  ],
  "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,
  "resolve_outdated_diff_discussions": false,
  "container_registry_enabled": false,
  "created_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": true,
  "avatar_url": "http://example.com/uploads/project/avatar/3/uploads/avatar.png",
  "license_url": "http://example.com/diaspora/diaspora-client/blob/master/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,
  "forks_count": 0,
  "star_count": 0,
  "public_jobs": true,
  "shared_with_groups": [],
  "only_allow_merge_if_pipeline_succeeds": false,
  "only_allow_merge_if_all_discussions_are_resolved": false,
  "remove_source_branch_after_merge": false,
  "request_access_enabled": false,
  "merge_method": "merge",
  "_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"
  }
}

List Starrers of a project

List the users who starred the specified project.

GET /projects/:id/starrers
AttributeTypeRequiredDescription
searchstringnoSearch for specific users.
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/starrers"

Example responses:

[
  {
    "starred_since": "2019-01-28T14:47:30.642Z",
    "user":
      {
        "id": 1,
        "username": "jane_smith",
        "name": "Jane Smith",
        "state": "active",
        "avatar_url": "http://localhost:3000/uploads/user/avatar/1/cd8.jpeg",
        "web_url": "http://localhost:3000/jane_smith"
      }
  },
    "starred_since": "2018-01-02T11:40:26.570Z",
    "user":
      {
        "id": 2,
        "username": "janine_smith",
        "name": "Janine Smith",
        "state": "blocked",
        "avatar_url": "http://gravatar.com/../e32131cd8.jpeg",
        "web_url": "http://localhost:3000/janine_smith"
      }
]

Languages

Get languages used in a project with percentage value.

GET /projects/:id/languages
curl --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/languages"

Example response:

{
  "Ruby": 66.69,
  "JavaScript": 22.98,
  "HTML": 7.91,
  "CoffeeScript": 2.42
}

Archive a project

Archives the project if the user is either admin or the project owner of this project. This action is idempotent, thus archiving an already archived project will not change the project.

POST /projects/:id/archive
AttributeTypeRequiredDescription
idinteger/stringyesThe ID or URL-encoded path of the project
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/archive"

Example response:

{
  "id": 3,
  "description": null,
  "default_branch": "master",
  "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/master/README.md",
  "tag_list": [
    "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,
  "resolve_outdated_diff_discussions": false,
  "container_registry_enabled": false,
  "created_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/master/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,
  "forks_count": 0,
  "star_count": 0,
  "runners_token": "b8bc4a7a29eb76ea83cf79e4908c2b",
  "ci_default_git_depth": 50,
  "public_jobs": true,
  "shared_with_groups": [],
  "only_allow_merge_if_pipeline_succeeds": false,
  "only_allow_merge_if_all_discussions_are_resolved": false,
  "remove_source_branch_after_merge": false,
  "request_access_enabled": false,
  "merge_method": "merge",
  "_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"
  }
}

Unarchive a project

Unarchives the project if the user is either admin or the project owner of this project. This action is idempotent, thus unarchiving a non-archived project will not change the project.

POST /projects/:id/unarchive
AttributeTypeRequiredDescription
idinteger/stringyesThe ID or URL-encoded path of the project
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" "https://gitlab.example.com/api/v4/projects/5/unarchive"

Example response:

{
  "id": 3,
  "description": null,
  "default_branch": "master",
  "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/master/README.md",
  "tag_list": [
    "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,
  "resolve_outdated_diff_discussions": false,
  "container_registry_enabled": false,
  "created_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/master/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,
  "forks_count": 0,
  "star_count": 0,
  "runners_token": "b8bc4a7a29eb76ea83cf79e4908c2b",
  "ci_default_git_depth": 50,
  "public_jobs": true,
  "shared_with_groups": [],
  "only_allow_merge_if_pipeline_succeeds": false,
  "only_allow_merge_if_all_discussions_are_resolved": false,
  "remove_source_branch_after_merge": false,
  "request_access_enabled": false,
  "merge_method": "merge",
  "_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"
  }
}

Remove project

Removes a project including all associated resources (issues, merge requests etc).

DELETE /projects/:id
AttributeTypeRequiredDescription
idinteger/stringyesThe ID or URL-encoded path of the project

Upload a file

Uploads a file to the specified project to be used in an issue or merge request description, or a comment.

POST /projects/:id/uploads
AttributeTypeRequiredDescription
idinteger/stringyesThe ID or URL-encoded path of the project
filestringyesThe file to be uploaded

To upload a file from your filesystem, use the --form argument. This causes cURL to post data using the header Content-Type: multipart/form-data. The file= parameter must point to a file on your filesystem and be preceded by @. For example:

curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" --form "file=@dk.png" https://gitlab.example.com/api/v4/projects/5/uploads

Returned object:

{
  "alt": "dk",
  "url": "/uploads/66dbcd21ec5d24ed6ea225176098d52b/dk.png",
  "markdown": "![dk](/uploads/66dbcd21ec5d24ed6ea225176098d52b/dk.png)"
}

Note: The returned url is relative to the project path. In Markdown contexts, the link is automatically expanded when the format in markdown is used.

Share project with group

Allow to share project with group.

POST /projects/:id/share
AttributeTypeRequiredDescription
idinteger/stringyesThe ID or URL-encoded path of the project
group_idintegeryesThe ID of the group to share with
group_accessintegeryesThe permissions level to grant the group
expires_atstringnoShare expiration date in ISO 8601 format: 2016-09-26

Unshare the project from the group. Returns 204 and no content on success.

DELETE /projects/:id/share/:group_id
AttributeTypeRequiredDescription
idinteger/stringyesThe ID or URL-encoded path of the project
group_idintegeryesThe ID of the group
curl --request DELETE --header "PRIVATE-TOKEN: <your_access_token>" https://gitlab.example.com/api/v4/projects/5/share/17

Hooks

Also called Project Hooks and Webhooks. These are different for System Hooks that are system wide.

List project hooks

Get a list of project hooks.

GET /projects/:id/hooks
AttributeTypeRequiredDescription
idinteger/stringyesThe ID or URL-encoded path of the project

Get project hook

Get a specific hook for a project.

GET /projects/:id/hooks/:hook_id
AttributeTypeRequiredDescription
idinteger/stringyesThe ID or URL-encoded path of the project
hook_idintegeryesThe ID of a project hook
{
  "id": 1,
  "url": "http://example.com/hook",
  "project_id": 3,
  "push_events": true,
  "push_events_branch_filter": "",
  "issues_events": true,
  "confidential_issues_events": true,
  "merge_requests_events": true,
  "tag_push_events": true,
  "note_events": true,
  "job_events": true,
  "pipeline_events": true,
  "wiki_page_events": true,
  "enable_ssl_verification": true,
  "created_at": "2012-10-12T17:04:47Z"
}

Add project hook

Adds a hook to a specified project.

POST /projects/:id/hooks
AttributeTypeRequiredDescription
idinteger/stringyesThe ID or URL-encoded path of the project
urlstringyesThe hook URL
push_eventsbooleannoTrigger hook on push events
push_events_branch_filterstringnoTrigger hook on push events for matching branches only
issues_eventsbooleannoTrigger hook on issues events
confidential_issues_eventsbooleannoTrigger hook on confidential issues events
merge_requests_eventsbooleannoTrigger hook on merge requests events
tag_push_eventsbooleannoTrigger hook on tag push events
note_eventsbooleannoTrigger hook on note events
job_eventsbooleannoTrigger hook on job events
pipeline_eventsbooleannoTrigger hook on pipeline events
wiki_page_eventsbooleannoTrigger hook on wiki events
enable_ssl_verificationbooleannoDo SSL verification when triggering the hook
tokenstringnoSecret token to validate received payloads; this will not be returned in the response

Edit project hook

Edits a hook for a specified project.

PUT /projects/:id/hooks/:hook_id
AttributeTypeRequiredDescription
idinteger/stringyesThe ID or URL-encoded path of the project
hook_idintegeryesThe ID of the project hook
urlstringyesThe hook URL
push_eventsbooleannoTrigger hook on push events
push_events_branch_filterstringnoTrigger hook on push events for matching branches only
issues_eventsbooleannoTrigger hook on issues events
confidential_issues_eventsbooleannoTrigger hook on confidential issues events
merge_requests_eventsbooleannoTrigger hook on merge requests events
tag_push_eventsbooleannoTrigger hook on tag push events
note_eventsbooleannoTrigger hook on note events
job_eventsbooleannoTrigger hook on job events
pipeline_eventsbooleannoTrigger hook on pipeline events
wiki_eventsbooleannoTrigger hook on wiki events
enable_ssl_verificationbooleannoDo SSL verification when triggering the hook
tokenstringnoSecret token to validate received payloads; this will not be returned in the response

Delete project hook

Removes a hook from a project. This is an idempotent method and can be called multiple times. Either the hook is available or not.

DELETE /projects/:id/hooks/:hook_id
AttributeTypeRequiredDescription
idinteger/stringyesThe ID or URL-encoded path of the project
hook_idintegeryesThe ID of the project hook

Note the JSON response differs if the hook is available or not. If the project hook is available before it is returned in the JSON response or an empty response is returned.

Fork relationship

Allows modification of the forked relationship between existing projects. Available only for project owners and admins.

Create a forked from/to relation between existing projects

Warning: This will destroy the LFS objects stored in the fork. So to retain the LFS objects, make sure you’ve pulled them before creating the fork relation, and push them again after creating the fork relation.
POST /projects/:id/fork/:forked_from_id
AttributeTypeRequiredDescription
idinteger/stringyesThe ID or URL-encoded path of the project
forked_from_idIDyesThe ID of the project that was forked from

Delete an existing forked from relationship

DELETE /projects/:id/fork
AttributeTypeRequiredDescription
idinteger/stringyesThe ID or URL-encoded path of the project

Search for projects by name

Search for projects by name which are accessible to the authenticated user. This endpoint can be accessed without authentication if the project is publicly accessible.

GET /projects
AttributeTypeRequiredDescription
searchstringyesA string contained in the project name
order_bystringnoReturn requests ordered by id, name, created_at or last_activity_at fields
sortstringnoReturn requests sorted in asc or desc order
curl --header "PRIVATE-TOKEN: <your_access_token>" https://gitlab.example.com/api/v4/projects?search=test

Start the Housekeeping task for a Project

Introduced in GitLab 9.0.

POST /projects/:id/housekeeping
AttributeTypeRequiredDescription
idinteger/stringyesThe ID of the project or NAMESPACE/PROJECT_NAME

Push Rules

Get project push rules

Get the push rules of a project.

GET /projects/:id/push_rule
AttributeTypeRequiredDescription
idinteger/stringyesThe ID of the project or NAMESPACE/PROJECT_NAME
{
  "id": 1,
  "project_id": 3,
  "commit_message_regex": "Fixes \d+\..*",
  "commit_message_negative_regex": "ssh\:\/\/",
  "branch_name_regex": "",
  "deny_delete_tag": false,
  "created_at": "2012-10-12T17:04:47Z",
  "member_check": false,
  "prevent_secrets": false,
  "author_email_regex": "",
  "file_name_regex": "",
  "max_file_size": 5,
  "commit_committer_check": false,
  "reject_unsigned_commits": false
}

Users on GitLab Premium, Silver, or higher will also see the commit_committer_check and reject_unsigned_commits parameters:

{
  "id": 1,
  "project_id": 3,
  "commit_committer_check": false,
  "reject_unsigned_commits": false
  ...
}

Add project push rule

Adds a push rule to a specified project.

POST /projects/:id/push_rule
AttributeTypeRequiredDescription
idinteger/stringyesThe ID of the project or NAMESPACE/PROJECT_NAME
deny_delete_tag booleannoDeny deleting a tag
member_check booleannoRestrict commits by author (email) to existing GitLab users
prevent_secrets booleannoGitLab will reject any files that are likely to contain secrets
commit_message_regex stringnoAll commit messages must match this, e.g. Fixed \d+\..*
commit_message_negative_regex stringnoNo commit message is allowed to match this, e.g. ssh\:\/\/
branch_name_regex stringnoAll branch names must match this, e.g. (feature|hotfix)\/*
author_email_regex stringnoAll commit author emails must match this, e.g. @my-company.com$
file_name_regex stringnoAll commited filenames must not match this, e.g. (jar|exe)$
max_file_size integernoMaximum file size (MB)
commit_committer_check booleannoUsers can only push commits to this repository that were committed with one of their own verified emails.
reject_unsigned_commits booleannoReject commit when it is not signed through GPG.

Edit project push rule

Edits a push rule for a specified project.

PUT /projects/:id/push_rule
AttributeTypeRequiredDescription
idinteger/stringyesThe ID of the project or NAMESPACE/PROJECT_NAME
deny_delete_tag booleannoDeny deleting a tag
member_check booleannoRestrict commits by author (email) to existing GitLab users
prevent_secrets booleannoGitLab will reject any files that are likely to contain secrets
commit_message_regex stringnoAll commit messages must match this, e.g. Fixed \d+\..*
commit_message_negative_regex stringnoNo commit message is allowed to match this, e.g. ssh\:\/\/
branch_name_regex stringnoAll branch names must match this, e.g. (feature|hotfix)\/*
author_email_regex stringnoAll commit author emails must match this, e.g. @my-company.com$
file_name_regex stringnoAll commited filenames must not match this, e.g. (jar|exe)$
max_file_size integernoMaximum file size (MB)
commit_committer_check booleannoUsers can only push commits to this repository that were committed with one of their own verified emails.
reject_unsigned_commits booleannoReject commits when they are not GPG signed.

Delete project push rule

Introduced in GitLab Starter 9.0.

Removes a push rule from a project. This is an idempotent method and can be called multiple times. Either the push rule is available or not.

DELETE /projects/:id/push_rule
AttributeTypeRequiredDescription
idinteger/stringyesThe ID or URL-encoded path of the project

Transfer a project to a new namespace

Introduced in GitLab 11.1.

PUT /projects/:id/transfer
AttributeTypeRequiredDescription
namespaceinteger/stringyesThe ID or path of the namespace to transfer to project to

Branches

Read more in the Branches documentation.

Project Import/Export

Read more in the Project import/export documentation.

Project members

Read more in the Project members documentation.

Start the pull mirroring process for a Project

Introduced in GitLab Starter 10.3.

POST /projects/:id/mirror/pull
AttributeTypeRequiredDescription
idinteger/stringyesThe ID or URL-encoded path of the project
curl --request POST --header "PRIVATE-TOKEN: <your_access_token>" https://gitlab.example.com/api/v4/projects/:id/mirror/pull

Project badges

Read more in the Project Badges documentation.

Issue and merge request description templates

The non-default issue and merge request description templates are managed inside the project’s repository. So you can manage them via the API through the Repositories API and the Repository Files API.

Download snapshot of a Git repository

Introduced in GitLab 10.7

This endpoint may only be accessed by an administrative user.

Download a snapshot of the project (or wiki, if requested) Git repository. This snapshot is always in uncompressed tar format.

If a repository is corrupted to the point where git clone does not work, the snapshot may allow some of the data to be retrieved.

GET /projects/:id/snapshot
AttributeTypeRequiredDescription
idinteger/stringyesThe ID or URL-encoded path of the project
wikibooleannoWhether to download the wiki, rather than project, repository