2020-07-30 08:09:33 -04:00
---
stage: Create
group: Source Code
2020-11-26 01:09:20 -05:00
info: "To determine the technical writer assigned to the Stage/Group associated with this page, see https://about.gitlab.com/handbook/engineering/ux/technical-writing/#assignments"
2020-07-30 08:09:33 -04:00
---
2021-02-03 10:09:24 -05:00
# Merge request approvals API **(PREMIUM)**
2019-05-18 17:27:41 -04:00
2021-04-14 20:09:12 -04:00
Configuration for
2021-04-28 17:10:01 -04:00
[approvals on all merge requests ](../user/project/merge_requests/approvals/index.md )
2021-04-14 20:09:12 -04:00
in the project. Must be authenticated for all endpoints.
2019-05-18 17:27:41 -04:00
## Project-level MR approvals
### Get Configuration
2021-10-08 14:13:02 -04:00
> Moved to GitLab Premium in 13.9.
2019-05-18 17:27:41 -04:00
You can request information about a project's approval configuration using the
following endpoint:
2020-02-27 04:09:01 -05:00
```plaintext
2019-05-18 17:27:41 -04:00
GET /projects/:id/approvals
```
2022-09-07 14:13:50 -04:00
Supported attributes:
2019-05-18 17:27:41 -04:00
| Attribute | Type | Required | Description |
| --------- | ------- | -------- | ------------------- |
2022-09-07 14:13:50 -04:00
| `id` | integer or string | ** {check-circle}** Yes | The ID or [URL-encoded path of a project ](index.md#namespaced-path-encoding ). |
2019-05-18 17:27:41 -04:00
```json
{
"approvals_before_merge": 2,
"reset_approvals_on_push": true,
2022-09-01 08:11:56 -04:00
"selective_code_owner_removals": false,
2020-01-31 07:08:33 -05:00
"disable_overriding_approvers_per_merge_request": false,
"merge_requests_author_approval": true,
"merge_requests_disable_committers_approval": false,
"require_password_to_approve": true
2019-05-18 17:27:41 -04:00
}
```
### Change configuration
2021-10-08 14:13:02 -04:00
> Moved to GitLab Premium in 13.9.
2019-05-18 17:27:41 -04:00
If you are allowed to, you can change approval configuration using the following
endpoint:
2020-02-27 04:09:01 -05:00
```plaintext
2019-05-18 17:27:41 -04:00
POST /projects/:id/approvals
```
2022-09-07 14:13:50 -04:00
Supported attributes:
2019-05-18 17:27:41 -04:00
2022-09-02 17:10:02 -04:00
| Attribute | Type | Required | Description |
| ------------------------------------------------ | ------- | -------- | -- |
2022-09-07 14:13:50 -04:00
| `id` | integer or string | ** {check-circle}** Yes | The ID or [URL-encoded path of a project ](index.md#namespaced-path-encoding ). |
| `approvals_before_merge` | integer | ** {dotted-circle}** No | How many approvals are required before a merge request can be merged. Deprecated in GitLab 12.0 in favor of Approval Rules API. |
| `disable_overriding_approvers_per_merge_request` | boolean | ** {dotted-circle}** No | Allow or prevent overriding approvers per merge request. |
| `merge_requests_author_approval` | boolean | ** {dotted-circle}** No | Allow or prevent authors from self approving merge requests; `true` means authors can self approve. |
| `merge_requests_disable_committers_approval` | boolean | ** {dotted-circle}** No | Allow or prevent committers from self approving merge requests. |
| `require_password_to_approve` | boolean | ** {dotted-circle}** No | Require approver to enter a password to authenticate before adding the approval. |
| `reset_approvals_on_push` | boolean | ** {dotted-circle}** No | Reset approvals on a new push. |
| `selective_code_owner_removals` | boolean | ** {dotted-circle}** No | Reset approvals from Code Owners if their files changed. Can be enabled only if `reset_approvals_on_push` is disabled. |
2019-05-18 17:27:41 -04:00
```json
{
2019-08-19 13:56:18 -04:00
"approvals_before_merge": 2,
"reset_approvals_on_push": true,
2022-09-01 08:11:56 -04:00
"selective_code_owner_removals": false,
2019-08-19 13:56:18 -04:00
"disable_overriding_approvers_per_merge_request": false,
"merge_requests_author_approval": false,
2020-01-31 07:08:33 -05:00
"merge_requests_disable_committers_approval": false,
"require_password_to_approve": true
2019-08-19 13:56:18 -04:00
}
```
### Get project-level rules
2021-02-03 10:09:24 -05:00
> - Moved to GitLab Premium in 13.9.
2022-07-20 14:08:44 -04:00
> - Pagination support [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31011) in GitLab 15.3 [with a flag](../administration/feature_flags.md) named `approval_rules_pagination`. Enabled by default.
2022-08-04 08:11:22 -04:00
> - `applies_to_all_protected_branches` property was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335316) in GitLab 15.3.
2019-08-19 13:56:18 -04:00
You can request information about a project's approval rules using the following endpoint:
2020-02-27 04:09:01 -05:00
```plaintext
2019-08-19 13:56:18 -04:00
GET /projects/:id/approval_rules
```
2022-07-20 14:08:44 -04:00
Use the `page` and `per_page` [pagination ](index.md#offset-based-pagination ) parameters to restrict the list of approval rules.
2022-09-07 14:13:50 -04:00
Supported attributes:
2019-08-19 13:56:18 -04:00
| Attribute | Type | Required | Description |
|----------------------|---------|----------|-----------------------------------------------------------|
2022-09-07 14:13:50 -04:00
| `id` | integer or string | ** {check-circle}** Yes | The ID or [URL-encoded path of a project ](index.md#namespaced-path-encoding ). |
2019-08-19 13:56:18 -04:00
```json
[
{
"id": 1,
"name": "security",
"rule_type": "regular",
"eligible_approvers": [
{
2019-05-18 17:27:41 -04:00
"id": 5,
2019-08-19 13:56:18 -04:00
"name": "John Doe",
"username": "jdoe",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/jdoe"
},
{
"id": 50,
"name": "Group Member 1",
"username": "group_member_1",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/group_member_1"
2019-05-18 17:27:41 -04:00
}
2019-08-19 13:56:18 -04:00
],
"approvals_required": 3,
"users": [
{
"id": 5,
"name": "John Doe",
"username": "jdoe",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/jdoe"
}
],
"groups": [
{
"id": 5,
2019-05-18 17:27:41 -04:00
"name": "group1",
"path": "group1",
"description": "",
"visibility": "public",
"lfs_enabled": false,
"avatar_url": null,
"web_url": "http://localhost/groups/group1",
"request_access_enabled": false,
"full_name": "group1",
"full_path": "group1",
"parent_id": null,
"ldap_cn": null,
"ldap_access": null
}
2019-08-19 13:56:18 -04:00
],
2022-08-04 08:11:22 -04:00
"applies_to_all_protected_branches": false,
2020-01-20 10:09:18 -05:00
"protected_branches": [
{
"id": 1,
"name": "master",
"push_access_levels": [
{
"access_level": 30,
"access_level_description": "Developers + Maintainers"
}
],
"merge_access_levels": [
{
"access_level": 30,
"access_level_description": "Developers + Maintainers"
}
],
"unprotect_access_levels": [
{
"access_level": 40,
"access_level_description": "Maintainers"
}
],
"code_owner_approval_required": "false"
}
],
2019-08-19 13:56:18 -04:00
"contains_hidden_groups": false
}
]
```
2020-11-20 10:09:16 -05:00
### Get a single project-level rule
2022-08-04 08:11:22 -04:00
> - Introduced in GitLab 13.7.
> - `applies_to_all_protected_branches` property was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335316) in GitLab 15.3.
2020-11-20 10:09:16 -05:00
You can request information about a single project approval rules using the following endpoint:
```plaintext
GET /projects/:id/approval_rules/:approval_rule_id
```
2022-09-07 14:13:50 -04:00
Supported attributes:
2020-11-20 10:09:16 -05:00
| Attribute | Type | Required | Description |
|----------------------|---------|----------|-----------------------------------------------------------|
2022-09-07 14:13:50 -04:00
| `id` | integer or string | ** {check-circle}** Yes | The ID or [URL-encoded path of a project ](index.md#namespaced-path-encoding ). |
| `approval_rule_id` | integer | ** {check-circle}** Yes | The ID of a approval rule. |
2020-11-20 10:09:16 -05:00
```json
{
"id": 1,
"name": "security",
"rule_type": "regular",
"eligible_approvers": [
{
"id": 5,
"name": "John Doe",
"username": "jdoe",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/jdoe"
},
{
"id": 50,
"name": "Group Member 1",
"username": "group_member_1",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/group_member_1"
}
],
"approvals_required": 3,
"users": [
{
"id": 5,
"name": "John Doe",
"username": "jdoe",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/jdoe"
}
],
"groups": [
{
"id": 5,
"name": "group1",
"path": "group1",
"description": "",
"visibility": "public",
"lfs_enabled": false,
"avatar_url": null,
"web_url": "http://localhost/groups/group1",
"request_access_enabled": false,
"full_name": "group1",
"full_path": "group1",
"parent_id": null,
"ldap_cn": null,
"ldap_access": null
}
],
2022-08-04 08:11:22 -04:00
"applies_to_all_protected_branches": false,
2020-11-20 10:09:16 -05:00
"protected_branches": [
{
"id": 1,
"name": "master",
"push_access_levels": [
{
"access_level": 30,
"access_level_description": "Developers + Maintainers"
}
],
"merge_access_levels": [
{
"access_level": 30,
"access_level_description": "Developers + Maintainers"
}
],
"unprotect_access_levels": [
{
"access_level": 40,
"access_level_description": "Maintainers"
}
],
"code_owner_approval_required": "false"
}
],
"contains_hidden_groups": false
}
```
2019-08-19 13:56:18 -04:00
### Create project-level rule
2021-02-03 10:09:24 -05:00
> - Moved to GitLab Premium in 13.9.
2022-05-10 08:07:47 -04:00
> - [Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/357300) the Vulnerability-Check feature in GitLab 15.0.
2022-08-04 08:11:22 -04:00
> - `applies_to_all_protected_branches` property was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335316) in GitLab 15.3.
2022-01-31 22:14:04 -05:00
2019-08-19 13:56:18 -04:00
You can create project approval rules using the following endpoint:
2020-02-27 04:09:01 -05:00
```plaintext
2019-08-19 13:56:18 -04:00
POST /projects/:id/approval_rules
```
2022-09-07 14:13:50 -04:00
Supported attributes:
2019-08-19 13:56:18 -04:00
2022-09-02 17:10:02 -04:00
| Attribute | Type | Required | Description |
|-------------------------------------|-------------------|----------|------------ |
2022-09-07 14:13:50 -04:00
| `id` | integer or string | ** {check-circle}** Yes | The ID or [URL-encoded path of a project ](index.md#namespaced-path-encoding ). |
| `approvals_required` | integer | ** {check-circle}** Yes | The number of required approvals for this rule. |
| `name` | string | ** {check-circle}** Yes | The name of the approval rule. |
| `applies_to_all_protected_branches` | boolean | ** {dotted-circle}** No | Whether the rule is applied to all protected branches. If set to `true` , the value of `protected_branch_ids` is ignored. Default is `false` . [Introduced ](https://gitlab.com/gitlab-org/gitlab/-/issues/335316 ) in GitLab 15.3. |
| `group_ids` | Array | ** {dotted-circle}** No | The IDs of groups as approvers. |
| `protected_branch_ids` | Array | ** {dotted-circle}** No | The IDs of protected branches to scope the rule by. To identify the ID, [use the API ](protected_branches.md#list-protected-branches ). |
| `report_type` | string | ** {dotted-circle}** No | The report type required when the rule type is `report_approver` . The supported report types are `license_scanning` and `code_coverage` . |
| `rule_type` | string | ** {dotted-circle}** No | The type of rule. `any_approver` is a pre-configured default rule with `approvals_required` at `0` . Other rules are `regular` . |
| `user_ids` | Array | ** {dotted-circle}** No | The IDs of users as approvers. |
2019-08-19 13:56:18 -04:00
```json
{
"id": 1,
"name": "security",
"rule_type": "regular",
"eligible_approvers": [
{
"id": 2,
"name": "John Doe",
"username": "jdoe",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/jdoe"
},
{
"id": 50,
"name": "Group Member 1",
"username": "group_member_1",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/group_member_1"
2019-05-18 17:27:41 -04:00
}
],
2019-08-19 13:56:18 -04:00
"approvals_required": 1,
"users": [
{
"id": 2,
"name": "John Doe",
"username": "jdoe",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/jdoe"
}
],
"groups": [
{
"id": 5,
"name": "group1",
"path": "group1",
"description": "",
"visibility": "public",
"lfs_enabled": false,
"avatar_url": null,
"web_url": "http://localhost/groups/group1",
"request_access_enabled": false,
"full_name": "group1",
"full_path": "group1",
"parent_id": null,
"ldap_cn": null,
"ldap_access": null
}
],
2022-08-04 08:11:22 -04:00
"applies_to_all_protected_branches": false,
2020-01-20 10:09:18 -05:00
"protected_branches": [
{
"id": 1,
"name": "master",
"push_access_levels": [
{
"access_level": 30,
"access_level_description": "Developers + Maintainers"
}
],
"merge_access_levels": [
{
"access_level": 30,
"access_level_description": "Developers + Maintainers"
}
],
"unprotect_access_levels": [
{
"access_level": 40,
"access_level_description": "Maintainers"
}
],
"code_owner_approval_required": "false"
}
],
2019-08-19 13:56:18 -04:00
"contains_hidden_groups": false
}
```
2021-09-20 20:09:28 -04:00
You can increase the default number of 0 required approvers like this:
```shell
curl --request POST --header "PRIVATE-TOKEN: < your_access_token > " \
--header 'Content-Type: application/json' \
--data '{"name": "Any name", "rule_type": "any_approver", "approvals_required": 2}'
```
Another example is creating an additional, user-specific rule:
```shell
curl --request POST --header "PRIVATE-TOKEN: < your_access_token > " \
--header 'Content-Type: application/json' \
--data '{"name": "Name of your rule", "approvals_required": 3, "user_ids": [123, 456, 789]}' \
https://gitlab.example.com/api/v4/projects/< project_id > /approval_rules
```
2019-08-19 13:56:18 -04:00
### Update project-level rule
2021-02-03 10:09:24 -05:00
> - Moved to GitLab Premium in 13.9.
2022-05-10 08:07:47 -04:00
> - [Removed](https://gitlab.com/gitlab-org/gitlab/-/issues/357300) the Vulnerability-Check feature in GitLab 15.0.
2022-08-04 08:11:22 -04:00
> - `applies_to_all_protected_branches` property was [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/335316) in GitLab 15.3.
2022-01-31 22:14:04 -05:00
2019-08-19 13:56:18 -04:00
You can update project approval rules using the following endpoint:
2020-02-27 04:09:01 -05:00
```plaintext
2019-08-19 13:56:18 -04:00
PUT /projects/:id/approval_rules/:approval_rule_id
```
2021-03-08 13:09:12 -05:00
**Important:** Approvers and groups not in the `users` /`groups` parameters are **removed**
2019-08-19 13:56:18 -04:00
2022-09-07 14:13:50 -04:00
Supported attributes:
2019-08-19 13:56:18 -04:00
2022-09-02 17:10:02 -04:00
| Attribute | Type | Required | Description |
|-------------------------------------|-------------------|----------|-------------|
2022-09-07 14:13:50 -04:00
| `id` | integer or string | ** {check-circle}** Yes | The ID or [URL-encoded path of a project ](index.md#namespaced-path-encoding ). |
| `approvals_required` | integer | ** {check-circle}** Yes | The number of required approvals for this rule. |
| `approval_rule_id` | integer | ** {check-circle}** Yes | The ID of a approval rule. |
| `name` | string | ** {check-circle}** Yes | The name of the approval rule. |
| `applies_to_all_protected_branches` | boolean | ** {dotted-circle}** No | Whether the rule is applied to all protected branches. If set to `true` , the value of `protected_branch_ids` is ignored. Default is `false` . [Introduced ](https://gitlab.com/gitlab-org/gitlab/-/issues/335316 ) in GitLab 15.3. |
| `group_ids` | Array | ** {dotted-circle}** No | The IDs of groups as approvers. |
| `protected_branch_ids` | Array | ** {dotted-circle}** No | The IDs of protected branches to scope the rule by. To identify the ID, [use the API ](protected_branches.md#list-protected-branches ). |
| `user_ids` | Array | ** {dotted-circle}** No | The IDs of users as approvers. |
2019-08-19 13:56:18 -04:00
```json
{
"id": 1,
"name": "security",
"rule_type": "regular",
"eligible_approvers": [
{
"id": 2,
"name": "John Doe",
"username": "jdoe",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/jdoe"
},
{
"id": 50,
"name": "Group Member 1",
"username": "group_member_1",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/group_member_1"
}
],
"approvals_required": 1,
"users": [
{
"id": 2,
"name": "John Doe",
"username": "jdoe",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/jdoe"
}
],
"groups": [
{
"id": 5,
"name": "group1",
"path": "group1",
"description": "",
"visibility": "public",
"lfs_enabled": false,
"avatar_url": null,
"web_url": "http://localhost/groups/group1",
"request_access_enabled": false,
"full_name": "group1",
"full_path": "group1",
"parent_id": null,
"ldap_cn": null,
"ldap_access": null
}
],
2022-08-04 08:11:22 -04:00
"applies_to_all_protected_branches": false,
2020-01-20 10:09:18 -05:00
"protected_branches": [
{
"id": 1,
"name": "master",
"push_access_levels": [
{
"access_level": 30,
"access_level_description": "Developers + Maintainers"
}
],
"merge_access_levels": [
{
"access_level": 30,
"access_level_description": "Developers + Maintainers"
}
],
"unprotect_access_levels": [
{
"access_level": 40,
"access_level_description": "Maintainers"
}
],
"code_owner_approval_required": "false"
}
],
2019-08-19 13:56:18 -04:00
"contains_hidden_groups": false
2019-05-18 17:27:41 -04:00
}
```
2019-08-19 13:56:18 -04:00
### Delete project-level rule
2022-09-02 17:10:02 -04:00
> Moved to GitLab Premium in 13.9.
2019-08-19 13:56:18 -04:00
You can delete project approval rules using the following endpoint:
2020-02-27 04:09:01 -05:00
```plaintext
2019-08-19 13:56:18 -04:00
DELETE /projects/:id/approval_rules/:approval_rule_id
```
2022-09-07 14:13:50 -04:00
Supported attributes:
2019-08-19 13:56:18 -04:00
2022-08-04 08:11:22 -04:00
| Attribute | Type | Required | Description |
|--------------------|-------------------|----------|------------------------------------------------------------------------------|
2022-09-07 14:13:50 -04:00
| `id` | integer or string | ** {check-circle}** Yes | The ID or [URL-encoded path of a project ](index.md#namespaced-path-encoding ). |
| `approval_rule_id` | integer | ** {check-circle}** Yes | The ID of a approval rule. |
2019-08-19 13:56:18 -04:00
2022-01-25 07:14:14 -05:00
## Merge request-level MR approvals
2019-05-18 17:27:41 -04:00
2022-01-25 07:14:14 -05:00
Configuration for approvals on a specific merge request. Must be authenticated for all endpoints.
2019-05-18 17:27:41 -04:00
### Get Configuration
2021-10-08 14:13:02 -04:00
> Moved to GitLab Premium in 13.9.
2019-05-18 17:27:41 -04:00
You can request information about a merge request's approval status using the
following endpoint:
2020-02-27 04:09:01 -05:00
```plaintext
2019-05-18 17:27:41 -04:00
GET /projects/:id/merge_requests/:merge_request_iid/approvals
```
2022-09-07 14:13:50 -04:00
Supported attributes:
2019-05-18 17:27:41 -04:00
2022-08-04 08:11:22 -04:00
| Attribute | Type | Required | Description |
|---------------------|-------------------|----------|------------------------------------------------------------------------------|
2022-09-07 14:13:50 -04:00
| `id` | integer or string | ** {check-circle}** Yes | The ID or [URL-encoded path of a project ](index.md#namespaced-path-encoding ). |
| `merge_request_iid` | integer | ** {check-circle}** Yes | The IID of the merge request. |
2019-05-18 17:27:41 -04:00
```json
{
"id": 5,
"iid": 5,
"project_id": 1,
"title": "Approvals API",
"description": "Test",
"state": "opened",
"created_at": "2016-06-08T00:19:52.638Z",
"updated_at": "2016-06-08T21:20:42.470Z",
"merge_status": "cannot_be_merged",
"approvals_required": 2,
"approvals_left": 1,
"approved_by": [
{
"user": {
"name": "Administrator",
"username": "root",
"id": 1,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon",
2019-06-25 11:37:47 -04:00
"web_url": "http://localhost:3000/root"
2019-05-18 17:27:41 -04:00
}
}
2021-04-29 08:09:58 -04:00
]
2019-05-18 17:27:41 -04:00
}
```
### Change approval configuration
2021-10-08 14:13:02 -04:00
> Moved to GitLab Premium in 13.9.
2019-05-18 17:27:41 -04:00
If you are allowed to, you can change `approvals_required` using the following
endpoint:
2020-02-27 04:09:01 -05:00
```plaintext
2019-05-18 17:27:41 -04:00
POST /projects/:id/merge_requests/:merge_request_iid/approvals
```
2022-09-07 14:13:50 -04:00
Supported attributes:
2019-05-18 17:27:41 -04:00
2022-09-02 17:10:02 -04:00
| Attribute | Type | Required | Description |
|----------------------|-------------------|----------|-------------|
2022-09-07 14:13:50 -04:00
| `id` | integer or string | ** {check-circle}** Yes | The ID or [URL-encoded path of a project ](index.md#namespaced-path-encoding ). |
| `approvals_required` | integer | ** {check-circle}** Yes | Approvals required before MR can be merged. Deprecated in GitLab 12.0 in favor of Approval Rules API. |
| `merge_request_iid` | integer | ** {check-circle}** Yes | The IID of the merge request. |
2019-05-18 17:27:41 -04:00
```json
{
"id": 5,
"iid": 5,
"project_id": 1,
"title": "Approvals API",
"description": "Test",
"state": "opened",
"created_at": "2016-06-08T00:19:52.638Z",
"updated_at": "2016-06-08T21:20:42.470Z",
"merge_status": "cannot_be_merged",
"approvals_required": 2,
"approvals_left": 2,
2019-08-19 13:56:18 -04:00
"approved_by": []
2019-05-18 17:27:41 -04:00
}
```
2019-09-05 08:19:08 -04:00
### Get the approval state of merge requests
2019-08-30 02:29:02 -04:00
2022-09-02 17:10:02 -04:00
> Moved to GitLab Premium in 13.9.
2019-08-30 02:29:02 -04:00
2019-09-05 08:19:08 -04:00
You can request information about a merge request's approval state by using the following endpoint:
2019-08-30 02:29:02 -04:00
2020-02-27 04:09:01 -05:00
```plaintext
2019-08-30 02:29:02 -04:00
GET /projects/:id/merge_requests/:merge_request_iid/approval_state
```
2021-03-08 13:09:12 -05:00
The `approval_rules_overwritten` are `true` if the merge request level rules
are created for the merge request. If there are none, it is `false` .
2019-08-30 02:29:02 -04:00
2019-09-03 04:44:14 -04:00
This includes additional information about the users who have already approved
(`approved_by`) and whether a rule is already approved (`approved`).
2019-08-30 02:29:02 -04:00
2022-09-07 14:13:50 -04:00
Supported attributes:
2019-08-30 02:29:02 -04:00
2022-08-04 08:11:22 -04:00
| Attribute | Type | Required | Description |
|---------------------|-------------------|----------|------------------------------------------------------------------------------|
2022-09-07 14:13:50 -04:00
| `id` | integer or string | ** {check-circle}** Yes | The ID or [URL-encoded path of a project ](index.md#namespaced-path-encoding ). |
| `merge_request_iid` | integer | ** {check-circle}** Yes | The IID of the merge request. |
2019-08-30 02:29:02 -04:00
```json
{
"approval_rules_overwritten": true,
"rules": [
{
"id": 1,
"name": "Ruby",
"rule_type": "regular",
"eligible_approvers": [
{
"id": 4,
"name": "John Doe",
"username": "jdoe",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/jdoe"
}
],
"approvals_required": 2,
"users": [
{
"id": 4,
"name": "John Doe",
"username": "jdoe",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/jdoe"
}
],
"groups": [],
"contains_hidden_groups": false,
"approved_by": [
{
"id": 4,
"name": "John Doe",
"username": "jdoe",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/jdoe"
}
],
"source_rule": null,
2020-04-06 11:10:04 -04:00
"approved": true,
"overridden": false
2019-08-30 02:29:02 -04:00
}
]
}
```
2019-08-22 08:42:15 -04:00
### Get merge request level rules
2021-02-03 10:09:24 -05:00
> - Moved to GitLab Premium in 13.9.
2022-07-20 14:08:44 -04:00
> - Pagination support [introduced](https://gitlab.com/gitlab-org/gitlab/-/issues/31011) in GitLab 15.3 [with a flag](../administration/feature_flags.md) named `approval_rules_pagination`. Enabled by default.
2019-08-22 08:42:15 -04:00
You can request information about a merge request's approval rules using the following endpoint:
2020-02-27 04:09:01 -05:00
```plaintext
2019-08-22 08:42:15 -04:00
GET /projects/:id/merge_requests/:merge_request_iid/approval_rules
```
2022-07-20 14:08:44 -04:00
Use the `page` and `per_page` [pagination ](index.md#offset-based-pagination ) parameters to restrict the list of approval rules.
2022-09-07 14:13:50 -04:00
Supported attributes:
2019-08-22 08:42:15 -04:00
| Attribute | Type | Required | Description |
|---------------------|---------|----------|---------------------|
2022-09-07 14:13:50 -04:00
| `id` | integer or string | ** {check-circle}** Yes | The ID or [URL-encoded path of a project ](index.md#namespaced-path-encoding ). |
| `merge_request_iid` | integer | ** {check-circle}** Yes | The IID of the merge request. |
2019-08-22 08:42:15 -04:00
```json
[
{
"id": 1,
"name": "security",
"rule_type": "regular",
"eligible_approvers": [
{
"id": 5,
"name": "John Doe",
"username": "jdoe",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/jdoe"
},
{
"id": 50,
"name": "Group Member 1",
"username": "group_member_1",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/group_member_1"
}
],
"approvals_required": 3,
"source_rule": null,
"users": [
{
"id": 5,
"name": "John Doe",
"username": "jdoe",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/jdoe"
}
],
"groups": [
{
"id": 5,
"name": "group1",
"path": "group1",
"description": "",
"visibility": "public",
"lfs_enabled": false,
"avatar_url": null,
"web_url": "http://localhost/groups/group1",
"request_access_enabled": false,
"full_name": "group1",
"full_path": "group1",
"parent_id": null,
"ldap_cn": null,
"ldap_access": null
}
],
2020-04-06 11:10:04 -04:00
"contains_hidden_groups": false,
"overridden": false
2019-08-22 08:42:15 -04:00
}
]
```
2022-03-21 17:08:16 -04:00
### Get a single merge request level rule
> [Introduced](https://gitlab.com/gitlab-org/gitlab/-/merge_requests/82767) in GitLab 14.10.
You can request information about a single merge request approval rule using the following endpoint:
```plaintext
GET /projects/:id/merge_requests/:merge_request_iid/approval_rules/:approval_rule_id
```
2022-09-07 14:13:50 -04:00
Supported attributes:
2022-03-21 17:08:16 -04:00
| Attribute | Type | Required | Description |
|---------------------|---------|----------|------------------------------------------------------------------------------|
2022-09-07 14:13:50 -04:00
| `id` | integer or string | ** {check-circle}** Yes | The ID or [URL-encoded path of a project ](index.md#namespaced-path-encoding ). |
| `approval_rule_id` | integer | ** {check-circle}** Yes | The ID of an approval rule. |
| `merge_request_iid` | integer | ** {check-circle}** Yes | The IID of a merge request. |
2022-03-21 17:08:16 -04:00
```json
{
"id": 1,
"name": "security",
"rule_type": "regular",
"eligible_approvers": [
{
"id": 5,
"name": "John Doe",
"username": "jdoe",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/jdoe"
},
{
"id": 50,
"name": "Group Member 1",
"username": "group_member_1",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/group_member_1"
}
],
"approvals_required": 3,
"source_rule": null,
"users": [
{
"id": 5,
"name": "John Doe",
"username": "jdoe",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/jdoe"
}
],
"groups": [
{
"id": 5,
"name": "group1",
"path": "group1",
"description": "",
"visibility": "public",
"lfs_enabled": false,
"avatar_url": null,
"web_url": "http://localhost/groups/group1",
"request_access_enabled": false,
"full_name": "group1",
"full_path": "group1",
"parent_id": null,
"ldap_cn": null,
"ldap_access": null
}
],
"contains_hidden_groups": false,
"overridden": false
}
```
2019-08-22 08:42:15 -04:00
### Create merge request level rule
2022-09-02 17:10:02 -04:00
> Moved to GitLab Premium in 13.9.
2019-08-22 08:42:15 -04:00
You can create merge request approval rules using the following endpoint:
2020-02-27 04:09:01 -05:00
```plaintext
2019-08-22 08:42:15 -04:00
POST /projects/:id/merge_requests/:merge_request_iid/approval_rules
```
2022-09-07 14:13:50 -04:00
Supported attributes:
2019-08-22 08:42:15 -04:00
| Attribute | Type | Required | Description |
|----------------------------|---------|----------|------------------------------------------------|
2022-09-07 14:13:50 -04:00
| `id` | integer or string | ** {check-circle}** Yes | The ID or [URL-encoded path of a project ](index.md#namespaced-path-encoding ) |
| `approvals_required` | integer | ** {check-circle}** Yes | The number of required approvals for this rule. |
| `merge_request_iid` | integer | ** {check-circle}** Yes | The IID of the merge request. |
| `name` | string | ** {check-circle}** Yes | The name of the approval rule. |
| `approval_project_rule_id` | integer | ** {dotted-circle}** No | The ID of a project-level approval rule. |
| `group_ids` | Array | ** {dotted-circle}** No | The IDs of groups as approvers. |
| `user_ids` | Array | ** {dotted-circle}** No | The IDs of users as approvers. |
2019-08-22 08:42:15 -04:00
2019-08-23 03:50:41 -04:00
**Important:** When `approval_project_rule_id` is set, the `name` , `users` and
2021-03-08 13:09:12 -05:00
`groups` of project-level rule are copied. The `approvals_required` specified
is used.
2019-08-22 08:42:15 -04:00
```json
{
"id": 1,
"name": "security",
"rule_type": "regular",
"eligible_approvers": [
{
"id": 2,
"name": "John Doe",
"username": "jdoe",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/jdoe"
},
{
"id": 50,
"name": "Group Member 1",
"username": "group_member_1",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/group_member_1"
}
],
"approvals_required": 1,
"source_rule": null,
"users": [
{
"id": 2,
"name": "John Doe",
"username": "jdoe",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/jdoe"
}
],
"groups": [
{
"id": 5,
"name": "group1",
"path": "group1",
"description": "",
"visibility": "public",
"lfs_enabled": false,
"avatar_url": null,
"web_url": "http://localhost/groups/group1",
"request_access_enabled": false,
"full_name": "group1",
"full_path": "group1",
"parent_id": null,
"ldap_cn": null,
"ldap_access": null
}
],
2020-04-06 11:10:04 -04:00
"contains_hidden_groups": false,
"overridden": false
2019-08-22 08:42:15 -04:00
}
```
### Update merge request level rule
2022-09-02 17:10:02 -04:00
> Moved to GitLab Premium in 13.9.
2019-08-22 08:42:15 -04:00
You can update merge request approval rules using the following endpoint:
2020-02-27 04:09:01 -05:00
```plaintext
2020-01-16 19:09:00 -05:00
PUT /projects/:id/merge_requests/:merge_request_iid/approval_rules/:approval_rule_id
2019-08-22 08:42:15 -04:00
```
2021-03-08 13:09:12 -05:00
**Important:** Approvers and groups not in the `users` /`groups` parameters are **removed**
2019-08-22 08:42:15 -04:00
2019-08-23 03:50:41 -04:00
**Important:** Updating a `report_approver` or `code_owner` rule is not allowed.
These are system generated rules.
2022-09-07 14:13:50 -04:00
Supported attributes:
2019-08-22 08:42:15 -04:00
| Attribute | Type | Required | Description |
|----------------------|---------|----------|------------------------------------------------|
2022-09-07 14:13:50 -04:00
| `id` | integer or string | ** {check-circle}** Yes | The ID or [URL-encoded path of a project ](index.md#namespaced-path-encoding ). |
| `approvals_required` | integer | ** {check-circle}** Yes | The number of required approvals for this rule. |
| `approval_rule_id` | integer | ** {check-circle}** Yes | The ID of an approval rule. |
| `merge_request_iid` | integer | ** {check-circle}** Yes | The IID of a merge request. |
| `name` | string | ** {check-circle}** Yes | The name of the approval rule. |
| `group_ids` | Array | ** {dotted-circle}** No | The IDs of groups as approvers. |
| `user_ids` | Array | ** {dotted-circle}** No | The IDs of users as approvers. |
2019-08-22 08:42:15 -04:00
```json
{
"id": 1,
"name": "security",
"rule_type": "regular",
"eligible_approvers": [
{
"id": 2,
"name": "John Doe",
"username": "jdoe",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/jdoe"
},
{
"id": 50,
"name": "Group Member 1",
"username": "group_member_1",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/group_member_1"
}
],
"approvals_required": 1,
"source_rule": null,
"users": [
{
"id": 2,
"name": "John Doe",
"username": "jdoe",
"state": "active",
"avatar_url": "https://www.gravatar.com/avatar/0?s=80& d=identicon",
"web_url": "http://localhost/jdoe"
}
],
"groups": [
{
"id": 5,
"name": "group1",
"path": "group1",
"description": "",
"visibility": "public",
"lfs_enabled": false,
"avatar_url": null,
"web_url": "http://localhost/groups/group1",
"request_access_enabled": false,
"full_name": "group1",
"full_path": "group1",
"parent_id": null,
"ldap_cn": null,
"ldap_access": null
}
],
2020-04-06 11:10:04 -04:00
"contains_hidden_groups": false,
"overridden": false
2019-08-22 08:42:15 -04:00
}
```
### Delete merge request level rule
2022-09-02 17:10:02 -04:00
> Moved to GitLab Premium in 13.9.
2019-08-22 08:42:15 -04:00
You can delete merge request approval rules using the following endpoint:
2020-02-27 04:09:01 -05:00
```plaintext
2019-08-22 08:42:15 -04:00
DELETE /projects/:id/merge_requests/:merge_request_iid/approval_rules/:approval_rule_id
```
2019-08-23 03:50:41 -04:00
**Important:** Deleting a `report_approver` or `code_owner` rule is not allowed.
These are system generated rules.
2022-09-07 14:13:50 -04:00
Supported attributes:
2019-08-22 08:42:15 -04:00
| Attribute | Type | Required | Description |
|---------------------|---------|----------|---------------------------|
2022-09-07 14:13:50 -04:00
| `id` | integer or string | ** {check-circle}** Yes | The ID or [URL-encoded path of a project ](index.md#namespaced-path-encoding ). |
| `approval_rule_id` | integer | ** {check-circle}** Yes | The ID of an approval rule. |
| `merge_request_iid` | integer | ** {check-circle}** Yes | The IID of the merge request. |
2019-08-30 02:35:13 -04:00
2022-01-25 07:14:14 -05:00
## Approve merge request
2019-08-30 02:35:13 -04:00
2021-10-08 14:13:02 -04:00
> Moved to GitLab Premium in 13.9.
2019-08-30 02:35:13 -04:00
If you are allowed to, you can approve a merge request using the following
endpoint:
2020-02-27 04:09:01 -05:00
```plaintext
2019-08-30 02:35:13 -04:00
POST /projects/:id/merge_requests/:merge_request_iid/approve
```
2022-09-07 14:13:50 -04:00
Supported attributes:
2019-08-30 02:35:13 -04:00
| Attribute | Type | Required | Description |
|---------------------|---------|----------|-------------------------|
2022-09-07 14:13:50 -04:00
| `id` | integer or string | ** {check-circle}** Yes | The ID or [URL-encoded path of a project ](index.md#namespaced-path-encoding ). |
| `approval_password` | string | ** {dotted-circle}** No | Current user's password. Required if [**Require user password to approve** ](../user/project/merge_requests/approvals/settings.md#require-user-password-to-approve ) is enabled in the project settings. |
| `merge_request_iid` | integer | ** {check-circle}** Yes | The IID of the merge request. |
| `sha` | string | ** {dotted-circle}** No | The `HEAD` of the merge request. |
2019-08-30 02:35:13 -04:00
The `sha` parameter works in the same way as
2022-02-10 13:18:16 -05:00
when [accepting a merge request ](merge_requests.md#merge-a-merge-request ): if it is passed, then it must
2019-08-30 02:35:13 -04:00
match the current HEAD of the merge request for the approval to be added. If it
2021-03-08 13:09:12 -05:00
does not match, the response code is `409` .
2019-08-30 02:35:13 -04:00
```json
{
"id": 5,
"iid": 5,
"project_id": 1,
"title": "Approvals API",
"description": "Test",
"state": "opened",
"created_at": "2016-06-08T00:19:52.638Z",
"updated_at": "2016-06-09T21:32:14.105Z",
"merge_status": "can_be_merged",
"approvals_required": 2,
"approvals_left": 0,
"approved_by": [
{
"user": {
"name": "Administrator",
"username": "root",
"id": 1,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon",
"web_url": "http://localhost:3000/root"
}
},
{
"user": {
"name": "Nico Cartwright",
"username": "ryley",
"id": 2,
"state": "active",
"avatar_url": "http://www.gravatar.com/avatar/cf7ad14b34162a76d593e3affca2adca?s=80\u0026d=identicon",
"web_url": "http://localhost:3000/ryley"
}
}
2021-04-29 08:09:58 -04:00
]
2019-08-30 02:35:13 -04:00
}
```
2022-01-25 07:14:14 -05:00
## Unapprove merge request
2019-08-30 02:35:13 -04:00
2021-10-08 14:13:02 -04:00
> Moved to GitLab Premium in 13.9.
2019-08-30 02:35:13 -04:00
If you did approve a merge request, you can unapprove it using the following
endpoint:
2020-02-27 04:09:01 -05:00
```plaintext
2019-08-30 02:35:13 -04:00
POST /projects/:id/merge_requests/:merge_request_iid/unapprove
```
2022-09-07 14:13:50 -04:00
Supported attributes:
2019-08-30 02:35:13 -04:00
| Attribute | Type | Required | Description |
|---------------------|---------|----------|---------------------|
2022-09-07 14:13:50 -04:00
| `id` | integer or string | ** {check-circle}** Yes | The ID or [URL-encoded path of a project ](index.md#namespaced-path-encoding ). |
| `merge_request_iid` | integer | ** {check-circle}** Yes | The IID of a merge request. |