diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,55 @@
+## Changes for 0.30.0.2
+
+_2026-03-12, Andreas Abel_
+
+- Fixed issue [#531](https://github.com/haskell-github/github/issues/531)
+  (Norfairking, PR [#532](https://github.com/haskell-github/github/pull/532)).
+- Allow `http-client-tls-0.4`.
+
+Tested with GHC 8.2 - 9.14.1.
+
+## Changes for 0.30.0.1
+
+_2025-08-27, Andreas Abel_
+
+- Drop dependencies `deepseq-generics` and `transformers-compat`.
+- Remove obsolete `deriving Typeable`.
+
+Tested with GHC 8.2 - 9.14 alpha1.
+
+## Changes for 0.30
+
+_2025-05-09, Andreas Abel, Peace edition_
+
+- Organization membership endpoint (Domen Kožar, PR [#487](https://github.com/haskell-github/github/pull/487)).
+- Allow JWT as an authentication method (Tom Sydney Kerckhove, PR [#497](https://github.com/haskell-github/github/pull/497)).
+- Support pagination (Tom McLaughlin, PR [#503](https://github.com/haskell-github/github/pull/503)).
+- Initial subset of Reactions endpoints (Dan Rijks, PR [#509](https://github.com/haskell-github/github/pull/509)).
+- Fix `getNotifications` (maralorn, PR [#511](https://github.com/haskell-github/github/pull/511)).
+- Add missing `name` field to `WorkflowJobs` `Job` type (Hugh Davidson, PR [#518](https://github.com/haskell-github/github/pull/518)).
+- Add `StateReasonDuplicate` to `IssueStateReason` (PR [#523](https://github.com/haskell-github/github/pull/523)).
+- Drop support for GHC 8.0 and below.
+- Drop dependency `time-compat`.
+
+Tested with GHC 8.2 - 9.12.2.
+
+
+## Changes for 0.29
+
+_2023-06-24, Andreas Abel, Midsommar edition_
+
+- Support for the GitHub Actions API
+  (PR [#459](https://github.com/haskell-github/github/pull/459)):
+  * New endpoint modules `GitHub.EndPoints.Actions.Artifacts`, `.Cache`,
+    `.Secrets`, `.Workflows`, `.WorkflowRuns`, `.WorkflowJobs`.
+  * Matching data structure modules `GitHub.Data.Actions.*`.
+
+- Add field `issueStateReason` of type `Maybe IssueStateReason` to `Issue`
+  with possible values `completed`, `not_planned` and `reopened`
+  (PR [#496](https://github.com/haskell-github/github/pull/496)).
+
+Tested with GHC 7.8 - 9.6.2
+
 ## Changes for 0.28.0.1
 
 _2022-07-23, Andreas Abel_
diff --git a/README.md b/README.md
--- a/README.md
+++ b/README.md
@@ -1,8 +1,10 @@
 GitHub
 ------
 
+[![Hackage version](https://img.shields.io/hackage/v/github.svg?label=Hackage&color=informational)](http://hackage.haskell.org/package/github)
+[![github on Stackage Nightly](https://stackage.org/package/github/badge/nightly)](https://stackage.org/nightly/package/github)
+[![Stackage LTS version](https://www.stackage.org/package/github/badge/lts?label=Stackage)](https://www.stackage.org/package/github)
 [![Haskell-CI](https://github.com/haskell-github/github/actions/workflows/haskell-ci.yml/badge.svg)](https://github.com/haskell-github/github/actions/workflows/haskell-ci.yml)
-[![Hackage](https://img.shields.io/hackage/v/github.svg)][hackage]
 
 The GitHub API v3 for Haskell.
 
@@ -92,7 +94,7 @@
 
 Available under the BSD 3-clause license.
 
-[hackage]: http://hackage.haskell.org/package/github "Hackage"
+[hackage]: https://hackage.haskell.org/package/github "Hackage"
 
 Alternative
 ===========
diff --git a/fixtures/actions/artifact.json b/fixtures/actions/artifact.json
new file mode 100644
--- /dev/null
+++ b/fixtures/actions/artifact.json
@@ -0,0 +1,19 @@
+{
+  "id": 416767789,
+  "node_id": "MDg6QXJ0aWZhY3Q0MTY3Njc3ODk=",
+  "name": "dist-without-markdown",
+  "size_in_bytes": 42718,
+  "url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/artifacts/416767789",
+  "archive_download_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/artifacts/416767789/zip",
+  "expired": false,
+  "created_at": "2022-10-29T22:18:21Z",
+  "updated_at": "2022-10-29T22:18:23Z",
+  "expires_at": "2023-01-27T22:18:16Z",
+  "workflow_run": {
+    "id": 3353148947,
+    "repository_id": 559365297,
+    "head_repository_id": 559365297,
+    "head_branch": "main",
+    "head_sha": "601593ecb1d8a57a04700fdb445a28d4186b8954"
+  }
+}
diff --git a/fixtures/actions/artifacts-list.json b/fixtures/actions/artifacts-list.json
new file mode 100644
--- /dev/null
+++ b/fixtures/actions/artifacts-list.json
@@ -0,0 +1,43 @@
+{
+  "total_count": 23809,
+  "artifacts": [
+    {
+      "id": 416737084,
+      "node_id": "MDg6QXJ0aWZhY3Q0MTY3MzcwODQ=",
+      "name": "doc-html",
+      "size_in_bytes": 61667543,
+      "url": "https://api.github.com/repos/python/cpython/actions/artifacts/416737084",
+      "archive_download_url": "https://api.github.com/repos/python/cpython/actions/artifacts/416737084/zip",
+      "expired": false,
+      "created_at": "2022-10-29T20:56:24Z",
+      "updated_at": "2022-10-29T20:56:25Z",
+      "expires_at": "2023-01-27T20:50:21Z",
+      "workflow_run": {
+        "id": 3352897496,
+        "repository_id": 81598961,
+        "head_repository_id": 101955313,
+        "head_branch": "backport-bfecff5-3.11",
+        "head_sha": "692cd77975413d71ff0951072df686e6f38711c8"
+      }
+    },
+    {
+      "id": 416712612,
+      "node_id": "MDg6QXJ0aWZhY3Q0MTY3MTI2MTI=",
+      "name": "doc-html",
+      "size_in_bytes": 61217330,
+      "url": "https://api.github.com/repos/python/cpython/actions/artifacts/416712612",
+      "archive_download_url": "https://api.github.com/repos/python/cpython/actions/artifacts/416712612/zip",
+      "expired": false,
+      "created_at": "2022-10-29T19:53:19Z",
+      "updated_at": "2022-10-29T19:53:20Z",
+      "expires_at": "2023-01-27T19:49:12Z",
+      "workflow_run": {
+        "id": 3352724493,
+        "repository_id": 81598961,
+        "head_repository_id": 559335486,
+        "head_branch": "patch-1",
+        "head_sha": "62eb88a66d1d35f7701873d8b698a2f8d7e84fa5"
+      }
+    }
+  ]
+}
diff --git a/fixtures/actions/cache-list.json b/fixtures/actions/cache-list.json
new file mode 100644
--- /dev/null
+++ b/fixtures/actions/cache-list.json
@@ -0,0 +1,14 @@
+{
+  "total_count": 1,
+  "actions_caches": [
+    {
+      "id": 1,
+      "ref": "refs/heads/main",
+      "key": "cache_key",
+      "version": "f5f850afdadd47730296d4ffa900de95f6bbafb75dc1e8475df1fa6ae79dcece",
+      "last_accessed_at": "2022-10-30T00:08:14.223333300Z",
+      "created_at": "2022-10-30T00:08:14.223333300Z",
+      "size_in_bytes": 26586
+    }
+  ]
+}
diff --git a/fixtures/actions/org-cache-usage.json b/fixtures/actions/org-cache-usage.json
new file mode 100644
--- /dev/null
+++ b/fixtures/actions/org-cache-usage.json
@@ -0,0 +1,4 @@
+{
+  "total_active_caches_size_in_bytes": 26586,
+  "total_active_caches_count": 1
+}
diff --git a/fixtures/actions/org-public-key.json b/fixtures/actions/org-public-key.json
new file mode 100644
--- /dev/null
+++ b/fixtures/actions/org-public-key.json
@@ -0,0 +1,4 @@
+{
+  "key_id": "568250167242549743",
+  "key": "KHVvOxB765kjkShEgUu27QCzl5XxKz/L20V+KRsWf0w="
+}
diff --git a/fixtures/actions/org-secrets-list.json b/fixtures/actions/org-secrets-list.json
new file mode 100644
--- /dev/null
+++ b/fixtures/actions/org-secrets-list.json
@@ -0,0 +1,18 @@
+{
+  "total_count": 2,
+  "secrets": [
+    {
+      "name": "TEST_SECRET",
+      "created_at": "2022-10-31T00:08:12Z",
+      "updated_at": "2022-10-31T00:08:12Z",
+      "visibility": "all"
+    },
+    {
+      "name": "TEST_SELECTED",
+      "created_at": "2022-10-31T00:08:43Z",
+      "updated_at": "2022-10-31T00:08:43Z",
+      "visibility": "selected",
+      "selected_repositories_url": "https://api.github.com/orgs/kote-test-org-actions/actions/secrets/TEST_SELECTED/repositories"
+    }
+  ]
+}
diff --git a/fixtures/actions/repo-cache-usage.json b/fixtures/actions/repo-cache-usage.json
new file mode 100644
--- /dev/null
+++ b/fixtures/actions/repo-cache-usage.json
@@ -0,0 +1,5 @@
+{
+  "full_name": "python/cpython",
+  "active_caches_size_in_bytes": 55000268087,
+  "active_caches_count": 171
+}
diff --git a/fixtures/actions/selected-repositories-for-secret.json b/fixtures/actions/selected-repositories-for-secret.json
new file mode 100644
--- /dev/null
+++ b/fixtures/actions/selected-repositories-for-secret.json
@@ -0,0 +1,72 @@
+{
+  "total_count": 1,
+  "repositories": [
+    {
+      "id": 559365297,
+      "node_id": "R_kgDOIVc8sQ",
+      "name": "actions-api",
+      "full_name": "kote-test-org-actions/actions-api",
+      "private": true,
+      "owner": {
+        "login": "kote-test-org-actions",
+        "id": 116976977,
+        "node_id": "O_kgDOBvjtUQ",
+        "avatar_url": "https://avatars.githubusercontent.com/u/116976977?v=4",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/kote-test-org-actions",
+        "html_url": "https://github.com/kote-test-org-actions",
+        "followers_url": "https://api.github.com/users/kote-test-org-actions/followers",
+        "following_url": "https://api.github.com/users/kote-test-org-actions/following{/other_user}",
+        "gists_url": "https://api.github.com/users/kote-test-org-actions/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/kote-test-org-actions/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/kote-test-org-actions/subscriptions",
+        "organizations_url": "https://api.github.com/users/kote-test-org-actions/orgs",
+        "repos_url": "https://api.github.com/users/kote-test-org-actions/repos",
+        "events_url": "https://api.github.com/users/kote-test-org-actions/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/kote-test-org-actions/received_events",
+        "type": "Organization",
+        "site_admin": false
+      },
+      "html_url": "https://github.com/kote-test-org-actions/actions-api",
+      "description": null,
+      "fork": false,
+      "url": "https://api.github.com/repos/kote-test-org-actions/actions-api",
+      "forks_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/forks",
+      "keys_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/keys{/key_id}",
+      "collaborators_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/collaborators{/collaborator}",
+      "teams_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/teams",
+      "hooks_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/hooks",
+      "issue_events_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/issues/events{/number}",
+      "events_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/events",
+      "assignees_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/assignees{/user}",
+      "branches_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/branches{/branch}",
+      "tags_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/tags",
+      "blobs_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/blobs{/sha}",
+      "git_tags_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/tags{/sha}",
+      "git_refs_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/refs{/sha}",
+      "trees_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/trees{/sha}",
+      "statuses_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/statuses/{sha}",
+      "languages_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/languages",
+      "stargazers_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/stargazers",
+      "contributors_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/contributors",
+      "subscribers_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/subscribers",
+      "subscription_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/subscription",
+      "commits_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/commits{/sha}",
+      "git_commits_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/commits{/sha}",
+      "comments_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/comments{/number}",
+      "issue_comment_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/issues/comments{/number}",
+      "contents_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/contents/{+path}",
+      "compare_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/compare/{base}...{head}",
+      "merges_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/merges",
+      "archive_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/{archive_format}{/ref}",
+      "downloads_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/downloads",
+      "issues_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/issues{/number}",
+      "pulls_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/pulls{/number}",
+      "milestones_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/milestones{/number}",
+      "notifications_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/notifications{?since,all,participating}",
+      "labels_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/labels{/name}",
+      "releases_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/releases{/id}",
+      "deployments_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/deployments"
+    }
+  ]
+}
diff --git a/fixtures/actions/workflow-job.json b/fixtures/actions/workflow-job.json
new file mode 100644
--- /dev/null
+++ b/fixtures/actions/workflow-job.json
@@ -0,0 +1,113 @@
+{
+  "id": 9183275828,
+  "run_id": 3353449941,
+  "run_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/runs/3353449941",
+  "run_attempt": 1,
+  "node_id": "CR_kwDOIVc8sc8AAAACI12rNA",
+  "head_sha": "3156f684232a3adec5085c920d2006aca80f2798",
+  "url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/jobs/9183275828",
+  "html_url": "https://github.com/kote-test-org-actions/actions-api/actions/runs/3353449941/jobs/5556228789",
+  "status": "completed",
+  "conclusion": "success",
+  "started_at": "2022-10-30T00:09:29Z",
+  "completed_at": "2022-10-30T00:09:49Z",
+  "name": "check-bats-version",
+  "steps": [
+    {
+      "name": "Set up job",
+      "status": "completed",
+      "conclusion": "success",
+      "number": 1,
+      "started_at": "2022-10-29T17:09:29.000-07:00",
+      "completed_at": "2022-10-29T17:09:32.000-07:00"
+    },
+    {
+      "name": "Run actions/checkout@v3",
+      "status": "completed",
+      "conclusion": "success",
+      "number": 2,
+      "started_at": "2022-10-29T17:09:32.000-07:00",
+      "completed_at": "2022-10-29T17:09:33.000-07:00"
+    },
+    {
+      "name": "Run actions/setup-node@v3",
+      "status": "completed",
+      "conclusion": "success",
+      "number": 3,
+      "started_at": "2022-10-29T17:09:34.000-07:00",
+      "completed_at": "2022-10-29T17:09:39.000-07:00"
+    },
+    {
+      "name": "Run npm install -g bats",
+      "status": "completed",
+      "conclusion": "success",
+      "number": 4,
+      "started_at": "2022-10-29T17:09:40.000-07:00",
+      "completed_at": "2022-10-29T17:09:42.000-07:00"
+    },
+    {
+      "name": "Run bats -v",
+      "status": "completed",
+      "conclusion": "success",
+      "number": 5,
+      "started_at": "2022-10-29T17:09:42.000-07:00",
+      "completed_at": "2022-10-29T17:09:42.000-07:00"
+    },
+    {
+      "name": "Archive Test",
+      "status": "completed",
+      "conclusion": "success",
+      "number": 6,
+      "started_at": "2022-10-29T17:09:42.000-07:00",
+      "completed_at": "2022-10-29T17:09:46.000-07:00"
+    },
+    {
+      "name": "Cache",
+      "status": "completed",
+      "conclusion": "success",
+      "number": 7,
+      "started_at": "2022-10-29T17:09:46.000-07:00",
+      "completed_at": "2022-10-29T17:09:47.000-07:00"
+    },
+    {
+      "name": "Post Cache",
+      "status": "completed",
+      "conclusion": "success",
+      "number": 12,
+      "started_at": "2022-10-29T17:09:49.000-07:00",
+      "completed_at": "2022-10-29T17:09:47.000-07:00"
+    },
+    {
+      "name": "Post Run actions/setup-node@v3",
+      "status": "completed",
+      "conclusion": "success",
+      "number": 13,
+      "started_at": "2022-10-29T17:09:49.000-07:00",
+      "completed_at": "2022-10-29T17:09:49.000-07:00"
+    },
+    {
+      "name": "Post Run actions/checkout@v3",
+      "status": "completed",
+      "conclusion": "success",
+      "number": 14,
+      "started_at": "2022-10-29T17:09:49.000-07:00",
+      "completed_at": "2022-10-29T17:09:49.000-07:00"
+    },
+    {
+      "name": "Complete job",
+      "status": "completed",
+      "conclusion": "success",
+      "number": 15,
+      "started_at": "2022-10-29T17:09:47.000-07:00",
+      "completed_at": "2022-10-29T17:09:47.000-07:00"
+    }
+  ],
+  "check_run_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/check-runs/9183275828",
+  "labels": [
+    "ubuntu-latest"
+  ],
+  "runner_id": 1,
+  "runner_name": "Hosted Agent",
+  "runner_group_id": 2,
+  "runner_group_name": "GitHub Actions"
+}
diff --git a/fixtures/actions/workflow-list.json b/fixtures/actions/workflow-list.json
new file mode 100644
--- /dev/null
+++ b/fixtures/actions/workflow-list.json
@@ -0,0 +1,17 @@
+{
+  "total_count": 1,
+  "workflows": [
+    {
+      "id": 39065091,
+      "node_id": "W_kwDOIVc8sc4CVBYD",
+      "name": "learn-github-actions",
+      "path": ".github/workflows/make_artifact.yaml",
+      "state": "active",
+      "created_at": "2022-10-29T15:17:59.000-07:00",
+      "updated_at": "2022-10-29T15:17:59.000-07:00",
+      "url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/workflows/39065091",
+      "html_url": "https://github.com/kote-test-org-actions/actions-api/blob/main/.github/workflows/make_artifact.yaml",
+      "badge_url": "https://github.com/kote-test-org-actions/actions-api/workflows/learn-github-actions/badge.svg"
+    }
+  ]
+}
diff --git a/fixtures/actions/workflow-runs-list.json b/fixtures/actions/workflow-runs-list.json
new file mode 100644
--- /dev/null
+++ b/fixtures/actions/workflow-runs-list.json
@@ -0,0 +1,665 @@
+{
+  "total_count": 3,
+  "workflow_runs": [
+    {
+      "id": 3353449941,
+      "name": "K0Te is learning GitHub Actions",
+      "node_id": "WFR_kwLOIVc8sc7H4ZXV",
+      "head_branch": "main",
+      "head_sha": "3156f684232a3adec5085c920d2006aca80f2798",
+      "path": ".github/workflows/make_artifact.yaml",
+      "display_title": "K0Te is learning GitHub Actions",
+      "run_number": 3,
+      "event": "push",
+      "status": "completed",
+      "conclusion": "success",
+      "workflow_id": 39065091,
+      "check_suite_id": 9030268154,
+      "check_suite_node_id": "CS_kwDOIVc8sc8AAAACGj70-g",
+      "url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/runs/3353449941",
+      "html_url": "https://github.com/kote-test-org-actions/actions-api/actions/runs/3353449941",
+      "pull_requests": [],
+      "created_at": "2022-10-30T00:09:22Z",
+      "updated_at": "2022-10-30T00:09:50Z",
+      "actor": {
+        "login": "K0Te",
+        "id": 6162155,
+        "node_id": "MDQ6VXNlcjYxNjIxNTU=",
+        "avatar_url": "https://avatars.githubusercontent.com/u/6162155?v=4",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/K0Te",
+        "html_url": "https://github.com/K0Te",
+        "followers_url": "https://api.github.com/users/K0Te/followers",
+        "following_url": "https://api.github.com/users/K0Te/following{/other_user}",
+        "gists_url": "https://api.github.com/users/K0Te/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/K0Te/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/K0Te/subscriptions",
+        "organizations_url": "https://api.github.com/users/K0Te/orgs",
+        "repos_url": "https://api.github.com/users/K0Te/repos",
+        "events_url": "https://api.github.com/users/K0Te/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/K0Te/received_events",
+        "type": "User",
+        "site_admin": false
+      },
+      "run_attempt": 1,
+      "referenced_workflows": [],
+      "run_started_at": "2022-10-30T00:09:22Z",
+      "triggering_actor": {
+        "login": "K0Te",
+        "id": 6162155,
+        "node_id": "MDQ6VXNlcjYxNjIxNTU=",
+        "avatar_url": "https://avatars.githubusercontent.com/u/6162155?v=4",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/K0Te",
+        "html_url": "https://github.com/K0Te",
+        "followers_url": "https://api.github.com/users/K0Te/followers",
+        "following_url": "https://api.github.com/users/K0Te/following{/other_user}",
+        "gists_url": "https://api.github.com/users/K0Te/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/K0Te/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/K0Te/subscriptions",
+        "organizations_url": "https://api.github.com/users/K0Te/orgs",
+        "repos_url": "https://api.github.com/users/K0Te/repos",
+        "events_url": "https://api.github.com/users/K0Te/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/K0Te/received_events",
+        "type": "User",
+        "site_admin": false
+      },
+      "jobs_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/runs/3353449941/jobs",
+      "logs_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/runs/3353449941/logs",
+      "check_suite_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/check-suites/9030268154",
+      "artifacts_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/runs/3353449941/artifacts",
+      "cancel_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/runs/3353449941/cancel",
+      "rerun_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/runs/3353449941/rerun",
+      "previous_attempt_url": null,
+      "workflow_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/workflows/39065091",
+      "head_commit": {
+        "id": "3156f684232a3adec5085c920d2006aca80f2798",
+        "tree_id": "f51ba8632086ca7af92f5e58c1dc98df1c62d7ce",
+        "message": "up",
+        "timestamp": "2022-10-30T00:09:16Z",
+        "author": {
+          "name": "Oleg Nykolyn",
+          "email": "juravel2@gmail.com"
+        },
+        "committer": {
+          "name": "Oleg Nykolyn",
+          "email": "juravel2@gmail.com"
+        }
+      },
+      "repository": {
+        "id": 559365297,
+        "node_id": "R_kgDOIVc8sQ",
+        "name": "actions-api",
+        "full_name": "kote-test-org-actions/actions-api",
+        "private": true,
+        "owner": {
+          "login": "kote-test-org-actions",
+          "id": 116976977,
+          "node_id": "O_kgDOBvjtUQ",
+          "avatar_url": "https://avatars.githubusercontent.com/u/116976977?v=4",
+          "gravatar_id": "",
+          "url": "https://api.github.com/users/kote-test-org-actions",
+          "html_url": "https://github.com/kote-test-org-actions",
+          "followers_url": "https://api.github.com/users/kote-test-org-actions/followers",
+          "following_url": "https://api.github.com/users/kote-test-org-actions/following{/other_user}",
+          "gists_url": "https://api.github.com/users/kote-test-org-actions/gists{/gist_id}",
+          "starred_url": "https://api.github.com/users/kote-test-org-actions/starred{/owner}{/repo}",
+          "subscriptions_url": "https://api.github.com/users/kote-test-org-actions/subscriptions",
+          "organizations_url": "https://api.github.com/users/kote-test-org-actions/orgs",
+          "repos_url": "https://api.github.com/users/kote-test-org-actions/repos",
+          "events_url": "https://api.github.com/users/kote-test-org-actions/events{/privacy}",
+          "received_events_url": "https://api.github.com/users/kote-test-org-actions/received_events",
+          "type": "Organization",
+          "site_admin": false
+        },
+        "html_url": "https://github.com/kote-test-org-actions/actions-api",
+        "description": null,
+        "fork": false,
+        "url": "https://api.github.com/repos/kote-test-org-actions/actions-api",
+        "forks_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/forks",
+        "keys_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/keys{/key_id}",
+        "collaborators_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/collaborators{/collaborator}",
+        "teams_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/teams",
+        "hooks_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/hooks",
+        "issue_events_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/issues/events{/number}",
+        "events_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/events",
+        "assignees_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/assignees{/user}",
+        "branches_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/branches{/branch}",
+        "tags_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/tags",
+        "blobs_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/blobs{/sha}",
+        "git_tags_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/tags{/sha}",
+        "git_refs_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/refs{/sha}",
+        "trees_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/trees{/sha}",
+        "statuses_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/statuses/{sha}",
+        "languages_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/languages",
+        "stargazers_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/stargazers",
+        "contributors_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/contributors",
+        "subscribers_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/subscribers",
+        "subscription_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/subscription",
+        "commits_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/commits{/sha}",
+        "git_commits_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/commits{/sha}",
+        "comments_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/comments{/number}",
+        "issue_comment_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/issues/comments{/number}",
+        "contents_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/contents/{+path}",
+        "compare_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/compare/{base}...{head}",
+        "merges_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/merges",
+        "archive_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/{archive_format}{/ref}",
+        "downloads_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/downloads",
+        "issues_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/issues{/number}",
+        "pulls_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/pulls{/number}",
+        "milestones_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/milestones{/number}",
+        "notifications_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/notifications{?since,all,participating}",
+        "labels_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/labels{/name}",
+        "releases_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/releases{/id}",
+        "deployments_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/deployments"
+      },
+      "head_repository": {
+        "id": 559365297,
+        "node_id": "R_kgDOIVc8sQ",
+        "name": "actions-api",
+        "full_name": "kote-test-org-actions/actions-api",
+        "private": true,
+        "owner": {
+          "login": "kote-test-org-actions",
+          "id": 116976977,
+          "node_id": "O_kgDOBvjtUQ",
+          "avatar_url": "https://avatars.githubusercontent.com/u/116976977?v=4",
+          "gravatar_id": "",
+          "url": "https://api.github.com/users/kote-test-org-actions",
+          "html_url": "https://github.com/kote-test-org-actions",
+          "followers_url": "https://api.github.com/users/kote-test-org-actions/followers",
+          "following_url": "https://api.github.com/users/kote-test-org-actions/following{/other_user}",
+          "gists_url": "https://api.github.com/users/kote-test-org-actions/gists{/gist_id}",
+          "starred_url": "https://api.github.com/users/kote-test-org-actions/starred{/owner}{/repo}",
+          "subscriptions_url": "https://api.github.com/users/kote-test-org-actions/subscriptions",
+          "organizations_url": "https://api.github.com/users/kote-test-org-actions/orgs",
+          "repos_url": "https://api.github.com/users/kote-test-org-actions/repos",
+          "events_url": "https://api.github.com/users/kote-test-org-actions/events{/privacy}",
+          "received_events_url": "https://api.github.com/users/kote-test-org-actions/received_events",
+          "type": "Organization",
+          "site_admin": false
+        },
+        "html_url": "https://github.com/kote-test-org-actions/actions-api",
+        "description": null,
+        "fork": false,
+        "url": "https://api.github.com/repos/kote-test-org-actions/actions-api",
+        "forks_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/forks",
+        "keys_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/keys{/key_id}",
+        "collaborators_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/collaborators{/collaborator}",
+        "teams_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/teams",
+        "hooks_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/hooks",
+        "issue_events_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/issues/events{/number}",
+        "events_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/events",
+        "assignees_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/assignees{/user}",
+        "branches_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/branches{/branch}",
+        "tags_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/tags",
+        "blobs_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/blobs{/sha}",
+        "git_tags_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/tags{/sha}",
+        "git_refs_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/refs{/sha}",
+        "trees_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/trees{/sha}",
+        "statuses_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/statuses/{sha}",
+        "languages_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/languages",
+        "stargazers_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/stargazers",
+        "contributors_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/contributors",
+        "subscribers_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/subscribers",
+        "subscription_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/subscription",
+        "commits_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/commits{/sha}",
+        "git_commits_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/commits{/sha}",
+        "comments_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/comments{/number}",
+        "issue_comment_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/issues/comments{/number}",
+        "contents_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/contents/{+path}",
+        "compare_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/compare/{base}...{head}",
+        "merges_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/merges",
+        "archive_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/{archive_format}{/ref}",
+        "downloads_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/downloads",
+        "issues_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/issues{/number}",
+        "pulls_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/pulls{/number}",
+        "milestones_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/milestones{/number}",
+        "notifications_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/notifications{?since,all,participating}",
+        "labels_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/labels{/name}",
+        "releases_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/releases{/id}",
+        "deployments_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/deployments"
+      }
+    },
+    {
+      "id": 3353445625,
+      "name": "K0Te is learning GitHub Actions",
+      "node_id": "WFR_kwLOIVc8sc7H4YT5",
+      "head_branch": "main",
+      "head_sha": "2d2486b9aecb80bf916717f47f7c312431d3ceb6",
+      "path": ".github/workflows/make_artifact.yaml",
+      "display_title": "K0Te is learning GitHub Actions",
+      "run_number": 2,
+      "event": "push",
+      "status": "completed",
+      "conclusion": "success",
+      "workflow_id": 39065091,
+      "check_suite_id": 9030259685,
+      "check_suite_node_id": "CS_kwDOIVc8sc8AAAACGj7T5Q",
+      "url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/runs/3353445625",
+      "html_url": "https://github.com/kote-test-org-actions/actions-api/actions/runs/3353445625",
+      "pull_requests": [],
+      "created_at": "2022-10-30T00:07:49Z",
+      "updated_at": "2022-10-30T00:08:19Z",
+      "actor": {
+        "login": "K0Te",
+        "id": 6162155,
+        "node_id": "MDQ6VXNlcjYxNjIxNTU=",
+        "avatar_url": "https://avatars.githubusercontent.com/u/6162155?v=4",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/K0Te",
+        "html_url": "https://github.com/K0Te",
+        "followers_url": "https://api.github.com/users/K0Te/followers",
+        "following_url": "https://api.github.com/users/K0Te/following{/other_user}",
+        "gists_url": "https://api.github.com/users/K0Te/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/K0Te/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/K0Te/subscriptions",
+        "organizations_url": "https://api.github.com/users/K0Te/orgs",
+        "repos_url": "https://api.github.com/users/K0Te/repos",
+        "events_url": "https://api.github.com/users/K0Te/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/K0Te/received_events",
+        "type": "User",
+        "site_admin": false
+      },
+      "run_attempt": 1,
+      "referenced_workflows": [],
+      "run_started_at": "2022-10-30T00:07:49Z",
+      "triggering_actor": {
+        "login": "K0Te",
+        "id": 6162155,
+        "node_id": "MDQ6VXNlcjYxNjIxNTU=",
+        "avatar_url": "https://avatars.githubusercontent.com/u/6162155?v=4",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/K0Te",
+        "html_url": "https://github.com/K0Te",
+        "followers_url": "https://api.github.com/users/K0Te/followers",
+        "following_url": "https://api.github.com/users/K0Te/following{/other_user}",
+        "gists_url": "https://api.github.com/users/K0Te/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/K0Te/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/K0Te/subscriptions",
+        "organizations_url": "https://api.github.com/users/K0Te/orgs",
+        "repos_url": "https://api.github.com/users/K0Te/repos",
+        "events_url": "https://api.github.com/users/K0Te/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/K0Te/received_events",
+        "type": "User",
+        "site_admin": false
+      },
+      "jobs_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/runs/3353445625/jobs",
+      "logs_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/runs/3353445625/logs",
+      "check_suite_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/check-suites/9030259685",
+      "artifacts_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/runs/3353445625/artifacts",
+      "cancel_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/runs/3353445625/cancel",
+      "rerun_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/runs/3353445625/rerun",
+      "previous_attempt_url": null,
+      "workflow_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/workflows/39065091",
+      "head_commit": {
+        "id": "2d2486b9aecb80bf916717f47f7c312431d3ceb6",
+        "tree_id": "21d858674ab650ea734b7efbf05442a21685d121",
+        "message": "up",
+        "timestamp": "2022-10-30T00:07:44Z",
+        "author": {
+          "name": "Oleg Nykolyn",
+          "email": "juravel2@gmail.com"
+        },
+        "committer": {
+          "name": "Oleg Nykolyn",
+          "email": "juravel2@gmail.com"
+        }
+      },
+      "repository": {
+        "id": 559365297,
+        "node_id": "R_kgDOIVc8sQ",
+        "name": "actions-api",
+        "full_name": "kote-test-org-actions/actions-api",
+        "private": true,
+        "owner": {
+          "login": "kote-test-org-actions",
+          "id": 116976977,
+          "node_id": "O_kgDOBvjtUQ",
+          "avatar_url": "https://avatars.githubusercontent.com/u/116976977?v=4",
+          "gravatar_id": "",
+          "url": "https://api.github.com/users/kote-test-org-actions",
+          "html_url": "https://github.com/kote-test-org-actions",
+          "followers_url": "https://api.github.com/users/kote-test-org-actions/followers",
+          "following_url": "https://api.github.com/users/kote-test-org-actions/following{/other_user}",
+          "gists_url": "https://api.github.com/users/kote-test-org-actions/gists{/gist_id}",
+          "starred_url": "https://api.github.com/users/kote-test-org-actions/starred{/owner}{/repo}",
+          "subscriptions_url": "https://api.github.com/users/kote-test-org-actions/subscriptions",
+          "organizations_url": "https://api.github.com/users/kote-test-org-actions/orgs",
+          "repos_url": "https://api.github.com/users/kote-test-org-actions/repos",
+          "events_url": "https://api.github.com/users/kote-test-org-actions/events{/privacy}",
+          "received_events_url": "https://api.github.com/users/kote-test-org-actions/received_events",
+          "type": "Organization",
+          "site_admin": false
+        },
+        "html_url": "https://github.com/kote-test-org-actions/actions-api",
+        "description": null,
+        "fork": false,
+        "url": "https://api.github.com/repos/kote-test-org-actions/actions-api",
+        "forks_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/forks",
+        "keys_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/keys{/key_id}",
+        "collaborators_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/collaborators{/collaborator}",
+        "teams_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/teams",
+        "hooks_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/hooks",
+        "issue_events_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/issues/events{/number}",
+        "events_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/events",
+        "assignees_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/assignees{/user}",
+        "branches_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/branches{/branch}",
+        "tags_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/tags",
+        "blobs_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/blobs{/sha}",
+        "git_tags_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/tags{/sha}",
+        "git_refs_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/refs{/sha}",
+        "trees_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/trees{/sha}",
+        "statuses_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/statuses/{sha}",
+        "languages_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/languages",
+        "stargazers_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/stargazers",
+        "contributors_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/contributors",
+        "subscribers_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/subscribers",
+        "subscription_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/subscription",
+        "commits_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/commits{/sha}",
+        "git_commits_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/commits{/sha}",
+        "comments_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/comments{/number}",
+        "issue_comment_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/issues/comments{/number}",
+        "contents_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/contents/{+path}",
+        "compare_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/compare/{base}...{head}",
+        "merges_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/merges",
+        "archive_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/{archive_format}{/ref}",
+        "downloads_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/downloads",
+        "issues_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/issues{/number}",
+        "pulls_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/pulls{/number}",
+        "milestones_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/milestones{/number}",
+        "notifications_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/notifications{?since,all,participating}",
+        "labels_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/labels{/name}",
+        "releases_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/releases{/id}",
+        "deployments_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/deployments"
+      },
+      "head_repository": {
+        "id": 559365297,
+        "node_id": "R_kgDOIVc8sQ",
+        "name": "actions-api",
+        "full_name": "kote-test-org-actions/actions-api",
+        "private": true,
+        "owner": {
+          "login": "kote-test-org-actions",
+          "id": 116976977,
+          "node_id": "O_kgDOBvjtUQ",
+          "avatar_url": "https://avatars.githubusercontent.com/u/116976977?v=4",
+          "gravatar_id": "",
+          "url": "https://api.github.com/users/kote-test-org-actions",
+          "html_url": "https://github.com/kote-test-org-actions",
+          "followers_url": "https://api.github.com/users/kote-test-org-actions/followers",
+          "following_url": "https://api.github.com/users/kote-test-org-actions/following{/other_user}",
+          "gists_url": "https://api.github.com/users/kote-test-org-actions/gists{/gist_id}",
+          "starred_url": "https://api.github.com/users/kote-test-org-actions/starred{/owner}{/repo}",
+          "subscriptions_url": "https://api.github.com/users/kote-test-org-actions/subscriptions",
+          "organizations_url": "https://api.github.com/users/kote-test-org-actions/orgs",
+          "repos_url": "https://api.github.com/users/kote-test-org-actions/repos",
+          "events_url": "https://api.github.com/users/kote-test-org-actions/events{/privacy}",
+          "received_events_url": "https://api.github.com/users/kote-test-org-actions/received_events",
+          "type": "Organization",
+          "site_admin": false
+        },
+        "html_url": "https://github.com/kote-test-org-actions/actions-api",
+        "description": null,
+        "fork": false,
+        "url": "https://api.github.com/repos/kote-test-org-actions/actions-api",
+        "forks_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/forks",
+        "keys_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/keys{/key_id}",
+        "collaborators_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/collaborators{/collaborator}",
+        "teams_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/teams",
+        "hooks_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/hooks",
+        "issue_events_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/issues/events{/number}",
+        "events_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/events",
+        "assignees_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/assignees{/user}",
+        "branches_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/branches{/branch}",
+        "tags_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/tags",
+        "blobs_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/blobs{/sha}",
+        "git_tags_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/tags{/sha}",
+        "git_refs_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/refs{/sha}",
+        "trees_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/trees{/sha}",
+        "statuses_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/statuses/{sha}",
+        "languages_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/languages",
+        "stargazers_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/stargazers",
+        "contributors_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/contributors",
+        "subscribers_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/subscribers",
+        "subscription_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/subscription",
+        "commits_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/commits{/sha}",
+        "git_commits_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/commits{/sha}",
+        "comments_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/comments{/number}",
+        "issue_comment_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/issues/comments{/number}",
+        "contents_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/contents/{+path}",
+        "compare_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/compare/{base}...{head}",
+        "merges_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/merges",
+        "archive_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/{archive_format}{/ref}",
+        "downloads_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/downloads",
+        "issues_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/issues{/number}",
+        "pulls_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/pulls{/number}",
+        "milestones_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/milestones{/number}",
+        "notifications_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/notifications{?since,all,participating}",
+        "labels_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/labels{/name}",
+        "releases_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/releases{/id}",
+        "deployments_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/deployments"
+      }
+    },
+    {
+      "id": 3353148947,
+      "name": "K0Te is learning GitHub Actions",
+      "node_id": "WFR_kwLOIVc8sc7H3P4T",
+      "head_branch": "main",
+      "head_sha": "601593ecb1d8a57a04700fdb445a28d4186b8954",
+      "path": ".github/workflows/make_artifact.yaml",
+      "display_title": "K0Te is learning GitHub Actions",
+      "run_number": 1,
+      "event": "push",
+      "status": "completed",
+      "conclusion": "success",
+      "workflow_id": 39065091,
+      "check_suite_id": 9029740591,
+      "check_suite_node_id": "CS_kwDOIVc8sc8AAAACGjboLw",
+      "url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/runs/3353148947",
+      "html_url": "https://github.com/kote-test-org-actions/actions-api/actions/runs/3353148947",
+      "pull_requests": [],
+      "created_at": "2022-10-29T22:18:02Z",
+      "updated_at": "2022-10-29T22:18:22Z",
+      "actor": {
+        "login": "K0Te",
+        "id": 6162155,
+        "node_id": "MDQ6VXNlcjYxNjIxNTU=",
+        "avatar_url": "https://avatars.githubusercontent.com/u/6162155?v=4",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/K0Te",
+        "html_url": "https://github.com/K0Te",
+        "followers_url": "https://api.github.com/users/K0Te/followers",
+        "following_url": "https://api.github.com/users/K0Te/following{/other_user}",
+        "gists_url": "https://api.github.com/users/K0Te/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/K0Te/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/K0Te/subscriptions",
+        "organizations_url": "https://api.github.com/users/K0Te/orgs",
+        "repos_url": "https://api.github.com/users/K0Te/repos",
+        "events_url": "https://api.github.com/users/K0Te/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/K0Te/received_events",
+        "type": "User",
+        "site_admin": false
+      },
+      "run_attempt": 1,
+      "referenced_workflows": [],
+      "run_started_at": "2022-10-29T22:18:02Z",
+      "triggering_actor": {
+        "login": "K0Te",
+        "id": 6162155,
+        "node_id": "MDQ6VXNlcjYxNjIxNTU=",
+        "avatar_url": "https://avatars.githubusercontent.com/u/6162155?v=4",
+        "gravatar_id": "",
+        "url": "https://api.github.com/users/K0Te",
+        "html_url": "https://github.com/K0Te",
+        "followers_url": "https://api.github.com/users/K0Te/followers",
+        "following_url": "https://api.github.com/users/K0Te/following{/other_user}",
+        "gists_url": "https://api.github.com/users/K0Te/gists{/gist_id}",
+        "starred_url": "https://api.github.com/users/K0Te/starred{/owner}{/repo}",
+        "subscriptions_url": "https://api.github.com/users/K0Te/subscriptions",
+        "organizations_url": "https://api.github.com/users/K0Te/orgs",
+        "repos_url": "https://api.github.com/users/K0Te/repos",
+        "events_url": "https://api.github.com/users/K0Te/events{/privacy}",
+        "received_events_url": "https://api.github.com/users/K0Te/received_events",
+        "type": "User",
+        "site_admin": false
+      },
+      "jobs_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/runs/3353148947/jobs",
+      "logs_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/runs/3353148947/logs",
+      "check_suite_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/check-suites/9029740591",
+      "artifacts_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/runs/3353148947/artifacts",
+      "cancel_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/runs/3353148947/cancel",
+      "rerun_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/runs/3353148947/rerun",
+      "previous_attempt_url": null,
+      "workflow_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/actions/workflows/39065091",
+      "head_commit": {
+        "id": "601593ecb1d8a57a04700fdb445a28d4186b8954",
+        "tree_id": "7aa2d4e6f4e0ddb277fe2f35f7615651ee01c5a2",
+        "message": "test",
+        "timestamp": "2022-10-29T22:17:55Z",
+        "author": {
+          "name": "Oleg Nykolyn",
+          "email": "juravel2@gmail.com"
+        },
+        "committer": {
+          "name": "Oleg Nykolyn",
+          "email": "juravel2@gmail.com"
+        }
+      },
+      "repository": {
+        "id": 559365297,
+        "node_id": "R_kgDOIVc8sQ",
+        "name": "actions-api",
+        "full_name": "kote-test-org-actions/actions-api",
+        "private": true,
+        "owner": {
+          "login": "kote-test-org-actions",
+          "id": 116976977,
+          "node_id": "O_kgDOBvjtUQ",
+          "avatar_url": "https://avatars.githubusercontent.com/u/116976977?v=4",
+          "gravatar_id": "",
+          "url": "https://api.github.com/users/kote-test-org-actions",
+          "html_url": "https://github.com/kote-test-org-actions",
+          "followers_url": "https://api.github.com/users/kote-test-org-actions/followers",
+          "following_url": "https://api.github.com/users/kote-test-org-actions/following{/other_user}",
+          "gists_url": "https://api.github.com/users/kote-test-org-actions/gists{/gist_id}",
+          "starred_url": "https://api.github.com/users/kote-test-org-actions/starred{/owner}{/repo}",
+          "subscriptions_url": "https://api.github.com/users/kote-test-org-actions/subscriptions",
+          "organizations_url": "https://api.github.com/users/kote-test-org-actions/orgs",
+          "repos_url": "https://api.github.com/users/kote-test-org-actions/repos",
+          "events_url": "https://api.github.com/users/kote-test-org-actions/events{/privacy}",
+          "received_events_url": "https://api.github.com/users/kote-test-org-actions/received_events",
+          "type": "Organization",
+          "site_admin": false
+        },
+        "html_url": "https://github.com/kote-test-org-actions/actions-api",
+        "description": null,
+        "fork": false,
+        "url": "https://api.github.com/repos/kote-test-org-actions/actions-api",
+        "forks_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/forks",
+        "keys_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/keys{/key_id}",
+        "collaborators_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/collaborators{/collaborator}",
+        "teams_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/teams",
+        "hooks_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/hooks",
+        "issue_events_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/issues/events{/number}",
+        "events_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/events",
+        "assignees_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/assignees{/user}",
+        "branches_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/branches{/branch}",
+        "tags_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/tags",
+        "blobs_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/blobs{/sha}",
+        "git_tags_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/tags{/sha}",
+        "git_refs_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/refs{/sha}",
+        "trees_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/trees{/sha}",
+        "statuses_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/statuses/{sha}",
+        "languages_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/languages",
+        "stargazers_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/stargazers",
+        "contributors_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/contributors",
+        "subscribers_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/subscribers",
+        "subscription_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/subscription",
+        "commits_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/commits{/sha}",
+        "git_commits_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/commits{/sha}",
+        "comments_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/comments{/number}",
+        "issue_comment_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/issues/comments{/number}",
+        "contents_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/contents/{+path}",
+        "compare_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/compare/{base}...{head}",
+        "merges_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/merges",
+        "archive_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/{archive_format}{/ref}",
+        "downloads_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/downloads",
+        "issues_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/issues{/number}",
+        "pulls_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/pulls{/number}",
+        "milestones_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/milestones{/number}",
+        "notifications_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/notifications{?since,all,participating}",
+        "labels_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/labels{/name}",
+        "releases_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/releases{/id}",
+        "deployments_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/deployments"
+      },
+      "head_repository": {
+        "id": 559365297,
+        "node_id": "R_kgDOIVc8sQ",
+        "name": "actions-api",
+        "full_name": "kote-test-org-actions/actions-api",
+        "private": true,
+        "owner": {
+          "login": "kote-test-org-actions",
+          "id": 116976977,
+          "node_id": "O_kgDOBvjtUQ",
+          "avatar_url": "https://avatars.githubusercontent.com/u/116976977?v=4",
+          "gravatar_id": "",
+          "url": "https://api.github.com/users/kote-test-org-actions",
+          "html_url": "https://github.com/kote-test-org-actions",
+          "followers_url": "https://api.github.com/users/kote-test-org-actions/followers",
+          "following_url": "https://api.github.com/users/kote-test-org-actions/following{/other_user}",
+          "gists_url": "https://api.github.com/users/kote-test-org-actions/gists{/gist_id}",
+          "starred_url": "https://api.github.com/users/kote-test-org-actions/starred{/owner}{/repo}",
+          "subscriptions_url": "https://api.github.com/users/kote-test-org-actions/subscriptions",
+          "organizations_url": "https://api.github.com/users/kote-test-org-actions/orgs",
+          "repos_url": "https://api.github.com/users/kote-test-org-actions/repos",
+          "events_url": "https://api.github.com/users/kote-test-org-actions/events{/privacy}",
+          "received_events_url": "https://api.github.com/users/kote-test-org-actions/received_events",
+          "type": "Organization",
+          "site_admin": false
+        },
+        "html_url": "https://github.com/kote-test-org-actions/actions-api",
+        "description": null,
+        "fork": false,
+        "url": "https://api.github.com/repos/kote-test-org-actions/actions-api",
+        "forks_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/forks",
+        "keys_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/keys{/key_id}",
+        "collaborators_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/collaborators{/collaborator}",
+        "teams_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/teams",
+        "hooks_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/hooks",
+        "issue_events_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/issues/events{/number}",
+        "events_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/events",
+        "assignees_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/assignees{/user}",
+        "branches_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/branches{/branch}",
+        "tags_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/tags",
+        "blobs_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/blobs{/sha}",
+        "git_tags_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/tags{/sha}",
+        "git_refs_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/refs{/sha}",
+        "trees_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/trees{/sha}",
+        "statuses_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/statuses/{sha}",
+        "languages_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/languages",
+        "stargazers_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/stargazers",
+        "contributors_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/contributors",
+        "subscribers_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/subscribers",
+        "subscription_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/subscription",
+        "commits_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/commits{/sha}",
+        "git_commits_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/git/commits{/sha}",
+        "comments_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/comments{/number}",
+        "issue_comment_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/issues/comments{/number}",
+        "contents_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/contents/{+path}",
+        "compare_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/compare/{base}...{head}",
+        "merges_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/merges",
+        "archive_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/{archive_format}{/ref}",
+        "downloads_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/downloads",
+        "issues_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/issues{/number}",
+        "pulls_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/pulls{/number}",
+        "milestones_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/milestones{/number}",
+        "notifications_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/notifications{?since,all,participating}",
+        "labels_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/labels{/name}",
+        "releases_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/releases{/id}",
+        "deployments_url": "https://api.github.com/repos/kote-test-org-actions/actions-api/deployments"
+      }
+    }
+  ]
+}
diff --git a/github.cabal b/github.cabal
--- a/github.cabal
+++ b/github.cabal
@@ -1,6 +1,6 @@
-cabal-version:      >=1.10
+cabal-version:      2.4
 name:               github
-version:            0.28.0.1
+version:            0.30.0.2
 synopsis:           Access to the GitHub API, v3.
 category:           Network
 description:
@@ -20,7 +20,7 @@
   .
   For more of an overview please see the README: <https://github.com/haskell-github/github/blob/master/README.md>
 
-license:            BSD3
+license:            BSD-3-Clause
 license-file:       LICENSE
 author:             Mike Burns, John Wiegley, Oleg Grenrus
 maintainer:         Andreas Abel
@@ -30,26 +30,30 @@
   Copyright 2012-2013 Mike Burns, Copyright 2013-2015 John Wiegley, Copyright 2016-2021 Oleg Grenrus
 
 tested-with:
-  GHC == 9.4.1
-  GHC == 9.2.3
+  GHC == 9.14.1
+  GHC == 9.12.2
+  GHC == 9.10.3
+  GHC == 9.8.4
+  GHC == 9.6.7
+  GHC == 9.4.8
+  GHC == 9.2.8
   GHC == 9.0.2
   GHC == 8.10.7
   GHC == 8.8.4
   GHC == 8.6.5
   GHC == 8.4.4
   GHC == 8.2.2
-  GHC == 8.0.2
-  GHC == 7.10.3
-  GHC == 7.8.4
 
-extra-source-files:
+extra-doc-files:
   README.md
   CHANGELOG.md
-  fixtures/*.json
 
+extra-source-files:
+  fixtures/**/*.json
+
 source-repository head
   type:     git
-  location: git://github.com/haskell-github/github.git
+  location: https://github.com/haskell-github/github.git
 
 flag openssl
   description: "Use http-client-openssl"
@@ -60,16 +64,15 @@
   default-language:   Haskell2010
   ghc-options:
     -Wall
-  if impl(ghc >= 8.0)
-    ghc-options:
-      -Wcompat
-      -Wno-star-is-type
-        -- The star-is-type warning cannot be sensiblity addressed while supporting GHC 7.
+    -Wcompat
+    -Wno-star-is-type
+      -- The star-is-type warning cannot be sensiblity addressed while supporting GHC 7.
   hs-source-dirs:     src
   default-extensions:
     DataKinds
     DeriveDataTypeable
     DeriveGeneric
+    LambdaCase
     OverloadedStrings
     ScopedTypeVariables
     TypeOperators
@@ -87,6 +90,13 @@
     GitHub
     GitHub.Auth
     GitHub.Data
+    GitHub.Data.Actions.Common
+    GitHub.Data.Actions.Artifacts
+    GitHub.Data.Actions.Cache
+    GitHub.Data.Actions.Secrets
+    GitHub.Data.Actions.Workflows
+    GitHub.Data.Actions.WorkflowJobs
+    GitHub.Data.Actions.WorkflowRuns
     GitHub.Data.Activities
     GitHub.Data.Comments
     GitHub.Data.Content
@@ -108,6 +118,7 @@
     GitHub.Data.PublicSSHKeys
     GitHub.Data.PullRequests
     GitHub.Data.RateLimit
+    GitHub.Data.Reactions
     GitHub.Data.Releases
     GitHub.Data.Repos
     GitHub.Data.Request
@@ -118,6 +129,12 @@
     GitHub.Data.URL
     GitHub.Data.Webhooks
     GitHub.Data.Webhooks.Validate
+    GitHub.Endpoints.Actions.Artifacts
+    GitHub.Endpoints.Actions.Cache
+    GitHub.Endpoints.Actions.Secrets
+    GitHub.Endpoints.Actions.Workflows
+    GitHub.Endpoints.Actions.WorkflowJobs
+    GitHub.Endpoints.Actions.WorkflowRuns
     GitHub.Endpoints.Activity.Events
     GitHub.Endpoints.Activity.Notifications
     GitHub.Endpoints.Activity.Starring
@@ -142,6 +159,7 @@
     GitHub.Endpoints.PullRequests.Comments
     GitHub.Endpoints.PullRequests.Reviews
     GitHub.Endpoints.RateLimit
+    GitHub.Endpoints.Reactions
     GitHub.Endpoints.Repos
     GitHub.Endpoints.Repos.Collaborators
     GitHub.Endpoints.Repos.Comments
@@ -163,37 +181,37 @@
     GitHub.Internal.Prelude
     GitHub.Request
 
-  other-modules: Paths_github
+  other-modules:   Paths_github
+  autogen-modules: Paths_github
 
   -- Packages bundles with GHC, mtl and text are also here
+  -- Lower bounds at least those of https://www.stackage.org/lts-10.0 (GHC 8.2.2)
   build-depends:
-      base          >=4.7      && <5
-    , binary        >=0.7.1.0  && <0.11
-    , bytestring    >=0.10.4.0 && <0.12
-    , containers    >=0.5.5.1  && <0.7
-    , deepseq       >=1.3.0.2  && <1.5
-    , mtl           >=2.1.3.1  && <2.2 || >=2.2.1 && <2.4
-    , text          >=1.2.0.6  && <2.1
-    , time-compat   >=1.9.2.2  && <1.10
-    , transformers  >=0.3.0.0  && <0.7
+      base          >=4.10     && <5
+    , binary        >=0.8.5.1  && <0.11
+    , bytestring    >=0.10.8.2 && <0.13
+    , containers    >=0.5.10.2 && <1
+    , deepseq       >=1.4.3.0  && <1.6
+    , exceptions    >=0.10.2   && <0.11
+    , mtl           >=2.2.1    && <2.4
+    , text          >=1.2.2.2  && <2.2
+    , time          >=1.8.0.2  && <2
+    , transformers  >=0.5.2.0  && <0.7
 
   -- other packages
   build-depends:
-      aeson                 >=1.4.0.0    && <1.6 || >=2.0.1.0 && <2.2
-    , base-compat           >=0.11.1     && <0.13
+      aeson                 >=1.4.0.0    && <1.6 || >=2.0.1.0 && <2.3
+    , base-compat           >=0.11.1     && <1
     , base16-bytestring     >=0.1.1.6    && <1.1
     , binary-instances      >=1          && <1.1
     , cryptohash-sha1       >=0.11.100.1 && <0.12
-    , deepseq-generics      >=0.2.0.0    && <0.3
-    , exceptions            >=0.10.2     && <0.11
-    , hashable              >=1.2.7.0    && <1.5
+    , hashable              >=1.2.7.0    && <2
     , http-client           >=0.5.12     && <0.8
     , http-link-header      >=1.0.3.1    && <1.3
     , http-types            >=0.12.3     && <0.13
     , iso8601-time          >=0.1.5      && <0.2
     , network-uri           >=2.6.1.0    && <2.7
     , tagged                >=0.8.5      && <0.9
-    , transformers-compat   >=0.6.5      && <0.8
     , unordered-containers  >=0.2.10.0   && <0.3
     , vector                >=0.12.0.1   && <0.14
 
@@ -205,21 +223,24 @@
 
   else
     build-depends:
-        http-client-tls  >=0.3.5.3 && <0.4
+        http-client-tls  >=0.3.5.3 && <0.5
       , tls              >=1.4.1
 
-  if !impl(ghc >=8.0)
-    build-depends: semigroups >=0.18.5 && <0.20
-
 test-suite github-test
   default-language:   Haskell2010
   type:               exitcode-stdio-1.0
   hs-source-dirs:     spec
   main-is:            Spec.hs
   ghc-options:        -Wall -threaded
-  build-tool-depends: hspec-discover:hspec-discover >=2.7.1 && <2.11
+  build-tool-depends: hspec-discover:hspec-discover >=2.7.1 && <2.12
   other-extensions:   TemplateHaskell
   other-modules:
+    GitHub.Actions.ArtifactsSpec
+    GitHub.Actions.CacheSpec
+    GitHub.Actions.SecretsSpec
+    GitHub.Actions.WorkflowJobSpec
+    GitHub.Actions.WorkflowRunsSpec
+    GitHub.Actions.WorkflowSpec
     GitHub.ActivitySpec
     GitHub.CommitsSpec
     GitHub.EventsSpec
@@ -242,7 +263,8 @@
     , bytestring
     , file-embed
     , github
-    , hspec                 >=2.6.1 && <2.11
+    , hspec                 >=2.6.1 && <2.12
+    , http-client
     , tagged
     , text
     , unordered-containers
diff --git a/spec/GitHub/Actions/ArtifactsSpec.hs b/spec/GitHub/Actions/ArtifactsSpec.hs
new file mode 100644
--- /dev/null
+++ b/spec/GitHub/Actions/ArtifactsSpec.hs
@@ -0,0 +1,66 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TemplateHaskell   #-}
+module GitHub.Actions.ArtifactsSpec where
+
+import qualified GitHub as GH
+
+import Prelude ()
+import Prelude.Compat
+
+import           Data.Aeson         (eitherDecodeStrict)
+import           Data.ByteString    (ByteString)
+import           Data.Either.Compat (isRight)
+import           Data.FileEmbed     (embedFile)
+import           Data.Foldable      (for_)
+import           Data.String        (fromString)
+import qualified Data.Vector        as V
+import           System.Environment (lookupEnv)
+import           Test.Hspec
+                 (Spec, describe, it, pendingWith, shouldBe, shouldSatisfy)
+
+fromRightS :: Show a => Either a b -> b
+fromRightS (Right b) = b
+fromRightS (Left a) = error $ "Expected a Right and got a Left" ++ show a
+
+withAuth :: (GH.Auth -> IO ()) -> IO ()
+withAuth action = do
+    mtoken <- lookupEnv "GITHUB_TOKEN"
+    case mtoken of
+        Nothing    -> pendingWith "no GITHUB_TOKEN"
+        Just token -> action (GH.OAuth $ fromString token)
+
+spec :: Spec
+spec = do
+    describe "artifactsForR" $ do
+        it "works" $ withAuth $ \auth -> for_ repos $ \(owner, repo) -> do
+            cs <- GH.executeRequest auth $
+                GH.artifactsForR owner repo mempty GH.FetchAll
+            cs `shouldSatisfy` isRight
+
+    describe "decoding artifacts payloads" $ do
+        it "decodes artifacts list payload" $ do
+            GH.withTotalCountTotalCount artifactList `shouldBe` 23809
+            V.length (GH.withTotalCountItems artifactList) `shouldBe` 2
+        it "decodes signle artifact payload" $ do
+            GH.artifactName artifact `shouldBe` "dist-without-markdown"
+            GH.artifactWorkflowRunHeadSha (GH.artifactWorkflowRun artifact) `shouldBe` "601593ecb1d8a57a04700fdb445a28d4186b8954"
+
+  where
+    repos =
+      [ ("thoughtbot", "paperclip")
+      , ("phadej", "github")
+      ]
+
+    artifactList :: GH.WithTotalCount GH.Artifact
+    artifactList =
+        fromRightS (eitherDecodeStrict artifactsListPayload)
+
+    artifact :: GH.Artifact
+    artifact =
+        fromRightS (eitherDecodeStrict artifactPayload)
+
+    artifactsListPayload :: ByteString
+    artifactsListPayload = $(embedFile "fixtures/actions/artifacts-list.json")
+
+    artifactPayload :: ByteString
+    artifactPayload = $(embedFile "fixtures/actions/artifact.json")
diff --git a/spec/GitHub/Actions/CacheSpec.hs b/spec/GitHub/Actions/CacheSpec.hs
new file mode 100644
--- /dev/null
+++ b/spec/GitHub/Actions/CacheSpec.hs
@@ -0,0 +1,53 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TemplateHaskell   #-}
+module GitHub.Actions.CacheSpec where
+
+import qualified GitHub as GH
+
+import Prelude ()
+import Prelude.Compat
+
+import           Data.Aeson      (eitherDecodeStrict)
+import           Data.ByteString (ByteString)
+import           Data.FileEmbed  (embedFile)
+import qualified Data.Vector     as V
+import           Test.Hspec      (Spec, describe, it, shouldBe)
+
+fromRightS :: Show a => Either a b -> b
+fromRightS (Right b) = b
+fromRightS (Left a) = error $ "Expected a Right and got a Left" ++ show a
+
+spec :: Spec
+spec = do
+    describe "decoding cache payloads" $ do
+        it "decodes cache list payload" $ do
+            V.length (GH.withTotalCountItems cacheList) `shouldBe` 1
+        it "decodes cache usage for repo" $ do
+            GH.repositoryCacheUsageFullName repoCacheUsage `shouldBe` "python/cpython"
+            GH.repositoryCacheUsageActiveCachesSizeInBytes repoCacheUsage `shouldBe` 55000268087
+            GH.repositoryCacheUsageActiveCachesCount repoCacheUsage `shouldBe` 171
+        it "decodes cache usage for org" $ do
+            GH.organizationCacheUsageTotalActiveCachesSizeInBytes orgCacheUsage `shouldBe` 26586
+            GH.organizationCacheUsageTotalActiveCachesCount orgCacheUsage `shouldBe` 1
+
+  where
+    cacheList :: GH.WithTotalCount GH.Cache
+    cacheList =
+        fromRightS (eitherDecodeStrict cacheListPayload)
+
+    repoCacheUsage :: GH.RepositoryCacheUsage
+    repoCacheUsage =
+        fromRightS (eitherDecodeStrict repoCacheUsagePayload)
+
+    orgCacheUsage :: GH.OrganizationCacheUsage
+    orgCacheUsage =
+        fromRightS (eitherDecodeStrict orgCacheUsagePayload)
+
+    cacheListPayload :: ByteString
+    cacheListPayload = $(embedFile "fixtures/actions/cache-list.json")
+
+    repoCacheUsagePayload :: ByteString
+    repoCacheUsagePayload = $(embedFile "fixtures/actions/repo-cache-usage.json")
+
+    orgCacheUsagePayload :: ByteString
+    orgCacheUsagePayload = $(embedFile "fixtures/actions/org-cache-usage.json")
diff --git a/spec/GitHub/Actions/SecretsSpec.hs b/spec/GitHub/Actions/SecretsSpec.hs
new file mode 100644
--- /dev/null
+++ b/spec/GitHub/Actions/SecretsSpec.hs
@@ -0,0 +1,50 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TemplateHaskell   #-}
+module GitHub.Actions.SecretsSpec where
+
+import qualified GitHub as GH
+
+import Prelude ()
+import Prelude.Compat
+
+import           Data.Aeson      (eitherDecodeStrict)
+import           Data.ByteString (ByteString)
+import           Data.FileEmbed  (embedFile)
+import qualified Data.Vector     as V
+import           Test.Hspec      (Spec, describe, it, shouldBe)
+
+fromRightS :: Show a => Either a b -> b
+fromRightS (Right b) = b
+fromRightS (Left a) = error $ "Expected a Right and got a Left" ++ show a
+
+spec :: Spec
+spec = do
+    describe "decoding secrets payloads" $ do
+        it "decodes selected repo list payload" $ do
+            V.length (GH.withTotalCountItems repoList) `shouldBe` 1
+        it "decodes secret list payload" $ do
+            V.length (GH.withTotalCountItems orgSecretList) `shouldBe` 2
+        it "decodes public key payload" $ do
+            GH.publicKeyId orgPublicKey `shouldBe` "568250167242549743"
+
+  where
+    repoList :: GH.WithTotalCount GH.SelectedRepo
+    repoList =
+        fromRightS (eitherDecodeStrict repoListPayload)
+
+    orgSecretList:: GH.WithTotalCount GH.OrganizationSecret
+    orgSecretList=
+        fromRightS (eitherDecodeStrict orgSecretListPayload)
+
+    orgPublicKey:: GH.PublicKey
+    orgPublicKey=
+        fromRightS (eitherDecodeStrict orgPublicKeyPayload)
+
+    repoListPayload :: ByteString
+    repoListPayload = $(embedFile "fixtures/actions/selected-repositories-for-secret.json")
+
+    orgSecretListPayload :: ByteString
+    orgSecretListPayload = $(embedFile "fixtures/actions/org-secrets-list.json")
+
+    orgPublicKeyPayload :: ByteString
+    orgPublicKeyPayload = $(embedFile "fixtures/actions/org-public-key.json")
diff --git a/spec/GitHub/Actions/WorkflowJobSpec.hs b/spec/GitHub/Actions/WorkflowJobSpec.hs
new file mode 100644
--- /dev/null
+++ b/spec/GitHub/Actions/WorkflowJobSpec.hs
@@ -0,0 +1,32 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TemplateHaskell   #-}
+module GitHub.Actions.WorkflowJobSpec where
+
+import qualified GitHub         as GH
+import           GitHub.Data.Id
+
+import Prelude ()
+import Prelude.Compat
+
+import Data.Aeson      (eitherDecodeStrict)
+import Data.ByteString (ByteString)
+import Data.FileEmbed  (embedFile)
+import Test.Hspec      (Spec, describe, it, shouldBe)
+
+fromRightS :: Show a => Either a b -> b
+fromRightS (Right b) = b
+fromRightS (Left a) = error $ "Expected a Right and got a Left" ++ show a
+
+spec :: Spec
+spec = do
+    describe "decoding workflow jobs payloads" $ do
+        it "decodes workflow job" $ do
+            GH.jobId workflowJob `shouldBe` Id 9183275828
+
+  where
+    workflowJob:: GH.Job
+    workflowJob=
+        fromRightS (eitherDecodeStrict workflowJobPayload)
+
+    workflowJobPayload :: ByteString
+    workflowJobPayload = $(embedFile "fixtures/actions/workflow-job.json")
diff --git a/spec/GitHub/Actions/WorkflowRunsSpec.hs b/spec/GitHub/Actions/WorkflowRunsSpec.hs
new file mode 100644
--- /dev/null
+++ b/spec/GitHub/Actions/WorkflowRunsSpec.hs
@@ -0,0 +1,32 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TemplateHaskell   #-}
+module GitHub.Actions.WorkflowRunsSpec where
+
+import qualified GitHub as GH
+
+import Prelude ()
+import Prelude.Compat
+
+import           Data.Aeson      (eitherDecodeStrict)
+import           Data.ByteString (ByteString)
+import           Data.FileEmbed  (embedFile)
+import qualified Data.Vector     as V
+import           Test.Hspec      (Spec, describe, it, shouldBe)
+
+fromRightS :: Show a => Either a b -> b
+fromRightS (Right b) = b
+fromRightS (Left a) = error $ "Expected a Right and got a Left" ++ show a
+
+spec :: Spec
+spec = do
+    describe "decoding workflow runs payloads" $ do
+        it "decodes workflow runs list" $ do
+            V.length (GH.withTotalCountItems workflowRunsList) `shouldBe` 3
+
+  where
+    workflowRunsList:: GH.WithTotalCount GH.WorkflowRun
+    workflowRunsList =
+        fromRightS (eitherDecodeStrict workflowRunsPayload)
+
+    workflowRunsPayload :: ByteString
+    workflowRunsPayload = $(embedFile "fixtures/actions/workflow-runs-list.json")
diff --git a/spec/GitHub/Actions/WorkflowSpec.hs b/spec/GitHub/Actions/WorkflowSpec.hs
new file mode 100644
--- /dev/null
+++ b/spec/GitHub/Actions/WorkflowSpec.hs
@@ -0,0 +1,32 @@
+{-# LANGUAGE OverloadedStrings #-}
+{-# LANGUAGE TemplateHaskell   #-}
+module GitHub.Actions.WorkflowSpec where
+
+import qualified GitHub as GH
+
+import Prelude ()
+import Prelude.Compat
+
+import           Data.Aeson      (eitherDecodeStrict)
+import           Data.ByteString (ByteString)
+import           Data.FileEmbed  (embedFile)
+import qualified Data.Vector     as V
+import           Test.Hspec      (Spec, describe, it, shouldBe)
+
+fromRightS :: Show a => Either a b -> b
+fromRightS (Right b) = b
+fromRightS (Left a) = error $ "Expected a Right and got a Left" ++ show a
+
+spec :: Spec
+spec = do
+    describe "decoding workflow payloads" $ do
+        it "decodes workflow list" $ do
+            V.length (GH.withTotalCountItems workflowList) `shouldBe` 1
+
+  where
+    workflowList:: GH.WithTotalCount GH.Workflow
+    workflowList =
+        fromRightS (eitherDecodeStrict workflowPayload)
+
+    workflowPayload :: ByteString
+    workflowPayload = $(embedFile "fixtures/actions/workflow-list.json")
diff --git a/spec/GitHub/IssuesSpec.hs b/spec/GitHub/IssuesSpec.hs
--- a/spec/GitHub/IssuesSpec.hs
+++ b/spec/GitHub/IssuesSpec.hs
@@ -6,13 +6,14 @@
 import Prelude ()
 import Prelude.Compat
 
-import Data.Either.Compat (isRight)
-import Data.Foldable      (for_)
-import Data.String        (fromString)
-import System.Environment (lookupEnv)
-import Test.Hspec
-       (Spec, describe, expectationFailure, it, pendingWith, shouldSatisfy)
+import Data.Either.Compat  (isRight)
+import Data.Foldable       (for_)
+import Data.String         (fromString)
+import Network.HTTP.Client (newManager, responseBody)
+import System.Environment  (lookupEnv)
+import Test.Hspec          (Spec, describe, expectationFailure, it, pendingWith, shouldSatisfy)
 
+
 fromRightS :: Show a => Either a b -> b
 fromRightS (Right b) = b
 fromRightS (Left a) = error $ "Expected a Right and got a Left" ++ show a
@@ -38,6 +39,25 @@
                   cms <- GitHub.executeRequest auth $
                     GitHub.commentsR owner repo (GitHub.issueNumber i) 1
                   cms `shouldSatisfy` isRight
+
+    describe "issuesForRepoR paged" $ do
+        it "works" $ withAuth $ \auth -> for_ repos $ \(owner, repo) -> do
+            mgr <- newManager GitHub.tlsManagerSettings
+            ret <- GitHub.executeRequestWithMgrAndRes mgr auth $
+                GitHub.issuesForRepoR owner repo mempty (GitHub.FetchPage (GitHub.PageParams (Just 2) (Just 1)))
+
+            case ret of
+              Left e ->
+                expectationFailure . show $ e
+              Right res -> do
+                let issues = responseBody res
+                length issues `shouldSatisfy` (<= 2)
+
+                for_ issues $ \i -> do
+                  cms <- GitHub.executeRequest auth $
+                    GitHub.commentsR owner repo (GitHub.issueNumber i) 1
+                  cms `shouldSatisfy` isRight
+
     describe "issueR" $ do
         it "fetches issue #428" $ withAuth $ \auth -> do
             resIss <- GitHub.executeRequest auth $
diff --git a/spec/GitHub/ReposSpec.hs b/spec/GitHub/ReposSpec.hs
--- a/spec/GitHub/ReposSpec.hs
+++ b/spec/GitHub/ReposSpec.hs
@@ -1,4 +1,10 @@
+{-# LANGUAGE CPP #-}
 {-# LANGUAGE OverloadedStrings #-}
+
+#if __GLASGOW_HASKELL__ >= 900
+{-# OPTIONS_GHC -Wno-incomplete-uni-patterns #-}
+#endif
+
 module GitHub.ReposSpec where
 
 import GitHub
diff --git a/src/GitHub.hs b/src/GitHub.hs
--- a/src/GitHub.hs
+++ b/src/GitHub.hs
@@ -1,8 +1,4 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- This module re-exports all request constructors and data definitions from
 -- this package.
 --
@@ -16,7 +12,7 @@
 --
 -- The missing endpoints lists show which endpoints we know are missing, there
 -- might be more.
---
+
 module GitHub (
     -- * Activity
     -- | See <https://developer.github.com/v3/activity/>
@@ -177,6 +173,7 @@
     membersOfWithR,
     isMemberOfR,
     orgInvitationsR,
+    orgMembershipR,
     -- ** Outside Collaborators
     -- | See <https://developer.github.com/v3/orgs/outside_collaborators/>
     --
@@ -289,6 +286,15 @@
     commitR,
     diffR,
 
+    -- ** Reactions
+    -- | See <https://docs.github.com/en/rest/reactions/reactions?apiVersion=2022-11-28>
+    issueReactionsR,
+    createIssueReactionR,
+    deleteIssueReactionR,
+    commentReactionsR,
+    createCommentReactionR,
+    deleteCommentReactionR,
+
     -- ** Contents
     -- | See <https://developer.github.com/v3/repos/contents/>
     contentsForR,
@@ -413,6 +419,76 @@
     -- | See <https://developer.github.com/v3/rate_limit/>
     rateLimitR,
 
+    -- ** Actions - artifacts
+    -- | See <https://docs.github.com/en/rest/actions/artifacts>
+    artifactsForR,
+    artifactR,
+    deleteArtifactR,
+    downloadArtifactR,
+    artifactsForWorkflowRunR,
+
+    -- ** Actions - cache
+    -- | See <https://docs.github.com/en/rest/actions/cache>
+    cacheUsageOrganizationR,
+    cacheUsageByRepositoryR,
+    cacheUsageR,
+    cachesForRepoR,
+    deleteCacheR,
+
+    -- ** Actions - secrets
+    -- | See <https://docs.github.com/en/rest/actions/secrets>
+    organizationSecretsR,
+    organizationPublicKeyR,
+    organizationSecretR,
+    setOrganizationSecretR,
+    deleteOrganizationSecretR,
+    organizationSelectedRepositoriesForSecretR,
+    setOrganizationSelectedRepositoriesForSecretR,
+    addOrganizationSelectedRepositoriesForSecretR,
+    removeOrganizationSelectedRepositoriesForSecretR,
+    repoSecretsR,
+    repoPublicKeyR,
+    repoSecretR,
+    setRepoSecretR,
+    deleteRepoSecretR,
+    environmentSecretsR,
+    environmentPublicKeyR,
+    environmentSecretR,
+    setEnvironmentSecretR,
+    deleteEnvironmentSecretR,
+
+    -- ** Actions - workflow jobs
+    -- | See <https://docs.github.com/en/rest/actions/workflow-jobs>
+    jobR,
+    downloadJobLogsR,
+    jobsForWorkflowRunAttemptR,
+    jobsForWorkflowRunR,
+
+    -- ** Actions - workflow runs
+    -- | See <https://docs.github.com/en/rest/actions/workflow-runs>
+    reRunJobR,
+    workflowRunsR,
+    workflowRunR,
+    deleteWorkflowRunR,
+    workflowRunReviewHistoryR,
+    approveWorkflowRunR,
+    workflowRunAttemptR,
+    downloadWorkflowRunAttemptLogsR,
+    cancelWorkflowRunR,
+    downloadWorkflowRunLogsR,
+    deleteWorkflowRunLogsR,
+    reRunWorkflowR,
+    reRunFailedJobsR,
+    workflowRunsForWorkflowR,
+
+    -- ** Actions - workflows
+    -- | See <https://docs.github.com/en/rest/actions/workflows>
+    repositoryWorkflowsR,
+    workflowR,
+    disableWorkflowR,
+    triggerWorkflowR,
+    enableWorkflowR,
+
     -- * Data definitions
     module GitHub.Data,
     -- * Request handling
@@ -420,6 +496,12 @@
     ) where
 
 import GitHub.Data
+import GitHub.Endpoints.Actions.Artifacts
+import GitHub.Endpoints.Actions.Cache
+import GitHub.Endpoints.Actions.Secrets
+import GitHub.Endpoints.Actions.WorkflowJobs
+import GitHub.Endpoints.Actions.WorkflowRuns
+import GitHub.Endpoints.Actions.Workflows
 import GitHub.Endpoints.Activity.Events
 import GitHub.Endpoints.Activity.Notifications
 import GitHub.Endpoints.Activity.Starring
@@ -442,6 +524,7 @@
 import GitHub.Endpoints.PullRequests
 import GitHub.Endpoints.PullRequests.Comments
 import GitHub.Endpoints.PullRequests.Reviews
+import GitHub.Endpoints.Reactions
 import GitHub.Endpoints.RateLimit
 import GitHub.Endpoints.Repos
 import GitHub.Endpoints.Repos.Collaborators
diff --git a/src/GitHub/Auth.hs b/src/GitHub/Auth.hs
--- a/src/GitHub/Auth.hs
+++ b/src/GitHub/Auth.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
--- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 module GitHub.Auth (
     Auth (..),
+    Token,
+    JWTToken,
     AuthMethod,
     endpoint,
     setAuthRequest
@@ -14,18 +11,21 @@
 import Prelude ()
 
 import qualified Data.ByteString     as BS
+import qualified Data.Text.Encoding  as TE
 import qualified Network.HTTP.Client as HTTP
 
 type Token = BS.ByteString
+type JWTToken = Text
 
 -- | The Github auth data type
 data Auth
     = BasicAuth BS.ByteString BS.ByteString  -- ^ Username and password
     | OAuth Token                            -- ^ OAuth token
+    | JWT JWTToken                           -- ^ JWT Token
     | EnterpriseOAuth Text Token             -- ^ Custom endpoint and OAuth token
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData Auth where rnf = genericRnf
+instance NFData Auth
 instance Binary Auth
 instance Hashable Auth
 
@@ -45,10 +45,12 @@
 instance AuthMethod Auth where
     endpoint (BasicAuth _ _)       = Nothing
     endpoint (OAuth _)             = Nothing
+    endpoint (JWT _)             = Nothing
     endpoint (EnterpriseOAuth e _) = Just e
 
     setAuthRequest (BasicAuth u p)       = HTTP.applyBasicAuth u p
     setAuthRequest (OAuth t)             = setAuthHeader $ "token " <> t
+    setAuthRequest (JWT t)               = setAuthHeader $ "Bearer " <> TE.encodeUtf8 t
     setAuthRequest (EnterpriseOAuth _ t) = setAuthHeader $ "token " <> t
 
 setAuthHeader :: BS.ByteString -> HTTP.Request -> HTTP.Request
diff --git a/src/GitHub/Data.hs b/src/GitHub/Data.hs
--- a/src/GitHub/Data.hs
+++ b/src/GitHub/Data.hs
@@ -1,10 +1,6 @@
-{-# LANGUAGE CPP #-}
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- This module re-exports the @GitHub.Data.@ and "GitHub.Auth" submodules.
+
 module GitHub.Data (
     -- * Tagged types
     -- ** Name
@@ -34,6 +30,13 @@
     IssueNumber (..),
     -- * Module re-exports
     module GitHub.Auth,
+    module GitHub.Data.Actions.Common,
+    module GitHub.Data.Actions.Artifacts,
+    module GitHub.Data.Actions.Cache,
+    module GitHub.Data.Actions.Secrets,
+    module GitHub.Data.Actions.Workflows,
+    module GitHub.Data.Actions.WorkflowJobs,
+    module GitHub.Data.Actions.WorkflowRuns,
     module GitHub.Data.Activities,
     module GitHub.Data.Comments,
     module GitHub.Data.Content,
@@ -52,6 +55,7 @@
     module GitHub.Data.PullRequests,
     module GitHub.Data.RateLimit,
     module GitHub.Data.Releases,
+    module GitHub.Data.Reactions,
     module GitHub.Data.Repos,
     module GitHub.Data.Request,
     module GitHub.Data.Reviews,
@@ -67,6 +71,13 @@
 import Prelude ()
 
 import GitHub.Auth
+import GitHub.Data.Actions.Common
+import GitHub.Data.Actions.Artifacts
+import GitHub.Data.Actions.Secrets
+import GitHub.Data.Actions.Cache
+import GitHub.Data.Actions.Workflows
+import GitHub.Data.Actions.WorkflowJobs
+import GitHub.Data.Actions.WorkflowRuns
 import GitHub.Data.Activities
 import GitHub.Data.Comments
 import GitHub.Data.Content
@@ -87,6 +98,7 @@
 import GitHub.Data.PullRequests
 import GitHub.Data.RateLimit
 import GitHub.Data.Releases
+import GitHub.Data.Reactions
 import GitHub.Data.Repos
 import GitHub.Data.Request
 import GitHub.Data.Reviews
diff --git a/src/GitHub/Data/Actions/Artifacts.hs b/src/GitHub/Data/Actions/Artifacts.hs
new file mode 100644
--- /dev/null
+++ b/src/GitHub/Data/Actions/Artifacts.hs
@@ -0,0 +1,76 @@
+{-# LANGUAGE DataKinds         #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE KindSignatures    #-}
+
+module GitHub.Data.Actions.Artifacts (
+    Artifact(..),
+    ArtifactWorkflowRun(..),
+    ) where
+
+import GitHub.Data.Id          (Id)
+import GitHub.Data.URL         (URL)
+import GitHub.Internal.Prelude
+import Prelude ()
+
+import GitHub.Data.Actions.Common       (WithTotalCount (WithTotalCount))
+import GitHub.Data.Actions.WorkflowRuns (WorkflowRun)
+import GitHub.Data.Repos                (Repo)
+
+-------------------------------------------------------------------------------
+-- Artifact
+-------------------------------------------------------------------------------
+
+data ArtifactWorkflowRun  = ArtifactWorkflowRun
+    { artifactWorkflowRunWorkflowRunId    :: !(Id WorkflowRun)
+    , artifactWorkflowRunRepositoryId     :: !(Id Repo)
+    , artifactWorkflowRunHeadRepositoryId :: !(Id Repo)
+    , artifactWorkflowRunHeadBranch       :: !Text
+    , artifactWorkflowRunHeadSha          :: !Text
+    }
+  deriving (Show, Data, Eq, Ord, Generic)
+
+data Artifact = Artifact
+    { artifactArchiveDownloadUrl :: !URL
+    , artifactCreatedAt          :: !UTCTime
+    , artifactExpired            :: !Bool
+    , artifactExpiresAt          :: !UTCTime
+    , artifactId                 :: !(Id Artifact)
+    , artifactName               :: !Text
+    , artifactNodeId             :: !Text
+    , artifactSizeInBytes        :: !Int
+    , artifactUpdatedAt          :: !UTCTime
+    , artifactUrl                :: !URL
+    , artifactWorkflowRun        :: !ArtifactWorkflowRun
+    }
+  deriving (Show, Data, Eq, Ord, Generic)
+
+-------------------------------------------------------------------------------
+-- JSON instances
+-------------------------------------------------------------------------------
+
+instance FromJSON ArtifactWorkflowRun where
+    parseJSON = withObject "ArtifactWorkflowRun" $ \o -> ArtifactWorkflowRun
+        <$> o .: "id"
+        <*> o .: "repository_id"
+        <*> o .: "head_repository_id"
+        <*> o .: "head_branch"
+        <*> o .: "head_sha"
+
+instance FromJSON Artifact where
+    parseJSON = withObject "Artifact" $ \o -> Artifact
+        <$> o .: "archive_download_url"
+        <*> o .: "created_at"
+        <*> o .: "expired"
+        <*> o .: "expires_at"
+        <*> o .: "id"
+        <*> o .: "name"
+        <*> o .: "node_id"
+        <*> o .: "size_in_bytes"
+        <*> o .: "updated_at"
+        <*> o .: "url"
+        <*> o .: "workflow_run"
+
+instance FromJSON (WithTotalCount Artifact) where
+    parseJSON = withObject "ArtifactList" $ \o -> WithTotalCount
+        <$> o .: "artifacts"
+        <*> o .: "total_count"
diff --git a/src/GitHub/Data/Actions/Cache.hs b/src/GitHub/Data/Actions/Cache.hs
new file mode 100644
--- /dev/null
+++ b/src/GitHub/Data/Actions/Cache.hs
@@ -0,0 +1,78 @@
+{-# LANGUAGE DataKinds         #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE KindSignatures    #-}
+
+module GitHub.Data.Actions.Cache (
+    Cache(..),
+    RepositoryCacheUsage(..),
+    OrganizationCacheUsage(..)
+    ) where
+
+import GitHub.Data.Id          (Id)
+import GitHub.Internal.Prelude
+import Prelude ()
+
+import GitHub.Data.Actions.Common (WithTotalCount (WithTotalCount))
+
+-------------------------------------------------------------------------------
+-- Cache
+-------------------------------------------------------------------------------
+
+data Cache = Cache
+    { cacheId             :: !(Id Cache)
+    , cacheRef            :: !Text
+    , cacheKey            :: !Text
+    , cacheVersion        :: !Text
+    , cacheLastAccessedAt :: !UTCTime
+    , cacheCreatedAt      :: !UTCTime
+    , cacheSizeInBytes    :: !Int
+    }
+  deriving (Show, Data, Eq, Ord, Generic)
+
+data RepositoryCacheUsage = RepositoryCacheUsage
+    { repositoryCacheUsageFullName                :: !Text
+    , repositoryCacheUsageActiveCachesSizeInBytes :: !Int
+    , repositoryCacheUsageActiveCachesCount       :: !Int
+    }
+  deriving (Show, Data, Eq, Ord, Generic)
+
+data OrganizationCacheUsage = OrganizationCacheUsage
+    { organizationCacheUsageTotalActiveCachesSizeInBytes :: !Int
+    , organizationCacheUsageTotalActiveCachesCount       :: !Int
+    }
+  deriving (Show, Data, Eq, Ord, Generic)
+
+-------------------------------------------------------------------------------
+-- JSON instances
+-------------------------------------------------------------------------------
+
+instance FromJSON Cache where
+    parseJSON = withObject "Cache" $ \o -> Cache
+        <$> o .: "id"
+        <*> o .: "ref"
+        <*> o .: "key"
+        <*> o .: "version"
+        <*> o .: "last_accessed_at"
+        <*> o .: "created_at"
+        <*> o .: "size_in_bytes"
+
+instance FromJSON (WithTotalCount Cache) where
+    parseJSON = withObject "CacheList" $ \o -> WithTotalCount
+        <$> o .: "actions_caches"
+        <*> o .: "total_count"
+
+instance FromJSON OrganizationCacheUsage where
+    parseJSON = withObject "OrganizationCacheUsage" $ \o -> OrganizationCacheUsage
+        <$> o .: "total_active_caches_size_in_bytes"
+        <*> o .: "total_active_caches_count"
+
+instance FromJSON RepositoryCacheUsage where
+    parseJSON = withObject "RepositoryCacheUsage" $ \o -> RepositoryCacheUsage
+        <$> o .: "full_name"
+        <*> o .: "active_caches_size_in_bytes"
+        <*> o .: "active_caches_count"
+
+instance FromJSON (WithTotalCount RepositoryCacheUsage) where
+    parseJSON = withObject "CacheUsageList" $ \o -> WithTotalCount
+        <$> o .: "repository_cache_usages"
+        <*> o .: "total_count"
diff --git a/src/GitHub/Data/Actions/Common.hs b/src/GitHub/Data/Actions/Common.hs
new file mode 100644
--- /dev/null
+++ b/src/GitHub/Data/Actions/Common.hs
@@ -0,0 +1,33 @@
+{-# LANGUAGE DataKinds         #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE KindSignatures    #-}
+
+module GitHub.Data.Actions.Common (
+    WithTotalCount(..),
+    ) where
+
+import GitHub.Internal.Prelude
+import Prelude ()
+
+-------------------------------------------------------------------------------
+-- Common
+-------------------------------------------------------------------------------
+
+-- | A page of a paginated response.
+data WithTotalCount a = WithTotalCount
+    { withTotalCountItems      :: !(Vector a)
+        -- ^ A snippet of the answer.
+    , withTotalCountTotalCount :: !Int
+        -- ^ The total size of the answer.
+    }
+  deriving (Show, Data, Eq, Ord, Generic)
+
+-- | Joining two pages of a paginated response.
+--   The 'withTotalCountTotalCount' is assumed to be the same in both pages,
+--   but this is not checked.
+instance Semigroup (WithTotalCount a) where
+    WithTotalCount items1 count1 <> WithTotalCount items2 _ =
+        WithTotalCount (items1 <> items2) count1
+
+instance Foldable WithTotalCount where
+    foldMap f (WithTotalCount items _) = foldMap f items
diff --git a/src/GitHub/Data/Actions/Secrets.hs b/src/GitHub/Data/Actions/Secrets.hs
new file mode 100644
--- /dev/null
+++ b/src/GitHub/Data/Actions/Secrets.hs
@@ -0,0 +1,141 @@
+{-# LANGUAGE DataKinds         #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE KindSignatures    #-}
+{-# LANGUAGE RecordWildCards   #-}
+
+module GitHub.Data.Actions.Secrets (
+    OrganizationSecret(..),
+    PublicKey(..),
+    SetSecret(..),
+    SetRepoSecret(..),
+    SelectedRepo(..),
+    SetSelectedRepositories(..),
+    RepoSecret(..),
+    Environment(..),
+    ) where
+
+import GitHub.Data.Id          (Id)
+import GitHub.Internal.Prelude
+import Prelude ()
+
+import Data.Maybe                 (maybeToList)
+import GitHub.Data.Actions.Common (WithTotalCount (WithTotalCount))
+import GitHub.Data.Name           (Name)
+import GitHub.Data.Repos          (Repo)
+
+-------------------------------------------------------------------------------
+-- Secret
+-------------------------------------------------------------------------------
+
+data OrganizationSecret = OrganizationSecret
+    { organizationSecretName :: !(Name OrganizationSecret)
+    , organizationSecretCreatedAt :: !UTCTime
+    , organizationSecretUpdatedAt :: !UTCTime
+    , organizationSecretVisibility :: !Text
+    }
+  deriving (Show, Data, Eq, Ord, Generic)
+
+data PublicKey = PublicKey
+    { publicKeyId :: !Text
+    , publicKeyKey :: !Text
+    }
+  deriving (Show, Data, Eq, Ord, Generic)
+
+data SetSecret = SetSecret
+    { setSecretPublicKeyId :: !Text
+    , setSecretEncryptedValue :: !Text
+    , setSecretVisibility :: !Text
+    , setSecretSelectedRepositoryIds :: !(Maybe [Id Repo])
+    }
+  deriving (Show, Data, Eq, Ord, Generic)
+
+data SetRepoSecret = SetRepoSecret
+    { setRepoSecretPublicKeyId :: !Text
+    , setRepoSecretEncryptedValue :: !Text
+    }
+  deriving (Show, Data, Eq, Ord, Generic)
+
+data SelectedRepo = SelectedRepo
+    { selectedRepoRepoId :: !(Id Repo)
+    , selectedRepoRepoName :: !(Name Repo)
+    }
+  deriving (Show, Data, Eq, Ord, Generic)
+
+data SetSelectedRepositories = SetSelectedRepositories
+    { setSelectedRepositoriesRepositoryIds :: ![Id Repo]
+    }
+  deriving (Show, Data, Eq, Ord, Generic)
+
+data RepoSecret = RepoSecret
+    { repoSecretName :: !(Name RepoSecret)
+    , repoSecretCreatedAt :: !UTCTime
+    , repoSecretUpdatedAt :: !UTCTime
+    }
+  deriving (Show, Data, Eq, Ord, Generic)
+
+-- TODO move somewhere else?
+data Environment = Environment
+  deriving (Show, Data, Eq, Ord, Generic)
+
+-------------------------------------------------------------------------------
+-- JSON instances
+-------------------------------------------------------------------------------
+
+instance FromJSON OrganizationSecret where
+    parseJSON = withObject "Secret" $ \o -> OrganizationSecret
+        <$> o .: "name"
+        <*> o .: "created_at"
+        <*> o .: "updated_at"
+        <*> o .: "visibility"
+
+instance FromJSON (WithTotalCount OrganizationSecret) where
+    parseJSON = withObject "SecretList" $ \o -> WithTotalCount
+        <$> o .: "secrets"
+        <*> o .: "total_count"
+
+instance FromJSON PublicKey where
+    parseJSON = withObject "PublicKey" $ \o -> PublicKey
+        <$> o .: "key_id"
+        <*> o .: "key"
+
+instance FromJSON SelectedRepo where
+    parseJSON = withObject "SelectedRepo" $ \o -> SelectedRepo
+        <$> o .: "id"
+        <*> o .: "name"
+
+instance ToJSON SetSelectedRepositories where
+    toJSON SetSelectedRepositories{..} =
+        object
+            [ "selected_repository_ids" .=  setSelectedRepositoriesRepositoryIds
+            ]
+
+instance ToJSON SetSecret where
+    toJSON SetSecret{..} =
+        object $
+            [ "encrypted_value" .= setSecretEncryptedValue
+            ,  "key_id" .= setSecretPublicKeyId
+            ,  "visibility" .= setSecretVisibility
+            ] <> maybeToList (fmap ("selected_repository_ids" .=) setSecretSelectedRepositoryIds)
+
+instance ToJSON SetRepoSecret where
+    toJSON SetRepoSecret{..} =
+        object
+            [ "encrypted_value" .= setRepoSecretEncryptedValue
+            ,  "key_id" .= setRepoSecretPublicKeyId
+            ]
+
+instance FromJSON (WithTotalCount SelectedRepo) where
+    parseJSON = withObject "SelectedRepoList" $ \o -> WithTotalCount
+        <$> o .: "repositories"
+        <*> o .: "total_count"
+
+instance FromJSON RepoSecret where
+    parseJSON = withObject "RepoSecret" $ \o -> RepoSecret
+        <$> o .: "name"
+        <*> o .: "created_at"
+        <*> o .: "updated_at"
+
+instance FromJSON (WithTotalCount RepoSecret) where
+    parseJSON = withObject "RepoSecretList" $ \o -> WithTotalCount
+        <$> o .: "secrets"
+        <*> o .: "total_count"
diff --git a/src/GitHub/Data/Actions/WorkflowJobs.hs b/src/GitHub/Data/Actions/WorkflowJobs.hs
new file mode 100644
--- /dev/null
+++ b/src/GitHub/Data/Actions/WorkflowJobs.hs
@@ -0,0 +1,100 @@
+{-# LANGUAGE DataKinds         #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE KindSignatures    #-}
+
+module GitHub.Data.Actions.WorkflowJobs (
+    JobStep(..),
+    Job(..),
+    ) where
+
+import Prelude ()
+import GitHub.Internal.Prelude
+       (Applicative ((<*>)), Data, Eq, FromJSON (parseJSON), Generic, Integer,
+       Ord, Show, Text, UTCTime, Vector, withObject, ($), (.:),
+       (<$>))
+
+import GitHub.Data.Id                   (Id)
+import GitHub.Data.Name                 (Name)
+import GitHub.Data.URL                  (URL)
+
+import GitHub.Data.Actions.Common       (WithTotalCount (WithTotalCount))
+import GitHub.Data.Actions.WorkflowRuns (WorkflowRun)
+
+-------------------------------------------------------------------------------
+-- Workflow jobs
+-------------------------------------------------------------------------------
+
+data JobStep = JobStep
+    { jobStepName        :: !(Name JobStep)
+    , jobStepStatus      :: !Text
+    , jobStepConclusion  :: !Text
+    , jobStepNumber      :: !Integer
+    , jobStepStartedAt   :: !UTCTime
+    , jobStepCompletedAt :: !UTCTime
+    }
+  deriving (Show, Data, Eq, Ord, Generic)
+
+data Job = Job
+    { jobId              :: !(Id Job)
+    , jobRunId           :: !(Id WorkflowRun)
+    , jobRunUrl          :: !URL
+    , jobRunAttempt      :: !Integer
+    , jobNodeId          :: !Text
+    , jobHeadSha         :: !Text
+    , jobUrl             :: !URL
+    , jobHtmlUrl         :: !URL
+    , jobStatus          :: !Text
+    , jobConclusion      :: !Text
+    , jobStartedAt       :: !UTCTime
+    , jobCompletedAt     :: !UTCTime
+    , jobName            :: !(Name Job)
+    , jobSteps           :: !(Vector JobStep)
+    , jobRunCheckUrl     :: !URL
+    , jobLabels          :: !(Vector Text)
+    , jobRunnerId        :: !Integer
+    , jobRunnerName      :: !Text
+    , jobRunnerGroupId   :: !Integer
+    , jobRunnerGroupName :: !Text
+    }
+  deriving (Show, Data, Eq, Ord, Generic)
+
+-------------------------------------------------------------------------------
+-- JSON instances
+-------------------------------------------------------------------------------
+
+instance FromJSON JobStep where
+    parseJSON = withObject "JobStep" $ \o -> JobStep
+        <$> o .: "name"
+        <*> o .: "status"
+        <*> o .: "conclusion"
+        <*> o .: "number"
+        <*> o .: "started_at"
+        <*> o .: "completed_at"
+
+instance FromJSON Job where
+    parseJSON = withObject "Job" $ \o -> Job
+        <$> o .: "id"
+        <*> o .: "run_id"
+        <*> o .: "run_url"
+        <*> o .: "run_attempt"
+        <*> o .: "node_id"
+        <*> o .: "head_sha"
+        <*> o .: "url"
+        <*> o .: "html_url"
+        <*> o .: "status"
+        <*> o .: "conclusion"
+        <*> o .: "started_at"
+        <*> o .: "completed_at"
+        <*> o .: "name"
+        <*> o .: "steps"
+        <*> o .: "check_run_url"
+        <*> o .: "labels"
+        <*> o .: "runner_id"
+        <*> o .: "runner_name"
+        <*> o .: "runner_group_id"
+        <*> o .: "runner_group_name"
+
+instance FromJSON (WithTotalCount Job) where
+    parseJSON = withObject "JobList" $ \o -> WithTotalCount
+        <$> o .: "jobs"
+        <*> o .: "total_count"
diff --git a/src/GitHub/Data/Actions/WorkflowRuns.hs b/src/GitHub/Data/Actions/WorkflowRuns.hs
new file mode 100644
--- /dev/null
+++ b/src/GitHub/Data/Actions/WorkflowRuns.hs
@@ -0,0 +1,91 @@
+{-# LANGUAGE DataKinds         #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE KindSignatures    #-}
+
+module GitHub.Data.Actions.WorkflowRuns (
+    WorkflowRun(..),
+    RunAttempt(..),
+    ReviewHistory(..),
+    ) where
+
+import GitHub.Data.Actions.Common (WithTotalCount (WithTotalCount))
+import GitHub.Data.Definitions
+import GitHub.Data.URL            (URL)
+import GitHub.Internal.Prelude
+import Prelude ()
+
+import GitHub.Data.Id   (Id)
+import GitHub.Data.Name (Name)
+
+-------------------------------------------------------------------------------
+-- Workflow runs
+-------------------------------------------------------------------------------
+
+data WorkflowRun  = WorkflowRun
+    { workflowRunWorkflowRunId :: !(Id WorkflowRun)
+    , workflowRunName :: !(Name WorkflowRun)
+    , workflowRunHeadBranch :: !Text
+    , workflowRunHeadSha :: !Text
+    , workflowRunPath :: !Text
+    , workflowRunDisplayTitle :: !Text
+    , workflowRunRunNumber :: !Integer
+    , workflowRunEvent :: !Text
+    , workflowRunStatus :: !Text
+    , workflowRunConclusion :: !(Maybe Text)
+    , workflowRunWorkflowId :: !Integer
+    , workflowRunUrl :: !URL
+    , workflowRunHtmlUrl :: !URL
+    , workflowRunCreatedAt :: !UTCTime
+    , workflowRunUpdatedAt :: !UTCTime
+    , workflowRunActor :: !SimpleUser
+    , workflowRunAttempt :: !Integer
+    , workflowRunStartedAt :: !UTCTime
+    }
+  deriving (Show, Data, Eq, Ord, Generic)
+
+data RunAttempt = RunAttempt
+  deriving (Show, Data, Eq, Ord, Generic)
+
+data ReviewHistory  = ReviewHistory
+    { reviewHistoryState :: !Text
+    , reviewHistoryComment :: !Text
+    , reviewHistoryUser :: !SimpleUser
+
+    }
+  deriving (Show, Data, Eq, Ord, Generic)
+
+-------------------------------------------------------------------------------
+-- JSON instances
+-------------------------------------------------------------------------------
+
+instance FromJSON WorkflowRun where
+    parseJSON = withObject "WorkflowRun" $ \o -> WorkflowRun
+        <$> o .: "id"
+        <*> o .: "name"
+        <*> o .: "head_branch"
+        <*> o .: "head_sha"
+        <*> o .: "path"
+        <*> o .: "display_title"
+        <*> o .: "run_number"
+        <*> o .: "event"
+        <*> o .: "status"
+        <*> o .: "conclusion"
+        <*> o .: "workflow_id"
+        <*> o .: "url"
+        <*> o .: "html_url"
+        <*> o .: "created_at"
+        <*> o .: "updated_at"
+        <*> o .: "actor"
+        <*> o .: "run_attempt"
+        <*> o .: "run_started_at"
+
+instance FromJSON (WithTotalCount WorkflowRun) where
+    parseJSON = withObject "WorkflowRunList" $ \o -> WithTotalCount
+        <$> o .: "workflow_runs"
+        <*> o .: "total_count"
+
+instance FromJSON ReviewHistory where
+    parseJSON = withObject "ReviewHistory" $ \o -> ReviewHistory
+        <$> o .: "state"
+        <*> o .: "comment"
+        <*> o .: "user"
diff --git a/src/GitHub/Data/Actions/Workflows.hs b/src/GitHub/Data/Actions/Workflows.hs
new file mode 100644
--- /dev/null
+++ b/src/GitHub/Data/Actions/Workflows.hs
@@ -0,0 +1,62 @@
+{-# LANGUAGE DataKinds         #-}
+{-# LANGUAGE FlexibleInstances #-}
+{-# LANGUAGE KindSignatures    #-}
+
+module GitHub.Data.Actions.Workflows (
+    Workflow(..),
+    CreateWorkflowDispatchEvent(..),
+    ) where
+
+import Prelude ()
+import GitHub.Internal.Prelude
+
+import GitHub.Data.Actions.Common (WithTotalCount (WithTotalCount))
+import GitHub.Data.Id             (Id)
+import GitHub.Data.URL            (URL)
+
+data Workflow = Workflow
+    { workflowWorkflowId :: !(Id Workflow)
+    , workflowName       :: !Text
+    , workflowPath       :: !Text
+    , workflowState      :: !Text
+    , workflowCreatedAt  :: !UTCTime
+    , workflowUpdatedAt  :: !UTCTime
+    , workflowUrl        :: !URL
+    , workflowHtmlUrl    :: !URL
+    , workflowBadgeUrl   :: !URL
+    }
+  deriving (Show, Data, Eq, Ord, Generic)
+
+data CreateWorkflowDispatchEvent a = CreateWorkflowDispatchEvent
+    { createWorkflowDispatchEventRef    :: !Text
+    , createWorkflowDispatchEventInputs :: !a
+    }
+  deriving (Show, Generic)
+
+instance (NFData a) => NFData (CreateWorkflowDispatchEvent a)
+instance (Binary a) => Binary (CreateWorkflowDispatchEvent a)
+
+-------------------------------------------------------------------------------
+-- JSON instances
+-------------------------------------------------------------------------------
+
+instance FromJSON Workflow where
+    parseJSON = withObject "Workflow" $ \o -> Workflow
+        <$> o .: "id"
+        <*> o .: "name"
+        <*> o .: "path"
+        <*> o .: "state"
+        <*> o .: "created_at"
+        <*> o .: "updated_at"
+        <*> o .: "url"
+        <*> o .: "html_url"
+        <*> o .: "badge_url"
+
+instance FromJSON (WithTotalCount Workflow) where
+    parseJSON = withObject "WorkflowList" $ \o -> WithTotalCount
+        <$> o .: "workflows"
+        <*> o .: "total_count"
+
+instance ToJSON a => ToJSON (CreateWorkflowDispatchEvent a) where
+    toJSON (CreateWorkflowDispatchEvent ref inputs) =
+        object [ "ref" .= ref, "inputs" .= inputs ]
diff --git a/src/GitHub/Data/Activities.hs b/src/GitHub/Data/Activities.hs
--- a/src/GitHub/Data/Activities.hs
+++ b/src/GitHub/Data/Activities.hs
@@ -1,8 +1,3 @@
------------------------------------------------------------------------------
--- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 module GitHub.Data.Activities where
 
 import GitHub.Data.Id          (Id, mkId)
@@ -18,9 +13,9 @@
     { repoStarredStarredAt :: !UTCTime
     , repoStarredRepo      :: !Repo
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData RepoStarred where rnf = genericRnf
+instance NFData RepoStarred
 instance Binary RepoStarred
 
 -- JSON Instances
@@ -31,16 +26,16 @@
 
 data Subject = Subject
     { subjectTitle :: !Text
-    , subjectURL :: !URL
+    , subjectURL :: !(Maybe URL)
     , subjectLatestCommentURL :: !(Maybe URL)
     -- https://developer.github.com/v3/activity/notifications/ doesn't indicate
     -- what the possible values for this field are.
     -- TODO: Make an ADT for this.
     , subjectType :: !Text
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData Subject where rnf = genericRnf
+instance NFData Subject
 instance Binary Subject
 
 instance FromJSON Subject where
@@ -51,34 +46,44 @@
         <*> o .: "type"
 
 data NotificationReason
-    = AssignReason
+    = ApprovalRequestedReason
+    | AssignReason
     | AuthorReason
     | CommentReason
+    | CiActivityReason
     | InvitationReason
     | ManualReason
+    | MemberFeatureRequestedReason
     | MentionReason
     | ReviewRequestedReason
+    | SecurityAlertReason
+    | SecurityAdvisoryCreditReason
     | StateChangeReason
     | SubscribedReason
     | TeamMentionReason
-  deriving (Show, Data, Enum, Bounded, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Enum, Bounded, Eq, Ord, Generic)
 
-instance NFData NotificationReason where rnf = genericRnf
+instance NFData NotificationReason
 instance Binary NotificationReason
 
 instance FromJSON NotificationReason where
     parseJSON = withText "NotificationReason" $ \t -> case T.toLower t of
-        "assign"           -> pure AssignReason
-        "author"           -> pure AuthorReason
-        "comment"          -> pure CommentReason
-        "invitation"       -> pure InvitationReason
-        "manual"           -> pure ManualReason
-        "mention"          -> pure MentionReason
-        "review_requested" -> pure ReviewRequestedReason
-        "state_change"     -> pure StateChangeReason
-        "subscribed"       -> pure SubscribedReason
-        "team_mention"     -> pure TeamMentionReason
-        _                  -> fail $ "Unknown NotificationReason " ++ show t
+      "approval_requested"       -> pure ApprovalRequestedReason
+      "assign"                   -> pure AssignReason
+      "author"                   -> pure AuthorReason
+      "comment"                  -> pure CommentReason
+      "ci_activity"              -> pure CiActivityReason
+      "invitation"               -> pure InvitationReason
+      "manual"                   -> pure ManualReason
+      "member_feature_requested" -> pure MemberFeatureRequestedReason
+      "mention"                  -> pure MentionReason
+      "review_requested"         -> pure ReviewRequestedReason
+      "security_alert"           -> pure SecurityAlertReason
+      "security_advisory_credit" -> pure SecurityAdvisoryCreditReason
+      "state_change"             -> pure StateChangeReason
+      "subscribed"               -> pure SubscribedReason
+      "team_mention"             -> pure TeamMentionReason
+      _                          -> fail $ "Unknown NotificationReason " ++ show t
 
 data Notification = Notification
     -- XXX: The notification id field type IS in fact string. Not sure why gh
@@ -92,9 +97,9 @@
     , notificationLastReadAt :: !(Maybe UTCTime)
     , notificationUrl :: !URL
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData Notification where rnf = genericRnf
+instance NFData Notification
 instance Binary Notification
 
 instance FromJSON Notification where
@@ -107,4 +112,3 @@
         <*> o .: "updated_at"
         <*> o .: "last_read_at"
         <*> o .: "url"
-
diff --git a/src/GitHub/Data/Comments.hs b/src/GitHub/Data/Comments.hs
--- a/src/GitHub/Data/Comments.hs
+++ b/src/GitHub/Data/Comments.hs
@@ -1,8 +1,3 @@
------------------------------------------------------------------------------
--- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 module GitHub.Data.Comments where
 
 import GitHub.Data.Definitions
@@ -24,9 +19,9 @@
     , commentUser      :: !SimpleUser
     , commentId        :: !(Id Comment)
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData Comment where rnf = genericRnf
+instance NFData Comment
 instance Binary Comment
 
 instance FromJSON Comment where
@@ -46,9 +41,9 @@
 data NewComment = NewComment
     { newCommentBody :: !Text
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData NewComment where rnf = genericRnf
+instance NFData NewComment
 instance Binary NewComment
 
 instance ToJSON NewComment where
@@ -57,9 +52,9 @@
 data EditComment = EditComment
     { editCommentBody :: !Text
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData EditComment where rnf = genericRnf
+instance NFData EditComment
 instance Binary EditComment
 
 instance ToJSON EditComment where
@@ -71,9 +66,9 @@
     , newPullCommentPosition :: !Int
     , newPullCommentBody     :: !Text
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData NewPullComment where rnf = genericRnf
+instance NFData NewPullComment
 instance Binary NewPullComment
 
 instance ToJSON NewPullComment where
@@ -87,9 +82,9 @@
 data PullCommentReply = PullCommentReply
     { pullCommentReplyBody     :: Text
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData PullCommentReply where rnf = genericRnf
+instance NFData PullCommentReply
 
 instance ToJSON PullCommentReply where
     toJSON (PullCommentReply b) =
diff --git a/src/GitHub/Data/Content.hs b/src/GitHub/Data/Content.hs
--- a/src/GitHub/Data/Content.hs
+++ b/src/GitHub/Data/Content.hs
@@ -1,10 +1,6 @@
 {-# LANGUAGE RecordWildCards #-}
 {-# LANGUAGE CPP #-}
------------------------------------------------------------------------------
--- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
+
 module GitHub.Data.Content where
 
 import GitHub.Data.GitData
@@ -22,9 +18,9 @@
 data Content
   = ContentFile !ContentFileData
   | ContentDirectory !(Vector ContentItem)
- deriving (Show, Data, Typeable, Eq, Ord, Generic)
+ deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData Content where rnf = genericRnf
+instance NFData Content
 instance Binary Content
 
 data ContentFileData = ContentFileData {
@@ -32,24 +28,24 @@
   ,contentFileEncoding :: !Text
   ,contentFileSize     :: !Int
   ,contentFileContent  :: !Text
-} deriving (Show, Data, Typeable, Eq, Ord, Generic)
+} deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData ContentFileData where rnf = genericRnf
+instance NFData ContentFileData
 instance Binary ContentFileData
 
 -- | An item in a directory listing.
 data ContentItem = ContentItem {
    contentItemType :: !ContentItemType
   ,contentItemInfo :: !ContentInfo
-} deriving (Show, Data, Typeable, Eq, Ord, Generic)
+} deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData ContentItem where rnf = genericRnf
+instance NFData ContentItem
 instance Binary ContentItem
 
 data ContentItemType = ItemFile | ItemDir
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData ContentItemType where rnf = genericRnf
+instance NFData ContentItemType
 instance Binary ContentItemType
 
 -- | Information common to both kinds of Content: files and directories.
@@ -60,34 +56,34 @@
   ,contentUrl     :: !URL
   ,contentGitUrl  :: !URL
   ,contentHtmlUrl :: !URL
-} deriving (Show, Data, Typeable, Eq, Ord, Generic)
+} deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData ContentInfo where rnf = genericRnf
+instance NFData ContentInfo
 instance Binary ContentInfo
 
 data ContentResultInfo = ContentResultInfo
     { contentResultInfo :: !ContentInfo
     , contentResultSize :: !Int
-    } deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    } deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData ContentResultInfo where rnf = genericRnf
+instance NFData ContentResultInfo
 instance Binary ContentResultInfo
 
 data ContentResult = ContentResult
     { contentResultContent  :: !ContentResultInfo
     , contentResultCommit   :: !GitCommit
-    } deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    } deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData ContentResult where rnf = genericRnf
+instance NFData ContentResult
 instance Binary ContentResult
 
 data Author = Author
     { authorName  :: !Text
     , authorEmail :: !Text
     }
-    deriving (Eq, Ord, Show, Data, Typeable, Generic)
+    deriving (Eq, Ord, Show, Data, Generic)
 
-instance NFData Author where rnf = genericRnf
+instance NFData Author
 instance Binary Author
 
 data CreateFile = CreateFile
@@ -98,9 +94,9 @@
     , createFileAuthor    :: !(Maybe Author)
     , createFileCommitter :: !(Maybe Author)
     }
-    deriving (Eq, Ord, Show, Data, Typeable, Generic)
+    deriving (Eq, Ord, Show, Data, Generic)
 
-instance NFData CreateFile where rnf = genericRnf
+instance NFData CreateFile
 instance Binary CreateFile
 
 data UpdateFile = UpdateFile
@@ -112,9 +108,9 @@
     , updateFileAuthor    :: !(Maybe Author)
     , updateFileCommitter :: !(Maybe Author)
     }
-    deriving (Eq, Ord, Show, Data, Typeable, Generic)
+    deriving (Eq, Ord, Show, Data, Generic)
 
-instance NFData UpdateFile where rnf = genericRnf
+instance NFData UpdateFile
 instance Binary UpdateFile
 
 data DeleteFile = DeleteFile
@@ -125,9 +121,9 @@
     , deleteFileAuthor    :: !(Maybe Author)
     , deleteFileCommitter :: !(Maybe Author)
     }
-    deriving (Eq, Ord, Show, Data, Typeable, Generic)
+    deriving (Eq, Ord, Show, Data, Generic)
 
-instance NFData DeleteFile where rnf = genericRnf
+instance NFData DeleteFile
 instance Binary DeleteFile
 
 instance FromJSON Content where
diff --git a/src/GitHub/Data/Definitions.hs b/src/GitHub/Data/Definitions.hs
--- a/src/GitHub/Data/Definitions.hs
+++ b/src/GitHub/Data/Definitions.hs
@@ -1,8 +1,3 @@
------------------------------------------------------------------------------
--- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 module GitHub.Data.Definitions where
 
 import GitHub.Internal.Prelude
@@ -27,13 +22,13 @@
     | ParseError !Text -- ^ An error in the parser itself.
     | JsonError !Text -- ^ The JSON is malformed or unexpected.
     | UserError !Text -- ^ Incorrect input.
-    deriving (Show, Typeable)
+    deriving (Show)
 
 instance E.Exception Error
 
 -- | Type of the repository owners.
 data OwnerType = OwnerUser | OwnerOrganization | OwnerBot
-    deriving (Eq, Ord, Enum, Bounded, Show, Read, Generic, Typeable, Data)
+    deriving (Eq, Ord, Enum, Bounded, Show, Read, Generic, Data)
 
 instance NFData OwnerType
 instance Binary OwnerType
@@ -44,9 +39,9 @@
     , simpleUserAvatarUrl :: !URL
     , simpleUserUrl       :: !URL
     }
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData SimpleUser where rnf = genericRnf
+instance NFData SimpleUser
 instance Binary SimpleUser
 
 data SimpleOrganization = SimpleOrganization
@@ -55,9 +50,9 @@
     , simpleOrganizationUrl       :: !URL
     , simpleOrganizationAvatarUrl :: !URL
     }
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData SimpleOrganization where rnf = genericRnf
+instance NFData SimpleOrganization
 instance Binary SimpleOrganization
 
 -- | Sometimes we don't know the type of the owner, e.g. in 'Repo'
@@ -68,9 +63,9 @@
     , simpleOwnerAvatarUrl :: !URL
     , simpleOwnerType      :: !OwnerType
     }
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData SimpleOwner where rnf = genericRnf
+instance NFData SimpleOwner
 instance Binary SimpleOwner
 
 data User = User
@@ -93,9 +88,9 @@
     , userUrl         :: !URL
     , userHtmlUrl     :: !URL
     }
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData User where rnf = genericRnf
+instance NFData User
 instance Binary User
 
 data Organization = Organization
@@ -116,16 +111,16 @@
     , organizationUrl         :: !URL
     , organizationCreatedAt   :: !UTCTime
     }
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData Organization where rnf = genericRnf
+instance NFData Organization
 instance Binary Organization
 
 -- | In practice you can't have concrete values of 'Owner'.
 newtype Owner = Owner (Either User Organization)
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData Owner where rnf = genericRnf
+instance NFData Owner
 instance Binary Owner
 
 fromOwner :: Owner -> Either User Organization
@@ -223,14 +218,14 @@
 data OrgMemberFilter
     = OrgMemberFilter2faDisabled  -- ^ Members without two-factor authentication enabled. Available for organization owners.
     | OrgMemberFilterAll          -- ^ All members the authenticated user can see.
-    deriving (Show, Eq, Ord, Enum, Bounded, Typeable, Data, Generic)
+    deriving (Show, Eq, Ord, Enum, Bounded, Data, Generic)
 
 -- | Filter members returned by their role.
 data OrgMemberRole
     = OrgMemberRoleAll     -- ^ All members of the organization, regardless of role.
     | OrgMemberRoleAdmin   -- ^ Organization owners.
     | OrgMemberRoleMember  -- ^ Non-owner organization members.
-    deriving (Show, Eq, Ord, Enum, Bounded, Typeable, Data, Generic)
+    deriving (Show, Eq, Ord, Enum, Bounded, Data, Generic)
 
 -- | Request query string
 type QueryString = [(BS.ByteString, Maybe BS.ByteString)]
@@ -238,12 +233,69 @@
 -- | Count of elements
 type Count = Int
 
+
+
+data MembershipRole
+    = MembershipRoleMember
+    | MembershipRoleAdmin
+    | MembershipRoleBillingManager
+  deriving
+    (Eq, Ord, Show, Enum, Bounded, Generic, Data)
+
+instance NFData MembershipRole
+instance Binary MembershipRole
+
+instance FromJSON MembershipRole where
+    parseJSON = withText "MembershipRole" $ \t -> case T.toLower t of
+        "member"   -> pure MembershipRoleMember
+        "admin"           -> pure MembershipRoleAdmin
+        "billing_manager" -> pure MembershipRoleBillingManager
+        _                 -> fail $ "Unknown MembershipRole: " <> T.unpack t
+
+data MembershipState
+    = MembershipPending
+    | MembershipActive
+    deriving (Show, Data, Eq, Ord, Generic)
+
+instance NFData MembershipState
+instance Binary MembershipState
+
+instance FromJSON MembershipState where
+    parseJSON = withText "MembershipState" $ \t -> case T.toLower t of
+        "active"  -> pure MembershipActive
+        "pending" -> pure MembershipPending
+        _         -> fail $ "Unknown MembershipState: " <> T.unpack t
+
+
+data Membership = Membership
+    { membershipUrl             :: !URL
+    , membershipState           :: !MembershipState
+    , membershipRole            :: !MembershipRole
+    , membershipOrganizationUrl :: !URL
+    , membershipOrganization    :: !SimpleOrganization
+    , membershipUser            :: !SimpleUser
+    }
+    deriving (Show, Data, Eq, Ord, Generic)
+
+instance NFData Membership
+instance Binary Membership
+
+instance FromJSON Membership where
+    parseJSON = withObject "Membership" $ \o -> Membership
+        <$> o .: "url"
+        <*> o .: "state"
+        <*> o .: "role"
+        <*> o .: "organization_url"
+        <*> o .: "organization"
+        <*> o .: "user"
+
+
 -------------------------------------------------------------------------------
 -- IssueNumber
 -------------------------------------------------------------------------------
 
 newtype IssueNumber = IssueNumber Int
-    deriving (Eq, Ord, Show, Generic, Typeable, Data)
+    deriving (Eq, Ord, Show, Generic, Data)
 
 unIssueNumber :: IssueNumber -> Int
 unIssueNumber (IssueNumber i) = i
@@ -270,9 +322,9 @@
     , labelName  :: !(Name IssueLabel)
     , labelDesc  :: !(Maybe Text)
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData IssueLabel where rnf = genericRnf
+instance NFData IssueLabel
 instance Binary IssueLabel
 
 instance FromJSON IssueLabel where
@@ -292,9 +344,9 @@
     , newLabelName  :: !(Name NewIssueLabel)
     , newLabelDesc  :: !(Maybe Text)
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData NewIssueLabel where rnf = genericRnf
+instance NFData NewIssueLabel
 instance Binary NewIssueLabel
 
 
@@ -319,9 +371,9 @@
     , updateLabelName  :: !(Name UpdateIssueLabel)
     , updateLabelDesc  :: !(Maybe Text)
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData UpdateIssueLabel where rnf = genericRnf
+instance NFData UpdateIssueLabel
 instance Binary UpdateIssueLabel
 
 
diff --git a/src/GitHub/Data/DeployKeys.hs b/src/GitHub/Data/DeployKeys.hs
--- a/src/GitHub/Data/DeployKeys.hs
+++ b/src/GitHub/Data/DeployKeys.hs
@@ -19,7 +19,7 @@
     , repoDeployKeyCreatedAt :: !UTCTime
     , repoDeployKeyReadOnly  :: !Bool
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
 instance FromJSON RepoDeployKey where
     parseJSON = withObject "RepoDeployKey" $ \o -> RepoDeployKey
@@ -36,7 +36,7 @@
     , newRepoDeployKeyTitle    :: !Text
     , newRepoDeployKeyReadOnly :: !Bool
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
 instance ToJSON NewRepoDeployKey where
     toJSON (NewRepoDeployKey key title readOnly) = object
diff --git a/src/GitHub/Data/Deployments.hs b/src/GitHub/Data/Deployments.hs
--- a/src/GitHub/Data/Deployments.hs
+++ b/src/GitHub/Data/Deployments.hs
@@ -34,9 +34,9 @@
     | DeploymentQueryRef         !Text
     | DeploymentQueryTask        !Text
     | DeploymentQueryEnvironment !Text
-      deriving (Show, Data, Typeable, Eq, Ord, Generic)
+      deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData DeploymentQueryOption where rnf = genericRnf
+instance NFData DeploymentQueryOption
 instance Binary DeploymentQueryOption
 
 renderDeploymentQueryOption :: DeploymentQueryOption -> (ByteString, ByteString)
@@ -61,9 +61,9 @@
     , deploymentUpdatedAt     :: !UTCTime
     , deploymentStatusesUrl   :: !URL
     , deploymentRepositoryUrl :: !URL
-    } deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    } deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData a => NFData (Deployment a) where rnf = genericRnf
+instance NFData a => NFData (Deployment a)
 instance Binary a => Binary (Deployment a)
 
 instance FromJSON a => FromJSON (Deployment a) where
@@ -104,9 +104,9 @@
     -- qa). Default: production
     , createDeploymentDescription      :: !(Maybe Text)
     -- ^ Short description of the deployment. Default: ""
-    } deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    } deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData a => NFData (CreateDeployment a) where rnf = genericRnf
+instance NFData a => NFData (CreateDeployment a)
 instance Binary a => Binary (CreateDeployment a)
 
 instance ToJSON a => ToJSON (CreateDeployment a) where
@@ -132,9 +132,9 @@
     , deploymentStatusUpdatedAt     :: !UTCTime
     , deploymentStatusDeploymentUrl :: !URL
     , deploymentStatusRepositoryUrl :: !URL
-    } deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    } deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData DeploymentStatus where rnf = genericRnf
+instance NFData DeploymentStatus
 instance Binary DeploymentStatus
 
 instance FromJSON DeploymentStatus where
@@ -157,9 +157,9 @@
     | DeploymentStatusPending
     | DeploymentStatusSuccess
     | DeploymentStatusInactive
-      deriving (Show, Data, Typeable, Eq, Ord, Generic)
+      deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData DeploymentStatusState where rnf = genericRnf
+instance NFData DeploymentStatusState
 instance Binary DeploymentStatusState
 
 instance ToJSON DeploymentStatusState where
@@ -190,9 +190,9 @@
     , createDeploymentStatusDescription :: !(Maybe Text)
     -- ^ A short description of the status. Maximum length of 140 characters.
     -- Default: ""
-    } deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    } deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData CreateDeploymentStatus where rnf = genericRnf
+instance NFData CreateDeploymentStatus
 instance Binary CreateDeploymentStatus
 
 instance ToJSON CreateDeploymentStatus where
diff --git a/src/GitHub/Data/Email.hs b/src/GitHub/Data/Email.hs
--- a/src/GitHub/Data/Email.hs
+++ b/src/GitHub/Data/Email.hs
@@ -1,8 +1,3 @@
------------------------------------------------------------------------------
--- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 module GitHub.Data.Email where
 
 import GitHub.Internal.Prelude
@@ -13,9 +8,9 @@
 data EmailVisibility
     = EmailVisibilityPrivate
     | EmailVisibilityPublic
-    deriving (Show, Data, Enum, Bounded, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Enum, Bounded, Eq, Ord, Generic)
 
-instance NFData EmailVisibility where rnf = genericRnf
+instance NFData EmailVisibility
 instance Binary EmailVisibility
 
 instance FromJSON EmailVisibility where
@@ -29,9 +24,9 @@
     , emailVerified   :: !Bool
     , emailPrimary    :: !Bool
     , emailVisibility :: !(Maybe EmailVisibility)
-    } deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    } deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData Email where rnf = genericRnf
+instance NFData Email
 instance Binary Email
 
 instance FromJSON Email where
diff --git a/src/GitHub/Data/Enterprise.hs b/src/GitHub/Data/Enterprise.hs
--- a/src/GitHub/Data/Enterprise.hs
+++ b/src/GitHub/Data/Enterprise.hs
@@ -1,9 +1,6 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- This module re-exports the @GitHub.Data.Enterprise.@ submodules.
+
 module GitHub.Data.Enterprise (
     -- * Module re-exports
     module GitHub.Data.Enterprise.Organizations,
diff --git a/src/GitHub/Data/Enterprise/Organizations.hs b/src/GitHub/Data/Enterprise/Organizations.hs
--- a/src/GitHub/Data/Enterprise/Organizations.hs
+++ b/src/GitHub/Data/Enterprise/Organizations.hs
@@ -1,8 +1,3 @@
------------------------------------------------------------------------------
--- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 module GitHub.Data.Enterprise.Organizations where
 
 import GitHub.Data.Definitions
@@ -16,26 +11,26 @@
     , createOrganizationAdmin       :: !(Name User)
     , createOrganizationProfileName :: !(Maybe Text)
     }
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData CreateOrganization where rnf = genericRnf
+instance NFData CreateOrganization
 instance Binary CreateOrganization
 
 data RenameOrganization = RenameOrganization
     { renameOrganizationLogin :: !(Name Organization)
     }
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData RenameOrganization where rnf = genericRnf
+instance NFData RenameOrganization
 instance Binary RenameOrganization
 
 data RenameOrganizationResponse = RenameOrganizationResponse
     { renameOrganizationResponseMessage :: !Text
     , renameOrganizationResponseUrl     :: !URL
     }
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData RenameOrganizationResponse where rnf = genericRnf
+instance NFData RenameOrganizationResponse
 instance Binary RenameOrganizationResponse
 
 -- JSON Instances
diff --git a/src/GitHub/Data/Events.hs b/src/GitHub/Data/Events.hs
--- a/src/GitHub/Data/Events.hs
+++ b/src/GitHub/Data/Events.hs
@@ -1,8 +1,3 @@
------------------------------------------------------------------------------
--- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 module GitHub.Data.Events where
 
 import GitHub.Data.Definitions
@@ -14,15 +9,16 @@
 -- /TODO:/
 --
 -- * missing repo, org, payload, id
+--
 data Event = Event
     -- { eventId        :: !(Id Event) -- id can be encoded as string.
     { eventActor     :: !SimpleUser
     , eventCreatedAt :: !UTCTime
     , eventPublic    :: !Bool
     }
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData Event where rnf = genericRnf
+instance NFData Event
 instance Binary Event
 
 instance FromJSON Event where
diff --git a/src/GitHub/Data/Gists.hs b/src/GitHub/Data/Gists.hs
--- a/src/GitHub/Data/Gists.hs
+++ b/src/GitHub/Data/Gists.hs
@@ -1,8 +1,3 @@
------------------------------------------------------------------------------
--- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 module GitHub.Data.Gists where
 
 import GitHub.Data.Definitions
@@ -26,9 +21,9 @@
     , gistId          :: !(Name Gist)
     , gistFiles       :: !(HashMap Text GistFile)
     , gistGitPullUrl  :: !URL
-    } deriving (Show, Data, Typeable, Eq, Generic)
+    } deriving (Show, Data, Eq, Generic)
 
-instance NFData Gist where rnf = genericRnf
+instance NFData Gist
 instance Binary Gist
 
 instance FromJSON Gist where
@@ -54,9 +49,9 @@
     , gistFileFilename :: !Text
     , gistFileContent  :: !(Maybe Text)
     }
-  deriving (Show, Data, Typeable, Eq, Generic)
+  deriving (Show, Data, Eq, Generic)
 
-instance NFData GistFile where rnf = genericRnf
+instance NFData GistFile
 instance Binary GistFile
 
 instance FromJSON GistFile where
@@ -76,9 +71,9 @@
     , gistCommentUpdatedAt :: !UTCTime
     , gistCommentId        :: !(Id GistComment)
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData GistComment where rnf = genericRnf
+instance NFData GistComment
 instance Binary GistComment
 
 instance FromJSON GistComment where
@@ -94,9 +89,9 @@
     { newGistDescription :: !(Maybe Text)
     , newGistFiles       :: !(HashMap Text NewGistFile)
     , newGistPublic      :: !(Maybe Bool)
-    } deriving (Show, Data, Typeable, Eq, Generic)
+    } deriving (Show, Data, Eq, Generic)
 
-instance NFData NewGist where rnf = genericRnf
+instance NFData NewGist
 instance Binary NewGist
 
 instance ToJSON NewGist where
@@ -114,9 +109,9 @@
 
 data NewGistFile = NewGistFile
     { newGistFileContent :: !Text
-    } deriving (Show, Data, Typeable, Eq, Generic)
+    } deriving (Show, Data, Eq, Generic)
 
-instance NFData NewGistFile where rnf = genericRnf
+instance NFData NewGistFile
 instance Binary NewGistFile
 
 instance ToJSON NewGistFile where
diff --git a/src/GitHub/Data/GitData.hs b/src/GitHub/Data/GitData.hs
--- a/src/GitHub/Data/GitData.hs
+++ b/src/GitHub/Data/GitData.hs
@@ -1,8 +1,3 @@
------------------------------------------------------------------------------
--- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 module GitHub.Data.GitData where
 
 import GitHub.Data.Definitions
@@ -20,16 +15,16 @@
     | CommitQueryAuthor !Text
     | CommitQuerySince !UTCTime
     | CommitQueryUntil !UTCTime
-  deriving (Show, Eq, Ord, Generic, Typeable, Data)
+  deriving (Show, Eq, Ord, Generic, Data)
 
 data Stats = Stats
     { statsAdditions :: !Int
     , statsTotal     :: !Int
     , statsDeletions :: !Int
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData Stats where rnf = genericRnf
+instance NFData Stats
 instance Binary Stats
 
 data Commit = Commit
@@ -42,9 +37,9 @@
     , commitFiles     :: !(Vector File)
     , commitStats     :: !(Maybe Stats)
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData Commit where rnf = genericRnf
+instance NFData Commit
 instance Binary Commit
 
 data Tree = Tree
@@ -52,9 +47,9 @@
     , treeUrl      :: !URL
     , treeGitTrees :: !(Vector GitTree)
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData Tree where rnf = genericRnf
+instance NFData Tree
 instance Binary Tree
 
 data GitTree = GitTree
@@ -66,9 +61,9 @@
     , gitTreePath :: !Text
     , gitTreeMode :: !Text
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData GitTree where rnf = genericRnf
+instance NFData GitTree
 instance Binary GitTree
 
 data GitCommit = GitCommit
@@ -80,9 +75,9 @@
     , gitCommitSha       :: !(Maybe (Name GitCommit))
     , gitCommitParents   :: !(Vector Tree)
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData GitCommit where rnf = genericRnf
+instance NFData GitCommit
 instance Binary GitCommit
 
 data Blob = Blob
@@ -92,9 +87,9 @@
     , blobSha      :: !(Name Blob)
     , blobSize     :: !Int
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData Blob where rnf = genericRnf
+instance NFData Blob
 instance Binary Blob
 
 data Tag = Tag
@@ -103,26 +98,26 @@
     , tagTarballUrl :: !URL
     , tagCommit     :: !BranchCommit
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData Tag where rnf = genericRnf
+instance NFData Tag
 instance Binary Tag
 
 data Branch = Branch
     { branchName   :: !Text
     , branchCommit :: !BranchCommit
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData Branch where rnf = genericRnf
+instance NFData Branch
 
 data BranchCommit = BranchCommit
     { branchCommitSha :: !Text
     , branchCommitUrl :: !URL
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData BranchCommit where rnf = genericRnf
+instance NFData BranchCommit
 instance Binary BranchCommit
 
 data Diff = Diff
@@ -139,18 +134,18 @@
     , diffDiffUrl      :: !URL
     , diffPermalinkUrl :: !URL
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData Diff where rnf = genericRnf
+instance NFData Diff
 instance Binary Diff
 
 data NewGitReference = NewGitReference
     { newGitReferenceRef :: !Text
     , newGitReferenceSha :: !Text
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData NewGitReference where rnf = genericRnf
+instance NFData NewGitReference
 instance Binary NewGitReference
 
 data GitReference = GitReference
@@ -158,9 +153,9 @@
     , gitReferenceUrl    :: !URL
     , gitReferenceRef    :: !(Name GitReference)
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData GitReference where rnf = genericRnf
+instance NFData GitReference
 instance Binary GitReference
 
 data GitObject = GitObject
@@ -168,9 +163,9 @@
     , gitObjectSha  :: !Text
     , gitObjectUrl  :: !URL
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData GitObject where rnf = genericRnf
+instance NFData GitObject
 instance Binary GitObject
 
 data GitUser = GitUser
@@ -178,9 +173,9 @@
     , gitUserEmail :: !Text
     , gitUserDate  :: !UTCTime
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData GitUser where rnf = genericRnf
+instance NFData GitUser
 instance Binary GitUser
 
 data File = File
@@ -194,9 +189,9 @@
     , fileFilename  :: !Text
     , fileDeletions :: !Int
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData File where rnf = genericRnf
+instance NFData File
 instance Binary File
 
 -- JSON instances
@@ -213,8 +208,8 @@
         <*> o .: "parents"
         <*> o .: "url"
         <*> o .: "commit"
-        <*> o .:? "committer"
-        <*> o .:? "author"
+        <*> (o .:? "committer" <|> pure Nothing)
+        <*> (o .:? "author" <|> pure Nothing)
         <*> o .:? "files" .!= V.empty
         <*> o .:? "stats"
 
diff --git a/src/GitHub/Data/Id.hs b/src/GitHub/Data/Id.hs
--- a/src/GitHub/Data/Id.hs
+++ b/src/GitHub/Data/Id.hs
@@ -1,8 +1,3 @@
------------------------------------------------------------------------------
--- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 module GitHub.Data.Id (
     Id(..),
     mkId,
@@ -14,7 +9,7 @@
 
 -- | Numeric identifier.
 newtype Id entity = Id Int
-    deriving (Eq, Ord, Show, Generic, Typeable, Data)
+    deriving (Eq, Ord, Show, Generic, Data)
 
 -- | Smart constructor for 'Id'.
 mkId :: proxy entity -> Int -> Id entity
diff --git a/src/GitHub/Data/Invitation.hs b/src/GitHub/Data/Invitation.hs
--- a/src/GitHub/Data/Invitation.hs
+++ b/src/GitHub/Data/Invitation.hs
@@ -1,8 +1,3 @@
------------------------------------------------------------------------------
--- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 module GitHub.Data.Invitation where
 
 import GitHub.Data.Definitions
@@ -24,9 +19,9 @@
     , invitationCreatedAt :: !UTCTime
     , inviter             :: !SimpleUser
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData Invitation where rnf = genericRnf
+instance NFData Invitation
 instance Binary Invitation
 
 instance FromJSON Invitation where
@@ -46,9 +41,9 @@
     | InvitationRoleHiringManager
     | InvitationRoleReinstate
   deriving
-    (Eq, Ord, Show, Enum, Bounded, Generic, Typeable, Data)
+    (Eq, Ord, Show, Enum, Bounded, Generic, Data)
 
-instance NFData InvitationRole where rnf = genericRnf
+instance NFData InvitationRole
 instance Binary InvitationRole
 
 instance FromJSON InvitationRole where
@@ -70,9 +65,9 @@
     , repoInvitationPermission :: !Text
     , repoInvitationHtmlUrl    :: !URL
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData RepoInvitation where rnf = genericRnf
+instance NFData RepoInvitation
 instance Binary RepoInvitation
 
 instance FromJSON RepoInvitation where
diff --git a/src/GitHub/Data/Issues.hs b/src/GitHub/Data/Issues.hs
--- a/src/GitHub/Data/Issues.hs
+++ b/src/GitHub/Data/Issues.hs
@@ -1,15 +1,10 @@
------------------------------------------------------------------------------
--- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 module GitHub.Data.Issues where
 
 import GitHub.Data.Definitions
 import GitHub.Data.Id           (Id)
 import GitHub.Data.Milestone    (Milestone)
 import GitHub.Data.Name         (Name)
-import GitHub.Data.Options      (IssueState)
+import GitHub.Data.Options      (IssueState, IssueStateReason)
 import GitHub.Data.PullRequests
 import GitHub.Data.URL          (URL)
 import GitHub.Internal.Prelude
@@ -36,10 +31,11 @@
     , issueId          :: !(Id Issue)
     , issueComments    :: !Int
     , issueMilestone   :: !(Maybe Milestone)
+    , issueStateReason :: !(Maybe IssueStateReason)
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData Issue where rnf = genericRnf
+instance NFData Issue
 instance Binary Issue
 
 data NewIssue = NewIssue
@@ -49,9 +45,9 @@
     , newIssueMilestone :: !(Maybe (Id Milestone))
     , newIssueLabels    :: !(Maybe (Vector (Name IssueLabel)))
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData NewIssue where rnf = genericRnf
+instance NFData NewIssue
 instance Binary NewIssue
 
 data EditIssue = EditIssue
@@ -62,9 +58,9 @@
     , editIssueMilestone :: !(Maybe (Id Milestone))
     , editIssueLabels    :: !(Maybe (Vector (Name IssueLabel)))
     }
-  deriving  (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving  (Show, Data, Eq, Ord, Generic)
 
-instance NFData EditIssue where rnf = genericRnf
+instance NFData EditIssue
 instance Binary EditIssue
 
 data IssueComment = IssueComment
@@ -76,9 +72,9 @@
     , issueCommentBody      :: !Text
     , issueCommentId        :: !Int
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData IssueComment where rnf = genericRnf
+instance NFData IssueComment
 instance Binary IssueComment
 
 -- | See <https://developer.github.com/v3/issues/events/#events-1>
@@ -110,9 +106,9 @@
     | MovedColumnsInProject -- ^ The issue was moved between columns in a project board.
     | RemovedFromProject    -- ^ The issue was removed from a project board.
     | ConvertedNoteToIssue  -- ^ The issue was created by converting a note in a project board to an issue.
-  deriving (Show, Data, Enum, Bounded, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Enum, Bounded, Eq, Ord, Generic)
 
-instance NFData EventType where rnf = genericRnf
+instance NFData EventType
 instance Binary EventType
 
 -- | Issue event
@@ -126,9 +122,9 @@
     , issueEventIssue     :: !(Maybe Issue)
     , issueEventLabel     :: !(Maybe IssueLabel)
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData IssueEvent where rnf = genericRnf
+instance NFData IssueEvent
 instance Binary IssueEvent
 
 instance FromJSON IssueEvent where
@@ -203,6 +199,7 @@
         <*> o .: "id"
         <*> o .: "comments"
         <*> o .:? "milestone"
+        <*> o .:? "state_reason"
 
 instance ToJSON NewIssue where
     toJSON (NewIssue t b a m ls) = object $ filter notNull
diff --git a/src/GitHub/Data/Milestone.hs b/src/GitHub/Data/Milestone.hs
--- a/src/GitHub/Data/Milestone.hs
+++ b/src/GitHub/Data/Milestone.hs
@@ -1,8 +1,3 @@
------------------------------------------------------------------------------
--- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 module GitHub.Data.Milestone where
 
 import GitHub.Data.Definitions
@@ -23,9 +18,9 @@
     , milestoneCreatedAt    :: !UTCTime
     , milestoneState        :: !Text
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData Milestone where rnf = genericRnf
+instance NFData Milestone
 instance Binary Milestone
 
 instance FromJSON Milestone where
@@ -47,9 +42,9 @@
     , newMilestoneDescription :: !(Maybe Text)
     , newMilestoneDueOn       :: !(Maybe UTCTime)
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData NewMilestone where rnf = genericRnf
+instance NFData NewMilestone
 instance Binary NewMilestone
 
 
@@ -70,9 +65,9 @@
   , updateMilestoneDescription :: !(Maybe Text)
   , updateMilestoneDueOn       :: !(Maybe UTCTime)
   }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData UpdateMilestone where rnf = genericRnf
+instance NFData UpdateMilestone
 instance Binary UpdateMilestone
 
 
diff --git a/src/GitHub/Data/Name.hs b/src/GitHub/Data/Name.hs
--- a/src/GitHub/Data/Name.hs
+++ b/src/GitHub/Data/Name.hs
@@ -1,9 +1,3 @@
-{-# LANGUAGE CPP #-}
------------------------------------------------------------------------------
--- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 module GitHub.Data.Name (
     Name(..),
     mkName,
@@ -13,13 +7,11 @@
 import Prelude ()
 import GitHub.Internal.Prelude
 
-#if MIN_VERSION_aeson(1,0,0)
 import Data.Aeson.Types
        (FromJSONKey (..), ToJSONKey (..), fromJSONKeyCoerce, toJSONKeyText)
-#endif
 
 newtype Name entity = N Text
-    deriving (Eq, Ord, Show, Generic, Typeable, Data)
+    deriving (Eq, Ord, Show, Generic, Data)
 
 -- | Smart constructor for 'Name'
 mkName :: proxy entity -> Text -> Name entity
@@ -43,7 +35,6 @@
 instance IsString (Name entity) where
     fromString = N . fromString
 
-#if MIN_VERSION_aeson(1,0,0)
 -- | @since 0.15.0.0
 instance ToJSONKey (Name entity) where
     toJSONKey = toJSONKeyText untagName
@@ -51,4 +42,3 @@
 -- | @since 0.15.0.0
 instance FromJSONKey (Name entity) where
     fromJSONKey = fromJSONKeyCoerce
-#endif
diff --git a/src/GitHub/Data/Options.hs b/src/GitHub/Data/Options.hs
--- a/src/GitHub/Data/Options.hs
+++ b/src/GitHub/Data/Options.hs
@@ -1,10 +1,9 @@
 {-# LANGUAGE RecordWildCards #-}
------------------------------------------------------------------------------
+{-# LANGUAGE LambdaCase #-}
+
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- Module with modifiers for pull requests' and issues' listings.
+
 module GitHub.Data.Options (
     -- * Common modifiers
     stateOpen,
@@ -48,8 +47,34 @@
     optionsAnyAssignee,
     optionsNoAssignee,
     optionsAssignee,
+    -- * Actions artifacts
+    ArtifactMod,
+    artifactModToQueryString,
+    optionsArtifactName,
+    -- * Actions cache
+    CacheMod,
+    cacheModToQueryString,
+    optionsRef,
+    optionsNoRef,
+    optionsKey,
+    optionsNoKey,
+    optionsDirectionAsc,
+    optionsDirectionDesc,
+    sortByCreatedAt,
+    sortByLastAccessedAt,
+    sortBySizeInBytes,
+    -- * Actions workflow runs
+    WorkflowRunMod,
+    workflowRunModToQueryString,
+    optionsWorkflowRunActor,
+    optionsWorkflowRunBranch,
+    optionsWorkflowRunEvent,
+    optionsWorkflowRunStatus,
+    optionsWorkflowRunCreated,
+    optionsWorkflowRunHeadSha,
     -- * Data
     IssueState (..),
+    IssueStateReason (..),
     MergeableState (..),
     -- * Internal
     HasState,
@@ -79,7 +104,7 @@
     = StateOpen
     | StateClosed
   deriving
-    (Eq, Ord, Show, Enum, Bounded, Generic, Typeable, Data)
+    (Eq, Ord, Show, Enum, Bounded, Generic, Data)
 
 instance ToJSON IssueState where
     toJSON StateOpen    = String "open"
@@ -91,9 +116,36 @@
         "closed" -> pure StateClosed
         _        -> fail $ "Unknown IssueState: " <> T.unpack t
 
-instance NFData IssueState where rnf = genericRnf
+instance NFData IssueState
 instance Binary IssueState
 
+-- | 'GitHub.Data.Issues.Issue' state reason
+data IssueStateReason
+    = StateReasonCompleted
+    | StateReasonDuplicate
+    | StateReasonNotPlanned
+    | StateReasonReopened
+  deriving
+    (Eq, Ord, Show, Enum, Bounded, Generic, Data)
+
+instance ToJSON IssueStateReason where
+    toJSON = String . \case
+      StateReasonCompleted  -> "completed"
+      StateReasonDuplicate  -> "duplicate"
+      StateReasonNotPlanned -> "not_planned"
+      StateReasonReopened   -> "reopened"
+
+instance FromJSON IssueStateReason where
+    parseJSON = withText "IssueStateReason" $ \t -> case T.toLower t of
+        "completed"   -> pure StateReasonCompleted
+        "duplicate"   -> pure StateReasonDuplicate
+        "not_planned" -> pure StateReasonNotPlanned
+        "reopened"    -> pure StateReasonReopened
+        _ -> fail $ "Unknown IssueStateReason: " <> T.unpack t
+
+instance NFData IssueStateReason
+instance Binary IssueStateReason
+
 -- | 'GitHub.Data.PullRequests.PullRequest' mergeable_state
 data MergeableState
     = StateUnknown
@@ -104,7 +156,7 @@
     | StateBehind
     | StateDraft
   deriving
-    (Eq, Ord, Show, Enum, Bounded, Generic, Typeable, Data)
+    (Eq, Ord, Show, Enum, Bounded, Generic, Data)
 
 instance ToJSON MergeableState where
     toJSON StateUnknown  = String "unknown"
@@ -126,16 +178,16 @@
         "draft"    -> pure StateDraft
         _          -> fail $ "Unknown MergeableState: " <> T.unpack t
 
-instance NFData MergeableState where rnf = genericRnf
+instance NFData MergeableState
 instance Binary MergeableState
 
 data SortDirection
     = SortAscending
     | SortDescending
   deriving
-    (Eq, Ord, Show, Enum, Bounded, Generic, Typeable, Data)
+    (Eq, Ord, Show, Enum, Bounded, Generic, Data)
 
-instance NFData SortDirection where rnf = genericRnf
+instance NFData SortDirection
 instance Binary SortDirection
 
 -- PR
@@ -146,9 +198,9 @@
     | SortPRPopularity
     | SortPRLongRunning
   deriving
-    (Eq, Ord, Show, Enum, Bounded, Generic, Typeable, Data)
+    (Eq, Ord, Show, Enum, Bounded, Generic, Data)
 
-instance NFData SortPR where rnf = genericRnf
+instance NFData SortPR
 instance Binary SortPR
 
 -- Issue
@@ -159,9 +211,9 @@
     | IssueFilterSubscribed
     | IssueFilterAll
   deriving
-    (Eq, Ord, Show, Enum, Bounded, Generic, Typeable, Data)
+    (Eq, Ord, Show, Enum, Bounded, Generic, Data)
 
-instance NFData IssueFilter where rnf = genericRnf
+instance NFData IssueFilter
 instance Binary IssueFilter
 
 data SortIssue
@@ -169,9 +221,9 @@
     | SortIssueUpdated
     | SortIssueComments
   deriving
-    (Eq, Ord, Show, Enum, Bounded, Generic, Typeable, Data)
+    (Eq, Ord, Show, Enum, Bounded, Generic, Data)
 
-instance NFData SortIssue where rnf = genericRnf
+instance NFData SortIssue
 instance Binary SortIssue
 
 data FilterBy a
@@ -182,8 +234,20 @@
       -- ^ e.g. for milestones "any" means "any milestone".
       -- I.e. won't show issues without mileston specified
   deriving
-    (Eq, Ord, Show, Generic, Typeable, Data)
+    (Eq, Ord, Show, Generic, Data)
 
+-- Actions cache
+
+data SortCache
+    = SortCacheCreatedAt
+    | SortCacheLastAccessedAt
+    | SortCacheSizeInBytes
+  deriving
+    (Eq, Ord, Show, Enum, Bounded, Generic, Data)
+
+instance NFData SortCache
+instance Binary SortCache
+
 -------------------------------------------------------------------------------
 -- Classes
 -------------------------------------------------------------------------------
@@ -270,7 +334,7 @@
     , pullRequestOptionsDirection :: !SortDirection
     }
   deriving
-    (Eq, Ord, Show, Generic, Typeable, Data)
+    (Eq, Ord, Show, Generic, Data)
 
 defaultPullRequestOptions :: PullRequestOptions
 defaultPullRequestOptions = PullRequestOptions
@@ -365,7 +429,7 @@
     , issueOptionsSince     :: !(Maybe UTCTime)
     }
   deriving
-    (Eq, Ord, Show, Generic, Typeable, Data)
+    (Eq, Ord, Show, Generic, Data)
 
 defaultIssueOptions :: IssueOptions
 defaultIssueOptions = IssueOptions
@@ -511,7 +575,7 @@
     , issueRepoOptionsSince     :: !(Maybe UTCTime)             -- ^ 'HasSince'
     }
   deriving
-    (Eq, Ord, Show, Generic, Typeable, Data)
+    (Eq, Ord, Show, Generic, Data)
 
 defaultIssueRepoOptions :: IssueRepoOptions
 defaultIssueRepoOptions = IssueRepoOptions
@@ -640,3 +704,236 @@
 optionsAssignee :: Name User -> IssueRepoMod
 optionsAssignee u = IssueRepoMod $ \opts ->
     opts { issueRepoOptionsAssignee = FilterBy u }
+
+-------------------------------------------------------------------------------
+-- Actions artifacts
+-------------------------------------------------------------------------------
+
+-- | See <https://docs.github.com/en/rest/actions/artifacts#list-artifacts-for-a-repository>.
+data ArtifactOptions = ArtifactOptions
+    { artifactOptionsName :: !(Maybe Text)
+    }
+  deriving
+    (Eq, Ord, Show, Generic, Data)
+
+defaultArtifactOptions :: ArtifactOptions
+defaultArtifactOptions = ArtifactOptions
+    { artifactOptionsName = Nothing
+    }
+
+-- | See <https://docs.github.com/en/rest/actions/artifacts#list-artifacts-for-a-repository>.
+newtype ArtifactMod = ArtifactMod (ArtifactOptions -> ArtifactOptions)
+
+instance Semigroup ArtifactMod where
+    ArtifactMod f <> ArtifactMod g = ArtifactMod (g . f)
+
+instance Monoid ArtifactMod where
+    mempty  = ArtifactMod id
+    mappend = (<>)
+
+-- | Filters artifacts by exact match on their name field.
+optionsArtifactName :: Text -> ArtifactMod
+optionsArtifactName n = ArtifactMod $ \opts ->
+    opts { artifactOptionsName = Just n }
+
+toArtifactOptions :: ArtifactMod -> ArtifactOptions
+toArtifactOptions (ArtifactMod f) = f defaultArtifactOptions
+
+artifactModToQueryString :: ArtifactMod -> QueryString
+artifactModToQueryString = artifactOptionsToQueryString . toArtifactOptions
+
+artifactOptionsToQueryString :: ArtifactOptions -> QueryString
+artifactOptionsToQueryString (ArtifactOptions name) =
+    catMaybes
+    [ mk "name" <$> name'
+    ]
+  where
+    mk k v = (k, Just v)
+    name' = fmap TE.encodeUtf8 name
+
+-------------------------------------------------------------------------------
+-- Actions cache
+-------------------------------------------------------------------------------
+
+-- | See <https://docs.github.com/en/rest/actions/cache#list-github-actions-caches-for-a-repository>.
+data CacheOptions = CacheOptions
+    { cacheOptionsRef       :: !(Maybe Text)
+    , cacheOptionsKey       :: !(Maybe Text)
+    , cacheOptionsSort      :: !(Maybe SortCache)
+    , cacheOptionsDirection :: !(Maybe SortDirection)
+    }
+  deriving
+    (Eq, Ord, Show, Generic, Data)
+
+defaultCacheOptions :: CacheOptions
+defaultCacheOptions = CacheOptions
+    { cacheOptionsRef       = Nothing
+    , cacheOptionsKey       = Nothing
+    , cacheOptionsSort      = Nothing
+    , cacheOptionsDirection = Nothing
+    }
+
+-- | See <https://docs.github.com/en/rest/actions/cache#list-github-actions-caches-for-a-repository>.
+newtype CacheMod = CacheMod (CacheOptions -> CacheOptions)
+
+instance Semigroup CacheMod where
+    CacheMod f <> CacheMod g = CacheMod (g . f)
+
+instance Monoid CacheMod where
+    mempty  = CacheMod id
+    mappend = (<>)
+
+toCacheOptions :: CacheMod -> CacheOptions
+toCacheOptions (CacheMod f) = f defaultCacheOptions
+
+cacheModToQueryString :: CacheMod -> QueryString
+cacheModToQueryString = cacheOptionsToQueryString . toCacheOptions
+
+cacheOptionsToQueryString :: CacheOptions -> QueryString
+cacheOptionsToQueryString (CacheOptions ref key sort dir) =
+    catMaybes
+    [ mk "ref"        <$> ref'
+    , mk "key"        <$> key'
+    , mk "sort"       <$> sort'
+    , mk "directions" <$> direction'
+    ]
+  where
+    mk k v = (k, Just v)
+    sort' = sort <&> \case
+        SortCacheCreatedAt      -> "created_at"
+        SortCacheLastAccessedAt -> "last_accessed_at"
+        SortCacheSizeInBytes    -> "size_in_bytes"
+    direction' = dir <&> \case
+       SortDescending -> "desc"
+       SortAscending  -> "asc"
+    ref' = fmap TE.encodeUtf8 ref
+    key' = fmap TE.encodeUtf8 key
+
+-------------------------------------------------------------------------------
+-- Cache modifiers
+-------------------------------------------------------------------------------
+
+optionsRef :: Text -> CacheMod
+optionsRef x = CacheMod $ \opts ->
+    opts { cacheOptionsRef = Just x }
+
+optionsNoRef :: CacheMod
+optionsNoRef = CacheMod $ \opts ->
+    opts { cacheOptionsRef = Nothing }
+
+optionsKey :: Text -> CacheMod
+optionsKey x = CacheMod $ \opts ->
+    opts { cacheOptionsKey = Just x }
+
+optionsNoKey :: CacheMod
+optionsNoKey = CacheMod $ \opts ->
+    opts { cacheOptionsKey = Nothing }
+
+optionsDirectionAsc :: CacheMod
+optionsDirectionAsc = CacheMod $ \opts ->
+    opts { cacheOptionsDirection = Just SortAscending }
+
+optionsDirectionDesc :: CacheMod
+optionsDirectionDesc = CacheMod $ \opts ->
+    opts { cacheOptionsDirection = Just SortDescending }
+
+sortByCreatedAt :: CacheMod
+sortByCreatedAt = CacheMod $ \opts ->
+    opts { cacheOptionsSort = Just SortCacheCreatedAt }
+
+sortByLastAccessedAt :: CacheMod
+sortByLastAccessedAt = CacheMod $ \opts ->
+    opts { cacheOptionsSort = Just SortCacheLastAccessedAt }
+
+sortBySizeInBytes :: CacheMod
+sortBySizeInBytes = CacheMod $ \opts ->
+    opts { cacheOptionsSort = Just SortCacheSizeInBytes }
+
+-------------------------------------------------------------------------------
+-- Actions workflow runs
+-------------------------------------------------------------------------------
+
+-- | See <https://docs.github.com/en/rest/actions/workflow-runs#list-workflow-runs-for-a-repository>.
+data WorkflowRunOptions = WorkflowRunOptions
+    { workflowRunOptionsActor   :: !(Maybe Text)
+    , workflowRunOptionsBranch  :: !(Maybe Text)
+    , workflowRunOptionsEvent   :: !(Maybe Text)
+    , workflowRunOptionsStatus  :: !(Maybe Text)
+    , workflowRunOptionsCreated :: !(Maybe Text)
+    , workflowRunOptionsHeadSha :: !(Maybe Text)
+    }
+  deriving
+    (Eq, Ord, Show, Generic, Data)
+
+defaultWorkflowRunOptions :: WorkflowRunOptions
+defaultWorkflowRunOptions = WorkflowRunOptions
+    { workflowRunOptionsActor   = Nothing
+    , workflowRunOptionsBranch  = Nothing
+    , workflowRunOptionsEvent   = Nothing
+    , workflowRunOptionsStatus  = Nothing
+    , workflowRunOptionsCreated = Nothing
+    , workflowRunOptionsHeadSha = Nothing
+    }
+
+-- | See <https://docs.github.com/en/rest/actions/workflow-runs#list-workflow-runs-for-a-repository>.
+newtype WorkflowRunMod = WorkflowRunMod (WorkflowRunOptions -> WorkflowRunOptions)
+
+instance Semigroup WorkflowRunMod where
+    WorkflowRunMod f <> WorkflowRunMod g = WorkflowRunMod (g . f)
+
+instance Monoid WorkflowRunMod where
+    mempty  = WorkflowRunMod id
+    mappend = (<>)
+
+toWorkflowRunOptions :: WorkflowRunMod -> WorkflowRunOptions
+toWorkflowRunOptions (WorkflowRunMod f) = f defaultWorkflowRunOptions
+
+workflowRunModToQueryString :: WorkflowRunMod -> QueryString
+workflowRunModToQueryString = workflowRunOptionsToQueryString . toWorkflowRunOptions
+
+workflowRunOptionsToQueryString :: WorkflowRunOptions -> QueryString
+workflowRunOptionsToQueryString (WorkflowRunOptions actor branch event status created headSha) =
+    catMaybes
+    [ mk "actor"    <$> actor'
+    , mk "branch"   <$> branch'
+    , mk "event"    <$> event'
+    , mk "status"   <$> status'
+    , mk "created"  <$> created'
+    , mk "head_sha" <$> headSha'
+    ]
+  where
+    mk k v = (k, Just v)
+    actor'   = fmap TE.encodeUtf8 actor
+    branch'  = fmap TE.encodeUtf8 branch
+    event'   = fmap TE.encodeUtf8 event
+    status'  = fmap TE.encodeUtf8 status
+    created' = fmap TE.encodeUtf8 created
+    headSha' = fmap TE.encodeUtf8 headSha
+
+-------------------------------------------------------------------------------
+-- Workflow run modifiers
+-------------------------------------------------------------------------------
+
+optionsWorkflowRunActor :: Text -> WorkflowRunMod
+optionsWorkflowRunActor x = WorkflowRunMod $ \opts ->
+    opts { workflowRunOptionsActor = Just x }
+
+optionsWorkflowRunBranch :: Text -> WorkflowRunMod
+optionsWorkflowRunBranch x = WorkflowRunMod $ \opts ->
+    opts { workflowRunOptionsBranch = Just x }
+
+optionsWorkflowRunEvent :: Text -> WorkflowRunMod
+optionsWorkflowRunEvent x = WorkflowRunMod $ \opts ->
+    opts { workflowRunOptionsEvent = Just x }
+
+optionsWorkflowRunStatus :: Text -> WorkflowRunMod
+optionsWorkflowRunStatus x = WorkflowRunMod $ \opts ->
+    opts { workflowRunOptionsStatus = Just x }
+
+optionsWorkflowRunCreated :: Text -> WorkflowRunMod
+optionsWorkflowRunCreated x = WorkflowRunMod $ \opts ->
+    opts { workflowRunOptionsCreated = Just x }
+
+optionsWorkflowRunHeadSha :: Text -> WorkflowRunMod
+optionsWorkflowRunHeadSha x = WorkflowRunMod $ \opts ->
+    opts { workflowRunOptionsHeadSha = Just x }
diff --git a/src/GitHub/Data/PublicSSHKeys.hs b/src/GitHub/Data/PublicSSHKeys.hs
--- a/src/GitHub/Data/PublicSSHKeys.hs
+++ b/src/GitHub/Data/PublicSSHKeys.hs
@@ -14,7 +14,7 @@
     { basicPublicSSHKeyId        :: !(Id PublicSSHKey)
     , basicPublicSSHKeyKey       :: !Text
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
 instance FromJSON PublicSSHKeyBasic where
     parseJSON = withObject "PublicSSHKeyBasic" $ \o -> PublicSSHKeyBasic
@@ -30,7 +30,7 @@
     , publicSSHKeyCreatedAt :: !(Maybe UTCTime)
     , publicSSHKeyReadOnly  :: !Bool
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
 instance FromJSON PublicSSHKey where
     parseJSON = withObject "PublicSSHKey" $ \o -> PublicSSHKey
@@ -46,7 +46,7 @@
     { newPublicSSHKeyKey      :: !Text
     , newPublicSSHKeyTitle    :: !Text
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
 instance ToJSON NewPublicSSHKey where
     toJSON (NewPublicSSHKey key title) = object
diff --git a/src/GitHub/Data/PullRequests.hs b/src/GitHub/Data/PullRequests.hs
--- a/src/GitHub/Data/PullRequests.hs
+++ b/src/GitHub/Data/PullRequests.hs
@@ -1,8 +1,3 @@
------------------------------------------------------------------------------
--- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 module GitHub.Data.PullRequests (
     SimplePullRequest(..),
     PullRequest(..),
@@ -48,9 +43,9 @@
     , simplePullRequestTitle              :: !Text
     , simplePullRequestId                 :: !(Id PullRequest)
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData SimplePullRequest where rnf = genericRnf
+instance NFData SimplePullRequest
 instance Binary SimplePullRequest
 
 data PullRequest = PullRequest
@@ -86,9 +81,9 @@
     , pullRequestMergeable            :: !(Maybe Bool)
     , pullRequestMergeableState       :: !MergeableState
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData PullRequest where rnf = genericRnf
+instance NFData PullRequest
 instance Binary PullRequest
 
 data EditPullRequest = EditPullRequest
@@ -101,7 +96,7 @@
     }
   deriving (Show, Generic)
 
-instance NFData EditPullRequest where rnf = genericRnf
+instance NFData EditPullRequest
 instance Binary EditPullRequest
 
 data CreatePullRequest
@@ -118,7 +113,7 @@
       }
   deriving (Show, Generic)
 
-instance NFData CreatePullRequest where rnf = genericRnf
+instance NFData CreatePullRequest
 instance Binary CreatePullRequest
 
 data PullRequestLinks = PullRequestLinks
@@ -127,9 +122,9 @@
     , pullRequestLinksHtml           :: !URL
     , pullRequestLinksSelf           :: !URL
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData PullRequestLinks where rnf = genericRnf
+instance NFData PullRequestLinks
 instance Binary PullRequestLinks
 
 data PullRequestCommit = PullRequestCommit
@@ -139,9 +134,9 @@
     , pullRequestCommitUser  :: !SimpleUser
     , pullRequestCommitRepo  :: !(Maybe Repo)
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData PullRequestCommit where rnf = genericRnf
+instance NFData PullRequestCommit
 instance Binary PullRequestCommit
 
 data PullRequestEvent = PullRequestEvent
@@ -151,9 +146,9 @@
     , pullRequestRepository       :: !Repo
     , pullRequestSender           :: !SimpleUser
     }
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData PullRequestEvent where rnf = genericRnf
+instance NFData PullRequestEvent
 instance Binary PullRequestEvent
 
 data PullRequestEventType
@@ -168,9 +163,9 @@
     | PullRequestReviewRequested
     | PullRequestReviewRequestRemoved
     | PullRequestEdited
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData PullRequestEventType where rnf = genericRnf
+instance NFData PullRequestEventType
 instance Binary PullRequestEventType
 
 data PullRequestReference = PullRequestReference
@@ -178,9 +173,9 @@
     , pullRequestReferencePatchUrl :: !(Maybe URL)
     , pullRequestReferenceDiffUrl  :: !(Maybe URL)
     }
-    deriving (Eq, Ord, Show, Generic, Typeable, Data)
+    deriving (Eq, Ord, Show, Generic, Data)
 
-instance NFData PullRequestReference where rnf = genericRnf
+instance NFData PullRequestReference
 instance Binary PullRequestReference
 
 
@@ -321,4 +316,4 @@
     = MergeSuccessful
     | MergeCannotPerform
     | MergeConflict
-  deriving (Eq, Ord, Read, Show, Enum, Bounded, Generic, Typeable)
+  deriving (Eq, Ord, Read, Show, Enum, Bounded, Generic)
diff --git a/src/GitHub/Data/RateLimit.hs b/src/GitHub/Data/RateLimit.hs
--- a/src/GitHub/Data/RateLimit.hs
+++ b/src/GitHub/Data/RateLimit.hs
@@ -1,14 +1,9 @@
------------------------------------------------------------------------------
--- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 module GitHub.Data.RateLimit where
 
 import GitHub.Internal.Prelude
 import Prelude ()
 
-import Data.Time.Clock.System.Compat (SystemTime (..))
+import Data.Time.Clock.System (SystemTime (..))
 
 import qualified Data.ByteString.Char8 as BS8
 import qualified Network.HTTP.Client as HTTP
@@ -18,9 +13,9 @@
     , limitsRemaining :: !Int
     , limitsReset     :: !SystemTime
     }
-  deriving (Show, {- Data, -} Typeable, Eq, Ord, Generic)
+  deriving (Show, Eq, Ord, Generic)
 
-instance NFData Limits where rnf = genericRnf
+instance NFData Limits
 instance Binary Limits
 
 instance FromJSON Limits where
@@ -34,9 +29,9 @@
     , rateLimitSearch  :: Limits
     , rateLimitGraphQL :: Limits
     }
-  deriving (Show, {- Data, -} Typeable, Eq, Ord, Generic)
+  deriving (Show, Eq, Ord, Generic)
 
-instance NFData RateLimit where rnf = genericRnf
+instance NFData RateLimit
 instance Binary RateLimit
 
 instance FromJSON RateLimit where
diff --git a/src/GitHub/Data/Reactions.hs b/src/GitHub/Data/Reactions.hs
new file mode 100644
--- /dev/null
+++ b/src/GitHub/Data/Reactions.hs
@@ -0,0 +1,78 @@
+{-# LANGUAGE InstanceSigs #-}
+module GitHub.Data.Reactions where
+
+import qualified Data.Text as T
+import GitHub.Data.Id (Id)
+import GitHub.Data.Definitions (SimpleUser)
+import GitHub.Internal.Prelude
+import Prelude ()
+
+data Reaction = Reaction
+  { reactionId :: Id Reaction
+  , reactionUser :: !(Maybe SimpleUser)
+  , reactionContent :: !ReactionContent
+  , reactionCreatedAt :: !UTCTime
+  }
+  deriving (Show, Data, Eq, Ord, Generic)
+
+instance NFData Reaction
+instance Binary Reaction
+
+data NewReaction = NewReaction
+  { newReactionContent :: !ReactionContent
+  }
+  deriving (Show, Data, Eq, Ord, Generic)
+
+instance NFData NewReaction
+instance Binary NewReaction
+
+-- |
+-- <https://docs.github.com/en/rest/reactions/reactions?apiVersion=2022-11-28#about-reactions>
+data ReactionContent
+  = PlusOne
+  | MinusOne
+  | Laugh
+  | Confused
+  | Heart
+  | Hooray
+  | Rocket
+  | Eyes
+  deriving (Show, Data, Eq, Ord, Enum, Bounded, Generic)
+
+instance NFData ReactionContent
+instance Binary ReactionContent
+
+-- JSON instances
+
+instance FromJSON Reaction where
+  parseJSON = withObject "Reaction" $ \o ->
+    Reaction
+      <$> o .: "id"
+      <*> o .:? "user"
+      <*> o .: "content"
+      <*> o .: "created_at"
+
+instance ToJSON NewReaction where
+  toJSON (NewReaction content) = object ["content" .= content]
+
+instance FromJSON ReactionContent where
+  parseJSON = withText "ReactionContent" $ \case
+    "+1" -> pure PlusOne
+    "-1" -> pure MinusOne
+    "laugh" -> pure Laugh
+    "confused" -> pure Confused
+    "heart" -> pure Heart
+    "hooray" -> pure Hooray
+    "rocket" -> pure Rocket
+    "eyes" -> pure Eyes
+    t -> fail $ "Unknown ReactionContent: " <> T.unpack t
+
+instance ToJSON ReactionContent where
+  toJSON PlusOne = String "+1"
+  toJSON MinusOne = String "-1"
+  toJSON Laugh = String "laugh"
+  toJSON Confused = String "confused"
+  toJSON Heart = String "heart"
+  toJSON Hooray = String "hooray"
+  toJSON Rocket = String "rocket"
+  toJSON Eyes = String "eyes"
diff --git a/src/GitHub/Data/Releases.hs b/src/GitHub/Data/Releases.hs
--- a/src/GitHub/Data/Releases.hs
+++ b/src/GitHub/Data/Releases.hs
@@ -25,7 +25,7 @@
     , releaseAuthor          :: !SimpleUser
     , releaseAssets          :: !(Vector ReleaseAsset)
     }
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
 instance FromJSON Release where
     parseJSON = withObject "Event" $ \o -> Release
@@ -47,7 +47,7 @@
         <*> o .: "author"
         <*> o .: "assets"
 
-instance NFData Release where rnf = genericRnf
+instance NFData Release
 instance Binary Release
 
 data ReleaseAsset = ReleaseAsset
@@ -64,7 +64,7 @@
     , releaseAssetUpdatedAt          :: !UTCTime
     , releaseAssetUploader           :: !SimpleUser
     }
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
 instance FromJSON ReleaseAsset where
     parseJSON = withObject "Event" $ \o -> ReleaseAsset
@@ -81,5 +81,5 @@
         <*> o .: "updated_at"
         <*> o .: "uploader"
 
-instance NFData ReleaseAsset where rnf = genericRnf
+instance NFData ReleaseAsset
 instance Binary ReleaseAsset
diff --git a/src/GitHub/Data/Repos.hs b/src/GitHub/Data/Repos.hs
--- a/src/GitHub/Data/Repos.hs
+++ b/src/GitHub/Data/Repos.hs
@@ -1,14 +1,10 @@
-{-# LANGUAGE CPP               #-}
 {-# LANGUAGE FlexibleInstances #-}
-#define UNSAFE 1
------------------------------------------------------------------------------
+
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- This module also exports
 -- @'FromJSON' a => 'FromJSON' ('HM.HashMap' 'Language' a)@
 -- orphan-ish instance for @aeson < 1@
+
 module GitHub.Data.Repos where
 
 import GitHub.Data.Definitions
@@ -21,13 +17,7 @@
 
 import qualified Data.HashMap.Strict as HM
 import qualified Data.Text as T
-#if MIN_VERSION_aeson(1,0,0)
 import Data.Aeson.Types (FromJSONKey (..), fromJSONKeyCoerce)
-#else
-#ifdef UNSAFE
-import Unsafe.Coerce (unsafeCoerce)
-#endif
-#endif
 
 data Repo = Repo
     { repoId              :: !(Id Repo)
@@ -63,9 +53,9 @@
     , repoUpdatedAt       :: !(Maybe UTCTime)
     , repoPermissions     :: !(Maybe RepoPermissions) -- ^ Repository permissions as they relate to the authenticated user.
     }
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData Repo where rnf = genericRnf
+instance NFData Repo
 instance Binary Repo
 
 data CodeSearchRepo = CodeSearchRepo
@@ -98,9 +88,9 @@
     , codeSearchRepoUpdatedAt       :: !(Maybe UTCTime)
     , codeSearchRepoPermissions     :: !(Maybe RepoPermissions) -- ^ Repository permissions as they relate to the authenticated user.
     }
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData CodeSearchRepo where rnf = genericRnf
+instance NFData CodeSearchRepo
 instance Binary CodeSearchRepo
 
 -- | Repository permissions, as they relate to the authenticated user.
@@ -111,18 +101,18 @@
     , repoPermissionPush :: !Bool
     , repoPermissionPull :: !Bool
     }
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData RepoPermissions where rnf = genericRnf
+instance NFData RepoPermissions
 instance Binary RepoPermissions
 
 data RepoRef = RepoRef
     { repoRefOwner :: !SimpleOwner
     , repoRefRepo  :: !(Name Repo)
     }
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData RepoRef where rnf = genericRnf
+instance NFData RepoRef
 instance Binary RepoRef
 
 data NewRepo = NewRepo
@@ -139,9 +129,9 @@
     , newRepoAllowSquashMerge  :: !(Maybe Bool)
     , newRepoAllowMergeCommit  :: !(Maybe Bool)
     , newRepoAllowRebaseMerge  :: !(Maybe Bool)
-    } deriving (Eq, Ord, Show, Data, Typeable, Generic)
+    } deriving (Eq, Ord, Show, Data, Generic)
 
-instance NFData NewRepo where rnf = genericRnf
+instance NFData NewRepo
 instance Binary NewRepo
 
 newRepo :: Name Repo -> NewRepo
@@ -161,9 +151,9 @@
     , editAllowRebaseMerge :: !(Maybe Bool)
     , editArchived         :: !(Maybe Bool)
     }
-    deriving (Eq, Ord, Show, Data, Typeable, Generic)
+    deriving (Eq, Ord, Show, Data, Generic)
 
-instance NFData EditRepo where rnf = genericRnf
+instance NFData EditRepo
 instance Binary EditRepo
 
 -- | Filter the list of the user's repos using any of these constructors.
@@ -173,19 +163,19 @@
     | RepoPublicityPublic  -- ^ Only public repos.
     | RepoPublicityPrivate -- ^ Only private repos.
     | RepoPublicityMember  -- ^ Only repos to which the user is a member but not an owner.
-    deriving (Show, Eq, Ord, Enum, Bounded, Typeable, Data, Generic)
+    deriving (Show, Eq, Ord, Enum, Bounded, Data, Generic)
 
 -- | The value is the number of bytes of code written in that language.
 type Languages = HM.HashMap Language Int
 
 -- | A programming language.
 newtype Language = Language Text
-   deriving (Show, Data, Typeable, Eq, Ord, Generic)
+   deriving (Show, Data, Eq, Ord, Generic)
 
 getLanguage :: Language -> Text
 getLanguage (Language l) = l
 
-instance NFData Language where rnf = genericRnf
+instance NFData Language
 instance Binary Language
 instance Hashable Language where
     hashWithSalt salt (Language l) = hashWithSalt salt l
@@ -198,9 +188,9 @@
     = KnownContributor !Int !URL !(Name User) !URL !(Id User) !Text
     -- | An unknown Github user with their number of contributions and recorded name.
     | AnonymousContributor !Int !Text
-   deriving (Show, Data, Typeable, Eq, Ord, Generic)
+   deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData Contributor where rnf = genericRnf
+instance NFData Contributor
 instance Binary Contributor
 
 contributorToSimpleUser :: Contributor -> Maybe SimpleUser
@@ -215,18 +205,18 @@
     | CollaboratorPermissionWrite
     | CollaboratorPermissionRead
     | CollaboratorPermissionNone
-    deriving (Show, Data, Enum, Bounded, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Enum, Bounded, Eq, Ord, Generic)
 
-instance NFData CollaboratorPermission where rnf = genericRnf
+instance NFData CollaboratorPermission
 instance Binary CollaboratorPermission
 
 -- | A collaborator and its permission on a repository.
 -- See <https://developer.github.com/v3/repos/collaborators/#review-a-users-permission-level>
 data CollaboratorWithPermission
     = CollaboratorWithPermission SimpleUser CollaboratorPermission
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData CollaboratorWithPermission where rnf = genericRnf
+instance NFData CollaboratorWithPermission
 instance Binary CollaboratorWithPermission
 
 -- JSON instances
@@ -385,27 +375,13 @@
 instance ToJSON Language where
     toJSON = toJSON . getLanguage
 
-#if MIN_VERSION_aeson(1,0,0)
 instance FromJSONKey Language where
     fromJSONKey = fromJSONKeyCoerce
-#else
-instance FromJSON a => FromJSON (HM.HashMap Language a) where
-    parseJSON = fmap mapKeyLanguage . parseJSON
-      where
-        mapKeyLanguage :: HM.HashMap Text a -> HM.HashMap Language a
-#ifdef UNSAFE
-        mapKeyLanguage = unsafeCoerce
-#else
-        mapKeyLanguage = mapKey Language
-        mapKey :: (Eq k2, Hashable k2) => (k1 -> k2) -> HM.HashMap k1 a -> HM.HashMap k2 a
-        mapKey f = HM.fromList . map (first f) . HM.toList
-#endif
-#endif
 
 data ArchiveFormat
     = ArchiveFormatTarball -- ^ ".tar.gz" format
     | ArchiveFormatZipball -- ^ ".zip" format
-    deriving (Show, Eq, Ord, Enum, Bounded, Typeable, Data, Generic)
+    deriving (Show, Eq, Ord, Enum, Bounded, Data, Generic)
 
 instance IsPathPart ArchiveFormat where
     toPathPart af = case af of
diff --git a/src/GitHub/Data/Request.hs b/src/GitHub/Data/Request.hs
--- a/src/GitHub/Data/Request.hs
+++ b/src/GitHub/Data/Request.hs
@@ -1,13 +1,8 @@
-{-# LANGUAGE CPP                #-}
 {-# LANGUAGE FlexibleContexts   #-}
 {-# LANGUAGE GADTs              #-}
 {-# LANGUAGE KindSignatures     #-}
 {-# LANGUAGE StandaloneDeriving #-}
------------------------------------------------------------------------------
--- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
+
 module GitHub.Data.Request (
     -- * Request
     Request,
@@ -19,6 +14,8 @@
     CommandMethod(..),
     toMethod,
     FetchCount(..),
+    PageParams(..),
+    PageLinks(..),
     MediaType (..),
     Paths,
     IsPathPart(..),
@@ -34,6 +31,7 @@
 import qualified Data.ByteString.Lazy      as LBS
 import qualified Data.Text                 as T
 import qualified Network.HTTP.Types.Method as Method
+import Network.URI (URI)
 
 ------------------------------------------------------------------------------
 -- Path parts
@@ -63,7 +61,7 @@
     | Patch
     | Put
     | Delete
-  deriving (Eq, Ord, Read, Show, Enum, Bounded, Typeable, Data, Generic)
+  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Generic)
 
 instance Hashable CommandMethod
 
@@ -79,8 +77,11 @@
 
 -- | 'PagedQuery' returns just some results, using this data we can specify how
 -- many pages we want to fetch.
-data FetchCount = FetchAtLeast !Word | FetchAll
-    deriving (Eq, Ord, Read, Show, Generic, Typeable)
+data FetchCount =
+    FetchAtLeast !Word
+    | FetchAll
+    | FetchPage PageParams
+    deriving (Eq, Ord, Read, Show, Generic)
 
 
 -- | This instance is there mostly for 'fromInteger'.
@@ -99,9 +100,40 @@
 
 instance Hashable FetchCount
 instance Binary FetchCount
-instance NFData FetchCount where rnf = genericRnf
+instance NFData FetchCount
 
 -------------------------------------------------------------------------------
+-- PageParams
+-------------------------------------------------------------------------------
+
+-- | Params for specifying the precise page and items per page.
+data PageParams = PageParams {
+    pageParamsPerPage :: Maybe Int
+    , pageParamsPage :: Maybe Int
+    }
+    deriving (Eq, Ord, Read, Show, Generic)
+
+instance Hashable PageParams
+instance Binary PageParams
+instance NFData PageParams
+
+-------------------------------------------------------------------------------
+-- PageLinks
+-------------------------------------------------------------------------------
+
+-- | 'PagedQuery' returns just some results, using this data we can specify how
+-- many pages we want to fetch.
+data PageLinks = PageLinks {
+    pageLinksPrev :: Maybe URI
+    , pageLinksNext :: Maybe URI
+    , pageLinksLast :: Maybe URI
+    , pageLinksFirst :: Maybe URI
+    }
+    deriving (Eq, Ord, Show, Generic)
+
+instance NFData PageLinks
+
+-------------------------------------------------------------------------------
 -- MediaType
 -------------------------------------------------------------------------------
 
@@ -116,7 +148,7 @@
     | MtStatus     -- ^ Parse status
     | MtUnit       -- ^ Always succeeds
     | MtPreview  a -- ^ Some other (preview) type; this is an extension point.
-  deriving (Eq, Ord, Read, Show, Typeable, Data, Generic)
+  deriving (Eq, Ord, Read, Show, Data, Generic)
 
 ------------------------------------------------------------------------------
 -- RW
@@ -128,7 +160,7 @@
     = RO  -- ^ /Read-only/, doesn't necessarily requires authentication
     | RA  -- ^ /Read authenticated/
     | RW  -- ^ /Read-write/, requires authentication
-  deriving (Eq, Ord, Read, Show, Enum, Bounded, Typeable, Data, Generic)
+  deriving (Eq, Ord, Read, Show, Enum, Bounded, Data, Generic)
 
 {-
 data SRO (rw :: RW) where
@@ -162,7 +194,6 @@
         -> Paths                   -- ^ path
         -> LBS.ByteString          -- ^ body
         -> GenRequest mt 'RW a
-  deriving (Typeable)
 
 -- | Most requests ask for @JSON@.
 type Request = GenRequest 'MtJSON
diff --git a/src/GitHub/Data/Reviews.hs b/src/GitHub/Data/Reviews.hs
--- a/src/GitHub/Data/Reviews.hs
+++ b/src/GitHub/Data/Reviews.hs
@@ -16,9 +16,7 @@
     | ReviewStateChangesRequested
     deriving (Show, Enum, Bounded, Eq, Ord, Generic)
 
-instance NFData ReviewState where
-    rnf = genericRnf
-
+instance NFData ReviewState
 instance Binary ReviewState
 
 instance FromJSON ReviewState where
@@ -41,9 +39,7 @@
     , reviewId :: !(Id Review)
     } deriving (Show, Generic)
 
-instance NFData Review where
-    rnf = genericRnf
-
+instance NFData Review
 instance Binary Review
 
 instance FromJSON Review where
@@ -74,9 +70,7 @@
     , reviewCommentPullRequestUrl :: !URL
     } deriving (Show, Generic)
 
-instance NFData ReviewComment where
-    rnf = genericRnf
-
+instance NFData ReviewComment
 instance Binary ReviewComment
 
 instance FromJSON ReviewComment where
diff --git a/src/GitHub/Data/Search.hs b/src/GitHub/Data/Search.hs
--- a/src/GitHub/Data/Search.hs
+++ b/src/GitHub/Data/Search.hs
@@ -1,8 +1,3 @@
------------------------------------------------------------------------------
--- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 module GitHub.Data.Search where
 
 import GitHub.Data.Repos       (CodeSearchRepo)
@@ -16,11 +11,11 @@
     { searchResultTotalCount :: !Int
     , searchResultResults    :: !entities
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
 type SearchResult entity = SearchResult' (V.Vector entity)
 
-instance NFData entities => NFData (SearchResult' entities) where rnf = genericRnf
+instance NFData entities => NFData (SearchResult' entities)
 instance Binary entities => Binary (SearchResult' entities)
 
 instance (Monoid entities, FromJSON entities) => FromJSON (SearchResult' entities) where
@@ -43,9 +38,9 @@
     , codeHtmlUrl :: !URL
     , codeRepo    :: !CodeSearchRepo
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData Code where rnf = genericRnf
+instance NFData Code
 instance Binary Code
 
 instance FromJSON Code where
diff --git a/src/GitHub/Data/Statuses.hs b/src/GitHub/Data/Statuses.hs
--- a/src/GitHub/Data/Statuses.hs
+++ b/src/GitHub/Data/Statuses.hs
@@ -1,7 +1,5 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
 {-# LANGUAGE NoImplicitPrelude  #-}
-{-# LANGUAGE OverloadedStrings  #-}
+
 module GitHub.Data.Statuses where
 
 import GitHub.Data.Definitions
@@ -21,9 +19,9 @@
     | StatusSuccess
     | StatusError
     | StatusFailure
-  deriving (Show, Data, Enum, Bounded, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Enum, Bounded, Eq, Ord, Generic)
 
-instance NFData StatusState where rnf = genericRnf
+instance NFData StatusState
 instance Binary StatusState
 
 instance FromJSON StatusState where
@@ -52,7 +50,7 @@
     , statusContext     :: !(Maybe Text)
     , statusCreator     :: !(Maybe SimpleUser)
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
 instance FromJSON Status where
   parseJSON = withObject "Status" $ \o -> Status
@@ -73,9 +71,9 @@
     , newStatusDescription :: !(Maybe Text)
     , newStatusContext     :: !(Maybe Text)
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData NewStatus where rnf = genericRnf
+instance NFData NewStatus
 instance Binary NewStatus
 
 instance ToJSON NewStatus where
@@ -99,7 +97,7 @@
     , combinedStatusCommitUrl  :: !URL
     , combinedStatusUrl        :: !URL
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
 instance FromJSON CombinedStatus where
     parseJSON = withObject "CombinedStatus" $ \o -> CombinedStatus
diff --git a/src/GitHub/Data/Teams.hs b/src/GitHub/Data/Teams.hs
--- a/src/GitHub/Data/Teams.hs
+++ b/src/GitHub/Data/Teams.hs
@@ -1,12 +1,5 @@
-{-# LANGUAGE DeriveDataTypeable #-}
-{-# LANGUAGE DeriveGeneric      #-}
 {-# LANGUAGE NoImplicitPrelude  #-}
-{-# LANGUAGE OverloadedStrings  #-}
------------------------------------------------------------------------------
--- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
+
 module GitHub.Data.Teams where
 
 import GitHub.Data.Definitions
@@ -22,26 +15,26 @@
 data Privacy
     = PrivacyClosed
     | PrivacySecret
-    deriving (Show, Data, Enum, Bounded, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Enum, Bounded, Eq, Ord, Generic)
 
-instance NFData Privacy where rnf = genericRnf
+instance NFData Privacy
 instance Binary Privacy
 
 data Permission
     = PermissionPull
     | PermissionPush
     | PermissionAdmin
-    deriving (Show, Data, Enum, Bounded, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Enum, Bounded, Eq, Ord, Generic)
 
-instance NFData Permission where rnf = genericRnf
+instance NFData Permission
 instance Binary Permission
 
 data AddTeamRepoPermission = AddTeamRepoPermission
     { addTeamRepoPermission :: !Permission
     }
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData AddTeamRepoPermission where rnf = genericRnf
+instance NFData AddTeamRepoPermission
 instance Binary AddTeamRepoPermission
 
 data SimpleTeam = SimpleTeam
@@ -55,9 +48,9 @@
     , simpleTeamMembersUrl      :: !URL
     , simpleTeamRepositoriesUrl :: !URL
     }
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData SimpleTeam where rnf = genericRnf
+instance NFData SimpleTeam
 instance Binary SimpleTeam
 
 data Team = Team
@@ -74,9 +67,9 @@
     , teamReposCount      :: !Int
     , teamOrganization    :: !SimpleOrganization
     }
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData Team where rnf = genericRnf
+instance NFData Team
 instance Binary Team
 
 data CreateTeam = CreateTeam
@@ -86,9 +79,9 @@
     , createTeamPrivacy     :: !Privacy
     , createTeamPermission  :: !Permission
     }
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData CreateTeam where rnf = genericRnf
+instance NFData CreateTeam
 instance Binary CreateTeam
 
 data EditTeam = EditTeam
@@ -97,15 +90,15 @@
     , editTeamPrivacy     :: !(Maybe Privacy)
     , editTeamPermission  :: !(Maybe Permission)
     }
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData EditTeam where rnf = genericRnf
+instance NFData EditTeam
 instance Binary  EditTeam
 
 data Role
     = RoleMaintainer
     | RoleMember
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
 instance NFData Role
 instance Binary Role
@@ -113,9 +106,9 @@
 data ReqState
     = StatePending
     | StateActive
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData ReqState where rnf = genericRnf
+instance NFData ReqState
 instance Binary ReqState
 
 data TeamMembership = TeamMembership
@@ -123,16 +116,16 @@
     , teamMembershipRole     :: !Role
     , teamMembershipReqState :: !ReqState
     }
-    deriving (Show, Data, Typeable, Eq, Ord, Generic)
+    deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData TeamMembership where rnf = genericRnf
+instance NFData TeamMembership
 instance Binary TeamMembership
 
 data CreateTeamMembership = CreateTeamMembership {
   createTeamMembershipRole :: !Role
-} deriving (Show, Data, Typeable, Eq, Ord, Generic)
+} deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData CreateTeamMembership where rnf = genericRnf
+instance NFData CreateTeamMembership
 instance Binary CreateTeamMembership
 
 -- JSON Instances
@@ -258,4 +251,4 @@
     = TeamMemberRoleAll         -- ^ all members of the team.
     | TeamMemberRoleMaintainer  -- ^ team maintainers
     | TeamMemberRoleMember      -- ^ normal members of the team.
-    deriving (Show, Eq, Ord, Enum, Bounded, Typeable, Data, Generic)
+    deriving (Show, Eq, Ord, Enum, Bounded, Data, Generic)
diff --git a/src/GitHub/Data/URL.hs b/src/GitHub/Data/URL.hs
--- a/src/GitHub/Data/URL.hs
+++ b/src/GitHub/Data/URL.hs
@@ -1,8 +1,3 @@
------------------------------------------------------------------------------
--- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 module GitHub.Data.URL (
     URL(..),
     getUrl,
@@ -15,12 +10,12 @@
 --
 -- /N.B./ syntactical validity is not verified.
 newtype URL = URL Text
-    deriving (Eq, Ord, Show, Generic, Typeable, Data)
+    deriving (Eq, Ord, Show, Generic, Data)
 
 getUrl :: URL -> Text
 getUrl (URL url) = url
 
-instance NFData URL where rnf = genericRnf
+instance NFData URL
 instance Binary URL
 
 instance ToJSON URL where
diff --git a/src/GitHub/Data/Webhooks.hs b/src/GitHub/Data/Webhooks.hs
--- a/src/GitHub/Data/Webhooks.hs
+++ b/src/GitHub/Data/Webhooks.hs
@@ -1,8 +1,3 @@
------------------------------------------------------------------------------
--- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 module GitHub.Data.Webhooks where
 
 import GitHub.Data.Id          (Id)
@@ -25,9 +20,9 @@
     , repoWebhookUpdatedAt    :: !UTCTime
     , repoWebhookCreatedAt    :: !UTCTime
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData RepoWebhook where rnf = genericRnf
+instance NFData RepoWebhook
 instance Binary RepoWebhook
 
 -- | See <https://developer.github.com/webhooks/#events>.
@@ -90,9 +85,9 @@
     | WebhookWatchEvent
     | WebhookWorkflowDispatch
     | WebhookWorkflowRun
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData RepoWebhookEvent where rnf = genericRnf
+instance NFData RepoWebhookEvent
 instance Binary RepoWebhookEvent
 
 data RepoWebhookResponse = RepoWebhookResponse
@@ -100,9 +95,9 @@
     , repoWebhookResponseStatus  :: !(Maybe Text)
     , repoWebhookResponseMessage :: !(Maybe Text)
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData RepoWebhookResponse where rnf = genericRnf
+instance NFData RepoWebhookResponse
 instance Binary RepoWebhookResponse
 
 data PingEvent = PingEvent
@@ -110,9 +105,9 @@
     , pingEventHook   :: !RepoWebhook
     , pingEventHookId :: !(Id RepoWebhook)
     }
-  deriving (Show, Data, Typeable, Eq, Ord, Generic)
+  deriving (Show, Data, Eq, Ord, Generic)
 
-instance NFData PingEvent where rnf = genericRnf
+instance NFData PingEvent
 instance Binary PingEvent
 
 data NewRepoWebhook = NewRepoWebhook
@@ -121,9 +116,9 @@
     , newRepoWebhookEvents :: !(Maybe (Vector RepoWebhookEvent))
     , newRepoWebhookActive :: !(Maybe Bool)
     }
-  deriving (Eq, Ord, Show, Typeable, Data, Generic)
+  deriving (Eq, Ord, Show, Data, Generic)
 
-instance NFData NewRepoWebhook where rnf = genericRnf
+instance NFData NewRepoWebhook
 instance Binary NewRepoWebhook
 
 data EditRepoWebhook = EditRepoWebhook
@@ -133,9 +128,9 @@
     , editRepoWebhookRemoveEvents :: !(Maybe (Vector RepoWebhookEvent))
     , editRepoWebhookActive       :: !(Maybe Bool)
     }
-  deriving (Eq, Ord, Show, Typeable, Data, Generic)
+  deriving (Eq, Ord, Show, Data, Generic)
 
-instance NFData EditRepoWebhook where rnf = genericRnf
+instance NFData EditRepoWebhook
 instance Binary EditRepoWebhook
 
 -- JSON instances
diff --git a/src/GitHub/Data/Webhooks/Validate.hs b/src/GitHub/Data/Webhooks/Validate.hs
--- a/src/GitHub/Data/Webhooks/Validate.hs
+++ b/src/GitHub/Data/Webhooks/Validate.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- Verification of incomming webhook payloads, as described at
 -- <https://developer.github.com/webhooks/securing/>
+
 module GitHub.Data.Webhooks.Validate (
   isValidPayload
 ) where
diff --git a/src/GitHub/Endpoints/Actions/Artifacts.hs b/src/GitHub/Endpoints/Actions/Artifacts.hs
new file mode 100644
--- /dev/null
+++ b/src/GitHub/Endpoints/Actions/Artifacts.hs
@@ -0,0 +1,61 @@
+-- |
+-- The actions API as documented at
+-- <https://docs.github.com/en/rest/reference/actions>.
+
+module GitHub.Endpoints.Actions.Artifacts (
+    artifactsForR,
+    artifactR,
+    deleteArtifactR,
+    downloadArtifactR,
+    artifactsForWorkflowRunR,
+    module GitHub.Data
+    ) where
+
+import GitHub.Data
+import GitHub.Internal.Prelude
+import Network.URI             (URI)
+import Prelude ()
+
+-- | List artifacts for repository.
+-- See <https://docs.github.com/en/rest/reference/actions#list-artifacts-for-a-repository>
+artifactsForR
+    :: Name Owner
+    -> Name Repo
+    -> ArtifactMod
+    -> FetchCount
+    -> Request 'RA (WithTotalCount Artifact)
+artifactsForR user repo opts = PagedQuery
+    ["repos", toPathPart user, toPathPart repo, "actions", "artifacts"]
+    (artifactModToQueryString opts)
+
+-- | Get an artifact.
+-- See <https://docs.github.com/en/rest/reference/actions#get-an-artifact>
+artifactR :: Name Owner -> Name Repo -> Id Artifact -> Request 'RA Artifact
+artifactR user repo artid =
+    query ["repos", toPathPart user, toPathPart repo, "actions", "artifacts", toPathPart artid] []
+
+-- | Delete an artifact.
+-- See <https://docs.github.com/en/rest/reference/actions#delete-an-artifact>
+deleteArtifactR :: Name Owner -> Name Repo -> Id Comment -> GenRequest 'MtUnit 'RW ()
+deleteArtifactR user repo artid =
+    Command Delete parts mempty
+  where
+    parts = ["repos", toPathPart user, toPathPart repo, "actions", "artifacts", toPathPart artid]
+
+-- | Download an artifact.
+-- See <https://docs.github.com/en/rest/reference/actions#download-an-artifact>
+downloadArtifactR :: Name Owner -> Name Repo -> Id Artifact -> GenRequest 'MtRedirect 'RW URI
+downloadArtifactR user repo artid =
+    Query ["repos", toPathPart user, toPathPart repo, "actions", "artifacts", toPathPart artid, "zip"] []
+
+-- | List artifacts for a workflow run.
+-- See <https://docs.github.com/en/rest/reference/actions#list-workflow-run-artifacts>
+artifactsForWorkflowRunR
+    :: Name Owner
+    -> Name Repo
+    -> Id WorkflowRun
+    -> FetchCount
+    -> Request 'RA (WithTotalCount Artifact)
+artifactsForWorkflowRunR user repo runid  = PagedQuery
+    ["repos", toPathPart user, toPathPart repo, "actions", "runs", toPathPart runid, "artifacts"]
+    []
diff --git a/src/GitHub/Endpoints/Actions/Cache.hs b/src/GitHub/Endpoints/Actions/Cache.hs
new file mode 100644
--- /dev/null
+++ b/src/GitHub/Endpoints/Actions/Cache.hs
@@ -0,0 +1,66 @@
+-- |
+-- The actions API as documented at
+-- <https://docs.github.com/en/rest/reference/actions>.
+
+module GitHub.Endpoints.Actions.Cache (
+    cacheUsageOrganizationR,
+    cacheUsageByRepositoryR,
+    cacheUsageR,
+    cachesForRepoR,
+    deleteCacheR,
+    module GitHub.Data
+    ) where
+
+import GitHub.Data
+import GitHub.Internal.Prelude
+import Prelude ()
+
+-- | Get Actions cache usage for the organization.
+-- See <https://docs.github.com/en/rest/actions/cache#get-github-actions-cache-usage-for-an-organization>
+cacheUsageOrganizationR
+    :: Name Organization
+    -> GenRequest 'MtJSON 'RA OrganizationCacheUsage
+cacheUsageOrganizationR org =
+    Query ["orgs", toPathPart org, "actions", "cache", "usage"] []
+
+-- | List repositories with GitHub Actions cache usage for an organization.
+-- See <https://docs.github.com/en/rest/actions/cache#list-repositories-with-github-actions-cache-usage-for-an-organization>
+cacheUsageByRepositoryR
+    :: Name Organization
+    -> FetchCount
+    -> GenRequest 'MtJSON 'RA (WithTotalCount RepositoryCacheUsage)
+cacheUsageByRepositoryR org =
+    PagedQuery ["orgs", toPathPart org, "actions", "cache", "usage-by-repository"] []
+
+-- | Get GitHub Actions cache usage for a repository.
+-- See <https://docs.github.com/en/rest/actions/cache#get-github-actions-cache-usage-for-a-repository>
+cacheUsageR
+    :: Name Owner
+    -> Name Repo
+    -> Request k RepositoryCacheUsage
+cacheUsageR user repo =
+    Query ["repos", toPathPart user, toPathPart repo, "actions", "cache", "usage"] []
+
+-- | List the GitHub Actions caches for a repository.
+-- See <https://docs.github.com/en/rest/actions/cache#list-github-actions-caches-for-a-repository>
+cachesForRepoR
+    :: Name Owner
+    -> Name Repo
+    -> CacheMod
+    -> FetchCount
+    -> GenRequest 'MtJSON 'RA (WithTotalCount Cache)
+cachesForRepoR user repo opts = PagedQuery
+    ["repos", toPathPart user, toPathPart repo, "actions", "caches"]
+    (cacheModToQueryString opts)
+
+-- | Delete GitHub Actions cache for a repository.
+-- See <https://docs.github.com/en/rest/actions/cache#delete-a-github-actions-cache-for-a-repository-using-a-cache-id>
+deleteCacheR
+    :: Name Owner
+    -> Name Repo
+    -> Id Cache
+    -> GenRequest 'MtUnit 'RW ()
+deleteCacheR user repo cacheid =
+    Command Delete parts mempty
+  where
+    parts = ["repos", toPathPart user, toPathPart repo, "actions", "caches", toPathPart cacheid]
diff --git a/src/GitHub/Endpoints/Actions/Secrets.hs b/src/GitHub/Endpoints/Actions/Secrets.hs
new file mode 100644
--- /dev/null
+++ b/src/GitHub/Endpoints/Actions/Secrets.hs
@@ -0,0 +1,221 @@
+-- |
+-- The actions API as documented at
+-- <https://docs.github.com/en/rest/reference/actions>.
+
+module GitHub.Endpoints.Actions.Secrets (
+    organizationSecretsR,
+    organizationPublicKeyR,
+    organizationSecretR,
+    setOrganizationSecretR,
+    deleteOrganizationSecretR,
+    organizationSelectedRepositoriesForSecretR,
+    setOrganizationSelectedRepositoriesForSecretR,
+    addOrganizationSelectedRepositoriesForSecretR,
+    removeOrganizationSelectedRepositoriesForSecretR,
+    repoSecretsR,
+    repoPublicKeyR,
+    repoSecretR,
+    setRepoSecretR,
+    deleteRepoSecretR,
+    environmentSecretsR,
+    environmentPublicKeyR,
+    environmentSecretR,
+    setEnvironmentSecretR,
+    deleteEnvironmentSecretR,
+    module GitHub.Data
+    ) where
+
+import GitHub.Data
+import GitHub.Internal.Prelude
+import Prelude ()
+
+-- | List organization secrets.
+-- See <https://docs.github.com/en/rest/actions/secrets#list-organization-secrets>
+organizationSecretsR
+    :: Name Organization
+    -> FetchCount
+    -> GenRequest 'MtJSON 'RA (WithTotalCount OrganizationSecret)
+organizationSecretsR org =
+    PagedQuery ["orgs", toPathPart org, "actions", "secrets"] []
+
+-- | List organization secrets.
+-- See <https://docs.github.com/en/rest/actions/secrets#get-an-organization-public-key>
+organizationPublicKeyR
+    :: Name Organization
+    -> GenRequest 'MtJSON 'RA PublicKey
+organizationPublicKeyR org =
+    Query ["orgs", toPathPart org, "actions", "secrets", "public-key"] []
+
+-- | Get an organization secret.
+-- See <https://docs.github.com/en/rest/actions/secrets#get-an-organization-secret>
+organizationSecretR
+    :: Name Organization
+    -> Name OrganizationSecret
+    -> GenRequest 'MtJSON 'RA OrganizationSecret
+organizationSecretR org name =
+    Query ["orgs", toPathPart org, "actions", "secrets", toPathPart name] []
+
+-- | Create or update an organization secret.
+-- See <https://docs.github.com/en/rest/actions/secrets#create-or-update-an-organization-secret>
+setOrganizationSecretR
+    :: Name Organization
+    -> Name OrganizationSecret
+    -> SetSecret
+    -> GenRequest 'MtUnit 'RW ()
+setOrganizationSecretR org name =
+    Command Put ["orgs", toPathPart org, "actions", "secrets", toPathPart name] . encode
+
+-- | Delete an organization secret.
+-- See <https://docs.github.com/en/rest/actions/secrets#delete-an-organization-secret>
+deleteOrganizationSecretR
+    :: Name Organization
+    -> Name OrganizationSecret
+    -> GenRequest 'MtUnit 'RW ()
+deleteOrganizationSecretR org name =
+    Command Delete parts mempty
+    where
+        parts = ["orgs", toPathPart org, "actions", "secrets", toPathPart name]
+
+-- | Get selected repositories for an organization secret.
+-- See <https://docs.github.com/en/rest/actions/secrets#list-selected-repositories-for-an-organization-secret>
+organizationSelectedRepositoriesForSecretR
+    :: Name Organization
+    -> Name OrganizationSecret
+    -> FetchCount
+    -> GenRequest 'MtJSON 'RA (WithTotalCount SelectedRepo)
+organizationSelectedRepositoriesForSecretR org name =
+    PagedQuery ["orgs", toPathPart org, "actions", "secrets", toPathPart name, "repositories"] []
+
+-- | Set selected repositories for an organization secret.
+-- See <https://docs.github.com/en/rest/actions/secrets#set-selected-repositories-for-an-organization-secret>
+setOrganizationSelectedRepositoriesForSecretR
+    :: Name Organization
+    -> Name OrganizationSecret
+    -> SetSelectedRepositories
+    -> GenRequest 'MtUnit 'RW ()
+setOrganizationSelectedRepositoriesForSecretR org name =
+    Command Put ["orgs", toPathPart org, "actions", "secrets", toPathPart name, "repositories"]  . encode
+
+-- | Add selected repository to an organization secret.
+-- See <https://docs.github.com/en/rest/actions/secrets#add-selected-repository-to-an-organization-secret>
+addOrganizationSelectedRepositoriesForSecretR
+    :: Name Organization
+    -> Name OrganizationSecret
+    -> Id Repo
+    -> GenRequest 'MtUnit 'RW ()
+addOrganizationSelectedRepositoriesForSecretR org name repo =
+    Command Put ["orgs", toPathPart org, "actions", "secrets", toPathPart name, "repositories", toPathPart repo] mempty
+
+-- | Remove selected repository from an organization secret.
+-- See <https://docs.github.com/en/rest/actions/secrets#remove-selected-repository-from-an-organization-secret>
+removeOrganizationSelectedRepositoriesForSecretR
+    :: Name Organization
+    -> Name OrganizationSecret
+    -> Id Repo
+    -> GenRequest 'MtUnit 'RW ()
+removeOrganizationSelectedRepositoriesForSecretR org name repo =
+    Command Delete ["orgs", toPathPart org, "actions", "secrets", toPathPart name, "repositories", toPathPart repo] mempty
+
+-- | List repository secrets.
+-- See <https://docs.github.com/en/rest/actions/secrets#list-repository-secrets>
+repoSecretsR
+    :: Name Owner
+    -> Name Repo
+    -> FetchCount
+    -> GenRequest 'MtJSON 'RA (WithTotalCount RepoSecret)
+repoSecretsR user repo =
+    PagedQuery ["repos", toPathPart user,  toPathPart repo, "actions", "secrets"] []
+
+-- | Get a repository public key.
+-- See <https://docs.github.com/en/rest/actions/secrets#get-a-repository-public-key>
+repoPublicKeyR
+    :: Name Owner
+    -> Name Organization
+    -> GenRequest 'MtJSON 'RA PublicKey
+repoPublicKeyR user org =
+    Query ["repos", toPathPart user, toPathPart org, "actions", "secrets", "public-key"] []
+
+-- | Get a repository secret.
+-- See <https://docs.github.com/en/rest/actions/secrets#get-a-repository-secret>
+repoSecretR
+    :: Name Owner
+    -> Name Organization
+    -> Name RepoSecret
+    -> GenRequest 'MtJSON 'RA RepoSecret
+repoSecretR user org name =
+    Query ["repos", toPathPart user, toPathPart org, "actions", "secrets", toPathPart name] []
+
+-- | Create or update a repository secret.
+-- See <https://docs.github.com/en/rest/actions/secrets#create-or-update-a-repository-secret>
+setRepoSecretR
+    :: Name Owner
+    -> Name Organization
+    -> Name RepoSecret
+    -> SetRepoSecret
+    -> GenRequest 'MtUnit 'RW ()
+setRepoSecretR user org name =
+    Command Put ["repos", toPathPart user, toPathPart org, "actions", "secrets", toPathPart name] . encode
+
+-- | Delete a repository secret.
+-- See <https://docs.github.com/en/rest/actions/secrets#delete-a-repository-secret>
+deleteRepoSecretR
+    :: Name Owner
+    -> Name Organization
+    -> Name RepoSecret
+    -> GenRequest 'MtUnit 'RW ()
+deleteRepoSecretR user org name =
+    Command Delete parts mempty
+    where
+        parts = ["repos", toPathPart user, toPathPart org, "actions", "secrets", toPathPart name]
+
+-- | List environment secrets.
+-- See <https://docs.github.com/en/rest/actions/secrets#list-environment-secrets>
+environmentSecretsR
+    :: Id Repo
+    -> Name Environment
+    -> FetchCount
+    -> GenRequest 'MtJSON 'RA (WithTotalCount RepoSecret)
+environmentSecretsR repo env =
+    PagedQuery ["repositories", toPathPart repo, "environments", toPathPart env, "secrets"] []
+
+-- | Get an environment public key.
+-- See <https://docs.github.com/en/rest/actions/secrets#get-an-environment-public-key>
+environmentPublicKeyR
+    :: Id Repo
+    -> Name Environment
+    -> GenRequest 'MtJSON 'RA PublicKey
+environmentPublicKeyR repo env =
+    Query ["repositories", toPathPart repo, "environments", toPathPart env, "secrets", "public-key"] []
+
+-- | Get an environment secret
+-- See <https://docs.github.com/en/rest/actions/secrets#get-an-environment-secret>
+environmentSecretR
+    :: Id Repo
+    -> Name Environment
+    -> Name RepoSecret
+    -> GenRequest 'MtJSON 'RA RepoSecret
+environmentSecretR repo env name =
+    Query ["repositories", toPathPart repo, "environments", toPathPart env, "secrets", toPathPart name] []
+
+-- | Create or update an environment secret.
+-- See <https://docs.github.com/en/rest/actions/secrets#create-or-update-an-environment-secret>
+setEnvironmentSecretR
+    :: Id Repo
+    -> Name Environment
+    -> Name RepoSecret
+    -> SetRepoSecret
+    -> GenRequest 'MtUnit 'RW ()
+setEnvironmentSecretR repo env name =
+    Command Put ["repositories", toPathPart repo, "environments", toPathPart env, "secrets", toPathPart name] . encode
+
+-- | Delete an environment secret.
+-- See <https://docs.github.com/en/rest/actions/secrets#delete-an-environment-secret>
+deleteEnvironmentSecretR
+    :: Id Repo
+    -> Name Environment
+    -> Name RepoSecret
+    -> GenRequest 'MtUnit 'RW ()
+deleteEnvironmentSecretR repo env name =
+    Command Delete parts mempty
+    where
+        parts = ["repositories", toPathPart repo, "environments", toPathPart env, "secrets", toPathPart name]
diff --git a/src/GitHub/Endpoints/Actions/WorkflowJobs.hs b/src/GitHub/Endpoints/Actions/WorkflowJobs.hs
new file mode 100644
--- /dev/null
+++ b/src/GitHub/Endpoints/Actions/WorkflowJobs.hs
@@ -0,0 +1,58 @@
+-- |
+-- The actions API as documented at
+-- <https://docs.github.com/en/rest/reference/actions>.
+
+module GitHub.Endpoints.Actions.WorkflowJobs (
+    jobR,
+    downloadJobLogsR,
+    jobsForWorkflowRunAttemptR,
+    jobsForWorkflowRunR,
+    module GitHub.Data
+    ) where
+
+import GitHub.Data
+import Network.URI (URI)
+import Prelude ()
+
+-- | Get a job for a workflow run.
+-- See <https://docs.github.com/en/rest/actions/workflow-jobs#get-a-job-for-a-workflow-run>
+jobR
+    :: Name Owner
+    -> Name Repo
+    -> Id Job
+    -> Request 'RA Job
+jobR owner repo job =
+    Query ["repos", toPathPart owner, toPathPart repo, "actions", "jobs", toPathPart job] []
+
+-- | Download job logs for a workflow run.
+-- See <https://docs.github.com/en/rest/actions/workflow-jobs#download-job-logs-for-a-workflow-run>
+downloadJobLogsR
+    :: Name Owner
+    -> Name Repo
+    -> Id Job
+    -> GenRequest 'MtRedirect 'RO URI
+downloadJobLogsR owner repo job =
+    Query ["repos", toPathPart owner, toPathPart repo, "actions", "jobs", toPathPart job, "logs"] []
+
+-- | List jobs for a workflow run attempt.
+-- See <https://docs.github.com/en/rest/actions/workflow-jobs#list-jobs-for-a-workflow-run-attempt>
+jobsForWorkflowRunAttemptR
+    :: Name Owner
+    -> Name Repo
+    -> Id WorkflowRun
+    -> Id RunAttempt
+    -> FetchCount
+    -> GenRequest 'MtJSON 'RA (WithTotalCount Job)
+jobsForWorkflowRunAttemptR owner repo run attempt =
+    PagedQuery ["repos", toPathPart owner, toPathPart repo, "actions", "runs", toPathPart run, "attempts", toPathPart attempt, "jobs"] []
+
+-- | List jobs for a workflow run.
+-- See <https://docs.github.com/en/rest/actions/workflow-jobs#list-jobs-for-a-workflow-run>
+jobsForWorkflowRunR
+    :: Name Owner
+    -> Name Repo
+    -> Id WorkflowRun
+    -> FetchCount
+    -> GenRequest 'MtJSON 'RA (WithTotalCount Job)
+jobsForWorkflowRunR owner repo run =
+    PagedQuery ["repos", toPathPart owner, toPathPart repo, "actions", "runs", toPathPart run, "jobs"] []
diff --git a/src/GitHub/Endpoints/Actions/WorkflowRuns.hs b/src/GitHub/Endpoints/Actions/WorkflowRuns.hs
new file mode 100644
--- /dev/null
+++ b/src/GitHub/Endpoints/Actions/WorkflowRuns.hs
@@ -0,0 +1,181 @@
+module GitHub.Endpoints.Actions.WorkflowRuns (
+    reRunJobR,
+    workflowRunsR,
+    workflowRunR,
+    deleteWorkflowRunR,
+    workflowRunReviewHistoryR,
+    approveWorkflowRunR,
+    workflowRunAttemptR,
+    downloadWorkflowRunAttemptLogsR,
+    cancelWorkflowRunR,
+    downloadWorkflowRunLogsR,
+    deleteWorkflowRunLogsR,
+    reRunWorkflowR,
+    reRunFailedJobsR,
+    workflowRunsForWorkflowR,
+    module GitHub.Data
+    ) where
+
+import GitHub.Data
+import GitHub.Internal.Prelude
+import Network.URI             (URI)
+import Prelude ()
+
+-- | Re-run a job from a workflow run.
+-- See <https://docs.github.com/en/rest/actions/workflow-runs#re-run-a-job-from-a-workflow-run>
+reRunJobR
+    :: Name Owner
+    -> Name Repo
+    -> Id Job
+    -> GenRequest 'MtUnit 'RW ()
+reRunJobR user repo job = Command Post
+    ["repos", toPathPart user, toPathPart repo, "actions", "jobs", toPathPart job, "rerun"]
+    mempty
+
+-- | List workflow runs for a repository.
+-- See <https://docs.github.com/en/rest/actions/workflow-runs#list-workflow-runs-for-a-repository>
+workflowRunsR
+    :: Name Owner
+    -> Name Repo
+    -> WorkflowRunMod
+    -> FetchCount
+    -> GenRequest 'MtJSON 'RA (WithTotalCount WorkflowRun)
+workflowRunsR user repo runMod = PagedQuery
+    ["repos", toPathPart user, toPathPart repo, "actions", "runs"]
+    (workflowRunModToQueryString runMod)
+
+-- | Get a workflow run.
+-- See <https://docs.github.com/en/rest/actions/workflow-runs#get-a-workflow-run>
+workflowRunR
+    :: Name Owner
+    -> Name Repo
+    -> Id WorkflowRun
+    -> GenRequest 'MtJSON 'RA WorkflowRun
+workflowRunR user repo run = Query
+    ["repos", toPathPart user, toPathPart repo, "actions", "runs", toPathPart run]
+    []
+
+-- | Delete a workflow run.
+-- See <https://docs.github.com/en/rest/actions/workflow-runs#delete-a-workflow-run>
+deleteWorkflowRunR
+    :: Name Owner
+    -> Name Repo
+    -> Id WorkflowRun
+    -> GenRequest 'MtUnit 'RW ()
+deleteWorkflowRunR user repo run = Command Delete
+    ["repos", toPathPart user, toPathPart repo, "actions", "runs", toPathPart run]
+    mempty
+
+-- | Get the review history for a workflow run.
+-- See <https://docs.github.com/en/rest/actions/workflow-runs#get-the-review-history-for-a-workflow-run>
+workflowRunReviewHistoryR
+    :: Name Owner
+    -> Name Repo
+    -> Id WorkflowRun
+    -> GenRequest 'MtJSON 'RA (Vector ReviewHistory)
+workflowRunReviewHistoryR user repo run = Query
+    ["repos", toPathPart user, toPathPart repo, "actions", "runs", toPathPart run, "approvals"]
+    []
+
+-- | Approve a workflow run for a fork pull request.
+-- See <https://docs.github.com/en/rest/actions/workflow-runs#approve-a-workflow-run-for-a-fork-pull-request>
+approveWorkflowRunR
+    :: Name Owner
+    -> Name Repo
+    -> Id WorkflowRun
+    -> GenRequest 'MtUnit 'RW ()
+approveWorkflowRunR user repo run = Command Post
+    ["repos", toPathPart user, toPathPart repo, "actions", "runs", toPathPart run, "approve"]
+    mempty
+
+-- | Get a workflow run attempt.
+-- See <https://docs.github.com/en/rest/actions/workflow-runs#get-a-workflow-run-attempt>
+workflowRunAttemptR
+    :: Name Owner
+    -> Name Repo
+    -> Id WorkflowRun
+    -> Id RunAttempt
+    -> GenRequest 'MtJSON 'RA WorkflowRun
+workflowRunAttemptR user repo run attempt = Query
+    ["repos", toPathPart user, toPathPart repo, "actions", "runs", toPathPart run, "attempts", toPathPart attempt]
+    []
+
+-- | Download workflow run attempt logs.
+-- See <https://docs.github.com/en/rest/actions/workflow-runs#download-workflow-run-attempt-logs>
+downloadWorkflowRunAttemptLogsR
+    :: Name Owner
+    -> Name Repo
+    -> Id WorkflowRun
+    -> Id RunAttempt
+    -> GenRequest 'MtRedirect 'RO URI
+downloadWorkflowRunAttemptLogsR user repo run attempt = Query
+    ["repos", toPathPart user, toPathPart repo, "actions", "runs", toPathPart run, "attempts", toPathPart attempt, "logs"]
+    []
+
+-- | Cancel a workflow run.
+-- See <https://docs.github.com/en/rest/actions/workflow-runs#cancel-a-workflow-run>
+cancelWorkflowRunR
+    :: Name Owner
+    -> Name Repo
+    -> Id WorkflowRun
+    -> GenRequest 'MtUnit 'RW ()
+cancelWorkflowRunR user repo run = Command Post
+    ["repos", toPathPart user, toPathPart repo, "actions", "runs", toPathPart run, "cancel"]
+    mempty
+
+-- | Download workflow run logs.
+-- See <https://docs.github.com/en/rest/actions/workflow-runs#download-workflow-run-logs>
+downloadWorkflowRunLogsR
+    :: Name Owner
+    -> Name Repo
+    -> Id WorkflowRun
+    -> GenRequest 'MtRedirect 'RA URI
+downloadWorkflowRunLogsR user repo run = Query
+    ["repos", toPathPart user, toPathPart repo, "actions", "runs", toPathPart run, "logs"]
+    []
+
+-- | Delete workflow run logs.
+-- See <https://docs.github.com/en/rest/actions/workflow-runs#delete-workflow-run-logs>
+deleteWorkflowRunLogsR
+    :: Name Owner
+    -> Name Repo
+    -> Id WorkflowRun
+    ->  GenRequest 'MtUnit 'RW ()
+deleteWorkflowRunLogsR user repo run = Command Delete
+    ["repos", toPathPart user, toPathPart repo, "actions", "runs", toPathPart run, "logs"]
+    mempty
+
+-- | Re-run a workflow.
+-- See <https://docs.github.com/en/rest/actions/workflow-runs#re-run-a-workflow>
+reRunWorkflowR
+    :: Name Owner
+    -> Name Repo
+    -> Id WorkflowRun
+    -> GenRequest 'MtUnit 'RW ()
+reRunWorkflowR user repo run = Command Post
+    ["repos", toPathPart user, toPathPart repo, "actions", "runs", toPathPart run, "rerun"]
+    mempty
+
+-- | Re-run failed jobs from a workflow run.
+-- See <https://docs.github.com/en/rest/actions/re-run-failed-jobs-from-a-workflow-run>
+reRunFailedJobsR
+    :: Name Owner
+    -> Name Repo
+    -> Id WorkflowRun
+    -> GenRequest 'MtUnit 'RW ()
+reRunFailedJobsR user repo run = Command Post
+    ["repos", toPathPart user, toPathPart repo, "actions", "runs", toPathPart run, "rerun-failed-jobs"]
+    mempty
+
+-- | List workflow runs for a workflow.
+-- See <https://docs.github.com/en/rest/actions/workflow-runs#list-workflow-runs-for-a-workflow>
+workflowRunsForWorkflowR
+    :: (IsPathPart idOrName) => Name Owner
+    -> Name Repo
+    -> idOrName
+    -> WorkflowRunMod
+    -> FetchCount
+    -> GenRequest 'MtJSON 'RA (WithTotalCount WorkflowRun)
+workflowRunsForWorkflowR user repo idOrName runMod = PagedQuery
+    ["repos", toPathPart user, toPathPart repo, "actions", "workflows", toPathPart idOrName, "runs"]
+     (workflowRunModToQueryString runMod)
diff --git a/src/GitHub/Endpoints/Actions/Workflows.hs b/src/GitHub/Endpoints/Actions/Workflows.hs
new file mode 100644
--- /dev/null
+++ b/src/GitHub/Endpoints/Actions/Workflows.hs
@@ -0,0 +1,68 @@
+module GitHub.Endpoints.Actions.Workflows (
+    repositoryWorkflowsR,
+    workflowR,
+    disableWorkflowR,
+    triggerWorkflowR,
+    enableWorkflowR,
+    module GitHub.Data
+    ) where
+
+import GitHub.Data
+import GitHub.Internal.Prelude
+import Prelude ()
+
+-- | List repository workflows.
+-- See <https://docs.github.com/en/rest/actions/workflows#list-repository-workflows>
+repositoryWorkflowsR
+    :: Name Owner
+    -> Name Repo
+    -> FetchCount
+    -> GenRequest 'MtJSON 'RA (WithTotalCount Workflow)
+repositoryWorkflowsR user repo  = PagedQuery
+    ["repos", toPathPart user, toPathPart repo, "actions", "workflows"]
+    []
+
+-- | Get a workflow.
+-- See <https://docs.github.com/en/rest/actions/workflows#get-a-workflow>
+workflowR
+    :: (IsPathPart idOrName) => Name Owner
+    -> Name Repo
+    -> idOrName
+    -> GenRequest 'MtJSON 'RA  Workflow
+workflowR user repo idOrName  = Query
+    ["repos", toPathPart user, toPathPart repo, "actions", "workflows", toPathPart idOrName]
+    []
+
+-- | Disable a workflow.
+-- See <https://docs.github.com/en/rest/actions/workflows#disable-a-workflow>
+disableWorkflowR
+    :: (IsPathPart idOrName) => Name Owner
+    -> Name Repo
+    -> idOrName
+    -> GenRequest 'MtUnit 'RW  ()
+disableWorkflowR user repo idOrName  = Command Put
+    ["repos", toPathPart user, toPathPart repo, "actions", "workflows", toPathPart idOrName, "disable"]
+    mempty
+
+-- | Create a workflow dispatch event.
+-- See <https://docs.github.com/en/rest/actions/workflows#create-a-workflow-dispatch-event>
+triggerWorkflowR
+    :: (ToJSON a, IsPathPart idOrName) => Name Owner
+    -> Name Repo
+    -> idOrName
+    -> CreateWorkflowDispatchEvent a
+    -> GenRequest 'MtUnit 'RW  ()
+triggerWorkflowR user repo idOrName  = Command Post
+    ["repos", toPathPart user, toPathPart repo, "actions", "workflows", toPathPart idOrName, "dispatches"]
+    . encode
+
+-- | Enable a workflow.
+-- See <https://docs.github.com/en/rest/actions/workflows#enable-a-workflow>
+enableWorkflowR
+    :: (IsPathPart idOrName) => Name Owner
+    -> Name Repo
+    -> idOrName
+    -> GenRequest 'MtUnit 'RW  ()
+enableWorkflowR user repo idOrName  = Command Put
+    ["repos", toPathPart user, toPathPart repo, "actions", "workflows", toPathPart idOrName, "enable"]
+    mempty
diff --git a/src/GitHub/Endpoints/Activity/Events.hs b/src/GitHub/Endpoints/Activity/Events.hs
--- a/src/GitHub/Endpoints/Activity/Events.hs
+++ b/src/GitHub/Endpoints/Activity/Events.hs
@@ -1,9 +1,6 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The events API as described on <https://developer.github.com/v3/activity/events/>.
+
 module GitHub.Endpoints.Activity.Events (
     -- * Events
     repositoryEventsR,
diff --git a/src/GitHub/Endpoints/Activity/Notifications.hs b/src/GitHub/Endpoints/Activity/Notifications.hs
--- a/src/GitHub/Endpoints/Activity/Notifications.hs
+++ b/src/GitHub/Endpoints/Activity/Notifications.hs
@@ -1,8 +1,4 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The repo watching API as described on
 -- <https://developer.github.com/v3/activity/notifications/>.
 
diff --git a/src/GitHub/Endpoints/Activity/Starring.hs b/src/GitHub/Endpoints/Activity/Starring.hs
--- a/src/GitHub/Endpoints/Activity/Starring.hs
+++ b/src/GitHub/Endpoints/Activity/Starring.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The repo starring API as described on
 -- <https://developer.github.com/v3/activity/starring/>.
+
 module GitHub.Endpoints.Activity.Starring (
     stargazersForR,
     reposStarredByR,
diff --git a/src/GitHub/Endpoints/Activity/Watching.hs b/src/GitHub/Endpoints/Activity/Watching.hs
--- a/src/GitHub/Endpoints/Activity/Watching.hs
+++ b/src/GitHub/Endpoints/Activity/Watching.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The repo watching API as described on
 -- <https://developer.github.com/v3/activity/watching/>.
+
 module GitHub.Endpoints.Activity.Watching (
     watchersForR,
     reposWatchedByR,
diff --git a/src/GitHub/Endpoints/Enterprise/Organizations.hs b/src/GitHub/Endpoints/Enterprise/Organizations.hs
--- a/src/GitHub/Endpoints/Enterprise/Organizations.hs
+++ b/src/GitHub/Endpoints/Enterprise/Organizations.hs
@@ -1,9 +1,6 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The GitHub Enterprise orgs API as described on <https://developer.github.com/enterprise/v3/enterprise-admin/orgs/>.
+
 module GitHub.Endpoints.Enterprise.Organizations (
     createOrganizationR,
     renameOrganizationR,
diff --git a/src/GitHub/Endpoints/Gists.hs b/src/GitHub/Endpoints/Gists.hs
--- a/src/GitHub/Endpoints/Gists.hs
+++ b/src/GitHub/Endpoints/Gists.hs
@@ -1,9 +1,6 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The gists API as described at <http://developer.github.com/v3/gists/>.
+
 module GitHub.Endpoints.Gists (
     gistsR,
     gistR,
diff --git a/src/GitHub/Endpoints/Gists/Comments.hs b/src/GitHub/Endpoints/Gists/Comments.hs
--- a/src/GitHub/Endpoints/Gists/Comments.hs
+++ b/src/GitHub/Endpoints/Gists/Comments.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The loving comments people have left on Gists, described on
 -- <http://developer.github.com/v3/gists/comments/>.
+
 module GitHub.Endpoints.Gists.Comments (
     commentsOnR,
     gistCommentR,
diff --git a/src/GitHub/Endpoints/GitData/Blobs.hs b/src/GitHub/Endpoints/GitData/Blobs.hs
--- a/src/GitHub/Endpoints/GitData/Blobs.hs
+++ b/src/GitHub/Endpoints/GitData/Blobs.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The API for dealing with git blobs from Github repos, as described in
 -- <http://developer.github.com/v3/git/blobs/>.
+
 module GitHub.Endpoints.GitData.Blobs (
     blobR,
     module GitHub.Data,
diff --git a/src/GitHub/Endpoints/GitData/Commits.hs b/src/GitHub/Endpoints/GitData/Commits.hs
--- a/src/GitHub/Endpoints/GitData/Commits.hs
+++ b/src/GitHub/Endpoints/GitData/Commits.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The API for underlying git commits of a Github repo, as described on
 -- <http://developer.github.com/v3/git/commits/>.
+
 module GitHub.Endpoints.GitData.Commits (
     gitCommitR,
     module GitHub.Data,
diff --git a/src/GitHub/Endpoints/GitData/References.hs b/src/GitHub/Endpoints/GitData/References.hs
--- a/src/GitHub/Endpoints/GitData/References.hs
+++ b/src/GitHub/Endpoints/GitData/References.hs
@@ -1,11 +1,8 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The underlying git references on a Github repo, exposed for the world to
 -- see. The git internals documentation will also prove handy for understanding
 -- these. API documentation at <http://developer.github.com/v3/git/refs/>.
+
 module GitHub.Endpoints.GitData.References (
     referenceR,
     referencesR,
diff --git a/src/GitHub/Endpoints/GitData/Trees.hs b/src/GitHub/Endpoints/GitData/Trees.hs
--- a/src/GitHub/Endpoints/GitData/Trees.hs
+++ b/src/GitHub/Endpoints/GitData/Trees.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The underlying tree of SHA1s and files that make up a git repo. The API is
 -- described on <http://developer.github.com/v3/git/trees/>.
+
 module GitHub.Endpoints.GitData.Trees (
     treeR,
     nestedTreeR,
diff --git a/src/GitHub/Endpoints/Issues.hs b/src/GitHub/Endpoints/Issues.hs
--- a/src/GitHub/Endpoints/Issues.hs
+++ b/src/GitHub/Endpoints/Issues.hs
@@ -1,10 +1,6 @@
-{-# LANGUAGE CPP #-}
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The issues API as described on <http://developer.github.com/v3/issues/>.
+
 module GitHub.Endpoints.Issues (
     currentUserIssuesR,
     organizationIssuesR,
diff --git a/src/GitHub/Endpoints/Issues/Comments.hs b/src/GitHub/Endpoints/Issues/Comments.hs
--- a/src/GitHub/Endpoints/Issues/Comments.hs
+++ b/src/GitHub/Endpoints/Issues/Comments.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The Github issue comments API from
 -- <http://developer.github.com/v3/issues/comments/>.
+
 module GitHub.Endpoints.Issues.Comments (
     commentR,
     commentsR,
diff --git a/src/GitHub/Endpoints/Issues/Events.hs b/src/GitHub/Endpoints/Issues/Events.hs
--- a/src/GitHub/Endpoints/Issues/Events.hs
+++ b/src/GitHub/Endpoints/Issues/Events.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The Github issue events API, which is described on
 -- <http://developer.github.com/v3/issues/events/>
+
 module GitHub.Endpoints.Issues.Events (
     eventsForIssueR,
     eventsForRepoR,
diff --git a/src/GitHub/Endpoints/Issues/Labels.hs b/src/GitHub/Endpoints/Issues/Labels.hs
--- a/src/GitHub/Endpoints/Issues/Labels.hs
+++ b/src/GitHub/Endpoints/Issues/Labels.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The API for dealing with labels on Github issues as described on
 -- <http://developer.github.com/v3/issues/labels/>.
+
 module GitHub.Endpoints.Issues.Labels (
     labelsOnRepoR,
     labelR,
diff --git a/src/GitHub/Endpoints/Issues/Milestones.hs b/src/GitHub/Endpoints/Issues/Milestones.hs
--- a/src/GitHub/Endpoints/Issues/Milestones.hs
+++ b/src/GitHub/Endpoints/Issues/Milestones.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The milestones API as described on
 -- <http://developer.github.com/v3/issues/milestones/>.
+
 module GitHub.Endpoints.Issues.Milestones (
     milestonesR,
     milestoneR,
diff --git a/src/GitHub/Endpoints/Organizations.hs b/src/GitHub/Endpoints/Organizations.hs
--- a/src/GitHub/Endpoints/Organizations.hs
+++ b/src/GitHub/Endpoints/Organizations.hs
@@ -1,9 +1,6 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The orgs API as described on <http://developer.github.com/v3/orgs/>.
+
 module GitHub.Endpoints.Organizations (
     publicOrganizationsForR,
     publicOrganizationR,
diff --git a/src/GitHub/Endpoints/Organizations/Members.hs b/src/GitHub/Endpoints/Organizations/Members.hs
--- a/src/GitHub/Endpoints/Organizations/Members.hs
+++ b/src/GitHub/Endpoints/Organizations/Members.hs
@@ -1,15 +1,13 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The organization members API as described on
 -- <http://developer.github.com/v3/orgs/members/>.
+
 module GitHub.Endpoints.Organizations.Members (
     membersOfR,
     membersOfWithR,
     isMemberOfR,
     orgInvitationsR,
+    orgMembershipR,
     module GitHub.Data,
     ) where
 
@@ -51,3 +49,10 @@
 -- See <https://developer.github.com/v3/orgs/members/#list-pending-organization-invitations>
 orgInvitationsR :: Name Organization -> FetchCount -> Request 'RA (Vector Invitation)
 orgInvitationsR org = pagedQuery ["orgs", toPathPart org, "invitations"] []
+
+-- | Get user membership information in an organization
+--
+-- See <https://docs.github.com/en/rest/orgs/members#get-organization-membership-for-a-user>
+orgMembershipR :: Name User -> Name Organization -> Request 'RA Membership
+orgMembershipR user org =
+    Query [ "orgs", toPathPart org, "memberships", toPathPart user ] []
diff --git a/src/GitHub/Endpoints/Organizations/OutsideCollaborators.hs b/src/GitHub/Endpoints/Organizations/OutsideCollaborators.hs
--- a/src/GitHub/Endpoints/Organizations/OutsideCollaborators.hs
+++ b/src/GitHub/Endpoints/Organizations/OutsideCollaborators.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The organization members API as described on
 -- <https://developer.github.com/v3/orgs/outside_collaborators/>.
+
 module GitHub.Endpoints.Organizations.OutsideCollaborators (
     outsideCollaboratorsR,
     ) where
diff --git a/src/GitHub/Endpoints/Organizations/Teams.hs b/src/GitHub/Endpoints/Organizations/Teams.hs
--- a/src/GitHub/Endpoints/Organizations/Teams.hs
+++ b/src/GitHub/Endpoints/Organizations/Teams.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The Owner teams API as described on
 -- <http://developer.github.com/v3/orgs/teams/>.
+
 module GitHub.Endpoints.Organizations.Teams (
     teamsOfR,
     teamInfoForR,
diff --git a/src/GitHub/Endpoints/PullRequests.hs b/src/GitHub/Endpoints/PullRequests.hs
--- a/src/GitHub/Endpoints/PullRequests.hs
+++ b/src/GitHub/Endpoints/PullRequests.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The pull requests API as documented at
 -- <http://developer.github.com/v3/pulls/>.
+
 module GitHub.Endpoints.PullRequests (
     pullRequestsForR,
     pullRequestR,
@@ -102,4 +99,3 @@
     buildCommitMessageMap :: Maybe Text -> Value
     buildCommitMessageMap (Just msg) = object ["commit_message" .= msg ]
     buildCommitMessageMap Nothing    = object []
-
diff --git a/src/GitHub/Endpoints/PullRequests/Comments.hs b/src/GitHub/Endpoints/PullRequests/Comments.hs
--- a/src/GitHub/Endpoints/PullRequests/Comments.hs
+++ b/src/GitHub/Endpoints/PullRequests/Comments.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The pull request review comments API as described at
 -- <http://developer.github.com/v3/pulls/comments/>.
+
 module GitHub.Endpoints.PullRequests.Comments (
     pullRequestCommentsR,
     pullRequestCommentR,
diff --git a/src/GitHub/Endpoints/PullRequests/Reviews.hs b/src/GitHub/Endpoints/PullRequests/Reviews.hs
--- a/src/GitHub/Endpoints/PullRequests/Reviews.hs
+++ b/src/GitHub/Endpoints/PullRequests/Reviews.hs
@@ -1,9 +1,6 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The reviews API as described on <http://developer.github.com/v3/pulls/reviews/>.
+
 module GitHub.Endpoints.PullRequests.Reviews
     ( pullRequestReviewsR
     , pullRequestReviewR
diff --git a/src/GitHub/Endpoints/RateLimit.hs b/src/GitHub/Endpoints/RateLimit.hs
--- a/src/GitHub/Endpoints/RateLimit.hs
+++ b/src/GitHub/Endpoints/RateLimit.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The Github RateLimit API, as described at
 -- <http://developer.github.com/v3/rate_limit/>.
+
 module GitHub.Endpoints.RateLimit (
     rateLimitR,
     module GitHub.Data,
diff --git a/src/GitHub/Endpoints/Reactions.hs b/src/GitHub/Endpoints/Reactions.hs
new file mode 100644
--- /dev/null
+++ b/src/GitHub/Endpoints/Reactions.hs
@@ -0,0 +1,60 @@
+-- |
+-- The Reactions API as described at
+-- <https://docs.github.com/en/rest/reactions/reactions?apiVersion=2022-11-28>.
+module GitHub.Endpoints.Reactions (
+  issueReactionsR,
+  createIssueReactionR,
+  deleteIssueReactionR,
+  commentReactionsR,
+  createCommentReactionR,
+  deleteCommentReactionR,
+  module GitHub.Data,
+) where
+
+import GitHub.Data
+import GitHub.Internal.Prelude
+import Prelude ()
+
+-- | List reactions for an issue.
+-- See <https://docs.github.com/en/rest/reactions/reactions?apiVersion=2022-11-28#list-reactions-for-an-issue>
+issueReactionsR :: Name Owner -> Name Repo -> Id Issue -> FetchCount -> Request k (Vector Reaction)
+issueReactionsR owner repo iid =
+  pagedQuery ["repos", toPathPart owner, toPathPart repo, "issues", toPathPart iid, "reactions"] []
+
+-- | Create reaction for an issue comment.
+-- See <https://docs.github.com/en/rest/reactions/reactions?apiVersion=2022-11-28#create-reaction-for-an-issue>
+createIssueReactionR :: Name Owner -> Name Repo -> Id Issue -> ReactionContent -> Request 'RW Reaction
+createIssueReactionR owner repo iid content =
+    command Post parts (encode $ NewReaction content)
+  where
+    parts = ["repos", toPathPart owner, toPathPart repo, "issues", toPathPart iid, "reactions"]
+
+-- | Delete an issue comment reaction.
+-- See <https://docs.github.com/en/rest/reactions/reactions?apiVersion=2022-11-28#delete-an-issue-reaction>
+deleteIssueReactionR :: Name Owner -> Name Repo -> Id Issue -> Id Reaction -> GenRequest 'MtUnit 'RW ()
+deleteIssueReactionR owner repo iid rid =
+    Command Delete parts mempty
+  where
+    parts = ["repos", toPathPart owner, toPathPart repo, "issues", toPathPart iid, "reactions", toPathPart rid]
+
+-- | List reactions for an issue comment.
+-- See <https://docs.github.com/en/rest/reactions/reactions?apiVersion=2022-11-28#list-reactions-for-an-issue-comment>
+commentReactionsR :: Name Owner -> Name Repo -> Id Comment -> FetchCount -> Request k (Vector Reaction)
+commentReactionsR owner repo cid =
+  pagedQuery ["repos", toPathPart owner, toPathPart repo, "issues", "comments", toPathPart cid, "reactions"] []
+
+-- | Create reaction for an issue comment.
+-- See https://docs.github.com/en/rest/reactions/reactions?apiVersion=2022-11-28#create-reaction-for-an-issue-comment
+createCommentReactionR :: Name Owner -> Name Repo -> Id Comment -> ReactionContent -> Request 'RW Reaction
+createCommentReactionR owner repo cid content =
+    command Post parts (encode $ NewReaction content)
+  where
+    parts = ["repos", toPathPart owner, toPathPart repo, "issues", "comments", toPathPart cid, "reactions"]
+
+-- | Delete an issue comment reaction.
+-- See <https://docs.github.com/en/rest/reactions/reactions?apiVersion=2022-11-28#delete-an-issue-comment-reaction>
+deleteCommentReactionR :: Name Owner -> Name Repo -> Id Comment -> Id Reaction -> GenRequest 'MtUnit 'RW ()
+deleteCommentReactionR owner repo cid rid =
+    Command Delete parts mempty
+  where
+    parts = ["repos", toPathPart owner, toPathPart repo, "issues", "comments", toPathPart cid, "reactions", toPathPart rid]
diff --git a/src/GitHub/Endpoints/Repos.hs b/src/GitHub/Endpoints/Repos.hs
--- a/src/GitHub/Endpoints/Repos.hs
+++ b/src/GitHub/Endpoints/Repos.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The Github Repos API, as documented at
 -- <http://developer.github.com/v3/repos/>
+
 module GitHub.Endpoints.Repos (
     -- * Querying repositories
     currentUserReposR,
diff --git a/src/GitHub/Endpoints/Repos/Collaborators.hs b/src/GitHub/Endpoints/Repos/Collaborators.hs
--- a/src/GitHub/Endpoints/Repos/Collaborators.hs
+++ b/src/GitHub/Endpoints/Repos/Collaborators.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The repo collaborators API as described on
 -- <http://developer.github.com/v3/repos/collaborators/>.
+
 module GitHub.Endpoints.Repos.Collaborators (
     collaboratorsOnR,
     collaboratorPermissionOnR,
diff --git a/src/GitHub/Endpoints/Repos/Comments.hs b/src/GitHub/Endpoints/Repos/Comments.hs
--- a/src/GitHub/Endpoints/Repos/Comments.hs
+++ b/src/GitHub/Endpoints/Repos/Comments.hs
@@ -1,11 +1,7 @@
-{-# LANGUAGE CPP #-}
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The repo commits API as described on
 -- <http://developer.github.com/v3/repos/comments/>.
+
 module GitHub.Endpoints.Repos.Comments (
     commentsForR,
     commitCommentsForR,
diff --git a/src/GitHub/Endpoints/Repos/Commits.hs b/src/GitHub/Endpoints/Repos/Commits.hs
--- a/src/GitHub/Endpoints/Repos/Commits.hs
+++ b/src/GitHub/Endpoints/Repos/Commits.hs
@@ -1,11 +1,7 @@
-{-# LANGUAGE CPP #-}
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The repo commits API as described on
 -- <http://developer.github.com/v3/repos/commits/>.
+
 module GitHub.Endpoints.Repos.Commits (
     CommitQueryOption(..),
     commitsForR,
diff --git a/src/GitHub/Endpoints/Repos/Contents.hs b/src/GitHub/Endpoints/Repos/Contents.hs
--- a/src/GitHub/Endpoints/Repos/Contents.hs
+++ b/src/GitHub/Endpoints/Repos/Contents.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The Github Repo Contents API, as documented at
 -- <https://developer.github.com/v3/repos/contents/>
+
 module GitHub.Endpoints.Repos.Contents (
     -- * Querying contents
     contentsForR,
diff --git a/src/GitHub/Endpoints/Repos/Forks.hs b/src/GitHub/Endpoints/Repos/Forks.hs
--- a/src/GitHub/Endpoints/Repos/Forks.hs
+++ b/src/GitHub/Endpoints/Repos/Forks.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- Hot forking action, as described at
 -- <http://developer.github.com/v3/repos/forks/>.
+
 module GitHub.Endpoints.Repos.Forks (
     forksForR,
     module GitHub.Data,
diff --git a/src/GitHub/Endpoints/Repos/Invitations.hs b/src/GitHub/Endpoints/Repos/Invitations.hs
--- a/src/GitHub/Endpoints/Repos/Invitations.hs
+++ b/src/GitHub/Endpoints/Repos/Invitations.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The repo invitations API as described on
 -- <https://developer.github.com/v3/repos/invitations/>.
+
 module GitHub.Endpoints.Repos.Invitations (
     listInvitationsOnR,
     listInvitationsForR,
diff --git a/src/GitHub/Endpoints/Repos/Statuses.hs b/src/GitHub/Endpoints/Repos/Statuses.hs
--- a/src/GitHub/Endpoints/Repos/Statuses.hs
+++ b/src/GitHub/Endpoints/Repos/Statuses.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The repo statuses API as described on
 -- <https://developer.github.com/v3/repos/statuses/>.
+
 module GitHub.Endpoints.Repos.Statuses (
     createStatusR,
     statusesForR,
diff --git a/src/GitHub/Endpoints/Repos/Webhooks.hs b/src/GitHub/Endpoints/Repos/Webhooks.hs
--- a/src/GitHub/Endpoints/Repos/Webhooks.hs
+++ b/src/GitHub/Endpoints/Repos/Webhooks.hs
@@ -1,11 +1,8 @@
- -----------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The webhooks API, as described at
 -- <https://developer.github.com/v3/repos/hooks/>
 -- <https://developer.github.com/webhooks>
+
 module GitHub.Endpoints.Repos.Webhooks (
     -- * Querying repositories
     webhooksForR,
diff --git a/src/GitHub/Endpoints/Search.hs b/src/GitHub/Endpoints/Search.hs
--- a/src/GitHub/Endpoints/Search.hs
+++ b/src/GitHub/Endpoints/Search.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The Github Search API, as described at
 -- <http://developer.github.com/v3/search/>.
+
 module GitHub.Endpoints.Search(
     searchReposR,
     searchCodeR,
diff --git a/src/GitHub/Endpoints/Users.hs b/src/GitHub/Endpoints/Users.hs
--- a/src/GitHub/Endpoints/Users.hs
+++ b/src/GitHub/Endpoints/Users.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The Github Users API, as described at
 -- <http://developer.github.com/v3/users/>.
+
 module GitHub.Endpoints.Users (
     userInfoForR,
     ownerInfoForR,
diff --git a/src/GitHub/Endpoints/Users/Emails.hs b/src/GitHub/Endpoints/Users/Emails.hs
--- a/src/GitHub/Endpoints/Users/Emails.hs
+++ b/src/GitHub/Endpoints/Users/Emails.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The user emails API as described on
 -- <http://developer.github.com/v3/users/emails/>.
+
 module GitHub.Endpoints.Users.Emails (
     currentUserEmailsR,
     currentUserPublicEmailsR,
diff --git a/src/GitHub/Endpoints/Users/Followers.hs b/src/GitHub/Endpoints/Users/Followers.hs
--- a/src/GitHub/Endpoints/Users/Followers.hs
+++ b/src/GitHub/Endpoints/Users/Followers.hs
@@ -1,10 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- The user followers API as described on
 -- <http://developer.github.com/v3/users/followers/>.
+
 module GitHub.Endpoints.Users.Followers (
     usersFollowingR,
     usersFollowedByR,
diff --git a/src/GitHub/Enterprise.hs b/src/GitHub/Enterprise.hs
--- a/src/GitHub/Enterprise.hs
+++ b/src/GitHub/Enterprise.hs
@@ -1,11 +1,7 @@
------------------------------------------------------------------------------
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- This module re-exports all request constructors and data definitions for
 -- working with GitHub Enterprise.
---
+
 module GitHub.Enterprise (
     -- * Enterprise Admin
     -- | See <https://developer.github.com/enterprise/v3/enterprise-admin/>
diff --git a/src/GitHub/Internal/Prelude.hs b/src/GitHub/Internal/Prelude.hs
--- a/src/GitHub/Internal/Prelude.hs
+++ b/src/GitHub/Internal/Prelude.hs
@@ -1,61 +1,30 @@
 {-# LANGUAGE NoImplicitPrelude #-}
-{-# LANGUAGE CPP #-}
------------------------------------------------------------------------------
+
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- This module may change between minor releases. Do not rely on its contents.
-module GitHub.Internal.Prelude (
-    module Prelude.Compat,
-    -- * Commonly used types
-    UTCTime,
-    HashMap,
-    Text, pack, unpack,
-    Vector,
-    -- * Commonly used typeclasses
-    Binary,
-    Data, Typeable,
-    Generic,
-    Hashable(..),
-    IsString(..),
-    NFData(..), genericRnf,
-    Semigroup(..),
-    -- * Aeson
-    FromJSON(..), ToJSON(..), Value(..), Object,
-    emptyObject,
-    encode,
-    withText, withObject, (.:), (.:?), (.!=), (.=), object, typeMismatch,
-    -- * Control.Applicative
-    (<|>),
-    -- * Data.Maybe
-    catMaybes,
-    -- * Data.List
-    intercalate, toList,
-    -- * Data.Time.ISO8601
-    formatISO8601,
-    ) where
 
-import Control.Applicative      ((<|>))
-import Control.DeepSeq          (NFData (..))
-import Control.DeepSeq.Generics (genericRnf)
-import Data.Aeson
+module GitHub.Internal.Prelude ( module X ) where
+
+import Control.Applicative      as X ((<|>))
+import Control.DeepSeq          as X (NFData (..))
+import Data.Aeson               as X
        (FromJSON (..), Object, ToJSON (..), Value (..), encode, object,
        withObject, withText, (.!=), (.:), (.:?), (.=))
-import Data.Aeson.Types         (emptyObject, typeMismatch)
-import Data.Binary              (Binary)
-import Data.Binary.Instances ()
-import Data.Data                (Data, Typeable)
-import Data.Foldable            (toList)
-import Data.Hashable            (Hashable (..))
-import Data.HashMap.Strict      (HashMap)
-import Data.List                (intercalate)
-import Data.Maybe               (catMaybes)
-import Data.Semigroup           (Semigroup (..))
-import Data.String              (IsString (..))
-import Data.Text                (Text, pack, unpack)
-import Data.Time.Compat         (UTCTime)
-import Data.Time.ISO8601        (formatISO8601)
-import Data.Vector              (Vector)
-import GHC.Generics             (Generic)
-import Prelude.Compat
+import Data.Aeson.Types         as X (emptyObject, typeMismatch)
+import Data.Binary              as X (Binary)
+import Data.Binary.Instances    as X ()
+import Data.Data                as X (Data)
+import Data.Foldable            as X (toList)
+import Data.Hashable            as X (Hashable (..))
+import Data.HashMap.Strict      as X (HashMap)
+import Data.List                as X (intercalate)
+import Data.Maybe               as X (catMaybes)
+import Data.Semigroup           as X (Semigroup (..))
+import Data.String              as X (IsString (..))
+import Data.Text                as X (Text, pack, unpack)
+import Data.Time                as X (UTCTime)
+import Data.Time.ISO8601        as X (formatISO8601)
+import Data.Vector              as X (Vector)
+import GHC.Generics             as X (Generic)
+import Prelude.Compat           as X
+import Data.Functor.Compat      as X ((<&>))
diff --git a/src/GitHub/Request.hs b/src/GitHub/Request.hs
--- a/src/GitHub/Request.hs
+++ b/src/GitHub/Request.hs
@@ -6,11 +6,8 @@
 {-# LANGUAGE KindSignatures         #-}
 {-# LANGUAGE ScopedTypeVariables    #-}
 {-# LANGUAGE UndecidableInstances   #-}
------------------------------------------------------------------------------
+
 -- |
--- License     :  BSD-3-Clause
--- Maintainer  :  Oleg Grenrus <oleg.grenrus@iki.fi>
---
 -- This module provides data types and helper methods, which makes possible
 -- to build alternative API request intepreters in addition to provided
 -- 'IO' functions.
@@ -30,6 +27,7 @@
 -- > -- | Lift request into Monad
 -- > githubRequest :: GH.Request 'False a -> GithubMonad a
 -- > githubRequest = singleton
+
 module GitHub.Request (
     -- * A convenient execution of requests
     github,
@@ -56,6 +54,7 @@
     ParseResponse (..),
     makeHttpRequest,
     parseStatus,
+    parsePageLinks,
     StatusMap,
     getNextUrl,
     performPagedRequest,
@@ -81,6 +80,7 @@
 import Control.Monad.Trans.Except (ExceptT (..), runExceptT)
 import Data.Aeson                 (eitherDecode)
 import Data.List                  (find)
+import Data.Maybe                 (fromMaybe)
 import Data.Tagged                (Tagged (..))
 import Data.Version               (showVersion)
 
@@ -89,13 +89,14 @@
        httpLbs, method, newManager, redirectCount, requestBody, requestHeaders,
        setQueryString, setRequestIgnoreStatus)
 import Network.HTTP.Link.Parser (parseLinkHeaderBS)
-import Network.HTTP.Link.Types  (LinkParam (..), href, linkParams)
+import Network.HTTP.Link.Types  (Link(..), LinkParam (..), href, linkParams)
 import Network.HTTP.Types       (Method, RequestHeaders, Status (..))
 import Network.URI
        (URI, escapeURIString, isUnescapedInURIComponent, parseURIReference,
        relativeTo)
 
 import qualified Data.ByteString              as BS
+import           Data.ByteString.Builder      (intDec, toLazyByteString)
 import qualified Data.ByteString.Lazy         as LBS
 import qualified Data.Text                    as T
 import qualified Data.Text.Encoding           as TE
@@ -201,11 +202,6 @@
     manager <- newManager tlsManagerSettings
     executeRequestWithMgr manager auth req
 
-lessFetchCount :: Int -> FetchCount -> Bool
-lessFetchCount _ FetchAll         = True
-lessFetchCount i (FetchAtLeast j) = i < fromIntegral j
-
-
 -- | Like 'executeRequest' but with provided 'Manager'.
 executeRequestWithMgr
     :: (AuthMethod am, ParseResponse mt a)
@@ -237,10 +233,13 @@
         res <- httpLbs' httpReq
         (<$ res) <$> unTagged (parseResponse httpReq res :: Tagged mt (ExceptT Error IO b))
 
-    performHttpReq httpReq (PagedQuery _ _ l) =
-        unTagged (performPagedRequest httpLbs' predicate httpReq :: Tagged mt (ExceptT Error IO (HTTP.Response b)))
-      where
-        predicate v = lessFetchCount (length v) l
+    performHttpReq httpReq (PagedQuery _ _ (FetchPage _)) = do
+        (res, _pageLinks) <- unTagged (performPerPageRequest httpLbs' httpReq :: Tagged mt (ExceptT Error IO (HTTP.Response b, PageLinks)))
+        return res
+    performHttpReq httpReq (PagedQuery _ _ FetchAll) =
+        unTagged (performPagedRequest httpLbs' (const True) httpReq :: Tagged mt (ExceptT Error IO (HTTP.Response b)))
+    performHttpReq httpReq (PagedQuery _ _ (FetchAtLeast j)) =
+        unTagged (performPagedRequest httpLbs' (\v -> length v < fromIntegral j) httpReq :: Tagged mt (ExceptT Error IO (HTTP.Response b)))
 
     performHttpReq httpReq (Command _ _ _) = do
         res <- httpLbs' httpReq
@@ -458,7 +457,7 @@
             $ setReqHeaders
             . unTagged (modifyRequest :: Tagged mt (HTTP.Request -> HTTP.Request))
             . maybe id setAuthRequest auth
-            . setQueryString qs
+            . setQueryString (qs <> extraQueryItems)
             $ req
     PagedQuery paths qs _ -> do
         req <- parseUrl' $ url paths
@@ -466,7 +465,7 @@
             $ setReqHeaders
             . unTagged (modifyRequest :: Tagged mt (HTTP.Request -> HTTP.Request))
             . maybe id setAuthRequest auth
-            . setQueryString qs
+            . setQueryString (qs <> extraQueryItems)
             $ req
     Command m paths body -> do
         req <- parseUrl' $ url paths
@@ -498,6 +497,14 @@
     setBody :: LBS.ByteString -> HTTP.Request -> HTTP.Request
     setBody body req = req { requestBody = RequestBodyLBS body }
 
+    extraQueryItems :: [(BS.ByteString, Maybe BS.ByteString)]
+    extraQueryItems = case r of
+      PagedQuery _ _ (FetchPage pp) -> catMaybes [
+          (\page -> ("page", Just (LBS.toStrict $ toLazyByteString $ intDec page))) <$> pageParamsPage pp
+          , (\perPage -> ("per_page", Just (LBS.toStrict $ toLazyByteString $ intDec perPage))) <$> pageParamsPerPage pp
+          ]
+      _ -> []
+
 -- | Query @Link@ header with @rel=next@ from the request headers.
 getNextUrl :: HTTP.Response a -> Maybe URI
 getNextUrl req = do
@@ -543,6 +550,35 @@
                 m <- unTagged (parseResponse req' res' :: Tagged mt (m a))
                 go (acc <> m) res' req'
             (_, _)           -> return (acc <$ res)
+
+-- | Helper for requesting a single page, as specified by 'PageParams'.
+--
+-- This parses and returns the 'PageLinks' alongside the HTTP response.
+performPerPageRequest
+    :: forall a m mt. (ParseResponse mt a, MonadCatch m, MonadError Error m)
+    => (HTTP.Request -> m (HTTP.Response LBS.ByteString))  -- ^ `httpLbs` analogue
+    -> HTTP.Request                                        -- ^ initial request
+    -> Tagged mt (m (HTTP.Response a, PageLinks))
+performPerPageRequest httpLbs' initReq = Tagged $ do
+    res <- httpLbs' initReq
+    m <- unTagged (parseResponse initReq res :: Tagged mt (m a))
+    return (m <$ res, parsePageLinks res)
+
+-- | Parse the 'PageLinks' from an HTTP response, where the information is
+-- encoded in the Link header.
+parsePageLinks :: HTTP.Response a -> PageLinks
+parsePageLinks res = PageLinks {
+    pageLinksPrev = linkToUri <$> find (elem (Rel, "prev") . linkParams) links
+    , pageLinksNext = linkToUri <$> find (elem (Rel, "next") . linkParams) links
+    , pageLinksLast = linkToUri <$> find (elem (Rel, "last") . linkParams) links
+    , pageLinksFirst = linkToUri <$> find (elem (Rel, "first") . linkParams) links
+    }
+    where
+        links :: [Link URI]
+        links = fromMaybe [] (lookup "Link" (responseHeaders res) >>= parseLinkHeaderBS)
+
+        linkToUri :: Link URI -> URI
+        linkToUri (Link uri _) = uri
 
 -------------------------------------------------------------------------------
 -- Internal
