diff --git a/data/system-hooks/deployment1.json b/data/system-hooks/deployment1.json
new file mode 100644
--- /dev/null
+++ b/data/system-hooks/deployment1.json
@@ -0,0 +1,42 @@
+{
+  "object_kind": "deployment",
+  "status": "running",
+  "status_changed_at": "2026-03-16 03:09:32 +0000",
+  "deployment_id": 56,
+  "deployable_id": 106120,
+  "deployable_url": "https://example.com/joe1/proj-name/-/jobs/106120",
+  "environment": "production",
+  "environment_tier": "production",
+  "environment_slug": "production",
+  "environment_external_url": null,
+  "project": {
+    "id": 47800,
+    "name": "proj-name",
+    "description": null,
+    "web_url": "https://example.com/joe1/proj-name",
+    "avatar_url": null,
+    "git_ssh_url": "git@example.com:joe1/proj-name.git",
+    "git_http_url": "https://example.com/joe1/proj-name.git",
+    "namespace": "Joe Bloggs",
+    "visibility_level": 0,
+    "path_with_namespace": "joe1/proj-name",
+    "default_branch": "main",
+    "ci_config_path": "",
+    "homepage": "https://example.com/joe1/proj-name",
+    "url": "git@example.com:joe1/proj-name.git",
+    "ssh_url": "git@example.com:joe1/proj-name.git",
+    "http_url": "https://example.com/joe1/proj-name.git"
+  },
+  "short_sha": "abc1",
+  "user": {
+    "id": 414,
+    "name": "Joe Bloggs",
+    "username": "joe1",
+    "avatar_url": "https://secure.gravatar.com/avatar/abc1?s=80&d=identicon",
+    "email": "[REDACTED]"
+  },
+  "user_url": "https://example.com/joe1",
+  "commit_url": "https://example.com/joe1/proj-name/-/commit/abc1",
+  "commit_title": "Commit title",
+  "ref": "main"
+}
diff --git a/data/system-hooks/deployment2.json b/data/system-hooks/deployment2.json
new file mode 100644
--- /dev/null
+++ b/data/system-hooks/deployment2.json
@@ -0,0 +1,42 @@
+{
+  "object_kind": "deployment",
+  "status": "success",
+  "status_changed_at": "2026-03-16 03:09:34 +0000",
+  "deployment_id": 56,
+  "deployable_id": 106120,
+  "deployable_url": "https://example.com/joe1/proj-name/-/jobs/106120",
+  "environment": "production",
+  "environment_tier": "production",
+  "environment_slug": "production",
+  "environment_external_url": null,
+  "project": {
+    "id": 47800,
+    "name": "proj-name",
+    "description": null,
+    "web_url": "https://example.com/joe1/proj-name",
+    "avatar_url": null,
+    "git_ssh_url": "git@example.com:joe1/proj-name.git",
+    "git_http_url": "https://example.com/joe1/proj-name.git",
+    "namespace": "Joe Bloggs",
+    "visibility_level": 0,
+    "path_with_namespace": "joe1/proj-name",
+    "default_branch": "main",
+    "ci_config_path": "",
+    "homepage": "https://example.com/joe1/proj-name",
+    "url": "git@example.com:joe1/proj-name.git",
+    "ssh_url": "git@example.com:joe1/proj-name.git",
+    "http_url": "https://example.com/joe1/proj-name.git"
+  },
+  "short_sha": "abc1",
+  "user": {
+    "id": 414,
+    "name": "Joe Bloggs",
+    "username": "joe1",
+    "avatar_url": "https://secure.gravatar.com/avatar/abc1?s=80&d=identicon",
+    "email": "[REDACTED]"
+  },
+  "user_url": "https://example.com/joe1",
+  "commit_url": "https://example.com/joe1/proj-name/-/commit/abc1",
+  "commit_title": "Commit title",
+  "ref": "main"
+}
diff --git a/data/system-hooks/group-destroy2.json b/data/system-hooks/group-destroy2.json
new file mode 100644
--- /dev/null
+++ b/data/system-hooks/group-destroy2.json
@@ -0,0 +1,9 @@
+{
+  "created_at": "2026-03-24T00:44:28Z",
+  "updated_at": "2026-03-24T12:27:38Z",
+  "event_name": "group_destroy",
+  "name": "proj-deletion_scheduled-57112",
+  "path": "proj-deletion_scheduled-57112",
+  "full_path": "proj-deletion_scheduled-57112",
+  "group_id": 57112
+}
diff --git a/data/system-hooks/group-destroy3.json b/data/system-hooks/group-destroy3.json
new file mode 100644
--- /dev/null
+++ b/data/system-hooks/group-destroy3.json
@@ -0,0 +1,10 @@
+{
+   "created_at": "2012-07-21T07:30:54Z",
+   "updated_at": "2012-07-21T07:38:22Z",
+   "event_name": "group_destroy",
+         "name": "StoreCloud",
+  "owner_email": null,
+   "owner_name": null,
+         "path": "storecloud",
+     "group_id": 78
+}
diff --git a/data/system-hooks/group-removed.json b/data/system-hooks/group-removed.json
deleted file mode 100644
--- a/data/system-hooks/group-removed.json
+++ /dev/null
@@ -1,10 +0,0 @@
-{
-   "created_at": "2012-07-21T07:30:54Z",
-   "updated_at": "2012-07-21T07:38:22Z",
-   "event_name": "group_destroy",
-         "name": "StoreCloud",
-  "owner_email": null,
-   "owner_name": null,
-         "path": "storecloud",
-     "group_id": 78
-}
diff --git a/data/system-hooks/milestone1.json b/data/system-hooks/milestone1.json
--- a/data/system-hooks/milestone1.json
+++ b/data/system-hooks/milestone1.json
@@ -3,28 +3,28 @@
   "event_type": "milestone",
   "project": {
     "id": 48355,
-    "name": "Coursework 1",
+    "name": "proj name",
     "description": null,
-    "web_url": "https://gitlab-student.macs.hw.ac.uk/f27wd-group-23/coursework-1",
+    "web_url": "https://example.com/group1/proj-name",
     "avatar_url": null,
-    "git_ssh_url": "git@gitlab-student.macs.hw.ac.uk:f27wd-group-23/coursework-1.git",
-    "git_http_url": "https://gitlab-student.macs.hw.ac.uk/f27wd-group-23/coursework-1.git",
-    "namespace": "F27WD Group 23",
+    "git_ssh_url": "git@example.com:group1/proj-name.git",
+    "git_http_url": "https://example.com/group1/proj-name.git",
+    "namespace": "project namespace",
     "visibility_level": 0,
-    "path_with_namespace": "f27wd-group-23/coursework-1",
+    "path_with_namespace": "group1/proj-name",
     "default_branch": "main",
     "ci_config_path": "",
-    "homepage": "https://gitlab-student.macs.hw.ac.uk/f27wd-group-23/coursework-1",
-    "url": "git@gitlab-student.macs.hw.ac.uk:f27wd-group-23/coursework-1.git",
-    "ssh_url": "git@gitlab-student.macs.hw.ac.uk:f27wd-group-23/coursework-1.git",
-    "http_url": "https://gitlab-student.macs.hw.ac.uk/f27wd-group-23/coursework-1.git"
+    "homepage": "https://example.com/group1/proj-name",
+    "url": "git@example.com:group1/proj-name.git",
+    "ssh_url": "git@example.com:group1/proj-name.git",
+    "http_url": "https://example.com/group1/proj-name.git"
   },
   "group": null,
   "object_attributes": {
     "id": 115,
     "iid": 1,
-    "title": "Redesign and Implement Vortex",
-    "description": "This is to track the completion of CW1 against the marking scheme.\r\n\r\n| Criterion | Description | Marks |\r\n|-----------|-------------|-------|\r\n|  |  |  |\r\n|  |  |  |\r\n|  |  |  |\r\n\r\n",
+    "title": "Milestone title",
+    "description": "Milestone description",
     "state": "active",
     "created_at": "2026-02-12 12:35:59 UTC",
     "updated_at": "2026-02-12 12:35:59 UTC",
diff --git a/data/system-hooks/pipeline7.json b/data/system-hooks/pipeline7.json
new file mode 100644
--- /dev/null
+++ b/data/system-hooks/pipeline7.json
@@ -0,0 +1,69 @@
+{
+  "object_kind": "pipeline",
+  "object_attributes": {
+    "id": 76289,
+    "iid": 4,
+    "name": null,
+    "ref": "the-ref",
+    "tag": false,
+    "sha": "abc123",
+    "before_sha": "0000000000000000000000000000000000000000",
+    "source": "merge_request_event",
+    "status": "failed",
+    "detailed_status": "failed",
+    "stages": [],
+    "created_at": "2026-04-05 17:37:55 UTC",
+    "finished_at": "2026-04-05 17:37:55 UTC",
+    "duration": null,
+    "queued_duration": null,
+    "protected_ref": false,
+    "variables": [],
+    "url": "http://www.example.com/joe1/proj-name/-/pipelines/76289"
+  },
+  "merge_request": {
+    "id": 3252,
+    "iid": 2,
+    "title": "merge request title",
+    "source_branch": "the-ref",
+    "source_project_id": 51828,
+    "target_branch": "main",
+    "target_project_id": 51828,
+    "state": "opened",
+    "merge_status": "checking",
+    "detailed_merge_status": "preparing",
+    "url": "http://www.example.com/joe1/proj-name/-/merge_requests/2"
+  },
+  "user": {
+    "id": 4273,
+    "name": "Joe Bloggs",
+    "username": "joe1",
+    "avatar_url": "https://secure.gravatar.com/avatar/abc123",
+    "email": "[REDACTED]"
+  },
+  "project": {
+    "id": 51828,
+    "name": "project name",
+    "description": null,
+    "web_url": "http://www.example.com/joe1/proj-name",
+    "avatar_url": null,
+    "git_ssh_url": "git@example.com:joe1/proj-name.git",
+    "git_http_url": "http://www.example.com/joe1/proj-name.git",
+    "namespace": "Joe Bloggs",
+    "visibility_level": 0,
+    "path_with_namespace": "joe1/proj-name",
+    "default_branch": "main",
+    "ci_config_path": ""
+  },
+  "commit": {
+    "id": "abc123",
+    "message": "merge request title",
+    "title": "merge request title",
+    "timestamp": "2026-04-05T17:37:48+00:00",
+    "url": "http://www.example.com/joe1/proj-name/-/commit/abc123",
+    "author": {
+      "name": "Joe Bloggs",
+      "email": "joe1@example.com"
+    }
+  },
+  "builds": []
+}
diff --git a/data/system-hooks/tag-push3.json b/data/system-hooks/tag-push3.json
--- a/data/system-hooks/tag-push3.json
+++ b/data/system-hooks/tag-push3.json
@@ -1,46 +1,46 @@
 {
   "object_kind": "tag_push",
   "event_name": "tag_push",
-  "before": "6860fc562566df969ed0e59d5b71232b0bf201fb",
+  "before": "abc1234",
   "after": "0000000000000000000000000000000000000000",
   "ref": "refs/tags/v1",
   "ref_protected": false,
   "checkout_sha": null,
   "message": null,
   "user_id": 3887,
-  "user_name": "Wing To Wong",
-  "user_username": "wtw4000",
+  "user_name": "Joe Bloggs",
+  "user_username": "joe1",
   "user_email": "",
-  "user_avatar": "https://secure.gravatar.com/avatar/7aaf2666b1f7488c41ff5f9c0dad237c3d5abbc5cd205f800b80053027274e6b?s=80&d=identicon",
+  "user_avatar": "https://secure.gravatar.com/avatar/abc?s=80&d=identicon",
   "project_id": 48175,
   "project": {
     "id": 48175,
-    "name": "f28hs-cw1",
+    "name": "proj-name",
     "description": null,
-    "web_url": "https://gitlab-student.macs.hw.ac.uk/wtw4000/f28hs-cw1",
+    "web_url": "https://example.com/joe1/proj-name",
     "avatar_url": null,
-    "git_ssh_url": "git@gitlab-student.macs.hw.ac.uk:wtw4000/f28hs-cw1.git",
-    "git_http_url": "https://gitlab-student.macs.hw.ac.uk/wtw4000/f28hs-cw1.git",
-    "namespace": "Wing To Wong",
+    "git_ssh_url": "git@example.com:joe1/proj-name.git",
+    "git_http_url": "https://example.com/joe1/proj-name.git",
+    "namespace": "Joe Bloggs",
     "visibility_level": 0,
-    "path_with_namespace": "wtw4000/f28hs-cw1",
+    "path_with_namespace": "joe1/proj-name",
     "default_branch": "master",
     "ci_config_path": "",
-    "homepage": "https://gitlab-student.macs.hw.ac.uk/wtw4000/f28hs-cw1",
-    "url": "git@gitlab-student.macs.hw.ac.uk:wtw4000/f28hs-cw1.git",
-    "ssh_url": "git@gitlab-student.macs.hw.ac.uk:wtw4000/f28hs-cw1.git",
-    "http_url": "https://gitlab-student.macs.hw.ac.uk/wtw4000/f28hs-cw1.git"
+    "homepage": "https://example.com/joe1/proj-name",
+    "url": "git@example.com:joe1/proj-name.git",
+    "ssh_url": "git@example.com:joe1/proj-name.git",
+    "http_url": "https://example.com/joe1/proj-name.git"
   },
   "commits": [],
   "total_commits_count": 0,
   "push_options": {},
   "repository": {
-    "name": "f28hs-cw1",
-    "url": "git@gitlab-student.macs.hw.ac.uk:wtw4000/f28hs-cw1.git",
+    "name": "proj-name",
+    "url": "git@example.com:joe1/proj-name.git",
     "description": null,
-    "homepage": "https://gitlab-student.macs.hw.ac.uk/wtw4000/f28hs-cw1",
-    "git_http_url": "https://gitlab-student.macs.hw.ac.uk/wtw4000/f28hs-cw1.git",
-    "git_ssh_url": "git@gitlab-student.macs.hw.ac.uk:wtw4000/f28hs-cw1.git",
+    "homepage": "https://example.com/joe1/proj-name",
+    "git_http_url": "https://example.com/joe1/proj-name.git",
+    "git_ssh_url": "git@example.com:joe1/proj-name.git",
     "visibility_level": 0
   }
 }
diff --git a/gitlab-haskell.cabal b/gitlab-haskell.cabal
--- a/gitlab-haskell.cabal
+++ b/gitlab-haskell.cabal
@@ -1,7 +1,7 @@
 cabal-version: 3.0
 name:           gitlab-haskell
 category:       Git
-version:        1.3.0.0
+version:        1.4.0.0
 synopsis:       A Haskell library for the GitLab web API
 description:
             This library lifts the GitLab REST API into Haskell: <https://docs.gitlab.com/ee/api/>
@@ -11,7 +11,7 @@
 bug-reports:    https://gitlab.com/robstewart57/gitlab-haskell/issues
 author:         Rob Stewart
 maintainer:     robstewart57@gmail.com
-copyright:      2025 Rob Stewart, Heriot-Watt University
+copyright:      2026 Rob Stewart, Heriot-Watt University
 license:        BSD-3-Clause
 license-file:   LICENSE
 data-files:     data/system-hooks/*.json
diff --git a/src/GitLab.hs b/src/GitLab.hs
--- a/src/GitLab.hs
+++ b/src/GitLab.hs
@@ -123,7 +123,7 @@
         let (GitLabT versionCheck) = gitlabVersion
         tokenTest <- runExceptT (runReaderT versionCheck (GitLabState cfg manager))
         case tokenTest of
-          Left (GitLabError t) -> return (Left (GitLabError t))
+          Left err -> return (Left err)
           Right (Left response) ->
             case responseStatus response of
               (Status 401 "Unauthorized") -> return $ Left (GitLabError "access token not accepted.")
@@ -142,5 +142,5 @@
 runGitLabDbg (GitLabT action) = do
   liftIO $ hSetBuffering stdout LineBuffering
   manager <- liftIO $ newManager (mkManagerSettings def Nothing)
-  let cfg = GitLabServerConfig {url = "", authMethod = AuthMethodToken "", retries = 1, debugSystemHooks = Nothing}
+  let cfg = GitLabServerConfig {url = "", authMethod = AuthMethodToken "", retries = 1, delayBetweenRetries = 1, debugSystemHooks = Nothing}
   runExceptT (runReaderT action (GitLabState cfg manager))
diff --git a/src/GitLab/API/Branches.hs b/src/GitLab/API/Branches.hs
--- a/src/GitLab/API/Branches.hs
+++ b/src/GitLab/API/Branches.hs
@@ -37,7 +37,7 @@
     gitlabGetMany,
     gitlabGetOne,
     gitlabPost,
-    responseErrorText,
+    httpResponseError,
   )
 import Network.HTTP.Client
 
@@ -47,7 +47,7 @@
 branches project = do
   result <- branches' (project_id project)
   case result of
-    Left er -> throwError (GitLabError ("branches error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "branches" er)
     Right x -> return x
 
 -- | Get a list of repository branches from a project given its
@@ -75,7 +75,7 @@
 branch project branchName = do
   result <- branch' (project_id project) branchName
   case result of
-    Left er -> throwError (GitLabError ("branch error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "branch" er)
     Right x -> return x
 
 -- | Get a single project repository branch.
diff --git a/src/GitLab/API/Commits.hs b/src/GitLab/API/Commits.hs
--- a/src/GitLab/API/Commits.hs
+++ b/src/GitLab/API/Commits.hs
@@ -104,7 +104,7 @@
         ("actions", Just (T.encodeUtf8 (T.pack (show actions))))
       ]
   case result of
-    Left resp -> throwError (GitLabError ("createCommitMultipleFilesActions: " <> responseErrorText resp))
+    Left resp -> throwError (httpResponseError "createCommitMultipleFilesActions" resp)
     Right x -> return x
   where
     commitsAddr :: Int -> Text
diff --git a/src/GitLab/API/Events.hs b/src/GitLab/API/Events.hs
--- a/src/GitLab/API/Events.hs
+++ b/src/GitLab/API/Events.hs
@@ -76,7 +76,7 @@
 currentUserEvents attrs = do
   result <- gitlabGetMany "/events" (eventFilters attrs)
   case result of
-    Left er -> throwError (GitLabError ("currentUserEvents error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "currentUserEvents" er)
     Right xs -> return xs
 
 -- | Get events for a specific user.
@@ -91,7 +91,7 @@
 userEvents usr attrs = do
   result <- userEvents' (user_id usr) attrs
   case result of
-    Left er -> throwError (GitLabError ("userEvents error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "userEvents" er)
     Right xs -> return xs
 
 -- | Get events for a specific user by ID.
@@ -124,7 +124,7 @@
 projectEvents proj attrs = do
   result <- projectEvents' (project_id proj) attrs
   case result of
-    Left er -> throwError (GitLabError ("projectEvents error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "projectEvents" er)
     Right xs -> return xs
 
 -- | Get events for a project by ID.
@@ -157,7 +157,7 @@
 groupEvents grp attrs = do
   result <- groupEvents' (group_id grp) attrs
   case result of
-    Left er -> throwError (GitLabError ("groupEvents error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "groupEvents" er)
     Right xs -> return xs
 
 -- | Get events for a group by ID.
diff --git a/src/GitLab/API/Groups.hs b/src/GitLab/API/Groups.hs
--- a/src/GitLab/API/Groups.hs
+++ b/src/GitLab/API/Groups.hs
@@ -69,7 +69,7 @@
 groups attrs = do
   result <- gitlabGetMany "/groups" (listGroupsAttrs attrs)
   case result of
-    Left er -> throwError (GitLabError ("groups error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "groups" er)
     Right x -> return x
 
 -- | Get a list of visible direct subgroups in this group.
@@ -83,7 +83,7 @@
       )
       (listGroupsAttrs attrs)
   case result of
-    Left er -> throwError (GitLabError ("subGroups error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "subGroups" er)
     Right x -> return x
 
 -- | Get a list of visible descendant groups of this group.
@@ -97,7 +97,7 @@
       )
       (listGroupsAttrs attrs)
   case result of
-    Left er -> throwError (GitLabError ("descendantGroups error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "descendantGroups" er)
     Right x -> return x
 
 -- | Get a list of projects in this group.
@@ -111,7 +111,7 @@
       )
       (groupProjectAttrs attrs)
   case result of
-    Left er -> throwError (GitLabError ("groupProjects error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "groupProjects" er)
     Right x -> return x
 
 -- | Get a list of projects in this group.
@@ -125,7 +125,7 @@
       )
       (groupProjectAttrs attrs)
   case result of
-    Left er -> throwError (GitLabError ("groupSharedProjects error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "groupSharedProjects" er)
     Right x -> return x
 
 -- | Get all details of a group.
@@ -217,7 +217,7 @@
 searchGroup searchTxt = do
   result <- gitlabGetMany "/groups" [("search", Just (T.encodeUtf8 searchTxt))]
   case result of
-    Left er -> throwError (GitLabError ("searchGroups error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "searchGroups" er)
     Right x -> return x
 
 -- | Attributes related to a group
diff --git a/src/GitLab/API/Issues.hs b/src/GitLab/API/Issues.hs
--- a/src/GitLab/API/Issues.hs
+++ b/src/GitLab/API/Issues.hs
@@ -110,7 +110,7 @@
 groupIssues grp attrs = do
   result <- gitlabGetMany urlPath (issueFilters attrs)
   case result of
-    Left er -> throwError (GitLabError ("groupIssues error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "groupIssues" er)
     Right x -> return x
   where
     urlPath =
@@ -130,7 +130,7 @@
 projectIssues p filters = do
   result <- projectIssues' (project_id p) filters
   case result of
-    Left er -> throwError (GitLabError ("projectIssues error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "projectIssues" er)
     Right x -> return x
 
 -- | Get a list of a project’s issues
@@ -171,7 +171,7 @@
 userIssues usr = do
   result <- gitlabGetMany addr params
   case result of
-    Left er -> throwError (GitLabError ("userIssues error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "userIssues" er)
     Right x -> return x
   where
     addr = "/issues"
@@ -498,7 +498,7 @@
 issueStatisticsGroup group filters = do
   result <- issueStatisticsGroup' (group_id group) filters
   case result of
-    Left er -> throwError (GitLabError ("issueStatisticsGroup error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "issueStatisticsGroup" er)
     Right Nothing -> throwError (GitLabError "issueStatisticsGroup error")
     Right (Just stats) -> return stats
 
@@ -530,7 +530,7 @@
 issueStatisticsProject proj filters = do
   result <- issueStatisticsProject' (project_id proj) filters
   case result of
-    Left er -> throwError (GitLabError ("issueStatisticsProject error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "issueStatisticsProject" er)
     Right Nothing -> throwError (GitLabError "issueStatisticsProject error")
     Right (Just stats) -> return stats
 
diff --git a/src/GitLab/API/Jobs.hs b/src/GitLab/API/Jobs.hs
--- a/src/GitLab/API/Jobs.hs
+++ b/src/GitLab/API/Jobs.hs
@@ -49,7 +49,7 @@
 jobs project = do
   result <- jobs' (project_id project)
   case result of
-    Left er -> throwError (GitLabError ("jobs error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "jobs" er)
     Right answer -> return answer
 
 -- | Get a list of jobs in a project. Jobs are sorted in descending
diff --git a/src/GitLab/API/Members.hs b/src/GitLab/API/Members.hs
--- a/src/GitLab/API/Members.hs
+++ b/src/GitLab/API/Members.hs
@@ -76,7 +76,7 @@
 membersOfProject prj = do
   result <- gitlabGetMany addr []
   case result of
-    Left er -> throwError (GitLabError ("membersOfProject error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "membersOfProject" er)
     Right x -> return x
   where
     addr =
diff --git a/src/GitLab/API/MergeRequests.hs b/src/GitLab/API/MergeRequests.hs
--- a/src/GitLab/API/MergeRequests.hs
+++ b/src/GitLab/API/MergeRequests.hs
@@ -108,7 +108,7 @@
 mergeRequests p = do
   result <- mergeRequests' (project_id p)
   case result of
-    Left er -> throwError (GitLabError ("mergeRequests error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "mergeRequests" er)
     Right x -> return x
 
 -- | returns the merge requests for a project given its project ID.
@@ -141,7 +141,7 @@
 mergeRequestsWith p attrs = do
   result <- mergeRequestsWith' (project_id p) attrs
   case result of
-    Left er -> throwError (GitLabError ("mergeRequests error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "mergeRequests" er)
     Right x -> return x
 
 -- | returns the merge requests for a project given its project ID and
@@ -176,7 +176,7 @@
 mergeRequestCommits p mr = do
   result <- mergeRequestCommits' (project_id p) (merge_request_iid mr)
   case result of
-    Left er -> throwError (GitLabError ("mergeRequestCommits error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "mergeRequestCommits" er)
     Right x -> return x
 
 mergeRequestCommits' ::
diff --git a/src/GitLab/API/Pipelines.hs b/src/GitLab/API/Pipelines.hs
--- a/src/GitLab/API/Pipelines.hs
+++ b/src/GitLab/API/Pipelines.hs
@@ -28,13 +28,22 @@
 
     -- * Delete a pipeline
     deletePipeline,
+
+    -- * Querying pipelines
+    PipelineSearchAttrs (..),
+    PipelineOrderBy (..),
+    PipelineScope (..),
+    PipelineStatus (..),
   )
 where
 
 import qualified Data.ByteString.Lazy as BSL
+import Data.Default
+import Data.Maybe
 import Data.Text (Text)
 import qualified Data.Text as T
 import qualified Data.Text.Encoding as T
+import Data.Time.Clock
 import GitLab.Types
 import GitLab.WebRequests.GitLabWebCalls
 import Network.HTTP.Client
@@ -45,23 +54,29 @@
 pipelines ::
   -- | the project
   Project ->
+  -- | pipeline filters
+  PipelineSearchAttrs ->
   GitLab (Maybe [Pipeline])
-pipelines p = do
-  result <- pipelines' (project_id p)
+pipelines p attrs = do
+  result <- pipelines' (project_id p) attrs
   case result of
     Right ps -> return (Just ps)
-    Left _err -> return Nothing
+    Left _err -> return Nothing -- perhaps throwError (GitLabError ..)
 
 -- | returns the pipelines for a project given its project ID.
 pipelines' ::
   -- | the project ID
   Int ->
+  -- | pipeline filters
+  PipelineSearchAttrs ->
   GitLab (Either (Response BSL.ByteString) [Pipeline])
-pipelines' projectId =
+pipelines' projectId attrs =
   gitlabGetMany
     addr
-    [("sort", Just "desc")] -- most recent first
+    (pipelineSearchAttrsParams attrs)
   where
+    -- <> [("sort", Just "desc")] is most recent first
+
     addr =
       "/projects/"
         <> T.pack (show projectId)
@@ -177,3 +192,123 @@
         <> T.pack (show (project_id prj))
         <> "/pipelines/"
         <> T.pack (show pipelineId)
+
+data PipelineSearchAttrs = PipelineSearchAttrs
+  { -- | Return pipelines with the specified name.
+    pipelineSearchFilter_name :: Maybe Text,
+    -- | Order pipelines by id, status, ref, updated_at or user_id (default: id)
+    pipelineSearchFilter_order_by :: Maybe PipelineOrderBy,
+    -- | The ref of pipelines.
+    pipelineSearchFilter_ref :: Maybe Text,
+    -- | The scope of pipelines, one of: running, pending, finished, branches, tags.
+    pipelineSearchFilter_scope :: Maybe PipelineScope,
+    -- | The SHA of pipelines.
+    pipelineSearchFilter_sha :: Maybe Text,
+    -- | Sort pipelines in asc or desc order (default: desc).
+    pipelineSearchFilter_sort :: Maybe SortBy,
+    -- | The pipeline source.
+    pipelineSearchFilter_source :: Maybe Text,
+    -- | The status of pipelines, one of: created, waiting_for_resource,
+    -- | preparing, pending, running, success, failed, canceled, skipped,
+    -- | manual, scheduled.
+    pipelineSearchFilter_status :: Maybe PipelineStatus,
+    -- | Return pipelines updated after the specified date. Expected in ISO 8601
+    -- | format (2019-03-15T08:00:00Z).
+    pipelineSearchFilter_updated_after :: Maybe UTCTime,
+    -- | Return pipelines updated before the specified date. Expected in ISO
+    -- | 8601 format (2019-03-15T08:00:00Z).
+    pipelineSearchFilter_updated_before :: Maybe UTCTime,
+    -- | Return pipelines created after the specified date. Expected in ISO 8601
+    -- | format (2019-03-15T08:00:00Z).
+    pipelineSearchFilter_created_after :: Maybe UTCTime,
+    -- | Return pipelines created before the specified date. Expected in ISO
+    -- | 8601 format (2019-03-15T08:00:00Z).
+    pipelineSearchFilter_created_before :: Maybe UTCTime,
+    -- | The username of the user who triggered pipelines.
+    pipelineSearchFilter_username :: Maybe Text,
+    -- | Returns pipelines with invalid configurations.
+    pipelineSearchFilter_yaml_errors :: Maybe Bool
+  }
+
+data PipelineOrderBy
+  = PipelineOrderById
+  | PipelineOrderByStatus
+  | PipelineOrderByRef
+  | PipelineOrderByUpdatedAt
+  | PipelineOrderByUserId
+
+instance Show PipelineOrderBy where
+  show PipelineOrderById = "id"
+  show PipelineOrderByStatus = "status"
+  show PipelineOrderByRef = "ref"
+  show PipelineOrderByUpdatedAt = "updated_at"
+  show PipelineOrderByUserId = "user_id"
+
+data PipelineScope
+  = PipelineScopeRunning
+  | PipelineScopePending
+  | PipelineScopeFinished
+  | PipelineScopeBranches
+  | PipelineScopeTags
+
+instance Show PipelineScope where
+  show PipelineScopeRunning = "running"
+  show PipelineScopePending = "pending"
+  show PipelineScopeFinished = "finished"
+  show PipelineScopeBranches = "branches"
+  show PipelineScopeTags = "tags"
+
+data PipelineStatus
+  = PipelineCreated
+  | PipelineWaitingForResource
+  | PipelinePreparing
+  | PipelinePending
+  | PipelineRunning
+  | PipelineSuccess
+  | PipelineFailed
+  | PipelineCanceled
+  | PipelineSkipped
+  | PipelineManual
+  | PipelineScheduled
+
+instance Show PipelineStatus where
+  show PipelineCreated = "created"
+  show PipelineWaitingForResource = "waiting_for_resource"
+  show PipelinePreparing = "preparing"
+  show PipelinePending = "pending"
+  show PipelineRunning = "running"
+  show PipelineSuccess = "success"
+  show PipelineFailed = "failed"
+  show PipelineCanceled = "canceled"
+  show PipelineSkipped = "skipped"
+  show PipelineManual = "manual"
+  show PipelineScheduled = "scheduled"
+
+pipelineSearchAttrsParams :: PipelineSearchAttrs -> [GitLabParam]
+pipelineSearchAttrsParams filters =
+  catMaybes
+    [ (\t -> Just ("name", textToBS t)) =<< pipelineSearchFilter_name filters,
+      (\x -> Just ("order_by", textToBS (T.pack (show x)))) =<< pipelineSearchFilter_order_by filters,
+      (\t -> Just ("ref", textToBS t)) =<< pipelineSearchFilter_ref filters,
+      (\x -> Just ("scope", textToBS (T.pack (show x)))) =<< pipelineSearchFilter_scope filters,
+      (\t -> Just ("sha", textToBS t)) =<< pipelineSearchFilter_sha filters,
+      (\x -> Just ("sort", textToBS (T.pack (show x)))) =<< pipelineSearchFilter_sort filters,
+      (\t -> Just ("source", textToBS t)) =<< pipelineSearchFilter_source filters,
+      (\x -> Just ("status", textToBS (T.pack (show x)))) =<< pipelineSearchFilter_status filters,
+      (\d -> Just ("updated_after", textToBS (T.pack (show d)))) =<< pipelineSearchFilter_updated_after filters,
+      (\d -> Just ("updated_before", textToBS (T.pack (show d)))) =<< pipelineSearchFilter_updated_before filters,
+      (\d -> Just ("created_after", textToBS (T.pack (show d)))) =<< pipelineSearchFilter_created_after filters,
+      (\d -> Just ("created_before", textToBS (T.pack (show d)))) =<< pipelineSearchFilter_created_before filters,
+      (\t -> Just ("username", textToBS t)) =<< pipelineSearchFilter_username filters,
+      (\b -> Just ("yaml_errors", textToBS (showBool b))) =<< pipelineSearchFilter_yaml_errors filters
+    ]
+  where
+    textToBS = Just . T.encodeUtf8
+    showBool :: Bool -> Text
+    showBool True = "true"
+    showBool False = "false"
+
+-- | A default set of project searc filters where no project filters
+-- are applied, thereby returning all projects.
+instance Default PipelineSearchAttrs where
+  def = PipelineSearchAttrs Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing Nothing
diff --git a/src/GitLab/API/Projects.hs b/src/GitLab/API/Projects.hs
--- a/src/GitLab/API/Projects.hs
+++ b/src/GitLab/API/Projects.hs
@@ -129,7 +129,7 @@
 projects attrs = do
   result <- gitlabGetMany "/projects" (projectSearchAttrsParams attrs)
   case result of
-    Left er -> throwError (GitLabError ("projects error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "projects" er)
     Right x -> return x
 
 -- | Get a specific project. This endpoint can be accessed without
@@ -177,7 +177,7 @@
           (urlPath (user_id usr))
           (projectSearchAttrsParams attrs)
       case result of
-        Left er -> throwError (GitLabError ("userProjects' error: " <> responseErrorText er))
+        Left er -> throwError (httpResponseError "userProjects'" er)
         Right projs -> return (Just projs)
   where
     urlPath usrId = "/users/" <> T.pack (show usrId) <> "/projects"
@@ -203,7 +203,7 @@
       )
       (projectSearchAttrsParams attrs)
   case result of
-    Left er -> throwError (GitLabError ("starredProjects error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "starredProjects" er)
     Right x -> return x
 
 -- | Get a list of ancestor groups for this project.
@@ -512,7 +512,7 @@
 projectsWithName projectName = do
   result <- gitlabGetMany "/projects" [("search", Just (T.encodeUtf8 projectName))]
   case result of
-    Left er -> throwError (GitLabError ("projectsWithName error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "projectsWithName" er)
     Right foundProjects -> do
       return $
         filter (\prj -> projectName == project_path prj) foundProjects
@@ -616,7 +616,7 @@
     Just prId -> do
       result <- project prId
       case result of
-        Left er -> throwError (GitLabError ("projectOfIssue error: " <> responseErrorText er))
+        Left er -> throwError (httpResponseError "projectOfIssue" er)
         Right Nothing -> throwError (GitLabError "projectOfIssue error")
         Right (Just proj) -> return proj
 
@@ -1102,7 +1102,7 @@
   Project ->
   GitLab Bool
 projectCISuccess prj = do
-  pipes <- pipelines prj
+  pipes <- pipelines prj def
   case pipes of
     Nothing -> return False
     Just [] -> return False
diff --git a/src/GitLab/API/Repositories.hs b/src/GitLab/API/Repositories.hs
--- a/src/GitLab/API/Repositories.hs
+++ b/src/GitLab/API/Repositories.hs
@@ -44,7 +44,7 @@
 repositoryTree project = do
   result <- repositories' (project_id project)
   case result of
-    Left er -> throwError (GitLabError ("repositories error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "repositories" er)
     Right x -> return x
 
 -- | returns a list of repository files and directories in a project
@@ -151,7 +151,7 @@
 contributors prj order sort = do
   result <- gitlabGetMany addr params
   case result of
-    Left er -> throwError (GitLabError ("contributors error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "contributors" er)
     Right x -> return x
   where
     addr =
diff --git a/src/GitLab/API/Users.hs b/src/GitLab/API/Users.hs
--- a/src/GitLab/API/Users.hs
+++ b/src/GitLab/API/Users.hs
@@ -111,7 +111,7 @@
   let pathUser = "/users"
   result <- gitlabGetMany pathUser []
   case result of
-    Left er -> throwError (GitLabError ("allUsers error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "allUsers" er)
     Right usrs -> return usrs
 
 -- | Get a single user.
@@ -248,7 +248,7 @@
 currentUser = do
   result <- gitlabGetOne pathUser []
   case result of
-    Left er -> throwError (GitLabError ("currentUser error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "currentUser" er)
     Right Nothing -> throwError (GitLabError "currentUser error")
     Right (Just usr) -> return usr
   where
@@ -260,7 +260,7 @@
 currentUserStatus = do
   result <- gitlabGetOne pathUser []
   case result of
-    Left er -> throwError (GitLabError ("currentUserStatus error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "currentUserStatus" er)
     Right Nothing -> throwError (GitLabError "currentUserStatus error")
     Right (Just x) -> return x
   where
@@ -275,7 +275,7 @@
 userStatus usr = do
   result <- gitlabGetOne pathUser []
   case result of
-    Left er -> throwError (GitLabError ("userStatus error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "userStatus" er)
     Right Nothing -> throwError (GitLabError ("userStatus error"))
     Right (Just st) -> return st
   where
@@ -290,7 +290,7 @@
 userPreferences = do
   result <- gitlabGetOne pathUser []
   case result of
-    Left er -> throwError (GitLabError ("userPreferences error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "userPreferences" er)
     Right Nothing -> throwError (GitLabError ("userPreferences error"))
     Right (Just prefs) -> return prefs
   where
@@ -334,7 +334,7 @@
 currentUserCounts = do
   result <- gitlabGetOne pathUser []
   case result of
-    Left er -> throwError (GitLabError ("currentUserCounts error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "currentUserCounts" er)
     Right Nothing -> throwError (GitLabError ("currentUserCounts error"))
     Right (Just counts) -> return counts
   where
@@ -346,7 +346,7 @@
 currentUserSshKeys = do
   result <- gitlabGetOne pathUser []
   case result of
-    Left er -> throwError (GitLabError ("currentUserSshKeys error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "currentUserSshKeys" er)
     Right Nothing -> throwError (GitLabError ("currentUserSshKeys error"))
     Right (Just k) -> return k
   where
@@ -361,7 +361,7 @@
 userSshKeys usr = do
   result <- gitlabGetOne pathUser []
   case result of
-    Left er -> throwError (GitLabError ("userSshKeys error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "userSshKeys" er)
     Right Nothing -> throwError (GitLabError ("userSshKeys error"))
     Right (Just k) -> return k
   where
@@ -448,7 +448,7 @@
   let pathUser = "/user/emails/"
   result <- gitlabGetMany pathUser []
   case result of
-    Left er -> throwError (GitLabError ("emails error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "emails" er)
     Right x -> return x
 
 -- | Get a list of currently authenticated user’s emails.
@@ -463,7 +463,7 @@
           <> "/emails/"
   result <- gitlabGetMany pathUser []
   case result of
-    Left er -> throwError (GitLabError ("emailsCurrentUser error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "emailsCurrentUser" er)
     Right emls -> return emls
 
 -- | Used internally by the following functions
@@ -478,7 +478,7 @@
 userAction action _funcName usr = do
   result <- gitlabPost userAddr []
   case result of
-    Left er -> throwError (GitLabError ("userAction error: " <> responseErrorText er))
+    Left er -> throwError (httpResponseError "userAction" er)
     Right x -> return x
   where
     userAddr :: Text
diff --git a/src/GitLab/SystemHooks/GitLabSystemHooks.hs b/src/GitLab/SystemHooks/GitLabSystemHooks.hs
--- a/src/GitLab/SystemHooks/GitLabSystemHooks.hs
+++ b/src/GitLab/SystemHooks/GitLabSystemHooks.hs
@@ -47,7 +47,10 @@
   -- fire the rules
   didFire <-
     mapM (fire eventContent) rules
-      `catchError` \(GitLabError e) -> do
+      `catchError` \err -> do
+        let e = case err of
+              GitLabError t -> t
+              GitLabHttpError httpErr -> T.pack (show httpErr)
         liftIO $ do
           fpath <- writeSystemTempFile "gitlab-system-hook-exception-" (T.unpack e)
           void $ setFileMode fpath otherReadMode
@@ -171,8 +174,8 @@
       (parseEvent contents :: Maybe GroupCreate)
     `orElse` fireIf'
       (Just (\_ -> return True))
-      (cast f :: Maybe (GroupRemove -> GitLab ()))
-      (parseEvent contents :: Maybe GroupRemove)
+      (cast f :: Maybe (GroupDestroyEvent -> GitLab ()))
+      (parseEvent contents :: Maybe GroupDestroyEvent)
     `orElse` fireIf'
       (Just (\_ -> return True))
       (cast f :: Maybe (GroupRenameEvent -> GitLab ()))
@@ -237,6 +240,14 @@
       (Just (\_ -> return True))
       (cast f :: Maybe (AccessTokenEvent -> GitLab ()))
       (parseEvent contents :: Maybe AccessTokenEvent)
+    `orElse` fireIf'
+      (Just (\_ -> return True))
+      (cast f :: Maybe (DeploymentEvent -> GitLab ()))
+      (parseEvent contents :: Maybe DeploymentEvent)
+    `orElse` fireIf'
+      (Just (\_ -> return True))
+      (cast f :: Maybe (MilestoneEvent -> GitLab ()))
+      (parseEvent contents :: Maybe MilestoneEvent)
 tryFire contents (MatchIf _ predF f) = do
   fireIf'
     (cast predF :: Maybe (ProjectCreate -> GitLab Bool))
@@ -303,9 +314,9 @@
       (cast f :: Maybe (GroupCreate -> GitLab ()))
       (parseEvent contents :: Maybe GroupCreate)
     `orElse` fireIf'
-      (cast predF :: Maybe (GroupRemove -> GitLab Bool))
-      (cast f :: Maybe (GroupRemove -> GitLab ()))
-      (parseEvent contents :: Maybe GroupRemove)
+      (cast predF :: Maybe (GroupDestroyEvent -> GitLab Bool))
+      (cast f :: Maybe (GroupDestroyEvent -> GitLab ()))
+      (parseEvent contents :: Maybe GroupDestroyEvent)
     `orElse` fireIf'
       (cast predF :: Maybe (GroupRenameEvent -> GitLab Bool))
       (cast f :: Maybe (GroupRenameEvent -> GitLab ()))
@@ -370,6 +381,14 @@
       (cast predF :: Maybe (AccessTokenEvent -> GitLab Bool))
       (cast f :: Maybe (AccessTokenEvent -> GitLab ()))
       (parseEvent contents :: Maybe AccessTokenEvent)
+    `orElse` fireIf'
+      (cast predF :: Maybe (DeploymentEvent -> GitLab Bool))
+      (cast f :: Maybe (DeploymentEvent -> GitLab ()))
+      (parseEvent contents :: Maybe DeploymentEvent)
+    `orElse` fireIf'
+      (cast predF :: Maybe (MilestoneEvent -> GitLab Bool))
+      (cast f :: Maybe (MilestoneEvent -> GitLab ()))
+      (parseEvent contents :: Maybe MilestoneEvent)
 
 fireIf' :: (Typeable a, Show a) => Maybe (a -> GitLab Bool) -> Maybe (a -> GitLab ()) -> Maybe a -> GitLab Bool
 fireIf' castPred castF parsed = do
@@ -441,7 +460,7 @@
                                                               case parseEvent contents :: Maybe GroupCreate of
                                                                 Just _ -> True
                                                                 Nothing ->
-                                                                  case parseEvent contents :: Maybe GroupRemove of
+                                                                  case parseEvent contents :: Maybe GroupDestroyEvent of
                                                                     Just _ -> True
                                                                     Nothing ->
                                                                       case parseEvent contents :: Maybe GroupRenameEvent of
@@ -488,4 +507,10 @@
                                                                                                                             Nothing ->
                                                                                                                               case parseEvent contents :: Maybe AccessTokenEvent of
                                                                                                                                 Just _ -> True
-                                                                                                                                Nothing -> False
+                                                                                                                                Nothing ->
+                                                                                                                                  case parseEvent contents :: Maybe DeploymentEvent of
+                                                                                                                                    Just _ -> True
+                                                                                                                                    Nothing ->
+                                                                                                                                      case parseEvent contents :: Maybe MilestoneEvent of
+                                                                                                                                        Just _ -> True
+                                                                                                                                        Nothing -> False
diff --git a/src/GitLab/SystemHooks/Types.hs b/src/GitLab/SystemHooks/Types.hs
--- a/src/GitLab/SystemHooks/Types.hs
+++ b/src/GitLab/SystemHooks/Types.hs
@@ -33,7 +33,7 @@
     KeyCreate (..),
     KeyRemove (..),
     GroupCreate (..),
-    GroupRemove (..),
+    GroupDestroyEvent (..),
     GroupRenameEvent (..),
     NewGroupMember (..),
     GroupMemberRemove (..),
@@ -88,6 +88,9 @@
     EmojiObjectAttributes (..),
     AccessTokenEvent (..),
     AccessTokenObjectAttributes (..),
+    DeploymentEvent (..),
+    MilestoneEvent (..),
+    MilestoneAttributes (..),
     parseEvent,
   )
 where
@@ -393,20 +396,19 @@
   }
   deriving (Typeable, Show, Eq)
 
-instance SystemHook GroupRemove where
+instance SystemHook GroupDestroyEvent where
   match = Match
   matchIf = MatchIf
 
 -- | A group has been removed.
-data GroupRemove = GroupRemove
-  { groupRemove_created_at :: Text, -- todo improve: date
-    groupRemove_updated_at :: Text, -- todo improve: date
-    groupRemove_event_name :: Text,
-    groupRemove_name :: Text,
-    groupRemove_owner_email :: Maybe Text,
-    groupRemove_owner_name :: Maybe Text,
-    groupRemove_path :: Text,
-    groupRemove_group_id :: Int
+data GroupDestroyEvent = GroupDestroyEvent
+  { group_destroy_event_created_at :: Text, -- todo improve: date
+    group_destroy_event_updated_at :: Text, -- todo improve: date
+    group_destroy_event_name :: Text,
+    group_destroy_event_owner_email :: Maybe Text,
+    group_destroy_event_owner_name :: Maybe Text,
+    group_destroy_event_path :: Text,
+    group_destroy_event_group_id :: Int
   }
   deriving (Typeable, Show, Eq)
 
@@ -674,46 +676,46 @@
 
 -- | Attributes associated with a merge request
 data MergeRequestObjectAttributes = MergeRequestObjectAttributes
-  { objectAttributes_id :: Int,
-    objectAttributes_target_branch :: Text,
-    objectAttributes_source_branch :: Text,
-    objectAttributes_source_project_id :: Int,
-    objectAttributes_author_id :: Maybe Int,
-    objectAttributes_assignee_id :: Maybe Int,
-    objectAttributes_assignee_ids :: Maybe [Int],
-    objectAttributes_title :: Text,
-    objectAttributes_created_at :: Text,
-    objectAttributes_updated_at :: Text,
-    objectAttributes_milestone_id :: Maybe Int,
-    objectAttributes_state :: Text,
-    objectAttributes_state_id :: Maybe Int,
-    objectAttributes_merge_status :: Text,
-    objectAttributes_target_project_id :: Int,
-    objectAttributes_iid :: Int,
-    objectAttributes_description :: Text,
-    objectAttributes_updated_by_id :: Maybe Int,
-    objectAttributes_merge_error :: Maybe Text,
-    objectAttributes_merge_params :: Maybe MergeParams,
-    objectAttributes_merge_when_pipeline_succeeds :: Maybe Bool,
-    objectAttributes_merge_user_id :: Maybe Int,
-    objectAttributes_merge_commit_sha :: Maybe Text,
-    objectAttributes_deleted_at :: Maybe Text,
-    objectAttributes_in_progress_merge_commit_sha :: Maybe Text,
-    objectAttributes_lock_version :: Maybe Int,
-    objectAttributes_time_estimate :: Maybe Int,
-    objectAttributes_last_edited_at :: Maybe Text,
-    objectAttributes_last_edited_by_id :: Maybe Int,
-    objectAttributes_head_pipeline_id :: Maybe Int,
-    objectAttributes_ref_fetched :: Maybe Bool,
-    objectAttributes_merge_jid :: Maybe Int,
-    objectAttributes_source :: ProjectEvent,
-    objectAttributes_target :: ProjectEvent,
-    objectAttributes_last_commit :: CommitEvent,
-    objectAttributes_work_in_progress :: Bool,
-    objectAttributes_total_time_spent :: Maybe Int,
-    objectAttributes_human_total_time_spent :: Maybe Int,
-    objectAttributes_human_time_estimate :: Maybe Int,
-    objectAttributes_action :: Maybe Text
+  { merge_request_object_attributes_id :: Int,
+    merge_request_object_attributes_target_branch :: Text,
+    merge_request_object_attributes_source_branch :: Text,
+    merge_request_object_attributes_source_project_id :: Int,
+    merge_request_object_attributes_author_id :: Maybe Int,
+    merge_request_object_attributes_assignee_id :: Maybe Int,
+    merge_request_object_attributes_assignee_ids :: Maybe [Int],
+    merge_request_object_attributes_title :: Text,
+    merge_request_object_attributes_created_at :: Maybe Text,
+    merge_request_object_attributes_updated_at :: Maybe Text,
+    merge_request_object_attributes_milestone_id :: Maybe Int,
+    merge_request_object_attributes_state :: Text,
+    merge_request_object_attributes_state_id :: Maybe Int,
+    merge_request_object_attributes_merge_status :: Text,
+    merge_request_object_attributes_target_project_id :: Int,
+    merge_request_object_attributes_iid :: Int,
+    merge_request_object_attributes_description :: Maybe Text,
+    merge_request_object_attributes_updated_by_id :: Maybe Int,
+    merge_request_object_attributes_merge_error :: Maybe Text,
+    merge_request_object_attributes_merge_params :: Maybe MergeParams,
+    merge_request_object_attributes_merge_when_pipeline_succeeds :: Maybe Bool,
+    merge_request_object_attributes_merge_user_id :: Maybe Int,
+    merge_request_object_attributes_merge_commit_sha :: Maybe Text,
+    merge_request_object_attributes_deleted_at :: Maybe Text,
+    merge_request_object_attributes_in_progress_merge_commit_sha :: Maybe Text,
+    merge_request_object_attributes_lock_version :: Maybe Int,
+    merge_request_object_attributes_time_estimate :: Maybe Int,
+    merge_request_object_attributes_last_edited_at :: Maybe Text,
+    merge_request_object_attributes_last_edited_by_id :: Maybe Int,
+    merge_request_object_attributes_head_pipeline_id :: Maybe Int,
+    merge_request_object_attributes_ref_fetched :: Maybe Bool,
+    merge_request_object_attributes_merge_jid :: Maybe Int,
+    merge_request_object_attributes_source :: Maybe ProjectEvent,
+    merge_request_object_attributes_target :: Maybe ProjectEvent,
+    merge_request_object_attributes_last_commit :: Maybe CommitEvent,
+    merge_request_object_attributes_work_in_progress :: Maybe Bool,
+    merge_request_object_attributes_total_time_spent :: Maybe Int,
+    merge_request_object_attributes_human_total_time_spent :: Maybe Int,
+    merge_request_object_attributes_human_time_estimate :: Maybe Int,
+    merge_request_object_attributes_action :: Maybe Text
   }
   deriving (Typeable, Show, Eq, Generic)
 
@@ -749,7 +751,7 @@
   | KeyCreated
   | KeyRemoved
   | GroupCreated
-  | GroupRemoved
+  | GroupDestroyed
   | GroupRenamed
   | GroupMemberAdded
   | GroupMemberRemoved
@@ -765,6 +767,8 @@
   | WorkItemed
   | Emojid
   | AccessTokened
+  | Deploymented
+  | Milestoned
   deriving (Show, Eq)
 
 -- | CI build
@@ -846,7 +850,7 @@
 data PipelineEvent = PipelineEvent
   { pipeline_event_object_kind :: Text,
     pipeline_event_object_attributes :: PipelineObjectAttributes,
-    pipeline_event_merge_request :: Maybe Text,
+    pipeline_event_merge_request :: Maybe MergeRequestObjectAttributes,
     pipeline_event_user :: User,
     pipeline_event_project :: BuildProject,
     pipeline_event_commit :: CommitEvent,
@@ -1278,6 +1282,56 @@
   match = Match
   matchIf = MatchIf
 
+data DeploymentEvent = DeploymentEvent
+  { deployment_event_status :: Text, -- "running"
+    deployment_event_status_changed_at :: Maybe Text, -- TODO change to date type "2026-03-16 03:09:32 +0000"
+    deployment_event_deployment_id :: Int,
+    deployment_event_deployable_id :: Int,
+    deployment_event_deployable_url :: Text, -- TODO change to URL type
+    deployment_event_environment :: Text, -- "production"
+    deployment_event_environment_tier :: Text, -- "production"
+    deployment_event_environment_slug :: Text, -- "production"
+    deployment_event_environment_external_url :: Maybe Text, -- TODO change to URL type
+    deployment_event_project :: ProjectEvent,
+    deployment_event_short_sha :: Text,
+    deployment_event_user :: User,
+    deployment_event_user_url :: Text, -- TODO change to URL type
+    deployment_event_commit_url :: Text, -- TODO change to URL type
+    deployment_event_commit_title :: Text,
+    deployment_event_ref :: Text
+  }
+  deriving (Typeable, Show, Eq, Generic)
+
+instance SystemHook DeploymentEvent where
+  match = Match
+  matchIf = MatchIf
+
+data MilestoneEvent = MilestoneEvent
+  { milestone_event_project :: ProjectEvent,
+    milestone_event_group :: Maybe Text,
+    milestone_event_object_attributes :: MilestoneAttributes,
+    milestone_event_action :: Text -- "create"
+  }
+  deriving (Typeable, Show, Eq, Generic)
+
+data MilestoneAttributes = MilestoneAttributes
+  { milestone_attributes_id :: Int,
+    milestone_attributes_iid :: Int,
+    milestone_attributes_title :: Text,
+    milestone_attributes_description :: Text,
+    milestone_attributes_state :: Text, -- "active"
+    milestone_attributes_created_at :: Text, -- TODO change to date type "2026-02-12 12:35:59 UTC"
+    milestone_attributes_updated_at :: Text, -- TODO change to date type "2026-02-12 12:35:59 UTC"
+    milestone_attributes_due_date :: Text, -- TODO change to date type "2026-02-23"
+    milestone_attributes_start_date :: Text, -- TODO change to date type "2026-01-26"
+    milestone_attributes_project_id :: Int
+  }
+  deriving (Typeable, Show, Eq, Generic)
+
+instance SystemHook MilestoneEvent where
+  match = Match
+  matchIf = MatchIf
+
 instance FromJSON ProjectCreate where
   parseJSON =
     withObject "ProjectCreate" $ \v -> do
@@ -1599,25 +1653,24 @@
             _unexpected -> fail "group_create parsing failed"
         _unexpected -> fail "group_create parsing failed"
 
-instance FromJSON GroupRemove where
+instance FromJSON GroupDestroyEvent where
   parseJSON =
     withObject "GroupRemove" $ \v -> do
       isProjectEvent <- v .:? "event_name"
       case isProjectEvent of
         Just theEvent ->
           case theEvent of
-            GroupRemoved ->
-              GroupRemove
+            GroupDestroyed ->
+              GroupDestroyEvent
                 <$> v .: "created_at"
                 <*> v .: "updated_at"
-                <*> v .: "event_name"
                 <*> v .: "name"
-                <*> v .: "owner_email"
-                <*> v .: "owner_name"
+                <*> v .:? "owner_email"
+                <*> v .:? "owner_name"
                 <*> v .: "path"
                 <*> v .: "group_id"
-            _unexpected -> fail "group_remove parsing failed"
-        _unexpected -> fail "group_remove parsing failed"
+            _unexpected -> fail "group_destroy parsing failed"
+        _unexpected -> fail "group_destroy parsing failed"
 
 instance FromJSON GroupRenameEvent where
   parseJSON =
@@ -1982,46 +2035,46 @@
 bodyNoPrefix "userEvent_name" = "name"
 bodyNoPrefix "userEvent_username" = "username"
 bodyNoPrefix "userEvent_avatar_url" = "avatar_url"
-bodyNoPrefix "objectAttributes_id" = "id"
-bodyNoPrefix "objectAttributes_target_branch" = "target_branch"
-bodyNoPrefix "objectAttributes_source_branch" = "source_branch"
-bodyNoPrefix "objectAttributes_source_project_id" = "source_project_id"
-bodyNoPrefix "objectAttributes_author_id" = "author_id"
-bodyNoPrefix "objectAttributes_assignee_id" = "assignee_id"
-bodyNoPrefix "objectAttributes_assignee_ids" = "assignee_ids"
-bodyNoPrefix "objectAttributes_title" = "title"
-bodyNoPrefix "objectAttributes_created_at" = "created_at"
-bodyNoPrefix "objectAttributes_updated_at" = "updated_at"
-bodyNoPrefix "objectAttributes_milestone_id" = "milestone_id"
-bodyNoPrefix "objectAttributes_state" = "state"
-bodyNoPrefix "objectAttributes_state_id" = "state_id"
-bodyNoPrefix "objectAttributes_merge_status" = "merge_status"
-bodyNoPrefix "objectAttributes_target_project_id" = "target_project_id"
-bodyNoPrefix "objectAttributes_iid" = "iid"
-bodyNoPrefix "objectAttributes_description" = "description"
-bodyNoPrefix "objectAttributes_updated_by_id" = "updated_by_id"
-bodyNoPrefix "objectAttributes_merge_error" = "merge_error"
-bodyNoPrefix "objectAttributes_merge_params" = "merge_params"
-bodyNoPrefix "objectAttributes_merge_when_pipeline_succeeds" = "merge_when_pipeline_succeeds"
-bodyNoPrefix "objectAttributes_merge_user_id" = "merge_user_id"
-bodyNoPrefix "objectAttributes_merge_commit_sha" = "merge_commit_sha"
-bodyNoPrefix "objectAttributes_deleted_at" = "deleted_at"
-bodyNoPrefix "objectAttributes_in_progress_merge_commit_sha" = "in_progress_merge_commit_sha"
-bodyNoPrefix "objectAttributes_lock_version" = "lock_version"
-bodyNoPrefix "objectAttributes_time_estimate" = "time_estimate"
-bodyNoPrefix "objectAttributes_last_edited_at" = "last_edited_at"
-bodyNoPrefix "objectAttributes_last_edited_by_id" = "last_edited_by_id"
-bodyNoPrefix "objectAttributes_head_pipeline_id" = "head_pipeline_id"
-bodyNoPrefix "objectAttributes_ref_fetched" = "ref_fetched"
-bodyNoPrefix "objectAttributes_merge_jid" = "merge_jid"
-bodyNoPrefix "objectAttributes_source" = "source"
-bodyNoPrefix "objectAttributes_target" = "target"
-bodyNoPrefix "objectAttributes_last_commit" = "last_commit"
-bodyNoPrefix "objectAttributes_work_in_progress" = "work_in_progress"
-bodyNoPrefix "objectAttributes_total_time_spent" = "total_time_spent"
-bodyNoPrefix "objectAttributes_human_total_time_spent" = "human_total_time_spent"
-bodyNoPrefix "objectAttributes_human_time_estimate" = "human_time_estimate"
-bodyNoPrefix "objectAttributes_action" = "action"
+bodyNoPrefix "merge_request_object_attributes_id" = "id"
+bodyNoPrefix "merge_request_object_attributes_target_branch" = "target_branch"
+bodyNoPrefix "merge_request_object_attributes_source_branch" = "source_branch"
+bodyNoPrefix "merge_request_object_attributes_source_project_id" = "source_project_id"
+bodyNoPrefix "merge_request_object_attributes_author_id" = "author_id"
+bodyNoPrefix "merge_request_object_attributes_assignee_id" = "assignee_id"
+bodyNoPrefix "merge_request_object_attributes_assignee_ids" = "assignee_ids"
+bodyNoPrefix "merge_request_object_attributes_title" = "title"
+bodyNoPrefix "merge_request_object_attributes_created_at" = "created_at"
+bodyNoPrefix "merge_request_object_attributes_updated_at" = "updated_at"
+bodyNoPrefix "merge_request_object_attributes_milestone_id" = "milestone_id"
+bodyNoPrefix "merge_request_object_attributes_state" = "state"
+bodyNoPrefix "merge_request_object_attributes_state_id" = "state_id"
+bodyNoPrefix "merge_request_object_attributes_merge_status" = "merge_status"
+bodyNoPrefix "merge_request_object_attributes_target_project_id" = "target_project_id"
+bodyNoPrefix "merge_request_object_attributes_iid" = "iid"
+bodyNoPrefix "merge_request_object_attributes_description" = "description"
+bodyNoPrefix "merge_request_object_attributes_updated_by_id" = "updated_by_id"
+bodyNoPrefix "merge_request_object_attributes_merge_error" = "merge_error"
+bodyNoPrefix "merge_request_object_attributes_merge_params" = "merge_params"
+bodyNoPrefix "merge_request_object_attributes_merge_when_pipeline_succeeds" = "merge_when_pipeline_succeeds"
+bodyNoPrefix "merge_request_object_attributes_merge_user_id" = "merge_user_id"
+bodyNoPrefix "merge_request_object_attributes_merge_commit_sha" = "merge_commit_sha"
+bodyNoPrefix "merge_request_object_attributes_deleted_at" = "deleted_at"
+bodyNoPrefix "merge_request_object_attributes_in_progress_merge_commit_sha" = "in_progress_merge_commit_sha"
+bodyNoPrefix "merge_request_object_attributes_lock_version" = "lock_version"
+bodyNoPrefix "merge_request_object_attributes_time_estimate" = "time_estimate"
+bodyNoPrefix "merge_request_object_attributes_last_edited_at" = "last_edited_at"
+bodyNoPrefix "merge_request_object_attributes_last_edited_by_id" = "last_edited_by_id"
+bodyNoPrefix "merge_request_object_attributes_head_pipeline_id" = "head_pipeline_id"
+bodyNoPrefix "merge_request_object_attributes_ref_fetched" = "ref_fetched"
+bodyNoPrefix "merge_request_object_attributes_merge_jid" = "merge_jid"
+bodyNoPrefix "merge_request_object_attributes_source" = "source"
+bodyNoPrefix "merge_request_object_attributes_target" = "target"
+bodyNoPrefix "merge_request_object_attributes_last_commit" = "last_commit"
+bodyNoPrefix "merge_request_object_attributes_work_in_progress" = "work_in_progress"
+bodyNoPrefix "merge_request_object_attributes_total_time_spent" = "total_time_spent"
+bodyNoPrefix "merge_request_object_attributes_human_total_time_spent" = "human_total_time_spent"
+bodyNoPrefix "merge_request_object_attributes_human_time_estimate" = "human_time_estimate"
+bodyNoPrefix "merge_request_object_attributes_action" = "action"
 bodyNoPrefix "mergeRequestChanges_author_id" = "author_id"
 bodyNoPrefix "mergeRequestChanges_created_at" = "created_at"
 bodyNoPrefix "mergeRequestChanges_description" = "description"
@@ -2286,6 +2339,16 @@
 bodyNoPrefix "environment_name" = "name"
 bodyNoPrefix "environment_action" = "action"
 bodyNoPrefix "environment_deployment_tier" = "deployment_tier"
+bodyNoPrefix "milestone_attributes_id" = "id"
+bodyNoPrefix "milestone_attributes_iid" = "iid"
+bodyNoPrefix "milestone_attributes_title" = "title"
+bodyNoPrefix "milestone_attributes_description" = "description"
+bodyNoPrefix "milestone_attributes_state" = "state"
+bodyNoPrefix "milestone_attributes_created_at" = "created_at"
+bodyNoPrefix "milestone_attributes_updated_at" = "updated_at"
+bodyNoPrefix "milestone_attributes_due_date" = "due_date"
+bodyNoPrefix "milestone_attributes_start_date" = "start_date"
+bodyNoPrefix "milestone_attributes_project_id" = "project_id"
 bodyNoPrefix s = fail ("uexpected JSON field prefix: " <> s)
 
 instance FromJSON ProjectEvent where
@@ -2634,6 +2697,58 @@
             _unexpected -> fail "acess_token parsing failed"
         _unexpected -> fail "acess_token parsing failed"
 
+instance FromJSON DeploymentEvent where
+  parseJSON =
+    withObject "DeploymentEvent" $ \v -> do
+      isDeploymentEvent <- v .:? "object_kind"
+      case isDeploymentEvent of
+        Just theEvent ->
+          case theEvent of
+            Deploymented ->
+              DeploymentEvent
+                <$> v .: "status"
+                <*> v .: "status_changed_at"
+                <*> v .: "deployment_id"
+                <*> v .: "deployable_id"
+                <*> v .: "deployable_url"
+                <*> v .: "environment"
+                <*> v .: "environment_tier"
+                <*> v .: "environment_slug"
+                <*> v .: "environment_external_url"
+                <*> v .: "project"
+                <*> v .: "short_sha"
+                <*> v .: "user"
+                <*> v .: "user_url"
+                <*> v .: "commit_url"
+                <*> v .: "commit_title"
+                <*> v .: "ref"
+            _unexpected -> fail "deployment parsing failed"
+        _unexpected -> fail "deployment parsing failed"
+
+instance FromJSON MilestoneEvent where
+  parseJSON =
+    withObject "MilestoneEvent" $ \v -> do
+      isMilestoneEvent <- v .:? "object_kind"
+      case isMilestoneEvent of
+        Just theEvent ->
+          case theEvent of
+            Milestoned ->
+              MilestoneEvent
+                <$> v .: "project"
+                <*> v .: "group"
+                <*> v .: "object_attributes"
+                <*> v .: "action"
+            _unexpected -> fail "deployment parsing failed"
+        _unexpected -> fail "deployment parsing failed"
+
+instance FromJSON MilestoneAttributes where
+  parseJSON =
+    genericParseJSON
+      ( defaultOptions
+          { fieldLabelModifier = bodyNoPrefix
+          }
+      )
+
 instance FromJSON ProjectAction where
   parseJSON (String "project_create") = return ProjectCreated
   parseJSON (String "project_destroy") = return ProjectDestroyed
@@ -2650,7 +2765,7 @@
   parseJSON (String "key_create") = return KeyCreated
   parseJSON (String "key_destroy") = return KeyRemoved
   parseJSON (String "group_create") = return GroupCreated
-  parseJSON (String "group_destroy") = return GroupRemoved
+  parseJSON (String "group_destroy") = return GroupDestroyed
   parseJSON (String "group_rename") = return GroupRenamed
   parseJSON (String "user_add_to_group") = return GroupMemberAdded
   parseJSON (String "user_remove_from_group") = return GroupMemberRemoved
@@ -2666,4 +2781,6 @@
   parseJSON (String "work_item") = return WorkItemed
   parseJSON (String "emoji") = return Emojid
   parseJSON (String "access_token") = return AccessTokened
+  parseJSON (String "deployment") = return Deploymented
+  parseJSON (String "milestone") = return Milestoned
   parseJSON s = fail ("unexpected system hook event: " <> show s)
diff --git a/src/GitLab/Types.hs b/src/GitLab/Types.hs
--- a/src/GitLab/Types.hs
+++ b/src/GitLab/Types.hs
@@ -19,6 +19,7 @@
     GitLabState (..),
     GitLabServerConfig (..),
     GitLabError (..),
+    HttpResponseError (..),
     AuthMethod (..),
     ArchiveFormat (..),
     AccessLevel (..),
@@ -123,6 +124,8 @@
 import qualified Data.Text as T
 import Data.Time.Clock
 import Network.HTTP.Conduit
+import Network.HTTP.Types.Header (ResponseHeaders)
+import Network.HTTP.Types.Status (Status)
 
 -- | The monad in which the GitLab operations can be run.
 -- Contains the 'GitLabState' to run the requests with.
@@ -137,9 +140,25 @@
 instance (MIO.MonadIO m) => MIO.MonadIO (GitLabT m) where
   liftIO = GitLabT . MIO.liftIO
 
-data GitLabError = GitLabError Text
+data GitLabError
+  = -- | A general error, e.g. a JSON parsing failure.
+    GitLabError Text
+  | -- | A non-success HTTP response from the GitLab server, including response
+    -- headers.
+    GitLabHttpError HttpResponseError
   deriving (Show)
 
+-- | Details of a non-success HTTP response from the GitLab server.
+data HttpResponseError = HttpResponseError
+  { -- | The API operation that produced the error, e.g. @\"userEvents\"@.
+    httpErrorContext :: Text,
+    -- | The HTTP status of the response.
+    httpErrorStatus :: Status,
+    -- | The response headers.
+    httpErrorHeaders :: ResponseHeaders
+  }
+  deriving (Show)
+
 -- | Utility type which uses 'IO' as underlying monad
 type GitLab a = GitLabT (ExceptT GitLabError IO) a
 
@@ -155,6 +174,8 @@
     authMethod :: AuthMethod,
     -- | how many times to retry a HTTP request before giving up and returning an error.
     retries :: Int,
+    -- | delay between HTTP request retries in seconds
+    delayBetweenRetries :: Int,
     -- | write system hook events to files in the system temporary directory.
     debugSystemHooks :: Maybe DebugSystemHooks
   }
@@ -170,7 +191,7 @@
 
 -- | default settings are https://gitlab.com with 'AuthMethodNone', the 'url' and 'authMethod' values may need to be overwritten.
 instance Default GitLabServerConfig where
-  def = GitLabServerConfig {url = "https://gitlab.com", authMethod = AuthMethodNone, retries = 5, debugSystemHooks = Nothing}
+  def = GitLabServerConfig {url = "https://gitlab.com", authMethod = AuthMethodNone, retries = 5, delayBetweenRetries = 1, debugSystemHooks = Nothing}
 
 -- | personal access token, see <https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html>
 data AuthMethod
diff --git a/src/GitLab/WebRequests/GitLabWebCalls.hs b/src/GitLab/WebRequests/GitLabWebCalls.hs
--- a/src/GitLab/WebRequests/GitLabWebCalls.hs
+++ b/src/GitLab/WebRequests/GitLabWebCalls.hs
@@ -12,9 +12,11 @@
     gitlabUnsafe,
     gitlabGetByteStringResponse,
     responseErrorText,
+    httpResponseError,
   )
 where
 
+import Control.Concurrent (threadDelay)
 import qualified Control.Exception as Exception
 import Control.Monad.Except
 import Control.Monad.IO.Class
@@ -164,6 +166,20 @@
     <> " "
     <> T.decodeUtf8 (statusMessage (responseStatus resp))
 
+-- | Build a structured 'GitLabHttpError' from a failed HTTP response, tagging
+-- it with the API operation that produced it (e.g. @\"userEvents\"@).
+--
+-- The response status and headers are retained, so callers can inspect them
+-- (for example, to honour rate-limit headers such as @Retry-After@).
+httpResponseError :: Text -> Response payload -> GitLabError
+httpResponseError context resp =
+  GitLabHttpError
+    HttpResponseError
+      { httpErrorContext = context,
+        httpErrorStatus = responseStatus resp,
+        httpErrorHeaders = responseHeaders resp
+      }
+
 ---------------------
 -- internal functions
 
@@ -197,7 +213,7 @@
                    ],
             requestBody = RequestBodyBS (renderQuery False contentParams)
           }
-  liftIO $ tryGitLab 0 request (retries cfg) manager Nothing
+  liftIO $ tryGitLab 0 request (retries cfg) (delayBetweenRetries cfg) manager Nothing
 
 gitlabHTTPOne ::
   (FromJSON a) =>
@@ -297,16 +313,18 @@
   Request ->
   -- | maximum number of retries permitted
   Int ->
+  -- | delay between retries in seconds
+  Int ->
   -- | HTTP manager
   Manager ->
   -- | the exception to report if maximum retries met
   Maybe HttpException ->
   IO (Response BSL.ByteString)
-tryGitLab i request maxRetries manager lastException
+tryGitLab i request maxRetries delaySeconds manager lastException
   | i == maxRetries = error (show lastException)
   | otherwise =
       httpLbs request manager
-        `Exception.catch` \ex -> tryGitLab (i + 1) request maxRetries manager (Just ex)
+        `Exception.catch` \ex -> threadDelay delaySeconds >> tryGitLab (i + 1) request maxRetries delaySeconds manager (Just ex)
 
 parseOne :: (FromJSON a) => BSL.ByteString -> Maybe a
 parseOne bs =
diff --git a/tests/SystemHookTests.hs b/tests/SystemHookTests.hs
--- a/tests/SystemHookTests.hs
+++ b/tests/SystemHookTests.hs
@@ -106,11 +106,21 @@
             >>= \eventJson -> parseEvent eventJson @?= Just groupCreated2Haskell
         ),
       testCase
-        "group-removed-event"
-        ( TIO.readFile "data/system-hooks/group-removed.json"
-            >>= \eventJson -> parseEvent eventJson @?= Just groupRemovedHaskell
+        "group-destroy-event1"
+        ( TIO.readFile "data/system-hooks/group-destroy1.json"
+            >>= \eventJson -> parseEvent eventJson @?= Just groupDestroy1Haskell
         ),
       testCase
+        "group-destroy-event2"
+        ( TIO.readFile "data/system-hooks/group-destroy2.json"
+            >>= \eventJson -> parseEvent eventJson @?= Just groupDestroy2Haskell
+        ),
+      testCase
+        "group-destroy-event3"
+        ( TIO.readFile "data/system-hooks/group-destroy3.json"
+            >>= \eventJson -> parseEvent eventJson @?= Just groupDestroy3Haskell
+        ),
+      testCase
         "group-renamed1"
         ( TIO.readFile "data/system-hooks/group-renamed1.json"
             >>= \eventJson -> parseEvent eventJson @?= Just groupRenamed1Haskell
@@ -156,6 +166,11 @@
             >>= \eventJson -> parseEvent eventJson @?= Just tagPush2Haskell
         ),
       testCase
+        "tag-push-event3"
+        ( TIO.readFile "data/system-hooks/tag-push3.json"
+            >>= \eventJson -> parseEvent eventJson @?= Just tagPush3Haskell
+        ),
+      testCase
         "merge-request-event"
         ( TIO.readFile "data/system-hooks/merge-request.json"
             >>= \eventJson -> parseEvent eventJson @?= Just mergeRequestHaskell
@@ -221,6 +236,11 @@
             >>= \eventJson -> parseEvent eventJson @?= Just pipeline6Haskell
         ),
       testCase
+        "pipeline7"
+        ( TIO.readFile "data/system-hooks/pipeline7.json"
+            >>= \eventJson -> parseEvent eventJson @?= Just pipeline7Haskell
+        ),
+      testCase
         "issue1"
         ( TIO.readFile "data/system-hooks/issue1.json"
             >>= \eventJson -> parseEvent eventJson @?= Just issue1Haskell
@@ -304,6 +324,21 @@
         "access-token4"
         ( TIO.readFile "data/system-hooks/access-token4.json"
             >>= \eventJson -> parseEvent eventJson @?= Just accessToken4Haskell
+        ),
+      testCase
+        "deployment1"
+        ( TIO.readFile "data/system-hooks/deployment1.json"
+            >>= \eventJson -> parseEvent eventJson @?= Just deployment1Haskell
+        ),
+      testCase
+        "deployment2"
+        ( TIO.readFile "data/system-hooks/deployment2.json"
+            >>= \eventJson -> parseEvent eventJson @?= Just deployment2Haskell
+        ),
+      testCase
+        "milestone1"
+        ( TIO.readFile "data/system-hooks/milestone1.json"
+            >>= \eventJson -> parseEvent eventJson @?= Just milestone1Haskell
         )
     ]
 
@@ -390,7 +425,7 @@
       <> matchTest "key-create" "key-added.json" keyCreateRule "project-created.json" projectCreateRule
       <> matchTest "key-remove" "key-removed.json" keyRemoveRule "project-created.json" projectCreateRule
       <> matchTest "group-create" "group-created.json" groupCreateRule "project-created.json" projectCreateRule
-      <> matchTest "group-remove" "group-removed.json" groupRemoveRule "project-created.json" projectCreateRule
+      <> matchTest "group-destroy" "group-destroy3.json" groupDestroyRule "project-created.json" projectCreateRule
       <> matchTest "group-rename" "group-renamed1.json" groupRenameRule "project-created.json" projectCreateRule
       <> matchTest "new-group-member" "new-group-member.json" newGroupMemberRule "project-created.json" projectCreateRule
       <> matchTest "group-member-remove" "group-member-removed.json" groupMemberRemoveRule "project-created.json" projectCreateRule
@@ -407,6 +442,8 @@
       <> matchTest "work-item" "work-item1.json" workItemRule "project-created.json" projectCreateRule
       <> matchTest "emoji" "emoji1.json" emojiRule "project-created.json" projectCreateRule
       <> matchTest "access-token" "access-token1.json" accessTokenRule "project-created.json" projectCreateRule
+      <> matchTest "deployment" "deployment1.json" deploymentRule "project-created.json" projectCreateRule
+      <> matchTest "milestone" "milestone1.json" milestoneRule "project-created.json" projectCreateRule
 
 matchIfTests :: TestTree
 matchIfTests =
@@ -426,7 +463,7 @@
       <> matchIfTest "key-create" "key-added.json" keyCreateIfRuleYes keyCreateIfRuleNo
       <> matchIfTest "key-remove" "key-removed.json" keyRemoveIfRuleYes keyRemoveIfRuleNo
       <> matchIfTest "group-create" "group-created.json" groupCreateIfRuleYes groupCreateIfRuleNo
-      <> matchIfTest "group-remove" "group-removed.json" groupRemoveIfRuleYes groupRemoveIfRuleNo
+      <> matchIfTest "group-destroy" "group-destroy3.json" groupDestroyIfRuleYes groupDestroyIfRuleNo
       <> matchIfTest "group-rename" "group-renamed1.json" groupRenameIfRuleYes groupRenameIfRuleNo
       <> matchIfTest "new-group-member" "new-group-member.json" newGroupMemberIfRuleYes newGroupMemberIfRuleNo
       <> matchIfTest "group-member-remove" "group-member-removed.json" groupMemberRemoveIfRuleYes groupMemberRemoveIfRuleNo
@@ -443,6 +480,8 @@
       <> matchIfTest "work-item" "work-item1.json" workItemIfRuleYes workItemIfRuleNo
       <> matchIfTest "emoji" "emoji1.json" emojiIfRuleYes emojiIfRuleNo
       <> matchIfTest "access-token" "access-token1.json" accessTokenIfRuleYes accessTokenIfRuleNo
+      <> matchIfTest "deployment" "deployment1.json" deploymentIfRuleYes deploymentIfRuleNo
+      <> matchIfTest "milestone" "milestone1.json" milestoneIfRuleYes milestoneIfRuleNo
 
 receiveTests :: TestTree
 receiveTests =
@@ -1047,39 +1086,39 @@
         return ()
     )
 
-groupRemoveRule :: Rule
-groupRemoveRule =
+groupDestroyRule :: Rule
+groupDestroyRule =
   match
-    "groupRemove rule"
-    ( \GroupRemove {} -> do
+    "group-destroy rule"
+    ( \GroupDestroyEvent {} -> do
         return ()
     )
 
-groupRemoveIfRuleYes :: Rule
-groupRemoveIfRuleYes =
+groupDestroyIfRuleYes :: Rule
+groupDestroyIfRuleYes =
   matchIf
-    "groupRemove rule-if yes"
-    ( \event@GroupRemove {} -> do
+    "group-destroy rule-if yes"
+    ( \event@GroupDestroyEvent {} -> do
         return
-          ( groupRemove_name event
+          ( group_destroy_event_name event
               == "StoreCloud"
           )
     )
-    ( \GroupRemove {} -> do
+    ( \GroupDestroyEvent {} -> do
         return ()
     )
 
-groupRemoveIfRuleNo :: Rule
-groupRemoveIfRuleNo =
+groupDestroyIfRuleNo :: Rule
+groupDestroyIfRuleNo =
   matchIf
-    "groupRemove rule-if no"
-    ( \event@GroupRemove {} -> do
+    "group-destroy rule-if no"
+    ( \event@GroupDestroyEvent {} -> do
         return
-          ( groupRemove_name event
+          ( group_destroy_event_name event
               == ""
           )
     )
-    ( \GroupRemove {} -> do
+    ( \GroupDestroyEvent {} -> do
         return ()
     )
 
@@ -1551,6 +1590,66 @@
         return ()
     )
 
+deploymentRule :: Rule
+deploymentRule =
+  match
+    "deployment rule"
+    ( \DeploymentEvent {} -> do
+        return ()
+    )
+
+deploymentIfRuleYes :: Rule
+deploymentIfRuleYes =
+  matchIf
+    "deployment rule-if yes"
+    ( \event@DeploymentEvent {} -> do
+        return (deployment_event_environment event == "production")
+    )
+    ( \DeploymentEvent {} -> do
+        return ()
+    )
+
+deploymentIfRuleNo :: Rule
+deploymentIfRuleNo =
+  matchIf
+    "deployment rule-if no"
+    ( \event@DeploymentEvent {} -> do
+        return (deployment_event_environment event == "not production")
+    )
+    ( \DeploymentEvent {} -> do
+        return ()
+    )
+
+milestoneRule :: Rule
+milestoneRule =
+  match
+    "milestone rule"
+    ( \MilestoneEvent {} -> do
+        return ()
+    )
+
+milestoneIfRuleYes :: Rule
+milestoneIfRuleYes =
+  matchIf
+    "milestone rule-if yes"
+    ( \event@MilestoneEvent {} -> do
+        return (milestone_event_action event == "create")
+    )
+    ( \MilestoneEvent {} -> do
+        return ()
+    )
+
+milestoneIfRuleNo :: Rule
+milestoneIfRuleNo =
+  matchIf
+    "milestone rule-if no"
+    ( \event@MilestoneEvent {} -> do
+        return (milestone_event_action event == "not create")
+    )
+    ( \MilestoneEvent {} -> do
+        return ()
+    )
+
 projectCreatedHaskell :: ProjectCreate
 projectCreatedHaskell =
   ProjectCreate
@@ -1786,19 +1885,18 @@
 groupCreated2Haskell =
   GroupCreate {groupCreate_created_at = "2024-11-22T12:03:34Z", groupCreate_updated_at = "2024-11-22T12:03:34Z", groupCreate_event_name = "group_create", groupCreate_name = "the-name", groupCreate_owner_email = Nothing, groupCreate_owner_name = Nothing, groupCreate_path = "the-path", groupCreate_group_id = 31780}
 
-groupRemovedHaskell :: GroupRemove
-groupRemovedHaskell =
-  GroupRemove
-    { groupRemove_created_at = "2012-07-21T07:30:54Z",
-      groupRemove_updated_at = "2012-07-21T07:38:22Z",
-      groupRemove_event_name = "group_destroy",
-      groupRemove_name = "StoreCloud",
-      groupRemove_owner_email = Nothing,
-      groupRemove_owner_name = Nothing,
-      groupRemove_path = "storecloud",
-      groupRemove_group_id = 78
-    }
+groupDestroy1Haskell :: GroupDestroyEvent
+groupDestroy1Haskell =
+  GroupDestroyEvent {group_destroy_event_created_at = "2026-02-03T12:11:25Z", group_destroy_event_updated_at = "2026-02-11T21:51:07Z", group_destroy_event_name = "Dataguru-deletion_scheduled-54084", group_destroy_event_owner_email = Nothing, group_destroy_event_owner_name = Nothing, group_destroy_event_path = "dataguru-deletion_scheduled-54084", group_destroy_event_group_id = 54084}
 
+groupDestroy2Haskell :: GroupDestroyEvent
+groupDestroy2Haskell =
+  GroupDestroyEvent {group_destroy_event_created_at = "2026-03-24T00:44:28Z", group_destroy_event_updated_at = "2026-03-24T12:27:38Z", group_destroy_event_name = "proj-deletion_scheduled-57112", group_destroy_event_owner_email = Nothing, group_destroy_event_owner_name = Nothing, group_destroy_event_path = "proj-deletion_scheduled-57112", group_destroy_event_group_id = 57112}
+
+groupDestroy3Haskell :: GroupDestroyEvent
+groupDestroy3Haskell =
+  GroupDestroyEvent {group_destroy_event_created_at = "2012-07-21T07:30:54Z", group_destroy_event_updated_at = "2012-07-21T07:38:22Z", group_destroy_event_name = "StoreCloud", group_destroy_event_owner_email = Nothing, group_destroy_event_owner_name = Nothing, group_destroy_event_path = "storecloud", group_destroy_event_group_id = 78}
+
 groupRenamed1Haskell :: GroupRenameEvent
 groupRenamed1Haskell =
   GroupRenameEvent
@@ -1895,23 +1993,27 @@
 tagPush2Haskell =
   TagPush {tagPush_event_name = "tag_push", tagPush_before = "abc123", tagPush_after = "0000000000000000000000000000000000000000", tagPush_ref = "refs/tags/tag1", tagPush_checkout_sha = Nothing, tagPush_user_id = 123, tagPush_user_name = "Joe", tagPush_user_avatar = "https://secure.gravatar.com/avatar/abc123?s=80&d=identicon", tagPush_project_id = 48363, tagPush_project = ProjectEvent {projectEvent_id = Just 48363, projectEvent_name = "proj-name", projectEvent_description = Nothing, projectEvent_web_url = "https://example.com/joe1/proj-name", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:joe1/proj-name.git", projectEvent_git_http_url = "https://example.com/joe1/proj-name.git", projectEvent_namespace = "Joe", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe1/proj-name", projectEvent_default_branch = "main", projectEvent_homepage = Just "https://example.com/joe1/proj-name", projectEvent_url = "git@example.com:joe1/proj-name.git", projectEvent_ssh_url = "git@example.com:joe1/proj-name.git", projectEvent_http_url = "https://example.com/joe1/proj-name.git"}, tagPush_repository = RepositoryEvent {repositoryEvent_name = "proj-name", repositoryEvent_url = "git@example.com:joe1/proj-name.git", repositoryEvent_description = Nothing, repositoryEvent_homepage = Just "https://example.com/joe1/proj-name", repositoryEvent_git_http_url = Just "https://example.com/joe1/proj-name.git", repositoryEvent_git_ssh_url = Just "git@example.com:joe1/proj-name.git", repositoryEvent_visibility_level = Just Private}, tagPush_commits = [], tagPush_total_commits_count = 0}
 
+tagPush3Haskell :: TagPush
+tagPush3Haskell =
+  TagPush {tagPush_event_name = "tag_push", tagPush_before = "abc1234", tagPush_after = "0000000000000000000000000000000000000000", tagPush_ref = "refs/tags/v1", tagPush_checkout_sha = Nothing, tagPush_user_id = 3887, tagPush_user_name = "Joe Bloggs", tagPush_user_avatar = "https://secure.gravatar.com/avatar/abc?s=80&d=identicon", tagPush_project_id = 48175, tagPush_project = ProjectEvent {projectEvent_id = Just 48175, projectEvent_name = "proj-name", projectEvent_description = Nothing, projectEvent_web_url = "https://example.com/joe1/proj-name", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:joe1/proj-name.git", projectEvent_git_http_url = "https://example.com/joe1/proj-name.git", projectEvent_namespace = "Joe Bloggs", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe1/proj-name", projectEvent_default_branch = "master", projectEvent_homepage = Just "https://example.com/joe1/proj-name", projectEvent_url = "git@example.com:joe1/proj-name.git", projectEvent_ssh_url = "git@example.com:joe1/proj-name.git", projectEvent_http_url = "https://example.com/joe1/proj-name.git"}, tagPush_repository = RepositoryEvent {repositoryEvent_name = "proj-name", repositoryEvent_url = "git@example.com:joe1/proj-name.git", repositoryEvent_description = Nothing, repositoryEvent_homepage = Just "https://example.com/joe1/proj-name", repositoryEvent_git_http_url = Just "https://example.com/joe1/proj-name.git", repositoryEvent_git_ssh_url = Just "git@example.com:joe1/proj-name.git", repositoryEvent_visibility_level = Just Private}, tagPush_commits = [], tagPush_total_commits_count = 0}
+
 repositoryUpdateHaskell :: RepositoryUpdate
 repositoryUpdateHaskell =
   RepositoryUpdate {repositoryUpdate_event_name = "repository_update", repositoryUpdate_user_id = 1, repositoryUpdate_user_name = "John Smith", repositoryUpdate_user_email = "admin@example.com", repositoryUpdate_user_avatar = "https://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=8://s.gravatar.com/avatar/d4c74594d841139328695756648b6bd6?s=80", repositoryUpdate_project_id = 1, repositoryUpdate_project = ProjectEvent {projectEvent_id = Nothing, projectEvent_name = "Example", projectEvent_description = Just "", projectEvent_web_url = "http://example.com/jsmith/example", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:jsmith/example.git", projectEvent_git_http_url = "http://example.com/jsmith/example.git", projectEvent_namespace = "Jsmith", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "jsmith/example", projectEvent_default_branch = "master", projectEvent_homepage = Just "http://example.com/jsmith/example", projectEvent_url = "git@example.com:jsmith/example.git", projectEvent_ssh_url = "git@example.com:jsmith/example.git", projectEvent_http_url = "http://example.com/jsmith/example.git"}, repositoryUpdate_changes = [ProjectChanges {projectChanges_before = "8205ea8d81ce0c6b90fbe8280d118cc9fdad6130", projectChanges_after = "4045ea7a3df38697b3730a20fb73c8bed8a3e69e", projectChanges_ref = "refs/heads/master"}], repositoryUpdate_refs = ["refs/heads/master"]}
 
 mergeRequestHaskell :: MergeRequestEvent
 mergeRequestHaskell =
-  MergeRequestEvent {mergeRequest_object_kind = "merge_request", mergeRequest_event_type = "merge_request", mergeRequest_user = UserEvent {userEvent_id = Nothing, userEvent_name = "Administrator", userEvent_username = "root", userEvent_avatar_url = "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40&d=identicon", userEvent_email = Nothing}, mergeRequest_project = ProjectEvent {projectEvent_id = Just 1, projectEvent_name = "Gitlab Test", projectEvent_description = Just "Aut reprehenderit ut est.", projectEvent_web_url = "http://example.com/gitlabhq/gitlab-test", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:gitlabhq/gitlab-test.git", projectEvent_git_http_url = "http://example.com/gitlabhq/gitlab-test.git", projectEvent_namespace = "GitlabHQ", projectEvent_visibility_level = Public, projectEvent_path_with_namespace = "gitlabhq/gitlab-test", projectEvent_default_branch = "master", projectEvent_homepage = Just "http://example.com/gitlabhq/gitlab-test", projectEvent_url = "http://example.com/gitlabhq/gitlab-test.git", projectEvent_ssh_url = "git@example.com:gitlabhq/gitlab-test.git", projectEvent_http_url = "http://example.com/gitlabhq/gitlab-test.git"}, mergeRequest_object_attributes = MergeRequestObjectAttributes {objectAttributes_id = 99, objectAttributes_target_branch = "master", objectAttributes_source_branch = "ms-viewport", objectAttributes_source_project_id = 14, objectAttributes_author_id = Just 51, objectAttributes_assignee_id = Just 6, objectAttributes_assignee_ids = Nothing, objectAttributes_title = "MS-Viewport", objectAttributes_created_at = "2013-12-03T17:23:34Z", objectAttributes_updated_at = "2013-12-03T17:23:34Z", objectAttributes_milestone_id = Nothing, objectAttributes_state = "opened", objectAttributes_state_id = Nothing, objectAttributes_merge_status = "unchecked", objectAttributes_target_project_id = 14, objectAttributes_iid = 1, objectAttributes_description = "", objectAttributes_updated_by_id = Nothing, objectAttributes_merge_error = Nothing, objectAttributes_merge_params = Nothing, objectAttributes_merge_when_pipeline_succeeds = Nothing, objectAttributes_merge_user_id = Nothing, objectAttributes_merge_commit_sha = Nothing, objectAttributes_deleted_at = Nothing, objectAttributes_in_progress_merge_commit_sha = Nothing, objectAttributes_lock_version = Nothing, objectAttributes_time_estimate = Nothing, objectAttributes_last_edited_at = Nothing, objectAttributes_last_edited_by_id = Nothing, objectAttributes_head_pipeline_id = Nothing, objectAttributes_ref_fetched = Nothing, objectAttributes_merge_jid = Nothing, objectAttributes_source = ProjectEvent {projectEvent_id = Nothing, projectEvent_name = "Awesome Project", projectEvent_description = Just "Aut reprehenderit ut est.", projectEvent_web_url = "http://example.com/awesome_space/awesome_project", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:awesome_space/awesome_project.git", projectEvent_git_http_url = "http://example.com/awesome_space/awesome_project.git", projectEvent_namespace = "Awesome Space", projectEvent_visibility_level = Public, projectEvent_path_with_namespace = "awesome_space/awesome_project", projectEvent_default_branch = "master", projectEvent_homepage = Just "http://example.com/awesome_space/awesome_project", projectEvent_url = "http://example.com/awesome_space/awesome_project.git", projectEvent_ssh_url = "git@example.com:awesome_space/awesome_project.git", projectEvent_http_url = "http://example.com/awesome_space/awesome_project.git"}, objectAttributes_target = ProjectEvent {projectEvent_id = Nothing, projectEvent_name = "Awesome Project", projectEvent_description = Just "Aut reprehenderit ut est.", projectEvent_web_url = "http://example.com/awesome_space/awesome_project", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:awesome_space/awesome_project.git", projectEvent_git_http_url = "http://example.com/awesome_space/awesome_project.git", projectEvent_namespace = "Awesome Space", projectEvent_visibility_level = Public, projectEvent_path_with_namespace = "awesome_space/awesome_project", projectEvent_default_branch = "master", projectEvent_homepage = Just "http://example.com/awesome_space/awesome_project", projectEvent_url = "http://example.com/awesome_space/awesome_project.git", projectEvent_ssh_url = "git@example.com:awesome_space/awesome_project.git", projectEvent_http_url = "http://example.com/awesome_space/awesome_project.git"}, objectAttributes_last_commit = CommitEvent {commitEvent_id = "da1560886d4f094c3e6c9ef40349f7d38b5d27d7", commitEvent_message = "fixed readme", commitEvent_timestamp = "2012-01-03T23:36:29+02:00", commitEvent_url = "http://example.com/awesome_space/awesome_project/commits/da1560886d4f094c3e6c9ef40349f7d38b5d27d7", commitEvent_author = CommitAuthorEvent {commitAuthorEvent_name = "GitLab dev user", commitAuthorEvent_email = "gitlabdev@dv6700.(none)"}}, objectAttributes_work_in_progress = False, objectAttributes_total_time_spent = Nothing, objectAttributes_human_total_time_spent = Nothing, objectAttributes_human_time_estimate = Nothing, objectAttributes_action = Just "open"}, mergeRequest_labels = Just [Label {label_id = Just 206, label_title = Just "API", label_color = Just "#ffffff", label_project_id = Just 14, label_created_at = Just "2013-12-03T17:15:43Z", label_updated_at = Just "2013-12-03T17:15:43Z", label_template = Just False, label_description = Just "API related issues", label_type = Just "ProjectLabel", label_group_id = Just 41}], mergeRequest_changes = MergeRequestChanges {mergeRequestChanges_author_id = Nothing, mergeRequestChanges_created_at = Nothing, mergeRequestChanges_description = Nothing, mergeRequestChanges_id = Nothing, mergeRequestChanges_iid = Nothing, mergeRequestChanges_source_branch = Nothing, mergeRequestChanges_source_project_id = Nothing, mergeRequestChanges_target_branch = Nothing, mergeRequestChanges_target_project_id = Nothing, mergeRequestChanges_title = Nothing, mergeRequestChanges_updated_at = Just (MergeRequestChange {mergeRequestChange_previous = Just "2017-09-15 16:50:55 UTC", mergeRequestChange_current = Just "2017-09-15 16:52:00 UTC"})}, mergeRequest_repository = RepositoryEvent {repositoryEvent_name = "Gitlab Test", repositoryEvent_url = "http://example.com/gitlabhq/gitlab-test.git", repositoryEvent_description = Just "Aut reprehenderit ut est.", repositoryEvent_homepage = Just "http://example.com/gitlabhq/gitlab-test", repositoryEvent_git_http_url = Nothing, repositoryEvent_git_ssh_url = Nothing, repositoryEvent_visibility_level = Nothing}}
+  MergeRequestEvent {mergeRequest_object_kind = "merge_request", mergeRequest_event_type = "merge_request", mergeRequest_user = UserEvent {userEvent_id = Nothing, userEvent_name = "Administrator", userEvent_username = "root", userEvent_avatar_url = "http://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=40&d=identicon", userEvent_email = Nothing}, mergeRequest_project = ProjectEvent {projectEvent_id = Just 1, projectEvent_name = "Gitlab Test", projectEvent_description = Just "Aut reprehenderit ut est.", projectEvent_web_url = "http://example.com/gitlabhq/gitlab-test", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:gitlabhq/gitlab-test.git", projectEvent_git_http_url = "http://example.com/gitlabhq/gitlab-test.git", projectEvent_namespace = "GitlabHQ", projectEvent_visibility_level = Public, projectEvent_path_with_namespace = "gitlabhq/gitlab-test", projectEvent_default_branch = "master", projectEvent_homepage = Just "http://example.com/gitlabhq/gitlab-test", projectEvent_url = "http://example.com/gitlabhq/gitlab-test.git", projectEvent_ssh_url = "git@example.com:gitlabhq/gitlab-test.git", projectEvent_http_url = "http://example.com/gitlabhq/gitlab-test.git"}, mergeRequest_object_attributes = MergeRequestObjectAttributes {merge_request_object_attributes_id = 99, merge_request_object_attributes_target_branch = "master", merge_request_object_attributes_source_branch = "ms-viewport", merge_request_object_attributes_source_project_id = 14, merge_request_object_attributes_author_id = Just 51, merge_request_object_attributes_assignee_id = Just 6, merge_request_object_attributes_assignee_ids = Nothing, merge_request_object_attributes_title = "MS-Viewport", merge_request_object_attributes_created_at = Just "2013-12-03T17:23:34Z", merge_request_object_attributes_updated_at = Just "2013-12-03T17:23:34Z", merge_request_object_attributes_milestone_id = Nothing, merge_request_object_attributes_state = "opened", merge_request_object_attributes_state_id = Nothing, merge_request_object_attributes_merge_status = "unchecked", merge_request_object_attributes_target_project_id = 14, merge_request_object_attributes_iid = 1, merge_request_object_attributes_description = Just "", merge_request_object_attributes_updated_by_id = Nothing, merge_request_object_attributes_merge_error = Nothing, merge_request_object_attributes_merge_params = Nothing, merge_request_object_attributes_merge_when_pipeline_succeeds = Nothing, merge_request_object_attributes_merge_user_id = Nothing, merge_request_object_attributes_merge_commit_sha = Nothing, merge_request_object_attributes_deleted_at = Nothing, merge_request_object_attributes_in_progress_merge_commit_sha = Nothing, merge_request_object_attributes_lock_version = Nothing, merge_request_object_attributes_time_estimate = Nothing, merge_request_object_attributes_last_edited_at = Nothing, merge_request_object_attributes_last_edited_by_id = Nothing, merge_request_object_attributes_head_pipeline_id = Nothing, merge_request_object_attributes_ref_fetched = Nothing, merge_request_object_attributes_merge_jid = Nothing, merge_request_object_attributes_source = Just $ ProjectEvent {projectEvent_id = Nothing, projectEvent_name = "Awesome Project", projectEvent_description = Just "Aut reprehenderit ut est.", projectEvent_web_url = "http://example.com/awesome_space/awesome_project", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:awesome_space/awesome_project.git", projectEvent_git_http_url = "http://example.com/awesome_space/awesome_project.git", projectEvent_namespace = "Awesome Space", projectEvent_visibility_level = Public, projectEvent_path_with_namespace = "awesome_space/awesome_project", projectEvent_default_branch = "master", projectEvent_homepage = Just "http://example.com/awesome_space/awesome_project", projectEvent_url = "http://example.com/awesome_space/awesome_project.git", projectEvent_ssh_url = "git@example.com:awesome_space/awesome_project.git", projectEvent_http_url = "http://example.com/awesome_space/awesome_project.git"}, merge_request_object_attributes_target = Just $ ProjectEvent {projectEvent_id = Nothing, projectEvent_name = "Awesome Project", projectEvent_description = Just "Aut reprehenderit ut est.", projectEvent_web_url = "http://example.com/awesome_space/awesome_project", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:awesome_space/awesome_project.git", projectEvent_git_http_url = "http://example.com/awesome_space/awesome_project.git", projectEvent_namespace = "Awesome Space", projectEvent_visibility_level = Public, projectEvent_path_with_namespace = "awesome_space/awesome_project", projectEvent_default_branch = "master", projectEvent_homepage = Just "http://example.com/awesome_space/awesome_project", projectEvent_url = "http://example.com/awesome_space/awesome_project.git", projectEvent_ssh_url = "git@example.com:awesome_space/awesome_project.git", projectEvent_http_url = "http://example.com/awesome_space/awesome_project.git"}, merge_request_object_attributes_last_commit = Just $ CommitEvent {commitEvent_id = "da1560886d4f094c3e6c9ef40349f7d38b5d27d7", commitEvent_message = "fixed readme", commitEvent_timestamp = "2012-01-03T23:36:29+02:00", commitEvent_url = "http://example.com/awesome_space/awesome_project/commits/da1560886d4f094c3e6c9ef40349f7d38b5d27d7", commitEvent_author = CommitAuthorEvent {commitAuthorEvent_name = "GitLab dev user", commitAuthorEvent_email = "gitlabdev@dv6700.(none)"}}, merge_request_object_attributes_work_in_progress = Just False, merge_request_object_attributes_total_time_spent = Nothing, merge_request_object_attributes_human_total_time_spent = Nothing, merge_request_object_attributes_human_time_estimate = Nothing, merge_request_object_attributes_action = Just "open"}, mergeRequest_labels = Just [Label {label_id = Just 206, label_title = Just "API", label_color = Just "#ffffff", label_project_id = Just 14, label_created_at = Just "2013-12-03T17:15:43Z", label_updated_at = Just "2013-12-03T17:15:43Z", label_template = Just False, label_description = Just "API related issues", label_type = Just "ProjectLabel", label_group_id = Just 41}], mergeRequest_changes = MergeRequestChanges {mergeRequestChanges_author_id = Nothing, mergeRequestChanges_created_at = Nothing, mergeRequestChanges_description = Nothing, mergeRequestChanges_id = Nothing, mergeRequestChanges_iid = Nothing, mergeRequestChanges_source_branch = Nothing, mergeRequestChanges_source_project_id = Nothing, mergeRequestChanges_target_branch = Nothing, mergeRequestChanges_target_project_id = Nothing, mergeRequestChanges_title = Nothing, mergeRequestChanges_updated_at = Just (MergeRequestChange {mergeRequestChange_previous = Just "2017-09-15 16:50:55 UTC", mergeRequestChange_current = Just "2017-09-15 16:52:00 UTC"})}, mergeRequest_repository = RepositoryEvent {repositoryEvent_name = "Gitlab Test", repositoryEvent_url = "http://example.com/gitlabhq/gitlab-test.git", repositoryEvent_description = Just "Aut reprehenderit ut est.", repositoryEvent_homepage = Just "http://example.com/gitlabhq/gitlab-test", repositoryEvent_git_http_url = Nothing, repositoryEvent_git_ssh_url = Nothing, repositoryEvent_visibility_level = Nothing}}
 
 mergeRequestGitLab_15_5_0_Haskell :: MergeRequestEvent
 mergeRequestGitLab_15_5_0_Haskell =
-  MergeRequestEvent {mergeRequest_object_kind = "merge_request", mergeRequest_event_type = "merge_request", mergeRequest_user = UserEvent {userEvent_id = Nothing, userEvent_name = "Joe Bloggs", userEvent_username = "joe", userEvent_avatar_url = "https://gitlab.example.com/uploads/-/system/user/avatar/5/avatar.png", userEvent_email = Nothing}, mergeRequest_project = ProjectEvent {projectEvent_id = Just 7926, projectEvent_name = "test-ci-project", projectEvent_description = Just "", projectEvent_web_url = "https://gitlab.example.com/joe/test-ci-project", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_git_http_url = "https://gitlab.example.com/joe/test-ci-project.git", projectEvent_namespace = "Joe Bloggs", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe/test-ci-project", projectEvent_default_branch = "master", projectEvent_homepage = Just "https://gitlab.example.com/joe/test-ci-project", projectEvent_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_http_url = "https://gitlab.example.com/joe/test-ci-project.git"}, mergeRequest_object_attributes = MergeRequestObjectAttributes {objectAttributes_id = 3448, objectAttributes_target_branch = "master", objectAttributes_source_branch = "another-branch", objectAttributes_source_project_id = 7926, objectAttributes_author_id = Just 5, objectAttributes_assignee_id = Nothing, objectAttributes_assignee_ids = Just [], objectAttributes_title = "A change", objectAttributes_created_at = "2022-10-24 22:11:46 UTC", objectAttributes_updated_at = "2022-10-24 22:11:46 UTC", objectAttributes_milestone_id = Nothing, objectAttributes_state = "opened", objectAttributes_state_id = Just 1, objectAttributes_merge_status = "preparing", objectAttributes_target_project_id = 7926, objectAttributes_iid = 1, objectAttributes_description = "To test the merge request event.", objectAttributes_updated_by_id = Nothing, objectAttributes_merge_error = Nothing, objectAttributes_merge_params = Just (MergeParams {mergeParams_force_remove_source_branch = Just "1"}), objectAttributes_merge_when_pipeline_succeeds = Just False, objectAttributes_merge_user_id = Nothing, objectAttributes_merge_commit_sha = Nothing, objectAttributes_deleted_at = Nothing, objectAttributes_in_progress_merge_commit_sha = Nothing, objectAttributes_lock_version = Nothing, objectAttributes_time_estimate = Just 0, objectAttributes_last_edited_at = Nothing, objectAttributes_last_edited_by_id = Nothing, objectAttributes_head_pipeline_id = Nothing, objectAttributes_ref_fetched = Nothing, objectAttributes_merge_jid = Nothing, objectAttributes_source = ProjectEvent {projectEvent_id = Just 7926, projectEvent_name = "test-ci-project", projectEvent_description = Just "", projectEvent_web_url = "https://gitlab.example.com/joe/test-ci-project", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_git_http_url = "https://gitlab.example.com/joe/test-ci-project.git", projectEvent_namespace = "Joe Bloggs", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe/test-ci-project", projectEvent_default_branch = "master", projectEvent_homepage = Just "https://gitlab.example.com/joe/test-ci-project", projectEvent_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_http_url = "https://gitlab.example.com/joe/test-ci-project.git"}, objectAttributes_target = ProjectEvent {projectEvent_id = Just 7926, projectEvent_name = "test-ci-project", projectEvent_description = Just "", projectEvent_web_url = "https://gitlab.example.com/joe/test-ci-project", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_git_http_url = "https://gitlab.example.com/joe/test-ci-project.git", projectEvent_namespace = "Joe Bloggs", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe/test-ci-project", projectEvent_default_branch = "master", projectEvent_homepage = Just "https://gitlab.example.com/joe/test-ci-project", projectEvent_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_http_url = "https://gitlab.example.com/joe/test-ci-project.git"}, objectAttributes_last_commit = CommitEvent {commitEvent_id = "83c2d70f8ecb1376d1d4f1e52b7a18c560a7b95c", commitEvent_message = "A change\n", commitEvent_timestamp = "2022-10-24T23:10:03+01:00", commitEvent_url = "https://gitlab.example.com/joe/test-ci-project/-/commit/83c2d70f8ecb1376d1d4f1e52b7a18c560a7b95c", commitEvent_author = CommitAuthorEvent {commitAuthorEvent_name = "Joe Bloggs", commitAuthorEvent_email = "robstewart57@gmail.com"}}, objectAttributes_work_in_progress = False, objectAttributes_total_time_spent = Just 0, objectAttributes_human_total_time_spent = Nothing, objectAttributes_human_time_estimate = Nothing, objectAttributes_action = Just "open"}, mergeRequest_labels = Just [], mergeRequest_changes = MergeRequestChanges {mergeRequestChanges_author_id = Nothing, mergeRequestChanges_created_at = Nothing, mergeRequestChanges_description = Nothing, mergeRequestChanges_id = Nothing, mergeRequestChanges_iid = Nothing, mergeRequestChanges_source_branch = Nothing, mergeRequestChanges_source_project_id = Nothing, mergeRequestChanges_target_branch = Nothing, mergeRequestChanges_target_project_id = Nothing, mergeRequestChanges_title = Nothing, mergeRequestChanges_updated_at = Nothing}, mergeRequest_repository = RepositoryEvent {repositoryEvent_name = "test-ci-project", repositoryEvent_url = "git@gitlab.example.com:joe/test-ci-project.git", repositoryEvent_description = Just "", repositoryEvent_homepage = Just "https://gitlab.example.com/joe/test-ci-project", repositoryEvent_git_http_url = Nothing, repositoryEvent_git_ssh_url = Nothing, repositoryEvent_visibility_level = Nothing}}
+  MergeRequestEvent {mergeRequest_object_kind = "merge_request", mergeRequest_event_type = "merge_request", mergeRequest_user = UserEvent {userEvent_id = Nothing, userEvent_name = "Joe Bloggs", userEvent_username = "joe", userEvent_avatar_url = "https://gitlab.example.com/uploads/-/system/user/avatar/5/avatar.png", userEvent_email = Nothing}, mergeRequest_project = ProjectEvent {projectEvent_id = Just 7926, projectEvent_name = "test-ci-project", projectEvent_description = Just "", projectEvent_web_url = "https://gitlab.example.com/joe/test-ci-project", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_git_http_url = "https://gitlab.example.com/joe/test-ci-project.git", projectEvent_namespace = "Joe Bloggs", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe/test-ci-project", projectEvent_default_branch = "master", projectEvent_homepage = Just "https://gitlab.example.com/joe/test-ci-project", projectEvent_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_http_url = "https://gitlab.example.com/joe/test-ci-project.git"}, mergeRequest_object_attributes = MergeRequestObjectAttributes {merge_request_object_attributes_id = 3448, merge_request_object_attributes_target_branch = "master", merge_request_object_attributes_source_branch = "another-branch", merge_request_object_attributes_source_project_id = 7926, merge_request_object_attributes_author_id = Just 5, merge_request_object_attributes_assignee_id = Nothing, merge_request_object_attributes_assignee_ids = Just [], merge_request_object_attributes_title = "A change", merge_request_object_attributes_created_at = Just "2022-10-24 22:11:46 UTC", merge_request_object_attributes_updated_at = Just "2022-10-24 22:11:46 UTC", merge_request_object_attributes_milestone_id = Nothing, merge_request_object_attributes_state = "opened", merge_request_object_attributes_state_id = Just 1, merge_request_object_attributes_merge_status = "preparing", merge_request_object_attributes_target_project_id = 7926, merge_request_object_attributes_iid = 1, merge_request_object_attributes_description = Just "To test the merge request event.", merge_request_object_attributes_updated_by_id = Nothing, merge_request_object_attributes_merge_error = Nothing, merge_request_object_attributes_merge_params = Just (MergeParams {mergeParams_force_remove_source_branch = Just "1"}), merge_request_object_attributes_merge_when_pipeline_succeeds = Just False, merge_request_object_attributes_merge_user_id = Nothing, merge_request_object_attributes_merge_commit_sha = Nothing, merge_request_object_attributes_deleted_at = Nothing, merge_request_object_attributes_in_progress_merge_commit_sha = Nothing, merge_request_object_attributes_lock_version = Nothing, merge_request_object_attributes_time_estimate = Just 0, merge_request_object_attributes_last_edited_at = Nothing, merge_request_object_attributes_last_edited_by_id = Nothing, merge_request_object_attributes_head_pipeline_id = Nothing, merge_request_object_attributes_ref_fetched = Nothing, merge_request_object_attributes_merge_jid = Nothing, merge_request_object_attributes_source = Just $ ProjectEvent {projectEvent_id = Just 7926, projectEvent_name = "test-ci-project", projectEvent_description = Just "", projectEvent_web_url = "https://gitlab.example.com/joe/test-ci-project", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_git_http_url = "https://gitlab.example.com/joe/test-ci-project.git", projectEvent_namespace = "Joe Bloggs", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe/test-ci-project", projectEvent_default_branch = "master", projectEvent_homepage = Just "https://gitlab.example.com/joe/test-ci-project", projectEvent_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_http_url = "https://gitlab.example.com/joe/test-ci-project.git"}, merge_request_object_attributes_target = Just $ ProjectEvent {projectEvent_id = Just 7926, projectEvent_name = "test-ci-project", projectEvent_description = Just "", projectEvent_web_url = "https://gitlab.example.com/joe/test-ci-project", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_git_http_url = "https://gitlab.example.com/joe/test-ci-project.git", projectEvent_namespace = "Joe Bloggs", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe/test-ci-project", projectEvent_default_branch = "master", projectEvent_homepage = Just "https://gitlab.example.com/joe/test-ci-project", projectEvent_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_ssh_url = "git@gitlab.example.com:joe/test-ci-project.git", projectEvent_http_url = "https://gitlab.example.com/joe/test-ci-project.git"}, merge_request_object_attributes_last_commit = Just $ CommitEvent {commitEvent_id = "83c2d70f8ecb1376d1d4f1e52b7a18c560a7b95c", commitEvent_message = "A change\n", commitEvent_timestamp = "2022-10-24T23:10:03+01:00", commitEvent_url = "https://gitlab.example.com/joe/test-ci-project/-/commit/83c2d70f8ecb1376d1d4f1e52b7a18c560a7b95c", commitEvent_author = CommitAuthorEvent {commitAuthorEvent_name = "Joe Bloggs", commitAuthorEvent_email = "robstewart57@gmail.com"}}, merge_request_object_attributes_work_in_progress = Just False, merge_request_object_attributes_total_time_spent = Just 0, merge_request_object_attributes_human_total_time_spent = Nothing, merge_request_object_attributes_human_time_estimate = Nothing, merge_request_object_attributes_action = Just "open"}, mergeRequest_labels = Just [], mergeRequest_changes = MergeRequestChanges {mergeRequestChanges_author_id = Nothing, mergeRequestChanges_created_at = Nothing, mergeRequestChanges_description = Nothing, mergeRequestChanges_id = Nothing, mergeRequestChanges_iid = Nothing, mergeRequestChanges_source_branch = Nothing, mergeRequestChanges_source_project_id = Nothing, mergeRequestChanges_target_branch = Nothing, mergeRequestChanges_target_project_id = Nothing, mergeRequestChanges_title = Nothing, mergeRequestChanges_updated_at = Nothing}, mergeRequest_repository = RepositoryEvent {repositoryEvent_name = "test-ci-project", repositoryEvent_url = "git@gitlab.example.com:joe/test-ci-project.git", repositoryEvent_description = Just "", repositoryEvent_homepage = Just "https://gitlab.example.com/joe/test-ci-project", repositoryEvent_git_http_url = Nothing, repositoryEvent_git_ssh_url = Nothing, repositoryEvent_visibility_level = Nothing}}
 
 -- | tests that this fix works:
 -- https://gitlab.com/robstewart57/gitlab-haskell/-/commit/d1ca1037944616ac940284c5f8e49b5d9bcbf83c
 mergeRequestGitLab_15_5_0_maybe_descriptions_Haskell :: MergeRequestEvent
 mergeRequestGitLab_15_5_0_maybe_descriptions_Haskell =
-  MergeRequestEvent {mergeRequest_object_kind = "merge_request", mergeRequest_event_type = "merge_request", mergeRequest_user = UserEvent {userEvent_id = Nothing, userEvent_name = "Bloggs, Joe", userEvent_username = "joe123", userEvent_avatar_url = "https://secure.gravatar.com/avatar/df1b70b1fd7d7eaaa5f9a41f5f5093c0?s=80&d=identicon", userEvent_email = Nothing}, mergeRequest_project = ProjectEvent {projectEvent_id = Just 43593, projectEvent_name = "proj1", projectEvent_description = Nothing, projectEvent_web_url = "https://gitlab.example.com/grp1/grp2/proj1", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_git_http_url = "https://gitlab.example.com/grp1/grp2/proj1.git", projectEvent_namespace = "grp2", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "grp1/grp2/proj1", projectEvent_default_branch = "main", projectEvent_homepage = Just "https://gitlab.example.com/grp1/grp2/proj1", projectEvent_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_ssh_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_http_url = "https://gitlab.example.com/grp1/grp2/proj1.git"}, mergeRequest_object_attributes = MergeRequestObjectAttributes {objectAttributes_id = 3461, objectAttributes_target_branch = "main", objectAttributes_source_branch = "main", objectAttributes_source_project_id = 49668, objectAttributes_author_id = Just 2312, objectAttributes_assignee_id = Nothing, objectAttributes_assignee_ids = Just [], objectAttributes_title = "the MR title", objectAttributes_created_at = "2022-10-25 18:51:48 UTC", objectAttributes_updated_at = "2022-10-25 18:51:48 UTC", objectAttributes_milestone_id = Nothing, objectAttributes_state = "opened", objectAttributes_state_id = Just 1, objectAttributes_merge_status = "preparing", objectAttributes_target_project_id = 43593, objectAttributes_iid = 14, objectAttributes_description = "", objectAttributes_updated_by_id = Nothing, objectAttributes_merge_error = Nothing, objectAttributes_merge_params = Just (MergeParams {mergeParams_force_remove_source_branch = Nothing}), objectAttributes_merge_when_pipeline_succeeds = Just False, objectAttributes_merge_user_id = Nothing, objectAttributes_merge_commit_sha = Nothing, objectAttributes_deleted_at = Nothing, objectAttributes_in_progress_merge_commit_sha = Nothing, objectAttributes_lock_version = Nothing, objectAttributes_time_estimate = Just 0, objectAttributes_last_edited_at = Nothing, objectAttributes_last_edited_by_id = Nothing, objectAttributes_head_pipeline_id = Nothing, objectAttributes_ref_fetched = Nothing, objectAttributes_merge_jid = Nothing, objectAttributes_source = ProjectEvent {projectEvent_id = Just 49668, projectEvent_name = "proj1", projectEvent_description = Nothing, projectEvent_web_url = "https://gitlab.example.com/joe123/proj1", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:joe123/proj1.git", projectEvent_git_http_url = "https://gitlab.example.com/joe123/proj1.git", projectEvent_namespace = "Bloggs, Joe", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe123/proj1", projectEvent_default_branch = "main", projectEvent_homepage = Just "https://gitlab.example.com/joe123/proj1", projectEvent_url = "git@gitlab.example.com:joe123/proj1.git", projectEvent_ssh_url = "git@gitlab.example.com:joe123/proj1.git", projectEvent_http_url = "https://gitlab.example.com/joe123/proj1.git"}, objectAttributes_target = ProjectEvent {projectEvent_id = Just 43593, projectEvent_name = "proj1", projectEvent_description = Nothing, projectEvent_web_url = "https://gitlab.example.com/grp1/grp2/proj1", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_git_http_url = "https://gitlab.example.com/grp1/grp2/proj1.git", projectEvent_namespace = "grp2", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "grp1/grp2/proj1", projectEvent_default_branch = "main", projectEvent_homepage = Just "https://gitlab.example.com/grp1/grp2/proj1", projectEvent_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_ssh_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_http_url = "https://gitlab.example.com/grp1/grp2/proj1.git"}, objectAttributes_last_commit = CommitEvent {commitEvent_id = "249d94fdc92825a2ca22c4fa74c511ec5f03e086", commitEvent_message = "Updated README\n", commitEvent_timestamp = "2022-10-08T10:37:28+01:00", commitEvent_url = "https://gitlab.example.com/grp1/grp2/proj1/-/commit/249d94fdc92825a2ca22c4fa74c511ec5f03e086", commitEvent_author = CommitAuthorEvent {commitAuthorEvent_name = "Hill, Harry", commitAuthorEvent_email = "harry@gmail.com"}}, objectAttributes_work_in_progress = True, objectAttributes_total_time_spent = Just 0, objectAttributes_human_total_time_spent = Nothing, objectAttributes_human_time_estimate = Nothing, objectAttributes_action = Just "open"}, mergeRequest_labels = Just [], mergeRequest_changes = MergeRequestChanges {mergeRequestChanges_author_id = Nothing, mergeRequestChanges_created_at = Nothing, mergeRequestChanges_description = Nothing, mergeRequestChanges_id = Nothing, mergeRequestChanges_iid = Nothing, mergeRequestChanges_source_branch = Nothing, mergeRequestChanges_source_project_id = Nothing, mergeRequestChanges_target_branch = Nothing, mergeRequestChanges_target_project_id = Nothing, mergeRequestChanges_title = Nothing, mergeRequestChanges_updated_at = Nothing}, mergeRequest_repository = RepositoryEvent {repositoryEvent_name = "proj1", repositoryEvent_url = "git@gitlab.example.com:grp1/grp2/proj1.git", repositoryEvent_description = Nothing, repositoryEvent_homepage = Just "https://gitlab.example.com/grp1/grp2/proj1", repositoryEvent_git_http_url = Nothing, repositoryEvent_git_ssh_url = Nothing, repositoryEvent_visibility_level = Nothing}}
+  MergeRequestEvent {mergeRequest_object_kind = "merge_request", mergeRequest_event_type = "merge_request", mergeRequest_user = UserEvent {userEvent_id = Nothing, userEvent_name = "Bloggs, Joe", userEvent_username = "joe123", userEvent_avatar_url = "https://secure.gravatar.com/avatar/df1b70b1fd7d7eaaa5f9a41f5f5093c0?s=80&d=identicon", userEvent_email = Nothing}, mergeRequest_project = ProjectEvent {projectEvent_id = Just 43593, projectEvent_name = "proj1", projectEvent_description = Nothing, projectEvent_web_url = "https://gitlab.example.com/grp1/grp2/proj1", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_git_http_url = "https://gitlab.example.com/grp1/grp2/proj1.git", projectEvent_namespace = "grp2", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "grp1/grp2/proj1", projectEvent_default_branch = "main", projectEvent_homepage = Just "https://gitlab.example.com/grp1/grp2/proj1", projectEvent_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_ssh_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_http_url = "https://gitlab.example.com/grp1/grp2/proj1.git"}, mergeRequest_object_attributes = MergeRequestObjectAttributes {merge_request_object_attributes_id = 3461, merge_request_object_attributes_target_branch = "main", merge_request_object_attributes_source_branch = "main", merge_request_object_attributes_source_project_id = 49668, merge_request_object_attributes_author_id = Just 2312, merge_request_object_attributes_assignee_id = Nothing, merge_request_object_attributes_assignee_ids = Just [], merge_request_object_attributes_title = "the MR title", merge_request_object_attributes_created_at = Just "2022-10-25 18:51:48 UTC", merge_request_object_attributes_updated_at = Just "2022-10-25 18:51:48 UTC", merge_request_object_attributes_milestone_id = Nothing, merge_request_object_attributes_state = "opened", merge_request_object_attributes_state_id = Just 1, merge_request_object_attributes_merge_status = "preparing", merge_request_object_attributes_target_project_id = 43593, merge_request_object_attributes_iid = 14, merge_request_object_attributes_description = Just "", merge_request_object_attributes_updated_by_id = Nothing, merge_request_object_attributes_merge_error = Nothing, merge_request_object_attributes_merge_params = Just (MergeParams {mergeParams_force_remove_source_branch = Nothing}), merge_request_object_attributes_merge_when_pipeline_succeeds = Just False, merge_request_object_attributes_merge_user_id = Nothing, merge_request_object_attributes_merge_commit_sha = Nothing, merge_request_object_attributes_deleted_at = Nothing, merge_request_object_attributes_in_progress_merge_commit_sha = Nothing, merge_request_object_attributes_lock_version = Nothing, merge_request_object_attributes_time_estimate = Just 0, merge_request_object_attributes_last_edited_at = Nothing, merge_request_object_attributes_last_edited_by_id = Nothing, merge_request_object_attributes_head_pipeline_id = Nothing, merge_request_object_attributes_ref_fetched = Nothing, merge_request_object_attributes_merge_jid = Nothing, merge_request_object_attributes_source = Just $ ProjectEvent {projectEvent_id = Just 49668, projectEvent_name = "proj1", projectEvent_description = Nothing, projectEvent_web_url = "https://gitlab.example.com/joe123/proj1", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:joe123/proj1.git", projectEvent_git_http_url = "https://gitlab.example.com/joe123/proj1.git", projectEvent_namespace = "Bloggs, Joe", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe123/proj1", projectEvent_default_branch = "main", projectEvent_homepage = Just "https://gitlab.example.com/joe123/proj1", projectEvent_url = "git@gitlab.example.com:joe123/proj1.git", projectEvent_ssh_url = "git@gitlab.example.com:joe123/proj1.git", projectEvent_http_url = "https://gitlab.example.com/joe123/proj1.git"}, merge_request_object_attributes_target = Just $ ProjectEvent {projectEvent_id = Just 43593, projectEvent_name = "proj1", projectEvent_description = Nothing, projectEvent_web_url = "https://gitlab.example.com/grp1/grp2/proj1", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_git_http_url = "https://gitlab.example.com/grp1/grp2/proj1.git", projectEvent_namespace = "grp2", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "grp1/grp2/proj1", projectEvent_default_branch = "main", projectEvent_homepage = Just "https://gitlab.example.com/grp1/grp2/proj1", projectEvent_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_ssh_url = "git@gitlab.example.com:grp1/grp2/proj1.git", projectEvent_http_url = "https://gitlab.example.com/grp1/grp2/proj1.git"}, merge_request_object_attributes_last_commit = Just $ CommitEvent {commitEvent_id = "249d94fdc92825a2ca22c4fa74c511ec5f03e086", commitEvent_message = "Updated README\n", commitEvent_timestamp = "2022-10-08T10:37:28+01:00", commitEvent_url = "https://gitlab.example.com/grp1/grp2/proj1/-/commit/249d94fdc92825a2ca22c4fa74c511ec5f03e086", commitEvent_author = CommitAuthorEvent {commitAuthorEvent_name = "Hill, Harry", commitAuthorEvent_email = "harry@gmail.com"}}, merge_request_object_attributes_work_in_progress = Just True, merge_request_object_attributes_total_time_spent = Just 0, merge_request_object_attributes_human_total_time_spent = Nothing, merge_request_object_attributes_human_time_estimate = Nothing, merge_request_object_attributes_action = Just "open"}, mergeRequest_labels = Just [], mergeRequest_changes = MergeRequestChanges {mergeRequestChanges_author_id = Nothing, mergeRequestChanges_created_at = Nothing, mergeRequestChanges_description = Nothing, mergeRequestChanges_id = Nothing, mergeRequestChanges_iid = Nothing, mergeRequestChanges_source_branch = Nothing, mergeRequestChanges_source_project_id = Nothing, mergeRequestChanges_target_branch = Nothing, mergeRequestChanges_target_project_id = Nothing, mergeRequestChanges_title = Nothing, mergeRequestChanges_updated_at = Nothing}, mergeRequest_repository = RepositoryEvent {repositoryEvent_name = "proj1", repositoryEvent_url = "git@gitlab.example.com:grp1/grp2/proj1.git", repositoryEvent_description = Nothing, repositoryEvent_homepage = Just "https://gitlab.example.com/grp1/grp2/proj1", repositoryEvent_git_http_url = Nothing, repositoryEvent_git_ssh_url = Nothing, repositoryEvent_visibility_level = Nothing}}
 
 build1Haskell :: BuildEvent
 build1Haskell =
@@ -1949,6 +2051,10 @@
 pipeline6Haskell =
   PipelineEvent {pipeline_event_object_kind = "pipeline", pipeline_event_object_attributes = PipelineObjectAttributes {pipeline_object_attributes_id = 74974, pipeline_object_attributes_iid = 1, pipeline_object_attributes_name = Nothing, pipeline_object_attributes_ref = "main", pipeline_object_attributes_tag = False, pipeline_object_attributes_sha = "abc1", pipeline_object_attributes_before_sha = "aaa1", pipeline_object_attributes_source = "push", pipeline_object_attributes_status = "pending", pipeline_object_attributes_detailed_status = "pending", pipeline_object_attributes_stages = ["build", "test", "deploy"], pipeline_object_attributes_created_at = "2026-02-07 02:47:56 UTC", pipeline_object_attributes_finished_at = Nothing, pipeline_object_attributes_duration = Nothing, pipeline_object_attributes_queued_duration = Nothing, pipeline_object_attributes_variables = [], pipeline_object_attributes_url = "https://example.com/joe1/proj1/-/pipelines/74974"}, pipeline_event_merge_request = Nothing, pipeline_event_user = User {user_id = 414, user_username = "joe1", user_bio = Nothing, user_two_factor_enabled = Nothing, user_last_sign_in_at = Nothing, user_current_sign_in_at = Nothing, user_last_activity_on = Nothing, user_skype = Nothing, user_twitter = Nothing, user_website_url = Nothing, user_theme_id = Nothing, user_color_scheme_id = Nothing, user_external = Nothing, user_private_profile = Nothing, user_projects_limit = Nothing, user_can_create_group = Nothing, user_can_create_project = Nothing, user_public_email = Nothing, user_organization = Nothing, user_job_title = Nothing, user_pronouns = Nothing, user_linkedin = Nothing, user_confirmed_at = Nothing, user_identities = Nothing, user_name = "Joe Bloggs", user_email = Just "[REDACTED]", user_followers = Nothing, user_bot = Nothing, user_following = Nothing, user_state = Nothing, user_avatar_url = Just "https://secure.gravatar.com/avatar/aaa1?s=80&d=identicon", user_web_url = Nothing, user_location = Nothing, user_extern_uid = Nothing, user_group_id_for_saml = Nothing, user_discussion_locked = Nothing, user_created_at = Nothing, user_note = Nothing, user_password = Nothing, user_force_random_password = Nothing, user_providor = Nothing, user_reset_password = Nothing, user_skip_confirmation = Nothing, user_view_diffs_file_by_file = Nothing}, pipeline_event_project = BuildProject {build_project_project_id = 47461, build_project_project_name = "proj1", build_project_description = Nothing, build_project_web_url = "https://example.com/joe1/proj1", build_project_avatar_url = Nothing, build_project_git_ssh_url = "git@example.com:joe1/proj1.git", build_project_git_http_url = "https://example.com/joe1/proj1.git", build_project_namespace = "Joe Bloggs", build_project_visibility_level = 0, build_project_path_with_namespace = "joe1/proj1", build_project_default_branch = "main", build_project_ci_config_path = Just ""}, pipeline_event_commit = CommitEvent {commitEvent_id = "abc1", commitEvent_message = "commit message", commitEvent_timestamp = "2026-02-07T02:47:55+00:00", commitEvent_url = "https://example.com/joe1/proj1/-/commit/abc1", commitEvent_author = CommitAuthorEvent {commitAuthorEvent_name = "Joe Bloggs", commitAuthorEvent_email = "joe1@example.com"}}, pipeline_event_builds = [PipelineBuild {pipeline_build_id = 103996, pipeline_build_stage = "build", pipeline_build_name = "build-job", pipeline_build_status = "pending", pipeline_build_created_at = "2026-02-07 02:47:56 UTC", pipeline_build_started_at = Nothing, pipeline_build_finished_at = Nothing, pipeline_build_duration = Nothing, pipeline_build_queued_duration = Just 0.486474635, pipeline_build_failure_reason = Nothing, pipeline_build_when = "on_success", pipeline_build_manual = False, pipeline_build_allow_failure = False, pipeline_build_user = UserEvent {userEvent_id = Nothing, userEvent_name = "Joe Bloggs", userEvent_username = "joe1", userEvent_avatar_url = "https://secure.gravatar.com/avatar/aaa1?s=80&d=identicon", userEvent_email = Nothing}, pipeline_build_runner = Nothing, pipeline_build_artifacts_file = ArtifactsFile {artifacts_file_filename = Nothing, artifacts_file_size = Nothing}, pipeline_build_environment = Nothing}, PipelineBuild {pipeline_build_id = 103997, pipeline_build_stage = "test", pipeline_build_name = "test", pipeline_build_status = "created", pipeline_build_created_at = "2026-02-07 02:47:56 UTC", pipeline_build_started_at = Nothing, pipeline_build_finished_at = Nothing, pipeline_build_duration = Nothing, pipeline_build_queued_duration = Nothing, pipeline_build_failure_reason = Nothing, pipeline_build_when = "on_success", pipeline_build_manual = False, pipeline_build_allow_failure = False, pipeline_build_user = UserEvent {userEvent_id = Nothing, userEvent_name = "Joe Bloggs", userEvent_username = "joe1", userEvent_avatar_url = "https://secure.gravatar.com/avatar/aaa1?s=80&d=identicon", userEvent_email = Nothing}, pipeline_build_runner = Nothing, pipeline_build_artifacts_file = ArtifactsFile {artifacts_file_filename = Nothing, artifacts_file_size = Nothing}, pipeline_build_environment = Nothing}, PipelineBuild {pipeline_build_id = 103998, pipeline_build_stage = "test", pipeline_build_name = "test job", pipeline_build_status = "created", pipeline_build_created_at = "2026-02-07 02:47:56 UTC", pipeline_build_started_at = Nothing, pipeline_build_finished_at = Nothing, pipeline_build_duration = Nothing, pipeline_build_queued_duration = Nothing, pipeline_build_failure_reason = Nothing, pipeline_build_when = "on_success", pipeline_build_manual = False, pipeline_build_allow_failure = False, pipeline_build_user = UserEvent {userEvent_id = Nothing, userEvent_name = "Joe Bloggs", userEvent_username = "joe1", userEvent_avatar_url = "https://secure.gravatar.com/avatar/aaa1?s=80&d=identicon", userEvent_email = Nothing}, pipeline_build_runner = Nothing, pipeline_build_artifacts_file = ArtifactsFile {artifacts_file_filename = Nothing, artifacts_file_size = Nothing}, pipeline_build_environment = Nothing}, PipelineBuild {pipeline_build_id = 103999, pipeline_build_stage = "deploy", pipeline_build_name = "deploy-job", pipeline_build_status = "created", pipeline_build_created_at = "2026-02-07 02:47:56 UTC", pipeline_build_started_at = Nothing, pipeline_build_finished_at = Nothing, pipeline_build_duration = Nothing, pipeline_build_queued_duration = Nothing, pipeline_build_failure_reason = Nothing, pipeline_build_when = "on_success", pipeline_build_manual = False, pipeline_build_allow_failure = False, pipeline_build_user = UserEvent {userEvent_id = Nothing, userEvent_name = "Joe Bloggs", userEvent_username = "joe1", userEvent_avatar_url = "https://secure.gravatar.com/avatar/aaa1?s=80&d=identicon", userEvent_email = Nothing}, pipeline_build_runner = Nothing, pipeline_build_artifacts_file = ArtifactsFile {artifacts_file_filename = Nothing, artifacts_file_size = Nothing}, pipeline_build_environment = Just (Environment {environment_name = "production", environment_action = "start", environment_deployment_tier = Just "production"})}]}
 
+pipeline7Haskell :: PipelineEvent
+pipeline7Haskell =
+  PipelineEvent {pipeline_event_object_kind = "pipeline", pipeline_event_object_attributes = PipelineObjectAttributes {pipeline_object_attributes_id = 76289, pipeline_object_attributes_iid = 4, pipeline_object_attributes_name = Nothing, pipeline_object_attributes_ref = "the-ref", pipeline_object_attributes_tag = False, pipeline_object_attributes_sha = "abc123", pipeline_object_attributes_before_sha = "0000000000000000000000000000000000000000", pipeline_object_attributes_source = "merge_request_event", pipeline_object_attributes_status = "failed", pipeline_object_attributes_detailed_status = "failed", pipeline_object_attributes_stages = [], pipeline_object_attributes_created_at = "2026-04-05 17:37:55 UTC", pipeline_object_attributes_finished_at = Just "2026-04-05 17:37:55 UTC", pipeline_object_attributes_duration = Nothing, pipeline_object_attributes_queued_duration = Nothing, pipeline_object_attributes_variables = [], pipeline_object_attributes_url = "http://www.example.com/joe1/proj-name/-/pipelines/76289"}, pipeline_event_merge_request = Just (MergeRequestObjectAttributes {merge_request_object_attributes_id = 3252, merge_request_object_attributes_target_branch = "main", merge_request_object_attributes_source_branch = "the-ref", merge_request_object_attributes_source_project_id = 51828, merge_request_object_attributes_author_id = Nothing, merge_request_object_attributes_assignee_id = Nothing, merge_request_object_attributes_assignee_ids = Nothing, merge_request_object_attributes_title = "merge request title", merge_request_object_attributes_created_at = Nothing, merge_request_object_attributes_updated_at = Nothing, merge_request_object_attributes_milestone_id = Nothing, merge_request_object_attributes_state = "opened", merge_request_object_attributes_state_id = Nothing, merge_request_object_attributes_merge_status = "checking", merge_request_object_attributes_target_project_id = 51828, merge_request_object_attributes_iid = 2, merge_request_object_attributes_description = Nothing, merge_request_object_attributes_updated_by_id = Nothing, merge_request_object_attributes_merge_error = Nothing, merge_request_object_attributes_merge_params = Nothing, merge_request_object_attributes_merge_when_pipeline_succeeds = Nothing, merge_request_object_attributes_merge_user_id = Nothing, merge_request_object_attributes_merge_commit_sha = Nothing, merge_request_object_attributes_deleted_at = Nothing, merge_request_object_attributes_in_progress_merge_commit_sha = Nothing, merge_request_object_attributes_lock_version = Nothing, merge_request_object_attributes_time_estimate = Nothing, merge_request_object_attributes_last_edited_at = Nothing, merge_request_object_attributes_last_edited_by_id = Nothing, merge_request_object_attributes_head_pipeline_id = Nothing, merge_request_object_attributes_ref_fetched = Nothing, merge_request_object_attributes_merge_jid = Nothing, merge_request_object_attributes_source = Nothing, merge_request_object_attributes_target = Nothing, merge_request_object_attributes_last_commit = Nothing, merge_request_object_attributes_work_in_progress = Nothing, merge_request_object_attributes_total_time_spent = Nothing, merge_request_object_attributes_human_total_time_spent = Nothing, merge_request_object_attributes_human_time_estimate = Nothing, merge_request_object_attributes_action = Nothing}), pipeline_event_user = User {user_id = 4273, user_username = "joe1", user_bio = Nothing, user_two_factor_enabled = Nothing, user_last_sign_in_at = Nothing, user_current_sign_in_at = Nothing, user_last_activity_on = Nothing, user_skype = Nothing, user_twitter = Nothing, user_website_url = Nothing, user_theme_id = Nothing, user_color_scheme_id = Nothing, user_external = Nothing, user_private_profile = Nothing, user_projects_limit = Nothing, user_can_create_group = Nothing, user_can_create_project = Nothing, user_public_email = Nothing, user_organization = Nothing, user_job_title = Nothing, user_pronouns = Nothing, user_linkedin = Nothing, user_confirmed_at = Nothing, user_identities = Nothing, user_name = "Joe Bloggs", user_email = Just "[REDACTED]", user_followers = Nothing, user_bot = Nothing, user_following = Nothing, user_state = Nothing, user_avatar_url = Just "https://secure.gravatar.com/avatar/abc123", user_web_url = Nothing, user_location = Nothing, user_extern_uid = Nothing, user_group_id_for_saml = Nothing, user_discussion_locked = Nothing, user_created_at = Nothing, user_note = Nothing, user_password = Nothing, user_force_random_password = Nothing, user_providor = Nothing, user_reset_password = Nothing, user_skip_confirmation = Nothing, user_view_diffs_file_by_file = Nothing}, pipeline_event_project = BuildProject {build_project_project_id = 51828, build_project_project_name = "project name", build_project_description = Nothing, build_project_web_url = "http://www.example.com/joe1/proj-name", build_project_avatar_url = Nothing, build_project_git_ssh_url = "git@example.com:joe1/proj-name.git", build_project_git_http_url = "http://www.example.com/joe1/proj-name.git", build_project_namespace = "Joe Bloggs", build_project_visibility_level = 0, build_project_path_with_namespace = "joe1/proj-name", build_project_default_branch = "main", build_project_ci_config_path = Just ""}, pipeline_event_commit = CommitEvent {commitEvent_id = "abc123", commitEvent_message = "merge request title", commitEvent_timestamp = "2026-04-05T17:37:48+00:00", commitEvent_url = "http://www.example.com/joe1/proj-name/-/commit/abc123", commitEvent_author = CommitAuthorEvent {commitAuthorEvent_name = "Joe Bloggs", commitAuthorEvent_email = "joe1@example.com"}}, pipeline_event_builds = []}
+
 issue1Haskell :: IssueEvent
 issue1Haskell =
   IssueEvent {issue_event_event_type = "issue", issue_event_user = Just (UserEvent {userEvent_id = Nothing, userEvent_name = "Joe", userEvent_username = "ma2305", userEvent_avatar_url = "https://secure.gravatar.com/avatar/abcde", userEvent_email = Nothing}), issue_event_project = Just (ProjectEvent {projectEvent_id = Just 19102, projectEvent_name = "proj-name", projectEvent_description = Just "", projectEvent_web_url = "https://example.com/joe123/proj-name", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:joe123/proj-name.git", projectEvent_git_http_url = "https://example.com/joe123/proj-name.git", projectEvent_namespace = "Joe", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe123/proj-name", projectEvent_default_branch = "master", projectEvent_homepage = Just "https://example.com/joe123/proj-name", projectEvent_url = "git@example.com:joe123/proj-name.git", projectEvent_ssh_url = "git@example.com:joe123/proj-name.git", projectEvent_http_url = "https://example.com/joe123/proj-name.git"}), issue_event_object_attributes = Just (IssueEventObjectAttributes {issue_event_object_attributes_author_id = 2052, issue_event_object_attributes_closed_at = Just "2024-11-02 19:47:16 UTC", issue_event_object_attributes_confidential = False, issue_event_object_attributes_created_at = "2024-11-02 05:45:09 UTC", issue_event_object_attributes_description = Just "", issue_event_object_attributes_discussion_locked = Nothing, issue_event_object_attributes_due_date = Nothing, issue_event_object_attributes_id = 2183, issue_event_object_attributes_iid = 40, issue_event_object_attributes_last_edited_at = Nothing, issue_event_object_attributes_last_edited_by_id = Nothing, issue_event_object_attributes_milestone_id = Nothing, issue_event_object_attributes_move_to_id = Nothing, issue_event_object_attributes_duplicated_to_id = Nothing, issue_event_object_attributes_project_id = 19102, issue_event_object_attributes_relative_position = Just 20520, issue_event_object_attributes_state_id = 2, issue_event_object_attributes_time_estimate = 0, issue_event_object_attributes_title = "Issue title", issue_event_object_attributes_updated_at = "2024-11-02 19:47:17 UTC", issue_event_object_attributes_updated_by_id = Nothing, issue_event_object_attributes_type = "Issue", issue_event_object_attributes_url = "https://example.com/joe123/proj-name/-/issues/40", issue_event_object_attributes_total_time_spent = 0, issue_event_object_attributes_time_change = 0, issue_event_object_attributes_human_total_time_spent = Nothing, issue_event_object_attributes_human_time_change = Nothing, issue_event_object_attributes_human_time_estimate = Nothing}), issue_event_labels = Just [Label {label_id = Just 385, label_title = Just "Stage 3", label_color = Just "#cd5b45", label_project_id = Just 19102, label_created_at = Just "2024-11-02 05:42:30 UTC", label_updated_at = Just "2024-11-02 05:42:30 UTC", label_template = Just False, label_description = Nothing, label_type = Just "ProjectLabel", label_group_id = Nothing}], issue_event_changes = Just (IssueEventChanges {issue_event_changes_author_id = Nothing, issue_event_changes_created_at = Nothing, issue_event_changes_description = Nothing, issue_event_changes_id = Nothing, issue_event_changes_iid = Nothing, issue_event_changes_project_id = Nothing, issue_event_changes_title = Nothing, issue_event_changes_closed_at = Just (IssueChangesClosedAt {issue_event_closed_at_previous = Nothing, issue_event_closed_at_current = Just "2024-11-02 19:47:16 UTC"}), issue_event_changes_state_id = Just (IssueChangesStateId {issue_event_state_id_previous = Just 1, issue_event_state_id_current = 2}), issue_event_changes_updated_at = Just (IssueChangesUpdatedAt {issue_event_updated_at_previous = Just "2024-11-02 05:45:09 UTC", issue_event_updated_at_current = "2024-11-02 19:47:17 UTC"})}), issue_event_repository = Just (RepositoryEvent {repositoryEvent_name = "proj-name", repositoryEvent_url = "git@example.com:joe123/proj-name.git", repositoryEvent_description = Just "", repositoryEvent_homepage = Just "https://example.com/joe123/proj-name", repositoryEvent_git_http_url = Nothing, repositoryEvent_git_ssh_url = Nothing, repositoryEvent_visibility_level = Nothing}), issue_event_assignees = Just [UserEvent {userEvent_id = Nothing, userEvent_name = "Joe", userEvent_username = "joe123", userEvent_avatar_url = "https://secure.gravatar.com/avatar/abcde", userEvent_email = Nothing}]}
@@ -2016,3 +2122,15 @@
 accessToken4Haskell :: AccessTokenEvent
 accessToken4Haskell =
   AccessTokenEvent {access_token_event_project = EmojiProject {emoji_project_id = 28294, emoji_project_name = "proj-name", emoji_project_description = Nothing, emoji_project_web_url = "https://example.com/aaa1/proj-name", emoji_project_avatar_url = Nothing, emoji_project_git_ssh_url = "git@example.com:aaa1/proj-name.git", emoji_project_git_http_url = "https://example.com/aaa1/proj-name.git", emoji_project_namespace = "Joe Bloggs", emoji_project_visibility_level = 0, emoji_project_path_with_namespace = "aaa1/proj-name", emoji_project_default_branch = "main", emoji_project_ci_config_path = Nothing, emoji_project_homepage = "https://example.com/aaa1/proj-name", emoji_project_url = "git@example.com:aaa1/proj-name.git", emoji_project_ssh_url = "git@example.com:aaa1/proj-name.git", emoji_project_http_url = "https://example.com/aaa1/proj-name.git"}, access_token_event_object_attributes = AccessTokenObjectAttributes {access_token_object_user_id = 3401, access_token_object_created_at = "2024-11-25 08:12:01 UTC", access_token_object_id = 1470, access_token_object_name = "aaa1", access_token_object_expires_at = Just "2025-11-25"}, access_token_event_event_name = "expiring_access_token", access_token_event_interval = "seven_days"}
+
+deployment1Haskell :: DeploymentEvent
+deployment1Haskell =
+  DeploymentEvent {deployment_event_status = "running", deployment_event_status_changed_at = Just "2026-03-16 03:09:32 +0000", deployment_event_deployment_id = 56, deployment_event_deployable_id = 106120, deployment_event_deployable_url = "https://example.com/joe1/proj-name/-/jobs/106120", deployment_event_environment = "production", deployment_event_environment_tier = "production", deployment_event_environment_slug = "production", deployment_event_environment_external_url = Nothing, deployment_event_project = ProjectEvent {projectEvent_id = Just 47800, projectEvent_name = "proj-name", projectEvent_description = Nothing, projectEvent_web_url = "https://example.com/joe1/proj-name", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:joe1/proj-name.git", projectEvent_git_http_url = "https://example.com/joe1/proj-name.git", projectEvent_namespace = "Joe Bloggs", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe1/proj-name", projectEvent_default_branch = "main", projectEvent_homepage = Just "https://example.com/joe1/proj-name", projectEvent_url = "git@example.com:joe1/proj-name.git", projectEvent_ssh_url = "git@example.com:joe1/proj-name.git", projectEvent_http_url = "https://example.com/joe1/proj-name.git"}, deployment_event_short_sha = "abc1", deployment_event_user = User {user_id = 414, user_username = "joe1", user_bio = Nothing, user_two_factor_enabled = Nothing, user_last_sign_in_at = Nothing, user_current_sign_in_at = Nothing, user_last_activity_on = Nothing, user_skype = Nothing, user_twitter = Nothing, user_website_url = Nothing, user_theme_id = Nothing, user_color_scheme_id = Nothing, user_external = Nothing, user_private_profile = Nothing, user_projects_limit = Nothing, user_can_create_group = Nothing, user_can_create_project = Nothing, user_public_email = Nothing, user_organization = Nothing, user_job_title = Nothing, user_pronouns = Nothing, user_linkedin = Nothing, user_confirmed_at = Nothing, user_identities = Nothing, user_name = "Joe Bloggs", user_email = Just "[REDACTED]", user_followers = Nothing, user_bot = Nothing, user_following = Nothing, user_state = Nothing, user_avatar_url = Just "https://secure.gravatar.com/avatar/abc1?s=80&d=identicon", user_web_url = Nothing, user_location = Nothing, user_extern_uid = Nothing, user_group_id_for_saml = Nothing, user_discussion_locked = Nothing, user_created_at = Nothing, user_note = Nothing, user_password = Nothing, user_force_random_password = Nothing, user_providor = Nothing, user_reset_password = Nothing, user_skip_confirmation = Nothing, user_view_diffs_file_by_file = Nothing}, deployment_event_user_url = "https://example.com/joe1", deployment_event_commit_url = "https://example.com/joe1/proj-name/-/commit/abc1", deployment_event_commit_title = "Commit title", deployment_event_ref = "main"}
+
+deployment2Haskell :: DeploymentEvent
+deployment2Haskell =
+  DeploymentEvent {deployment_event_status = "success", deployment_event_status_changed_at = Just "2026-03-16 03:09:34 +0000", deployment_event_deployment_id = 56, deployment_event_deployable_id = 106120, deployment_event_deployable_url = "https://example.com/joe1/proj-name/-/jobs/106120", deployment_event_environment = "production", deployment_event_environment_tier = "production", deployment_event_environment_slug = "production", deployment_event_environment_external_url = Nothing, deployment_event_project = ProjectEvent {projectEvent_id = Just 47800, projectEvent_name = "proj-name", projectEvent_description = Nothing, projectEvent_web_url = "https://example.com/joe1/proj-name", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:joe1/proj-name.git", projectEvent_git_http_url = "https://example.com/joe1/proj-name.git", projectEvent_namespace = "Joe Bloggs", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "joe1/proj-name", projectEvent_default_branch = "main", projectEvent_homepage = Just "https://example.com/joe1/proj-name", projectEvent_url = "git@example.com:joe1/proj-name.git", projectEvent_ssh_url = "git@example.com:joe1/proj-name.git", projectEvent_http_url = "https://example.com/joe1/proj-name.git"}, deployment_event_short_sha = "abc1", deployment_event_user = User {user_id = 414, user_username = "joe1", user_bio = Nothing, user_two_factor_enabled = Nothing, user_last_sign_in_at = Nothing, user_current_sign_in_at = Nothing, user_last_activity_on = Nothing, user_skype = Nothing, user_twitter = Nothing, user_website_url = Nothing, user_theme_id = Nothing, user_color_scheme_id = Nothing, user_external = Nothing, user_private_profile = Nothing, user_projects_limit = Nothing, user_can_create_group = Nothing, user_can_create_project = Nothing, user_public_email = Nothing, user_organization = Nothing, user_job_title = Nothing, user_pronouns = Nothing, user_linkedin = Nothing, user_confirmed_at = Nothing, user_identities = Nothing, user_name = "Joe Bloggs", user_email = Just "[REDACTED]", user_followers = Nothing, user_bot = Nothing, user_following = Nothing, user_state = Nothing, user_avatar_url = Just "https://secure.gravatar.com/avatar/abc1?s=80&d=identicon", user_web_url = Nothing, user_location = Nothing, user_extern_uid = Nothing, user_group_id_for_saml = Nothing, user_discussion_locked = Nothing, user_created_at = Nothing, user_note = Nothing, user_password = Nothing, user_force_random_password = Nothing, user_providor = Nothing, user_reset_password = Nothing, user_skip_confirmation = Nothing, user_view_diffs_file_by_file = Nothing}, deployment_event_user_url = "https://example.com/joe1", deployment_event_commit_url = "https://example.com/joe1/proj-name/-/commit/abc1", deployment_event_commit_title = "Commit title", deployment_event_ref = "main"}
+
+milestone1Haskell :: MilestoneEvent
+milestone1Haskell =
+  MilestoneEvent {milestone_event_project = ProjectEvent {projectEvent_id = Just 48355, projectEvent_name = "proj name", projectEvent_description = Nothing, projectEvent_web_url = "https://example.com/group1/proj-name", projectEvent_avatar_url = Nothing, projectEvent_git_ssh_url = "git@example.com:group1/proj-name.git", projectEvent_git_http_url = "https://example.com/group1/proj-name.git", projectEvent_namespace = "project namespace", projectEvent_visibility_level = Private, projectEvent_path_with_namespace = "group1/proj-name", projectEvent_default_branch = "main", projectEvent_homepage = Just "https://example.com/group1/proj-name", projectEvent_url = "git@example.com:group1/proj-name.git", projectEvent_ssh_url = "git@example.com:group1/proj-name.git", projectEvent_http_url = "https://example.com/group1/proj-name.git"}, milestone_event_group = Nothing, milestone_event_object_attributes = MilestoneAttributes {milestone_attributes_id = 115, milestone_attributes_iid = 1, milestone_attributes_title = "Milestone title", milestone_attributes_description = "Milestone description", milestone_attributes_state = "active", milestone_attributes_created_at = "2026-02-12 12:35:59 UTC", milestone_attributes_updated_at = "2026-02-12 12:35:59 UTC", milestone_attributes_due_date = "2026-02-23", milestone_attributes_start_date = "2026-01-26", milestone_attributes_project_id = 48355}, milestone_event_action = "create"}
