Webhook events
- Tier: Free, Premium, Ultimate
- Offering: GitLab.com, GitLab Self-Managed, GitLab Dedicated
Connect GitLab to your external applications and automate your workflow with webhooks. When specific events occur in GitLab, webhooks send HTTP POST requests with detailed information to your configured endpoints. Build automated processes that react to code changes, deployments, comments, and other activities without manual intervention.
This page lists the events that are triggered for project webhooks and group webhooks.
For a list of events triggered for system webhooks, see system webhooks.
Events triggered for both project and group webhooks
| Event type | Trigger |
|---|---|
| Comment event | A new comment is made or edited on commits, merge requests, issues, and code snippets. 1 |
| Deployment event | A deployment starts, succeeds, fails, or is canceled. |
| Emoji event | An emoji reaction is added or removed. |
| Feature flag event | A feature flag is turned on or off. |
| Job event | A job status changes. |
| Merge request event | A merge request is created, edited, merged, or closed, or a commit is added in the source branch. |
| Milestone event | A milestone is created, closed, reopened, or deleted. |
| Pipeline event | A pipeline status changes. |
| Project or group access token event | A project or group access token will expire in seven days. |
| Push event | A push is made to the repository. |
| Release event | A release is created, edited, or deleted. |
| Tag event | Tags are created or deleted in the repository. |
| Vulnerability event | A vulnerability is created or updated. |
| Wiki page event | A wiki page is created, edited, or deleted. |
| Work item event | A new work item is created or an existing one is edited, closed, or reopened. |
Footnotes:
- Comment events triggered when the comment is edited introduced in GitLab 16.11.
Events triggered for group webhooks only
| Event type | Trigger |
|---|---|
| Group member event | A user is added or removed from a group, or a user’s access level or access expiration date changes. |
| Project event | A project is created or deleted in a group. |
| Subgroup event | A subgroup is created or removed from a group. |
If an author has no public email listed in their
GitLab profile, the email attribute in the
webhook payload displays a value of [REDACTED].
Push events
Push events are triggered when you push to the repository, except when:
- You push tags.
- A single push includes changes for more than three branches by default
(depending on the
push_event_hooks_limitsetting).
If you push more than 20 commits at once, the commits
attribute in the payload contains information about the newest 20 commits only.
Loading detailed commit data is expensive, so this restriction exists for performance reasons.
The total_commits_count attribute contains the actual number of commits.
If you create and push a branch without any new commits, the
commits attribute in the payload is empty.
Request header:
X-Gitlab-Event: Push HookPayload example:
{
"object_kind": "push",
"event_name": "push",
"before": "95790bf891e76fee5e1747ab589903a6a1f80f22",
"after": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
"ref": "refs/heads/master",
"ref_protected": true,
"checkout_sha": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
"message": "Hello World",
"user_id": 4,
"user_name": "John Smith",
"user_username": "jsmith",
"user_email": "john@example.com",
"user_avatar": "https://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=8://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=80",
"project_id": 15,
"project": {
"id": 15,
"name": "Diaspora",
"description": "",
"web_url": "http://example.com/mike/diaspora",
"avatar_url": null,
"git_ssh_url": "git@example.com:mike/diaspora.git",
"git_http_url": "http://example.com/mike/diaspora.git",
"namespace": "Mike",
"visibility_level": 0,
"path_with_namespace": "mike/diaspora",
"default_branch": "master",
"ci_config_path": null,
"homepage": "http://example.com/mike/diaspora",
"url": "git@example.com:mike/diaspora.git",
"ssh_url": "git@example.com:mike/diaspora.git",
"http_url": "http://example.com/mike/diaspora.git"
},
"commits": [
{
"id": "b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327",
"message": "Update Catalan translation to e38cb41.\n\nSee https://gitlab.com/gitlab-org/gitlab for more information",
"title": "Update Catalan translation to e38cb41.",
"timestamp": "2011-12-12T14:27:31+02:00",
"url": "http://example.com/mike/diaspora/commit/b6568db1bc1dcd7f8b4d5a946b0b91f9dacd7327",
"author": {
"name": "Jordi Mallach",
"email": "jordi@softcatala.org"
},
"added": ["CHANGELOG"],
"modified": ["app/controller/application.rb"],
"removed": []
},
{
"id": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
"message": "fixed readme",
"title": "fixed readme",
"timestamp": "2012-01-03T23:36:29+02:00",
"url": "http://example.com/mike/diaspora/commit/da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
"author": {
"name": "GitLab dev user",
"email": "gitlabdev@dv6700.(none)"
},
"added": ["CHANGELOG"],
"modified": ["app/controller/application.rb"],
"removed": []
}
],
"total_commits_count": 4,
"push_options": {},
"repository": {
"name": "Diaspora",
"url": "git@example.com:mike/diaspora.git",
"description": "",
"homepage": "http://example.com/mike/diaspora",
"git_http_url": "http://example.com/mike/diaspora.git",
"git_ssh_url": "git@example.com:mike/diaspora.git",
"visibility_level": 0
}
}Tag events
Tag events are triggered when you create or delete tags in the repository.
This hook is not executed if a single push includes changes for more than three
tags by default. This limit is controlled by the push_event_hooks_limit setting
(default: 3), which applies to both tags and branches. When exceeded,no webhooks
are triggered at all for that push event.
For GitLab Self-Managed instances, administrators can modify this limit using the Application Settings API.
Request header:
X-Gitlab-Event: Tag Push HookPayload example:
{
"object_kind": "tag_push",
"event_name": "tag_push",
"before": "0000000000000000000000000000000000000000",
"after": "82b3d5ae55f7080f1e6022629cdb57bfae7cccc7",
"ref": "refs/tags/v1.0.0",
"ref_protected": true,
"checkout_sha": "82b3d5ae55f7080f1e6022629cdb57bfae7cccc7",
"message": "Tag message",
"user_id": 1,
"user_name": "John Smith",
"user_username": "jsmith",
"user_email": "john@example.com",
"user_avatar": "https://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=8://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=80",
"project_id": 1,
"project": {
"id": 1,
"name": "Example",
"description": "",
"web_url": "http://example.com/jsmith/example",
"avatar_url": null,
"git_ssh_url": "git@example.com:jsmith/example.git",
"git_http_url": "http://example.com/jsmith/example.git",
"namespace": "Jsmith",
"visibility_level": 0,
"path_with_namespace": "jsmith/example",
"default_branch": "master",
"ci_config_path": null,
"homepage": "http://example.com/jsmith/example",
"url": "git@example.com:jsmith/example.git",
"ssh_url": "git@example.com:jsmith/example.git",
"http_url": "http://example.com/jsmith/example.git"
},
"commits": [],
"total_commits_count": 0,
"push_options": {},
"repository": {
"name": "Example",
"url": "ssh://git@example.com/jsmith/example.git",
"description": "",
"homepage": "http://example.com/jsmith/example",
"git_http_url": "http://example.com/jsmith/example.git",
"git_ssh_url": "git@example.com:jsmith/example.git",
"visibility_level": 0
}
}Work item events
Work item events are triggered when a work item is created, edited, closed, or reopened. The supported work item types are:
For issues and Service Desk issues, the object_kind is issue, and the type is Issue.
For all other work items, the object_kind field is work_item, and the type is the work item type.
For work item type Epic, to get events for changes, the webhook must be registered for the group.
The available values for object_attributes.action in the payload are:
openclosereopenupdate
The assignee and assignee_id keys are deprecated
and contain the first assignee only.
The escalation_status and escalation_policy fields are
only available for issue types which support escalations,
such as incidents.
Request header:
X-Gitlab-Event: Issue HookPayload example:
{
"object_kind": "issue",
"event_type": "issue",
"user": {
"id": 1,
"name": "Administrator",
"username": "root",
"avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon",
"email": "admin@example.com"
},
"project": {
"id": 1,
"name":"Gitlab Test",
"description":"Aut reprehenderit ut est.",
"web_url":"http://example.com/gitlabhq/gitlab-test",
"avatar_url":null,
"git_ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
"git_http_url":"http://example.com/gitlabhq/gitlab-test.git",
"namespace":"GitlabHQ",
"visibility_level":20,
"path_with_namespace":"gitlabhq/gitlab-test",
"default_branch":"master",
"ci_config_path": null,
"homepage":"http://example.com/gitlabhq/gitlab-test",
"url":"http://example.com/gitlabhq/gitlab-test.git",
"ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
"http_url":"http://example.com/gitlabhq/gitlab-test.git"
},
"object_attributes": {
"id": 301,
"title": "New API: create/update/delete file",
"assignee_ids": [51],
"assignee_id": 51,
"author_id": 51,
"project_id": 14,
"created_at": "2013-12-03T17:15:43Z",
"updated_at": "2013-12-03T17:15:43Z",
"updated_by_id": 1,
"last_edited_at": null,
"last_edited_by_id": null,
"relative_position": 0,
"description": "Create new API for manipulations with repository",
"milestone_id": null,
"state_id": 1,
"confidential": false,
"discussion_locked": true,
"due_date": null,
"moved_to_id": null,
"duplicated_to_id": null,
"time_estimate": 0,
"total_time_spent": 0,
"time_change": 0,
"human_total_time_spent": null,
"human_time_estimate": null,
"human_time_change": null,
"weight": null,
"health_status": "at_risk",
"type": "Issue",
"iid": 23,
"url": "http://example.com/diaspora/issues/23",
"state": "opened",
"action": "open",
"severity": "high",
"escalation_status": "triggered",
"escalation_policy": {
"id": 18,
"name": "Engineering On-call"
},
"labels": [{
"id": 206,
"title": "API",
"color": "#ffffff",
"project_id": 14,
"created_at": "2013-12-03T17:15:43Z",
"updated_at": "2013-12-03T17:15:43Z",
"template": false,
"description": "API related issues",
"type": "ProjectLabel",
"group_id": 41
}]
},
"repository": {
"name": "Gitlab Test",
"url": "http://example.com/gitlabhq/gitlab-test.git",
"description": "Aut reprehenderit ut est.",
"homepage": "http://example.com/gitlabhq/gitlab-test"
},
"assignees": [{
"name": "User1",
"username": "user1",
"avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
}],
"assignee": {
"name": "User1",
"username": "user1",
"avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
},
"labels": [{
"id": 206,
"title": "API",
"color": "#ffffff",
"project_id": 14,
"created_at": "2013-12-03T17:15:43Z",
"updated_at": "2013-12-03T17:15:43Z",
"template": false,
"description": "API related issues",
"type": "ProjectLabel",
"group_id": 41
}],
"changes": {
"updated_by_id": {
"previous": null,
"current": 1
},
"updated_at": {
"previous": "2017-09-15 16:50:55 UTC",
"current": "2017-09-15 16:52:00 UTC"
},
"labels": {
"previous": [{
"id": 206,
"title": "API",
"color": "#ffffff",
"project_id": 14,
"created_at": "2013-12-03T17:15:43Z",
"updated_at": "2013-12-03T17:15:43Z",
"template": false,
"description": "API related issues",
"type": "ProjectLabel",
"group_id": 41
}],
"current": [{
"id": 205,
"title": "Platform",
"color": "#123123",
"project_id": 14,
"created_at": "2013-12-03T17:15:43Z",
"updated_at": "2013-12-03T17:15:43Z",
"template": false,
"description": "Platform related issues",
"type": "ProjectLabel",
"group_id": 41
}]
}
}
}Comment events
Comment events are triggered when a new comment is made or edited on commits, merge requests, issues, and code snippets.
The note data is stored in object_attributes (for example, note or noteable_type).
The payload includes information about the target of the comment. For example,
a comment on an issue includes specific issue information under the issue key.
The available target types are:
commitmerge_requestissuesnippet
The available values for object_attributes.action in the payload are:
createupdate
Comment on a commit
Request header:
X-Gitlab-Event: Note HookPayload example:
{
"object_kind": "note",
"event_type": "note",
"user": {
"id": 1,
"name": "Administrator",
"username": "root",
"avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon",
"email": "admin@example.com"
},
"project_id": 5,
"project":{
"id": 5,
"name":"Gitlab Test",
"description":"Aut reprehenderit ut est.",
"web_url":"http://example.com/gitlabhq/gitlab-test",
"avatar_url":null,
"git_ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
"git_http_url":"http://example.com/gitlabhq/gitlab-test.git",
"namespace":"GitlabHQ",
"visibility_level":20,
"path_with_namespace":"gitlabhq/gitlab-test",
"default_branch":"master",
"homepage":"http://example.com/gitlabhq/gitlab-test",
"url":"http://example.com/gitlabhq/gitlab-test.git",
"ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
"http_url":"http://example.com/gitlabhq/gitlab-test.git"
},
"repository":{
"name": "Gitlab Test",
"url": "http://example.com/gitlab-org/gitlab-test.git",
"description": "Aut reprehenderit ut est.",
"homepage": "http://example.com/gitlab-org/gitlab-test"
},
"object_attributes": {
"id": 1243,
"note": "This is a commit comment. How does this work?",
"noteable_type": "Commit",
"author_id": 1,
"created_at": "2015-05-17 18:08:09 UTC",
"updated_at": "2015-05-17 18:08:09 UTC",
"project_id": 5,
"attachment":null,
"line_code": "bec9703f7a456cd2b4ab5fb3220ae016e3e394e3_0_1",
"commit_id": "cfe32cf61b73a0d5e9f13e774abde7ff789b1660",
"noteable_id": null,
"system": false,
"st_diff": {
"diff": "--- /dev/null\n+++ b/six\n@@ -0,0 +1 @@\n+Subproject commit 409f37c4f05865e4fb208c771485f211a22c4c2d\n",
"new_path": "six",
"old_path": "six",
"a_mode": "0",
"b_mode": "160000",
"new_file": true,
"renamed_file": false,
"deleted_file": false
},
"action": "create",
"url": "http://example.com/gitlab-org/gitlab-test/commit/cfe32cf61b73a0d5e9f13e774abde7ff789b1660#note_1243"
},
"commit": {
"id": "cfe32cf61b73a0d5e9f13e774abde7ff789b1660",
"message": "Add submodule\n\nSigned-off-by: Example User \u003cuser@example.com.com\u003e\n",
"timestamp": "2014-02-27T10:06:20+02:00",
"url": "http://example.com/gitlab-org/gitlab-test/commit/cfe32cf61b73a0d5e9f13e774abde7ff789b1660",
"author": {
"name": "Example User",
"email": "user@example.com"
}
}
}Comment on a merge request
Request header:
X-Gitlab-Event: Note HookPayload example:
{
"object_kind": "note",
"event_type": "note",
"user": {
"id": 1,
"name": "Administrator",
"username": "root",
"avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon",
"email": "admin@example.com"
},
"project_id": 5,
"project":{
"id": 5,
"name":"Gitlab Test",
"description":"Aut reprehenderit ut est.",
"web_url":"http://example.com/gitlab-org/gitlab-test",
"avatar_url":null,
"git_ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
"git_http_url":"http://example.com/gitlab-org/gitlab-test.git",
"namespace":"Gitlab Org",
"visibility_level":10,
"path_with_namespace":"gitlab-org/gitlab-test",
"default_branch":"master",
"homepage":"http://example.com/gitlab-org/gitlab-test",
"url":"http://example.com/gitlab-org/gitlab-test.git",
"ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
"http_url":"http://example.com/gitlab-org/gitlab-test.git"
},
"repository":{
"name": "Gitlab Test",
"url": "http://localhost/gitlab-org/gitlab-test.git",
"description": "Aut reprehenderit ut est.",
"homepage": "http://example.com/gitlab-org/gitlab-test"
},
"object_attributes": {
"id": 1244,
"note": "This MR needs work.",
"noteable_type": "MergeRequest",
"author_id": 1,
"created_at": "2015-05-17 18:21:36 UTC",
"updated_at": "2015-05-17 18:21:36 UTC",
"project_id": 5,
"attachment": null,
"line_code": null,
"commit_id": "",
"noteable_id": 7,
"system": false,
"st_diff": null,
"action": "create",
"url": "http://example.com/gitlab-org/gitlab-test/merge_requests/1#note_1244"
},
"merge_request": {
"id": 7,
"target_branch": "markdown",
"source_branch": "master",
"source_project_id": 5,
"author_id": 8,
"assignee_id": 28,
"title": "Tempora et eos debitis quae laborum et.",
"created_at": "2015-03-01 20:12:53 UTC",
"updated_at": "2015-03-21 18:27:27 UTC",
"milestone_id": 11,
"state": "opened",
"merge_status": "cannot_be_merged",
"target_project_id": 5,
"iid": 1,
"description": "Et voluptas corrupti assumenda temporibus. Architecto cum animi eveniet amet asperiores. Vitae numquam voluptate est natus sit et ad id.",
"position": 0,
"labels": [
{
"id": 25,
"title": "Afterpod",
"color": "#3e8068",
"project_id": null,
"created_at": "2019-06-05T14:32:20.211Z",
"updated_at": "2019-06-05T14:32:20.211Z",
"template": false,
"description": null,
"type": "GroupLabel",
"group_id": 4
},
{
"id": 86,
"title": "Element",
"color": "#231afe",
"project_id": 4,
"created_at": "2019-06-05T14:32:20.637Z",
"updated_at": "2019-06-05T14:32:20.637Z",
"template": false,
"description": null,
"type": "ProjectLabel",
"group_id": null
}
],
"source":{
"name":"Gitlab Test",
"description":"Aut reprehenderit ut est.",
"web_url":"http://example.com/gitlab-org/gitlab-test",
"avatar_url":null,
"git_ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
"git_http_url":"http://example.com/gitlab-org/gitlab-test.git",
"namespace":"Gitlab Org",
"visibility_level":10,
"path_with_namespace":"gitlab-org/gitlab-test",
"default_branch":"master",
"homepage":"http://example.com/gitlab-org/gitlab-test",
"url":"http://example.com/gitlab-org/gitlab-test.git",
"ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
"http_url":"http://example.com/gitlab-org/gitlab-test.git"
},
"target": {
"name":"Gitlab Test",
"description":"Aut reprehenderit ut est.",
"web_url":"http://example.com/gitlab-org/gitlab-test",
"avatar_url":null,
"git_ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
"git_http_url":"http://example.com/gitlab-org/gitlab-test.git",
"namespace":"Gitlab Org",
"visibility_level":10,
"path_with_namespace":"gitlab-org/gitlab-test",
"default_branch":"master",
"homepage":"http://example.com/gitlab-org/gitlab-test",
"url":"http://example.com/gitlab-org/gitlab-test.git",
"ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
"http_url":"http://example.com/gitlab-org/gitlab-test.git"
},
"last_commit": {
"id": "562e173be03b8ff2efb05345d12df18815438a4b",
"message": "Merge branch 'another-branch' into 'master'\n\nCheck in this test\n",
"timestamp": "2015-04-08T21: 00:25-07:00",
"url": "http://example.com/gitlab-org/gitlab-test/commit/562e173be03b8ff2efb05345d12df18815438a4b",
"author": {
"name": "John Smith",
"email": "john@example.com"
}
},
"work_in_progress": false,
"draft": false,
"assignee": {
"name": "User1",
"username": "user1",
"avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
},
"detailed_merge_status": "checking"
}
}Comment on an issue
- The
assignee_idfield is deprecated and shows the first assignee only. - The
event_typeis set toconfidential_notefor confidential issues.
Request header:
X-Gitlab-Event: Note HookPayload example:
{
"object_kind": "note",
"event_type": "note",
"user": {
"id": 1,
"name": "Administrator",
"username": "root",
"avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon",
"email": "admin@example.com"
},
"project_id": 5,
"project":{
"id": 5,
"name":"Gitlab Test",
"description":"Aut reprehenderit ut est.",
"web_url":"http://example.com/gitlab-org/gitlab-test",
"avatar_url":null,
"git_ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
"git_http_url":"http://example.com/gitlab-org/gitlab-test.git",
"namespace":"Gitlab Org",
"visibility_level":10,
"path_with_namespace":"gitlab-org/gitlab-test",
"default_branch":"master",
"homepage":"http://example.com/gitlab-org/gitlab-test",
"url":"http://example.com/gitlab-org/gitlab-test.git",
"ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
"http_url":"http://example.com/gitlab-org/gitlab-test.git"
},
"repository":{
"name":"diaspora",
"url":"git@example.com:mike/diaspora.git",
"description":"",
"homepage":"http://example.com/mike/diaspora"
},
"object_attributes": {
"id": 1241,
"note": "Hello world",
"noteable_type": "Issue",
"author_id": 1,
"created_at": "2015-05-17 17:06:40 UTC",
"updated_at": "2015-05-17 17:06:40 UTC",
"project_id": 5,
"attachment": null,
"line_code": null,
"commit_id": "",
"noteable_id": 92,
"system": false,
"st_diff": null,
"action": "create",
"url": "http://example.com/gitlab-org/gitlab-test/issues/17#note_1241"
},
"issue": {
"id": 92,
"title": "test",
"assignee_ids": [],
"assignee_id": null,
"author_id": 1,
"project_id": 5,
"created_at": "2015-04-12 14:53:17 UTC",
"updated_at": "2015-04-26 08:28:42 UTC",
"position": 0,
"branch_name": null,
"description": "test",
"milestone_id": null,
"state": "closed",
"iid": 17,
"labels": [
{
"id": 25,
"title": "Afterpod",
"color": "#3e8068",
"project_id": null,
"created_at": "2019-06-05T14:32:20.211Z",
"updated_at": "2019-06-05T14:32:20.211Z",
"template": false,
"description": null,
"type": "GroupLabel",
"group_id": 4
},
{
"id": 86,
"title": "Element",
"color": "#231afe",
"project_id": 4,
"created_at": "2019-06-05T14:32:20.637Z",
"updated_at": "2019-06-05T14:32:20.637Z",
"template": false,
"description": null,
"type": "ProjectLabel",
"group_id": null
}
]
}
}Comment on a code snippet
Request header:
X-Gitlab-Event: Note HookPayload example:
{
"object_kind": "note",
"event_type": "note",
"user": {
"id": 1,
"name": "Administrator",
"username": "root",
"avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon",
"email": "admin@example.com"
},
"project_id": 5,
"project":{
"id": 5,
"name":"Gitlab Test",
"description":"Aut reprehenderit ut est.",
"web_url":"http://example.com/gitlab-org/gitlab-test",
"avatar_url":null,
"git_ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
"git_http_url":"http://example.com/gitlab-org/gitlab-test.git",
"namespace":"Gitlab Org",
"visibility_level":10,
"path_with_namespace":"gitlab-org/gitlab-test",
"default_branch":"master",
"homepage":"http://example.com/gitlab-org/gitlab-test",
"url":"http://example.com/gitlab-org/gitlab-test.git",
"ssh_url":"git@example.com:gitlab-org/gitlab-test.git",
"http_url":"http://example.com/gitlab-org/gitlab-test.git"
},
"repository":{
"name":"Gitlab Test",
"url":"http://example.com/gitlab-org/gitlab-test.git",
"description":"Aut reprehenderit ut est.",
"homepage":"http://example.com/gitlab-org/gitlab-test"
},
"object_attributes": {
"id": 1245,
"note": "Is this snippet doing what it's supposed to be doing?",
"noteable_type": "Snippet",
"author_id": 1,
"created_at": "2015-05-17 18:35:50 UTC",
"updated_at": "2015-05-17 18:35:50 UTC",
"project_id": 5,
"attachment": null,
"line_code": null,
"commit_id": "",
"noteable_id": 53,
"system": false,
"st_diff": null,
"action": "create",
"url": "http://example.com/gitlab-org/gitlab-test/-/snippets/53#note_1245"
},
"snippet": {
"id": 53,
"title": "test",
"description": "A snippet description.",
"content": "puts 'Hello world'",
"author_id": 1,
"project_id": 5,
"created_at": "2015-04-09 02:40:38 UTC",
"updated_at": "2015-04-09 02:40:38 UTC",
"file_name": "test.rb",
"type": "ProjectSnippet",
"visibility_level": 0,
"url": "http://example.com/gitlab-org/gitlab-test/-/snippets/53"
}
}Merge request events
Merge request events are triggered when:
- A new merge request is created.
- An existing merge request is updated, approved (by all required approvers), unapproved, merged, or closed.
- An individual user adds or removes their approval to an existing merge request.
- A commit is added in the source branch.
- All threads are resolved on the merge request.
Merge request events can be triggered even if the changes field is empty.
Webhook receivers should always inspect the content of the changes field for the
actual changes in a merge request.
The available values for object_attributes.action in the payload are:
openclosereopenupdateapproval: An individual user has added their approval.approved: A merge request has been fully approved by all required approvers.unapproval: An individual user has removed their approval, either manually or by the system.unapproved: A previously-approved merge request has lost its approved status, either manually or by the system.merge
The field object_attributes.oldrev is only available when there are actual code changes, like:
- New code is pushed.
- A suggestion is applied.
System-initiated merge request events
Some merge request events are triggered automatically by the system, such as when approvals are reset due to new commit pushes. These system-initiated webhook events are only triggered by push events, and include more fields in the payload:
system: A boolean field. Iftrue, the event was triggered by the system. Iffalse, a user action triggered the event.system_action: A string field, present only whensystemistrue. Provides more context about the system action. Available values are:approvals_reset_on_push: The project has enabled Reset approvals on push, and new commits were pushed.code_owner_approvals_reset_on_push: The project has enabled Selective code owner removals, and Code Owner approvals were reset due to changes in files matching CODEOWNERS rules.
Other approval reset scenarios do not trigger webhooks.
Request header:
X-Gitlab-Event: Merge Request HookPayload example:
{
"object_kind": "merge_request",
"event_type": "merge_request",
"user": {
"id": 1,
"name": "Administrator",
"username": "root",
"avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon",
"email": "admin@example.com"
},
"project": {
"id": 1,
"name":"Gitlab Test",
"description":"Aut reprehenderit ut est.",
"web_url":"http://example.com/gitlabhq/gitlab-test",
"avatar_url":null,
"git_ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
"git_http_url":"http://example.com/gitlabhq/gitlab-test.git",
"namespace":"GitlabHQ",
"visibility_level":20,
"path_with_namespace":"gitlabhq/gitlab-test",
"default_branch":"master",
"ci_config_path":"",
"homepage":"http://example.com/gitlabhq/gitlab-test",
"url":"http://example.com/gitlabhq/gitlab-test.git",
"ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
"http_url":"http://example.com/gitlabhq/gitlab-test.git"
},
"repository": {
"name": "Gitlab Test",
"url": "http://example.com/gitlabhq/gitlab-test.git",
"description": "Aut reprehenderit ut est.",
"homepage": "http://example.com/gitlabhq/gitlab-test"
},
"object_attributes": {
"id": 99,
"iid": 1,
"target_branch": "master",
"source_branch": "ms-viewport",
"source_project_id": 14,
"author_id": 51,
"assignee_ids": [6],
"assignee_id": 6,
"reviewer_ids": [6],
"title": "MS-Viewport",
"created_at": "2013-12-03T17:23:34Z",
"updated_at": "2013-12-03T17:23:34Z",
"last_edited_at": "2013-12-03T17:23:34Z",
"last_edited_by_id": 1,
"milestone_id": null,
"state_id": 1,
"state": "opened",
"blocking_discussions_resolved": true,
"work_in_progress": false,
"draft": false,
"first_contribution": true,
"merge_status": "unchecked",
"target_project_id": 14,
"description": "",
"prepared_at": "2013-12-03T19:23:34Z",
"total_time_spent": 1800,
"time_change": 30,
"human_total_time_spent": "30m",
"human_time_change": "30s",
"human_time_estimate": "30m",
"url": "http://example.com/diaspora/merge_requests/1",
"source": {
"name":"Awesome Project",
"description":"Aut reprehenderit ut est.",
"web_url":"http://example.com/awesome_space/awesome_project",
"avatar_url":null,
"git_ssh_url":"git@example.com:awesome_space/awesome_project.git",
"git_http_url":"http://example.com/awesome_space/awesome_project.git",
"namespace":"Awesome Space",
"visibility_level":20,
"path_with_namespace":"awesome_space/awesome_project",
"default_branch":"master",
"homepage":"http://example.com/awesome_space/awesome_project",
"url":"http://example.com/awesome_space/awesome_project.git",
"ssh_url":"git@example.com:awesome_space/awesome_project.git",
"http_url":"http://example.com/awesome_space/awesome_project.git"
},
"target": {
"name":"Awesome Project",
"description":"Aut reprehenderit ut est.",
"web_url":"http://example.com/awesome_space/awesome_project",
"avatar_url":null,
"git_ssh_url":"git@example.com:awesome_space/awesome_project.git",
"git_http_url":"http://example.com/awesome_space/awesome_project.git",
"namespace":"Awesome Space",
"visibility_level":20,
"path_with_namespace":"awesome_space/awesome_project",
"default_branch":"master",
"homepage":"http://example.com/awesome_space/awesome_project",
"url":"http://example.com/awesome_space/awesome_project.git",
"ssh_url":"git@example.com:awesome_space/awesome_project.git",
"http_url":"http://example.com/awesome_space/awesome_project.git"
},
"last_commit": {
"id": "da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
"message": "fixed readme",
"title": "Update file README.md",
"timestamp": "2012-01-03T23:36:29+02:00",
"url": "http://example.com/awesome_space/awesome_project/commits/da1560886d4f094c3e6c9ef40349f7d38b5d27d7",
"author": {
"name": "GitLab dev user",
"email": "gitlabdev@dv6700.(none)"
}
},
"labels": [{
"id": 206,
"title": "API",
"color": "#ffffff",
"project_id": 14,
"created_at": "2013-12-03T17:15:43Z",
"updated_at": "2013-12-03T17:15:43Z",
"template": false,
"description": "API related issues",
"type": "ProjectLabel",
"group_id": 41
}],
"action": "open",
"detailed_merge_status": "mergeable"
},
"labels": [{
"id": 206,
"title": "API",
"color": "#ffffff",
"project_id": 14,
"created_at": "2013-12-03T17:15:43Z",
"updated_at": "2013-12-03T17:15:43Z",
"template": false,
"description": "API related issues",
"type": "ProjectLabel",
"group_id": 41
}],
"changes": {
"updated_by_id": {
"previous": null,
"current": 1
},
"draft": {
"previous": true,
"current": false
},
"updated_at": {
"previous": "2017-09-15 16:50:55 UTC",
"current":"2017-09-15 16:52:00 UTC"
},
"labels": {
"previous": [{
"id": 206,
"title": "API",
"color": "#ffffff",
"project_id": 14,
"created_at": "2013-12-03T17:15:43Z",
"updated_at": "2013-12-03T17:15:43Z",
"template": false,
"description": "API related issues",
"type": "ProjectLabel",
"group_id": 41
}],
"current": [{
"id": 205,
"title": "Platform",
"color": "#123123",
"project_id": 14,
"created_at": "2013-12-03T17:15:43Z",
"updated_at": "2013-12-03T17:15:43Z",
"template": false,
"description": "Platform related issues",
"type": "ProjectLabel",
"group_id": 41
}]
},
"last_edited_at": {
"previous": null,
"current": "2023-03-15 00:00:10 UTC"
},
"last_edited_by_id": {
"previous": null,
"current": 3278533
}
},
"assignees": [
{
"id": 6,
"name": "User1",
"username": "user1",
"avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
}
],
"reviewers": [
{
"id": 6,
"name": "User1",
"username": "user1",
"avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40\u0026d=identicon"
}
]
}The fields assignee_id and merge_status are deprecated.
Wiki page events
Wiki page events are triggered when a wiki page is created, updated, or deleted.
Request header:
X-Gitlab-Event: Wiki Page HookPayload example:
{
"object_kind": "wiki_page",
"user": {
"id": 1,
"name": "Administrator",
"username": "root",
"avatar_url": "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80\u0026d=identicon",
"email": "admin@example.com"
},
"project": {
"id": 1,
"name": "awesome-project",
"description": "This is awesome",
"web_url": "http://example.com/root/awesome-project",
"avatar_url": null,
"git_ssh_url": "git@example.com:root/awesome-project.git",
"git_http_url": "http://example.com/root/awesome-project.git",
"namespace": "root",
"visibility_level": 0,
"path_with_namespace": "root/awesome-project",
"default_branch": "master",
"homepage": "http://example.com/root/awesome-project",
"url": "git@example.com:root/awesome-project.git",
"ssh_url": "git@example.com:root/awesome-project.git",
"http_url": "http://example.com/root/awesome-project.git"
},
"wiki": {
"web_url": "http://example.com/root/awesome-project/-/wikis/home",
"git_ssh_url": "git@example.com:root/awesome-project.wiki.git",
"git_http_url": "http://example.com/root/awesome-project.wiki.git",
"path_with_namespace": "root/awesome-project.wiki",
"default_branch": "master"
},
"object_attributes": {
"title": "Awesome",
"content": "awesome content goes here",
"format": "markdown",
"message": "adding an awesome page to the wiki",
"slug": "awesome",
"url": "http://example.com/root/awesome-project/-/wikis/awesome",
"action": "create",
"diff_url": "http://example.com/root/awesome-project/-/wikis/home/diff?version_id=78ee4a6705abfbff4f4132c6646dbaae9c8fb6ec",
"version_id": "3ad67c972065298d226dd80b2b03e0fc2421e731"
}
}Pipeline events
Pipeline events are triggered when the status of a pipeline changes.
In GitLab 15.1 and later, pipeline webhooks triggered by blocked users are not processed.
In GitLab 16.1
and later, pipeline webhooks started to expose object_attributes.name.
Request header:
X-Gitlab-Event: Pipeline HookPayload example:
{
"object_kind": "pipeline",
"object_attributes": {
"id": 31,
"iid": 3,
"name": "Pipeline for branch: master",
"ref": "master",
"tag": false,
"sha": "bcbb5ec396a2c0f828686f14fac9b80b780504f2",
"before_sha": "bcbb5ec396a2c0f828686f14fac9b80b780504f2",
"source": "merge_request_event",
"status": "success",
"detailed_status": "passed",
"stages": [
"build",
"test",
"deploy"
],
"created_at": "2016-08-12 15:23:28 UTC",
"finished_at": "2016-08-12 15:26:29 UTC",
"duration": 63,
"queued_duration": 10,
"variables": [
{
"key": "NESTOR_PROD_ENVIRONMENT",
"value": "us-west-1"
}
],
"url": "http://example.com/gitlab-org/gitlab-test/-/pipelines/31"
},
"merge_request": {
"id": 1,
"iid": 1,
"title": "Test",
"source_branch": "test",
"source_project_id": 1,
"target_branch": "master",
"target_project_id": 1,
"state": "opened",
"merge_status": "can_be_merged",
"detailed_merge_status": "mergeable",
"url": "http://192.168.64.1:3005/gitlab-org/gitlab-test/merge_requests/1"
},
"user": {
"id": 1,
"name": "Administrator",
"username": "root",
"avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon",
"email": "user_email@gitlab.com"
},
"project": {
"id": 1,
"name": "Gitlab Test",
"description": "Atque in sunt eos similique dolores voluptatem.",
"web_url": "http://192.168.64.1:3005/gitlab-org/gitlab-test",
"avatar_url": null,
"git_ssh_url": "git@192.168.64.1:gitlab-org/gitlab-test.git",
"git_http_url": "http://192.168.64.1:3005/gitlab-org/gitlab-test.git",
"namespace": "Gitlab Org",
"visibility_level": 20,
"path_with_namespace": "gitlab-org/gitlab-test",
"default_branch": "master",
"ci_config_path": null
},
"commit": {
"id": "bcbb5ec396a2c0f828686f14fac9b80b780504f2",
"message": "test\n",
"title": "test",
"timestamp": "2016-08-12T17:23:21+02:00",
"url": "http://example.com/gitlab-org/gitlab-test/commit/bcbb5ec396a2c0f828686f14fac9b80b780504f2",
"author": {
"name": "User",
"email": "user@gitlab.com"
}
},
"builds": [
{
"id": 380,
"stage": "deploy",
"name": "production",
"status": "skipped",
"created_at": "2016-08-12 15:23:28 UTC",
"started_at": null,
"finished_at": null,
"duration": null,
"queued_duration": null,
"failure_reason": null,
"when": "manual",
"manual": true,
"allow_failure": false,
"user": {
"id": 1,
"name": "Administrator",
"username": "root",
"avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon",
"email": "admin@example.com"
},
"runner": null,
"artifacts_file": {
"filename": null,
"size": null
},
"environment": {
"name": "production",
"action": "start",
"deployment_tier": "production"
}
},
{
"id": 377,
"stage": "test",
"name": "test-image",
"status": "success",
"created_at": "2016-08-12 15:23:28 UTC",
"started_at": "2016-08-12 15:26:12 UTC",
"finished_at": "2016-08-12 15:26:29 UTC",
"duration": 17.0,
"queued_duration": 196.0,
"failure_reason": null,
"when": "on_success",
"manual": false,
"allow_failure": false,
"user": {
"id": 1,
"name": "Administrator",
"username": "root",
"avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon",
"email": "admin@example.com"
},
"runner": {
"id": 380987,
"description": "shared-runners-manager-6.gitlab.com",
"runner_type": "instance_type",
"active": true,
"is_shared": true,
"tags": [
"linux",
"docker",
"shared-runner"
]
},
"artifacts_file": {
"filename": null,
"size": null
},
"environment": null
},
{
"id": 378,
"stage": "test",
"name": "test-build",
"status": "failed",
"created_at": "2016-08-12 15:23:28 UTC",
"started_at": "2016-08-12 15:26:12 UTC",
"finished_at": "2016-08-12 15:26:29 UTC",
"duration": 17.0,
"queued_duration": 196.0,
"failure_reason": "script_failure",
"when": "on_success",
"manual": false,
"allow_failure": false,
"user": {
"id": 1,
"name": "Administrator",
"username": "root",
"avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon",
"email": "admin@example.com"
},
"runner": {
"id": 380987,
"description": "shared-runners-manager-6.gitlab.com",
"runner_type": "instance_type",
"active": true,
"is_shared": true,
"tags": [
"linux",
"docker"
]
},
"artifacts_file": {
"filename": null,
"size": null
},
"environment": null
},
{
"id": 376,
"stage": "build",
"name": "build-image",
"status": "success",
"created_at": "2016-08-12 15:23:28 UTC",
"started_at": "2016-08-12 15:24:56 UTC",
"finished_at": "2016-08-12 15:25:26 UTC",
"duration": 17.0,
"queued_duration": 196.0,
"failure_reason": null,
"when": "on_success",
"manual": false,
"allow_failure": false,
"user": {
"id": 1,
"name": "Administrator",
"username": "root",
"avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon",
"email": "admin@example.com"
},
"runner": {
"id": 380987,
"description": "shared-runners-manager-6.gitlab.com",
"runner_type": "instance_type",
"active": true,
"is_shared": true,
"tags": [
"linux",
"docker"
]
},
"artifacts_file": {
"filename": null,
"size": null
},
"environment": null
},
{
"id": 379,
"stage": "deploy",
"name": "staging",
"status": "created",
"created_at": "2016-08-12 15:23:28 UTC",
"started_at": null,
"finished_at": null,
"duration": null,
"queued_duration": null,
"failure_reason": null,
"when": "on_success",
"manual": false,
"allow_failure": false,
"user": {
"id": 1,
"name": "Administrator",
"username": "root",
"avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon",
"email": "admin@example.com"
},
"runner": null,
"artifacts_file": {
"filename": null,
"size": null
},
"environment": {
"name": "staging",
"action": "start",
"deployment_tier": "staging"
}
}
],
"source_pipeline": {
"project": {
"id": 41,
"web_url": "https://gitlab.example.com/gitlab-org/upstream-project",
"path_with_namespace": "gitlab-org/upstream-project"
},
"pipeline_id": 30,
"job_id": 3401
}
}Job events
Job events are triggered when the status of a job changes. Trigger jobs are excluded.
The commit.id in the payload is the ID of the pipeline, not the ID of the commit.
In GitLab 15.1 and later, job events triggered by blocked users are not processed.
Request header:
X-Gitlab-Event: Job HookPayload example:
{
"object_kind": "build",
"ref": "gitlab-script-trigger",
"tag": false,
"before_sha": "2293ada6b400935a1378653304eaf6221e0fdb8f",
"sha": "2293ada6b400935a1378653304eaf6221e0fdb8f",
"retries_count": 2,
"build_id": 1977,
"build_name": "test",
"build_stage": "test",
"build_status": "created",
"build_created_at": "2021-02-23T02:41:37.886Z",
"build_started_at": null,
"build_finished_at": null,
"build_created_at_iso": "2021-02-23T02:41:37Z",
"build_started_at_iso": null,
"build_finished_at_iso": null,
"build_duration": null,
"build_queued_duration": 1095.588715,
"build_allow_failure": false,
"build_failure_reason": "unknown_failure",
"pipeline_id": 2366,
"runner": {
"id": 380987,
"description": "shared-runners-manager-6.gitlab.com",
"runner_type": "project_type",
"active": true,
"is_shared": false,
"tags": [
"linux",
"docker"
]
},
"project_id": 380,
"project_name": "gitlab-org/gitlab-test",
"user": {
"id": 3,
"name": "User",
"username": "user",
"avatar_url": "http://www.gravatar.com/avatar/e32bd13e2add097461cb96824b7a829c?s=80\u0026d=identicon",
"email": "user@gitlab.com"
},
"commit": {
"id": 2366,
"name": "Build pipeline",
"sha": "2293ada6b400935a1378653304eaf6221e0fdb8f",
"message": "test\n",
"author_name": "User",
"author_email": "user@gitlab.com",
"author_url": "http://192.168.64.1:3005/user",
"status": "created",
"duration": null,
"started_at": null,
"finished_at": null,
"started_at_iso": null,
"finished_at_iso": null
},
"repository": {
"name": "gitlab_test",
"url": "http://192.168.64.1:3005/gitlab-org/gitlab-test",
"description": "Atque in sunt eos similique dolores voluptatem.",
"homepage": "http://192.168.64.1:3005/gitlab-org/gitlab-test",
"git_ssh_url": "git@192.168.64.1:gitlab-org/gitlab-test.git",
"git_http_url": "http://192.168.64.1:3005/gitlab-org/gitlab-test.git",
"visibility_level": 20
},
"project": {
"id": 380,
"name": "Gitlab Test",
"description": "Atque in sunt eos similique dolores voluptatem.",
"web_url": "http://192.168.64.1:3005/gitlab-org/gitlab-test",
"avatar_url": null,
"git_ssh_url": "git@192.168.64.1:gitlab-org/gitlab-test.git",
"git_http_url": "http://192.168.64.1:3005/gitlab-org/gitlab-test.git",
"namespace": "Gitlab Org",
"visibility_level": 20,
"path_with_namespace": "gitlab-org/gitlab-test",
"default_branch": "master",
"ci_config_path": null
},
"environment": null,
"source_pipeline": {
"project": {
"id": 41,
"web_url": "https://gitlab.example.com/gitlab-org/upstream-project",
"path_with_namespace": "gitlab-org/upstream-project"
},
"pipeline_id": 30,
"job_id": 3401
}
}Number of retries
retries_count is an integer that indicates if the job is a retry. 0 means that the job
has not been retried. 1 means that it’s the first retry.
Pipeline name
You can set custom names for pipelines with workflow:name.
If the pipeline has a name, that name is the value of commit.name.
Deployment events
Deployment events are triggered when a deployment:
- Starts
- Succeeds
- Fails
- Is canceled
The deployable_id and deployable_url in the payload represent a CI/CD job that executed the deployment.
When the deployment event occurs by API or trigger jobs, deployable_url is null.
Request header:
X-Gitlab-Event: Deployment HookPayload example:
{
"object_kind": "deployment",
"status": "success",
"status_changed_at":"2021-04-28 21:50:00 +0200",
"deployment_id": 15,
"deployable_id": 796,
"deployable_url": "http://10.126.0.2:3000/root/test-deployment-webhooks/-/jobs/796",
"environment": "staging",
"environment_tier": "staging",
"environment_slug": "staging",
"environment_external_url": "https://staging.example.com",
"project": {
"id": 30,
"name": "test-deployment-webhooks",
"description": "",
"web_url": "http://10.126.0.2:3000/root/test-deployment-webhooks",
"avatar_url": null,
"git_ssh_url": "ssh://vlad@10.126.0.2:2222/root/test-deployment-webhooks.git",
"git_http_url": "http://10.126.0.2:3000/root/test-deployment-webhooks.git",
"namespace": "Administrator",
"visibility_level": 0,
"path_with_namespace": "root/test-deployment-webhooks",
"default_branch": "master",
"ci_config_path": "",
"homepage": "http://10.126.0.2:3000/root/test-deployment-webhooks",
"url": "ssh://vlad@10.126.0.2:2222/root/test-deployment-webhooks.git",
"ssh_url": "ssh://vlad@10.126.0.2:2222/root/test-deployment-webhooks.git",
"http_url": "http://10.126.0.2:3000/root/test-deployment-webhooks.git"
},
"short_sha": "279484c0",
"user": {
"id": 1,
"name": "Administrator",
"username": "root",
"avatar_url": "https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
"email": "admin@example.com"
},
"user_url": "http://10.126.0.2:3000/root",
"commit_url": "http://10.126.0.2:3000/root/test-deployment-webhooks/-/commit/279484c09fbe69ededfced8c1bb6e6d24616b468",
"commit_title": "Add new file"
}Group member events
- Tier: Premium, Ultimate
These events are triggered for group webhooks only.
Member events are triggered when:
- A user is added as a group member.
- The access level of a user changes.
- The expiration date for user access is updated.
- A user is removed from the group.
- A user requests access to the group.
- An access request is denied.
Add member to group
Request header:
X-Gitlab-Event: Member HookPayload example:
{
"created_at": "2020-12-11T04:57:22Z",
"updated_at": "2020-12-11T04:57:22Z",
"group_name": "webhook-test",
"group_path": "webhook-test",
"group_id": 100,
"user_username": "test_user",
"user_name": "Test User",
"user_email": "testuser@webhooktest.com",
"user_id": 64,
"group_access": "Guest",
"group_plan": null,
"expires_at": "2020-12-14T00:00:00Z",
"event_name": "user_add_to_group"
}Update member access level or expiration date
Request header:
X-Gitlab-Event: Member HookPayload example:
{
"created_at": "2020-12-11T04:57:22Z",
"updated_at": "2020-12-12T08:48:19Z",
"group_name": "webhook-test",
"group_path": "webhook-test",
"group_id": 100,
"user_username": "test_user",
"user_name": "Test User",
"user_email": "testuser@webhooktest.com",
"user_id": 64,
"group_access": "Developer",
"group_plan": null,
"expires_at": "2020-12-20T00:00:00Z",
"event_name": "user_update_for_group"
}Remove member from group
Request header:
X-Gitlab-Event: Member HookPayload example:
{
"created_at": "2020-12-11T04:57:22Z",
"updated_at": "2020-12-12T08:52:34Z",
"group_name": "webhook-test",
"group_path": "webhook-test",
"group_id": 100,
"user_username": "test_user",
"user_name": "Test User",
"user_email": "testuser@webhooktest.com",
"user_id": 64,
"group_access": "Guest",
"group_plan": null,
"expires_at": "2020-12-14T00:00:00Z",
"event_name": "user_remove_from_group"
}A user requests access
Request header:
X-Gitlab-Event: Member HookPayload example:
{
"created_at": "2020-12-11T04:57:22Z",
"updated_at": "2020-12-12T08:52:34Z",
"group_name": "webhook-test",
"group_path": "webhook-test",
"group_id": 100,
"user_username": "test_user",
"user_name": "Test User",
"user_email": "testuser@webhooktest.com",
"user_id": 64,
"group_access": "Guest",
"group_plan": null,
"expires_at": "2020-12-14T00:00:00Z",
"event_name": "user_access_request_to_group"
}An access request is denied
Request header:
X-Gitlab-Event: Member HookPayload example:
{
"created_at": "2020-12-11T04:57:22Z",
"updated_at": "2020-12-12T08:52:34Z",
"group_name": "webhook-test",
"group_path": "webhook-test",
"group_id": 100,
"user_username": "test_user",
"user_name": "Test User",
"user_email": "testuser@webhooktest.com",
"user_id": 64,
"group_access": "Guest",
"group_plan": null,
"expires_at": "2020-12-14T00:00:00Z",
"event_name": "user_access_request_denied_for_group"
}Project events
- Tier: Premium, Ultimate
These events are triggered for group webhooks only.
Project events are triggered when:
Create a project in a group
Request header:
X-Gitlab-Event: Project HookPayload example:
{
"event_name": "project_create",
"created_at": "2024-10-07T10:43:48Z",
"updated_at": "2024-10-07T10:43:48Z",
"name": "project1",
"path": "project1",
"path_with_namespace": "group1/project1",
"project_id": 22,
"project_namespace_id": 32,
"owners": [{
"name": "John",
"email": "user1@example.com"
}],
"project_visibility": "private"
}Delete a project in a group
Request header:
X-Gitlab-Event: Project HookPayload example:
{
"event_name": "project_destroy",
"created_at": "2024-10-07T10:43:48Z",
"updated_at": "2024-10-07T10:43:48Z",
"name": "project1",
"path": "project1",
"path_with_namespace": "group1/project1",
"project_id": 22,
"project_namespace_id": 32,
"owners": [{
"name": "John",
"email": "user1@example.com"
}],
"project_visibility": "private"
}Subgroup events
- Tier: Premium, Ultimate
These events are triggered for group webhooks only.
Subgroup events are triggered when:
Create a subgroup in a group
Request header:
X-Gitlab-Event: Subgroup HookPayload example:
{
"created_at": "2021-01-20T09:40:12Z",
"updated_at": "2021-01-20T09:40:12Z",
"event_name": "subgroup_create",
"name": "subgroup1",
"path": "subgroup1",
"full_path": "group1/subgroup1",
"group_id": 10,
"parent_group_id": 7,
"parent_name": "group1",
"parent_path": "group1",
"parent_full_path": "group1"
}Remove a subgroup from a group
This webhook is not triggered when a subgroup is transferred to a new parent group.
Request header:
X-Gitlab-Event: Subgroup HookPayload example:
{
"created_at": "2021-01-20T09:40:12Z",
"updated_at": "2021-01-20T09:40:12Z",
"event_name": "subgroup_destroy",
"name": "subgroup1",
"path": "subgroup1",
"full_path": "group1/subgroup1",
"group_id": 10,
"parent_group_id": 7,
"parent_name": "group1",
"parent_path": "group1",
"parent_full_path": "group1"
}Feature flag events
Feature flag events are triggered when a feature flag is turned on or off.
Request header:
X-Gitlab-Event: Feature Flag HookPayload example:
{
"object_kind": "feature_flag",
"project": {
"id": 1,
"name":"Gitlab Test",
"description":"Aut reprehenderit ut est.",
"web_url":"http://example.com/gitlabhq/gitlab-test",
"avatar_url":null,
"git_ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
"git_http_url":"http://example.com/gitlabhq/gitlab-test.git",
"namespace":"GitlabHQ",
"visibility_level":20,
"path_with_namespace":"gitlabhq/gitlab-test",
"default_branch":"master",
"ci_config_path": null,
"homepage":"http://example.com/gitlabhq/gitlab-test",
"url":"http://example.com/gitlabhq/gitlab-test.git",
"ssh_url":"git@example.com:gitlabhq/gitlab-test.git",
"http_url":"http://example.com/gitlabhq/gitlab-test.git"
},
"user": {
"id": 1,
"name": "Administrator",
"username": "root",
"avatar_url": "https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=80&d=identicon",
"email": "admin@example.com"
},
"user_url": "http://example.com/root",
"object_attributes": {
"id": 6,
"name": "test-feature-flag",
"description": "test-feature-flag-description",
"active": true
}
}Release events
Release events are triggered when a release is created, updated, or deleted.
The available values for object_attributes.action in the payload are:
createupdatedelete
Request header:
X-Gitlab-Event: Release HookPayload example:
{
"id": 1,
"created_at": "2020-11-02 12:55:12 UTC",
"description": "v1.1 has been released",
"name": "v1.1",
"released_at": "2020-11-02 12:55:12 UTC",
"tag": "v1.1",
"object_kind": "release",
"project": {
"id": 2,
"name": "release-webhook-example",
"description": "",
"web_url": "https://example.com/gitlab-org/release-webhook-example",
"avatar_url": null,
"git_ssh_url": "ssh://git@example.com/gitlab-org/release-webhook-example.git",
"git_http_url": "https://example.com/gitlab-org/release-webhook-example.git",
"namespace": "Gitlab",
"visibility_level": 0,
"path_with_namespace": "gitlab-org/release-webhook-example",
"default_branch": "master",
"ci_config_path": null,
"homepage": "https://example.com/gitlab-org/release-webhook-example",
"url": "ssh://git@example.com/gitlab-org/release-webhook-example.git",
"ssh_url": "ssh://git@example.com/gitlab-org/release-webhook-example.git",
"http_url": "https://example.com/gitlab-org/release-webhook-example.git"
},
"url": "https://example.com/gitlab-org/release-webhook-example/-/releases/v1.1",
"action": "create",
"assets": {
"count": 5,
"links": [
{
"id": 1,
"link_type": "other",
"name": "Changelog",
"url": "https://example.net/changelog"
}
],
"sources": [
{
"format": "zip",
"url": "https://example.com/gitlab-org/release-webhook-example/-/archive/v1.1/release-webhook-example-v1.1.zip"
},
{
"format": "tar.gz",
"url": "https://example.com/gitlab-org/release-webhook-example/-/archive/v1.1/release-webhook-example-v1.1.tar.gz"
},
{
"format": "tar.bz2",
"url": "https://example.com/gitlab-org/release-webhook-example/-/archive/v1.1/release-webhook-example-v1.1.tar.bz2"
},
{
"format": "tar",
"url": "https://example.com/gitlab-org/release-webhook-example/-/archive/v1.1/release-webhook-example-v1.1.tar"
}
]
},
"commit": {
"id": "ee0a3fb31ac16e11b9dbb596ad16d4af654d08f8",
"message": "Release v1.1",
"title": "Release v1.1",
"timestamp": "2020-10-31T14:58:32+11:00",
"url": "https://example.com/gitlab-org/release-webhook-example/-/commit/ee0a3fb31ac16e11b9dbb596ad16d4af654d08f8",
"author": {
"name": "Example User",
"email": "user@example.com"
}
}
}Milestone events
Milestone events are triggered when a milestone is created, closed, reopened, or deleted.
The available values for object_attributes.action in the payload are:
createclosereopen
Request header:
X-Gitlab-Event: Milestone HookPayload example:
{
"object_kind": "milestone",
"event_type": "milestone",
"project": {
"id": 1,
"name": "Gitlab Test",
"description": "Aut reprehenderit ut est.",
"web_url": "http://example.com/gitlabhq/gitlab-test",
"avatar_url": null,
"git_ssh_url": "git@example.com:gitlabhq/gitlab-test.git",
"git_http_url": "http://example.com/gitlabhq/gitlab-test.git",
"namespace": "GitlabHQ",
"visibility_level": 20,
"path_with_namespace": "gitlabhq/gitlab-test",
"default_branch": "master",
"ci_config_path": null,
"homepage": "http://example.com/gitlabhq/gitlab-test",
"url": "http://example.com/gitlabhq/gitlab-test.git",
"ssh_url": "git@example.com:gitlabhq/gitlab-test.git",
"http_url": "http://example.com/gitlabhq/gitlab-test.git"
},
"object_attributes": {
"id": 61,
"iid": 10,
"title": "v1.0",
"description": "First stable release",
"state": "active",
"created_at": "2025-06-16 14:10:57 UTC",
"updated_at": "2025-06-16 14:10:57 UTC",
"due_date": "2025-06-30",
"start_date": "2025-06-16",
"group_id": null,
"project_id": 1
},
"action": "create"
}Emoji events
An emoji event is triggered when an emoji reaction is added or removed on:
- Issues
- Merge requests
- Project snippets
- Comments on:
- Issues
- Merge requests
- Project snippets
- Commits
The available values for object_attributes.action in the payload are:
awardto add a reactionrevoketo remove a reaction
Request header:
X-Gitlab-Event: Emoji HookPayload example:
{
"object_kind": "emoji",
"event_type": "award",
"user": {
"id": 1,
"name": "Blake Bergstrom",
"username": "root",
"avatar_url": "http://example.com/uploads/-/system/user/avatar/1/avatar.png",
"email": "[REDACTED]"
},
"project_id": 6,
"project": {
"id": 6,
"name": "Flight",
"description": "Velit fugit aperiam illum deleniti odio sequi.",
"web_url": "http://example.com/flightjs/Flight",
"avatar_url": null,
"git_ssh_url": "ssh://git@example.com/flightjs/Flight.git",
"git_http_url": "http://example.com/flightjs/Flight.git",
"namespace": "Flightjs",
"visibility_level": 20,
"path_with_namespace": "flightjs/Flight",
"default_branch": "master",
"ci_config_path": null,
"homepage": "http://example.com/flightjs/Flight",
"url": "ssh://git@example.com/flightjs/Flight.git",
"ssh_url": "ssh://git@example.com/flightjs/Flight.git",
"http_url": "http://example.com/flightjs/Flight.git"
},
"object_attributes": {
"user_id": 1,
"created_at": "2023-07-04 20:44:11 UTC",
"id": 1,
"name": "thumbsup",
"awardable_type": "Note",
"awardable_id": 363,
"updated_at": "2023-07-04 20:44:11 UTC",
"action": "award",
"awarded_on_url": "http://example.com/flightjs/Flight/-/issues/42#note_363"
},
"note": {
"attachment": null,
"author_id": 1,
"change_position": null,
"commit_id": null,
"created_at": "2023-07-04 15:09:55 UTC",
"discussion_id": "c3d97fd471f210a5dc8b97a409e3bea95ee06c14",
"id": 363,
"line_code": null,
"note": "Testing 123",
"noteable_id": 635,
"noteable_type": "Issue",
"original_position": null,
"position": null,
"project_id": 6,
"resolved_at": null,
"resolved_by_id": null,
"resolved_by_push": null,
"st_diff": null,
"system": false,
"type": null,
"updated_at": "2023-07-04 19:58:46 UTC",
"updated_by_id": null,
"description": "Testing 123",
"url": "http://example.com/flightjs/Flight/-/issues/42#note_363"
},
"issue": {
"author_id": 1,
"closed_at": null,
"confidential": false,
"created_at": "2023-07-04 14:59:43 UTC",
"description": "Issue description!",
"discussion_locked": null,
"due_date": null,
"id": 635,
"iid": 42,
"last_edited_at": null,
"last_edited_by_id": null,
"milestone_id": null,
"moved_to_id": null,
"duplicated_to_id": null,
"project_id": 6,
"relative_position": 18981,
"state_id": 1,
"time_estimate": 0,
"title": "New issue!",
"updated_at": "2023-07-04 15:09:55 UTC",
"updated_by_id": null,
"weight": null,
"health_status": null,
"url": "http://example.com/flightjs/Flight/-/issues/42",
"total_time_spent": 0,
"time_change": 0,
"human_total_time_spent": null,
"human_time_change": null,
"human_time_estimate": null,
"assignee_ids": [
1
],
"assignee_id": 1,
"labels": [
],
"state": "opened",
"severity": "unknown"
}
}Project and group access token events
Access token expiry events trigger before an access tokens expires. These events trigger:
- One day before the token expires
- Seven days before the token expires
- 30 days before the token expires, if the feature is enabled.
- 60 days before the token expires, if the feature is enabled.
The available values for event_name in the payload are:
expiring_access_token
Request header:
X-Gitlab-Event: Resource Access Token HookPayload example for project:
{
"object_kind": "access_token",
"project": {
"id": 7,
"name": "Flight",
"description": "Eum dolore maxime atque reprehenderit voluptatem.",
"web_url": "https://example.com/flightjs/Flight",
"avatar_url": null,
"git_ssh_url": "ssh://git@example.com/flightjs/Flight.git",
"git_http_url": "https://example.com/flightjs/Flight.git",
"namespace": "Flightjs",
"visibility_level": 0,
"path_with_namespace": "flightjs/Flight",
"default_branch": "master",
"ci_config_path": null,
"homepage": "https://example.com/flightjs/Flight",
"url": "ssh://git@example.com/flightjs/Flight.git",
"ssh_url": "ssh://git@example.com/flightjs/Flight.git",
"http_url": "https://example.com/flightjs/Flight.git"
},
"object_attributes": {
"user_id": 90,
"created_at": "2024-01-24 16:27:40 UTC",
"id": 25,
"name": "acd",
"expires_at": "2024-01-26"
},
"event_name": "expiring_access_token"
}Payload example for group:
{
"object_kind": "access_token",
"group": {
"group_name": "Twitter",
"group_path": "twitter",
"group_id": 35,
"full_path": "twitter"
},
"object_attributes": {
"user_id": 90,
"created_at": "2024-01-24 16:27:40 UTC",
"id": 25,
"name": "acd",
"expires_at": "2024-01-26"
},
"event_name": "expiring_access_token"
}Vulnerability events
A vulnerability event is triggered when:
- A vulnerability is created.
- A vulnerability’s status is changed.
- An issue is linked to a vulnerability.
Request header:
X-Gitlab-Event: Vulnerability HookPayload example:
{
"object_kind": "vulnerability",
"object_attributes": {
"url": "https://example.com/flightjs/Flight/-/security/vulnerabilities/1",
"title": "REXML DoS vulnerability",
"state": "confirmed",
"project_id": 50,
"location": {
"file": "Gemfile.lock",
"dependency": {
"package": {
"name": "rexml"
},
"version": "3.3.1"
}
},
"cvss": [
{
"vector": "CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:N/A:H",
"vendor": "NVD"
}
],
"severity": "high",
"severity_overridden": false,
"identifiers": [
{
"name": "Gemnasium-29dce398-220a-4315-8c84-16cd8b6d9b05",
"external_id": "29dce398-220a-4315-8c84-16cd8b6d9b05",
"external_type": "gemnasium",
"url": "https://gitlab.com/gitlab-org/security-products/gemnasium-db/-/blob/master/gem/rexml/CVE-2024-41123.yml"
},
{
"name": "CVE-2024-41123",
"external_id": "CVE-2024-41123",
"external_type": "cve",
"url": "https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-41123"
}
],
"issues": [
{
"title": "REXML ReDoS vulnerability",
"url": "https://example.com/flightjs/Flight/-/issues/1",
"created_at": "2025-01-08T00:46:14.429Z",
"updated_at": "2025-01-08T00:46:14.429Z"
}
],
"report_type": "dependency_scanning",
"confidence": "unknown",
"confidence_overridden": false,
"confirmed_at": "2025-01-08T00:46:14.413Z",
"confirmed_by_id": 1,
"dismissed_at": null,
"dismissed_by_id": null,
"resolved_at": null,
"resolved_by_id": null,
"auto_resolved": false,
"resolved_on_default_branch": false,
"created_at": "2025-01-08T00:46:14.413Z",
"updated_at": "2025-01-08T00:46:14.413Z"
}
}